ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggZDViODFmNi4uMzAzYzViZCAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTQgKzEsMTYgQEAKLVRoaXMgaXMgcmVsZWFzZSA5ODA3MjYgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKK1RoaXMgaXMgcmVsZWFzZSA5ODA4MDkgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKIGRldmVsb3BlcidzIG9ubHkgcmVsZWFzZS4gIFRoZXJlIGFyZSBtYW55IGJ1Z3MgYW5kIG1hbnkgdW5pbXBsZW1lbnRlZCBBUEkKIGZlYXR1cmVzLiAgTW9zdCBhcHBsaWNhdGlvbnMgc3RpbGwgZG8gbm90IHdvcmsgY29ycmVjdGx5LgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gImp1bGxpYXJkQGxyYy5lcGZsLmNoIi4gIFBsZWFzZSBkb24ndAogZm9yZ2V0IHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk4MDcyNjogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBTdGlsbCBtb3JlIGNvbW1vbiBjb250cm9scyBzdHVmZi4KLQktIE1vcmUgRGlyZWN0RHJhdyBzdXBwb3J0LgotCS0gQ29tcGlsYXRpb24gcHJvYmxlbXMgc2hvdWxkIGJlIGdvbmUuCitXSEFUJ1MgTkVXIHdpdGggV2luZS05ODA4MDk6IChzZWUgQ2hhbmdlTG9nIGZvciBkZXRhaWxzKQorCS0gUHJlbGltaW5hcnkgRE9TIGV4ZWN1dGFibGVzIHN1cHBvcnQuCisJLSBQb3N0c2NyaXB0IGRyaXZlciBpbXByb3ZlbWVudHMuCisJLSBNb3JlIGNsaWVudC9zZXJ2ZXIgc3R1ZmYuCisJLSBCZXR0ZXIgc2hlbGwzMi5kbGwgYnVpbHRpbiBzdXBwb3J0LgorCS0gUHJvcGVyIFdpbjE2IG11dGV4IGxvY2tpbmcuCiAJLSBMb3RzIG9mIGJ1ZyBmaXhlcy4KIAogU2VlIHRoZSBSRUFETUUgZmlsZSBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvciBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLgpAQCAtMTcsMTAgKzE5LDEwIEBACiB0aGUgcmVsZWFzZSBpcyBhdmFpbGFibGUgYXQgdGhlIGZ0cCBzaXRlcy4gIFRoZSBzb3VyY2VzIHdpbGwgYmUgYXZhaWxhYmxlCiBmcm9tIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgogCi0gIGZ0cDovL3N1bnNpdGUudW5jLmVkdS9wdWIvTGludXgvQUxQSEEvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDcyNi50YXIuZ3oKLSAgZnRwOi8vdHN4LTExLm1pdC5lZHUvcHViL2xpbnV4L0FMUEhBL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODA3MjYudGFyLmd6Ci0gIGZ0cDovL2Z0cC5pbmZvbWFnaWMuY29tL3B1Yi9taXJyb3JzL2xpbnV4L3N1bnNpdGUvQUxQSEEvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDcyNi50YXIuZ3oKLSAgZnRwOi8vZnRwLnByb2dzb2MudXRzLmVkdS5hdS9wdWIvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDcyNi50YXIuZ3oKKyAgZnRwOi8vc3Vuc2l0ZS51bmMuZWR1L3B1Yi9MaW51eC9BTFBIQS93aW5lL2RldmVsb3BtZW50L1dpbmUtOTgwODA5LnRhci5negorICBmdHA6Ly90c3gtMTEubWl0LmVkdS9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDgwOS50YXIuZ3oKKyAgZnRwOi8vZnRwLmluZm9tYWdpYy5jb20vcHViL21pcnJvcnMvbGludXgvc3Vuc2l0ZS9BTFBIQS93aW5lL2RldmVsb3BtZW50L1dpbmUtOTgwODA5LnRhci5negorICBmdHA6Ly9mdHAucHJvZ3NvYy51dHMuZWR1LmF1L3B1Yi9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTgwODA5LnRhci5negogCiBJdCBzaG91bGQgYWxzbyBiZSBhdmFpbGFibGUgZnJvbSBhbnkgc2l0ZSB0aGF0IG1pcnJvcnMgdHN4LTExIG9yIHN1bnNpdGUuCiAKZGlmZiAtLWdpdCBhL0FVVEhPUlMgYi9BVVRIT1JTCmluZGV4IDA0YzZkZTM0Li44N2UwODA0IDEwMDY0NAotLS0gYS9BVVRIT1JTCisrKyBiL0FVVEhPUlMKQEAgLTY0LDYgKzY0LDcgQEAKIEFsZXggS29yb2JrYSwKIEdyZWcgS3JlaWRlciwKIEFuYW5kIEt1bXJpYSwKK092ZSBL5XZlbiwKIFNjb3R0IEEuIExhaXJkLAogRGF2aWQgTGVlIExhbWJlcnQsCiBBbmRyZXcgTGV3eWNreSwKZGlmZiAtLWdpdCBhL0JVR1MgYi9CVUdTCmluZGV4IDlmMDhjNDguLmU3MTEzYWQgMTAwNjQ0Ci0tLSBhL0JVR1MKKysrIGIvQlVHUwpAQCAtNzMsNiArNzMsMTAgQEAKIAogICogQWxsb2NDU1RvRFNBbGlhcygpIHNob3VsZG4ndCBhbGxvYyBhbGlhcyBmb3IgdGhlIHNhbWUgc2VnbWVudCBtdWx0aXBsZQogICAgdGltZXMuCisgCisgKiBTb21lIHByb2dyYW1zIGV4cGVjdCB0aGF0IG1lbnUgd2luZG93IGhhbmRsZXMgc3RheSB0aGUgc2FtZSBhbGwgdGhlIHRpbWUuCisgICAoY2hlbWRyYXcpLiBUaGlzIGltcGxpZXMgdGhhdCB0aGUgbWVudSBwb3B1cHdpbmRvd3MgYXJlIGp1c3QgaGlkZGVuLCBub3QKKyAgIGRlc3Ryb3llZCBpbiByZWFsIFdpbmRvd3MuCiAKIFdoZXJlIHRvIGxvb2sgaW4gc291cmNlIGZpbGVzOgogCmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cgYi9DaGFuZ2VMb2cKaW5kZXggOTU1ZWU5NS4uYmQ5Y2I0NSAxMDA2NDQKLS0tIGEvQ2hhbmdlTG9nCisrKyBiL0NoYW5nZUxvZwpAQCAtMSw0ICsxLDI2MSBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU3VuIEF1ZyAgOSAxMzoyMTozNSAxOTk4ICBBbmRyZWFzIE1vaHIgPDEwMC4zMDkzNkBnZXJtYW55Lm5ldD4KKworCSogW2xvYWRlci9uZS9tb2R1bGUuY10gW2lmMTYzMi9rZXJuZWwuc3BlY10KKwlBZGRlZCB0aGUgdW5kb2N1bWVudGVkIEhJV09SRCBvZiBHZXRNb2R1bGVIYW5kbGUgKGhGaXJzdE1vZHVsZSkuCisKKwkqIFtsb2FkZXIvbmUvc2VnbWVudC5jXQorCVdpbmUgZm9yZ290IHRvIHNldCBzb21lIE5FX1NFR0ZMQUdTXyouCisJQ29tYmluZWQgd2l0aCBhbm90aGVyIGxvYWRlciBjaGFuZ2UsIHRoaXMgZml4ZWQgdGhlCisJIkJMSU5LRVIgLS0gZXJyb3IgaW4gbG9hZGluZyBtb2R1bGUiIG9yIGdob3N0IE1lc3NhZ2VCb3ggcHJvYmxlbQorCXRoYXQgYWJvdXQgMSUgb2YgYWxsIFdpbmRvd3MgcHJvZ3JhbXMgaGF2ZS4KKwlTb21lIEJMSU5LRVIgcHJvZ3JhbXMgc3RpbGwgZG9uJ3Qgd29yaywgdGhvdWdoLgorCUJ1dCBJJ20gd29ya2luZyBvbiBpdCwgd2l0aCBncmVhdCBoZWxwIGZyb20gQmxpbmtpbmMuCisKKwkqIFtsb2FkZXIvdGFzay5jXQorCUluaXRUYXNrIG5lZWRzIHRvIGRlY3JlbWVudCB0aGUgU1AgcmVnaXN0ZXIgYnkgdHdvIGFzIFdpbjk1IGRvZXMuCisKK1NhdCBBdWcgIDggMTk6MTE6NDYgMTk5OCAgTWFyY3VzIE1laXNzbmVyIDxtYXJjdXNAamV0LmZyYW5rZW4uZGU+CisKKyAJKiBbKi8qXQorCUFkZGVkIHNvbWUgbWlzc2luZyBXSU5BUEkgYW5kIHNvbWUgbWlzc2luZyBwcm90b3R5cGVzIGZvcgorCWZ1bmN0aW9ucy4KKworCSogW2NvbnRyb2xzL3N0YXRpYy5jXQorCUdvdCByaWQgb2YgdGhlIE1PRFVMRTMyX0xvb2t1cEhNT0RVTEUgZXJyb3Igc2hvd2luZyB1cCBmb3IgZXZlcnkKKwltZXNzYWdlIGJveC4KKworCSogW3dpbmRvd3Mvd2lucHJvYy5jXQorCVdNX05PVElGWSAxNi0+MzIgbWFwcGluZyAoQU9MIEluc3RhbnQgTWVzc2VuZ2VyIG9yIGhvd2V2ZXIgaXQgaXMgY2FsbGVkKS4KKworCSogW21pc2Mvd2luc29jay5jXQorCWhvc3RlbnQvc2VydmVudC9wcm90b2VudCBzaG91bGQgbm90IHVzZSB0aGUgc2FtZSBzdGF0aWMgYnVmZmVycy4KKwkoaGFzIGJyb2tlbiBudDMuMTUgZmluZ2VyLmV4ZSB3aGljaCBkb2VzIGhwPWdldGhvc3RieW5hbWUoKSwgdGhlbgorCWdldHNlcnZieW5hbWUoImZpbmdlciIsInRjcCIpIGFuZCB0aGUgcmVmZXJlbmNlcyBocC0+aF9hZGRyX2xpc3RbMF0pLgorCitTYXQgQXVnICA4IDEzOjIxOjI0IDE5OTggIEFsZXhhbmRyZSBKdWxsaWFyZCAgPGp1bGxpYXJkQGxyYy5lcGZsLmNoPgorCisJKiBbaW5jbHVkZS9zZXJ2ZXIuaF0gW3Rvb2xzL21ha2VfcmVxdWVzdHNdIFtzZXJ2ZXIvcmVxdWVzdC5jXQorCSAgW3NlcnZlci90cmFjZS5jXQorCUF1dG9tYXRlZCBwYXJ0IG9mIHRoZSBjbGllbnQvc2VydmVyIHJlcXVlc3QgY29kZSBnZW5lcmF0aW9uLgorCUFkZGVkIHRyYWNpbmcgb2YgY2xpZW50L3NlcnZlciBjb21tdW5pY2F0aW9uLgorCisJKiBbc2NoZWR1bGVyLyouY10gW3NlcnZlci9wcm9jZXNzLmNdCisJQWRkZWQgc3VwcG9ydCBmb3Igc2VydmVyLXNpZGUgaGFuZGxlcy4KKworCSogW3NjaGVkdWxlci90aHJlYWQuY10KKwlBZGRlZCBETExfVEhSRUFEX0FUVEFDSC9ERVRBQ0ggbm90aWZpY2F0aW9ucy4KKworCSogW2NvbmZpZ3VyZS5pbl0KKwlBZGRlZCBjaGVjayBmb3IgLWxzb2NrZXQuCisKKwkqIFt3aW5kb3dzL3dpbnByb2MuY10KKwlSZXR1cm4gdGhlIHRodW5rIGFkZHJlc3MgaW4gV0lOUFJPQ19HZXRQcm9jIGlmIHRoZSBmdW5jdGlvbiB0eXBlcworCWRvbid0IG1hdGNoLgorCitTYXQgQXVnICA4IDAyOjQ0OjA0IDE5OTggIERvdWdsYXMgUmlkZ3dheSAgPHJpZGd3YXlAd2luZWhxLmNvbT4KKworCSogW3dpbmRvd3Mvd2lucHJvYy5jXVt3aW5kb3dzL3dpbi5jXVt3aW5kb3dzL21lc3NhZ2UuY10gIAorCURvY3VtZW50YXRpb24gZm9yIENhbGxXaW5kb3dQcm9jLCBTZXRXaW5kb3dMb25nLCBEaXNwYXRjaE1lc3NhZ2UsCisJV2FpdE1lc3NhZ2UsIEdldE1lc3NhZ2UsIGFuZCBQZWVrTWVzc2FnZS4KKworU2F0IEF1ZyAgOCAwMTowMDowMCAxOTk4ICBKdWVyZ2VuIFNjaG1pZWQgPGp1ZXJnZW4uc2NobWllZEBtZXRyb25ldC5kZT4KKworCSogW2NvbnRyb2xzL2NvbW1jdHJsLmNdW2NvbnRyb2xzL3dpZGdldHMuY11baW5jbHVkZS9idWlsdGluMzIuaF0KKwkgIFtpbmNsdWRlL2NvbW1jdHJsLmhdW3JlbGF5MzIvYnVpbHRpbjMyLmNdW3JlbGF5MzIvY29tY3RsMzIuc3BlY10KKwkgIFt0b29scy9idWlsZC5jXSBbcmVsYXkzMi9zaGVsbDMyLnNwZWNdCisJQWRkZWQgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIExpYk1haW4gZnVuY3Rpb24uIFRoZSBjb21tb24gCisJY29udHJvbHMgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkIG5vdy4KKworCSogW2NvbnRyb2xzL3RyZWV2aWV3LmNdW21lbW9yeS9hdG9tLmNdW3NjaGVkdWxlci90aHJlYWQuY11bd2luZG93cy9jbGFzcy5jXQorCSAgW3dpbmRvd3MvbXNnYm94LmNdW3dpbmRvd3Mvd2luLmNdCisJUHV0IFRSQUNFIGluLCBwdXQgU2V0TGFzdEVycm9yKCkgaW4uCisKKwkqIFtpbmNsdWRlL2ludGVyZmFjZXMuaF0KKwlBZGRlZCBJQ2xhc3NGYWN0b3J5OjpMb2NrU2VydmVyLgorCisJKiBbaW5jbHVkZS9vbGUyLmhdCisJQWRkZWQgc3RydWN0IGZvciBMUE9MRU1FTlVHUk9VUFdJRFRIUzMyLCBIT0xFTUVOVTMyLgorCisJKiBbaW5jbHVkZS9zaGVsbC5oXVtpbmNsdWRlL3NobG9iai5oXVttaXNjL3NoZWxsLmNdW29sZS9mb2xkZXJzLmNdCisJUmVvcmdhbml6ZWQgYW5kIG1hbnkgc3RydWN0cyBhbmQgY2xhc3NlcyAoSVNoZWxsQnJvd3NlcixJU2hlbGxWaWV3KQorCWFkZGVkLiBzaGVsbDMyLmRsbCBzaG91bGQgd29yayBpbiBtYW55IGNhc2VzIG5vdy4KKwlTdGFydGVkIFNIR2V0RmlsZUluZm9BIGltcGxlbWVudGVhdGlvbiwgcmV3cm90ZSBTSEdldFBhdGhGcm9tSURMaXN0MzJBLgorCU5ldyBTaGVsbDMyTGliTWFpbiBzdGFydGVkIFNoZWxsSWNvbkNhY2hlIEltcGxlbWVudGF0aW9uLgorCisJKiBbbWlzYy9zaGVsbG9yZC5jXQorCVJld3JvdGUgSUxDb21iaW5lLCBJTEdldFNpemUKKwlOZXcgc3R1YnMgU0hGaW5kX0luaXRNZW51UG9wdXAsIEZpbGVNZW51X0NyZWF0ZSwgU2hlbGxFeGVjdXRlRXgsCisJU0hTZXRJbnN0YW5jZUV4cGxvcmVyLCBTSEdldEluc3RhbmNlRXhwbG9yZXIsIFNIRnJlZVVudXNlZExpYnJhcmllcy4KKworCSogW2luY2x1ZGUvd2luZXJyb3IuaF0KKwlDbGFzcyBhbmQgd2luZG93IHJlbGF0ZWQgZXJyb3IgY29kZXMgYWRkZWQuCisKKwkqIFttZW1vcnkvaGVhcC5jXQorCUNoYW5nZWQgbHN0cmxlbjMyQSB0byBzdHJsZW4gdG8gZ2V0IHJpZCBvZiBtaWxpb25zIG9mIFRSQUNFIGxpbmVzLgorCisJKiBbbWlzYy9kZGVtbC5jXQorCUZpcnN0IGxpbmVzIGZvciBEZGVDcmVhdGVTdHJpbmdIYW5kbGUzMkEgLyBEZGVGcmVlU3RyaW5nSGFuZGxlMzIuCisKKwkqIFttaXNjL25ldHdvcmsuY11bcmVsYXkzMi9tcHIuc3BlY10KKwlGaXhlZCBzb21lIGJ1Z3MsIGNoYW5nZWQgb3JkaW5hbHMuCisKKwkqIFt3aW5kb3dzL2NsYXNzLmNdCisJV29ya2Fyb3VuZHMgZm9yIGluY29ycmVjdCBoSW5zdGFuY2UgaGFuZGxpbmcuIEZpeGVzIHBhcnRzIG9mCisJTVNXb3JkOTUvRXhjZWw5NSBhbmQgTW9uZXk5NS4KKworVGh1IEF1ZyAgNiAyMTowNTozNSAxOTk4ICBFcmljIEtvaGwgPGVrb2hsQGFiby5yaGVpbi16ZWl0dW5nLmRlPgorCisJKiBbd2luZG93cy9ub25jbGllbnQuY11bbWlzYy90d2Vhay5jXVtpbmNsdWRlL3R3ZWFrLmhdCisJICBbZG9jdW1lbnRhdGlvbi93aW45NWxvb2tdCisJUmVtb3ZlZCBzb21lIHR3ZWFrIHZhcmlhYmxlcy4gVGhleSBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KKworCSogW2ZpbGVzL2Rvc19mcy5jXQorCUFkZGVkIGNoZWNrIGZvciBudWxsIHBvaW50ZXIgaW4gRE9TRlNfR2V0RGV2aWNlKCkuCisKKwkqIFtjb250cm9scy90b29sdGlwcy5jXVtpbmNsdWRlL2NvbW1jdHJsLmhdCisJSW1wcm92ZWQgdG9vbHRpcHMuCisKKwkqIFtjb250cm9scy9zdGF0dXMuY11baW5jbHVkZS9jb21tY3RybC5oXQorCUNsZWFuZWQgdXAgY29kZSBhbmQgYWRkZWQgdG9vbHRpcCBzdXBwb3J0LgorCisJKiBbY29udHJvbHMvdG9vbGJhci5jXVtpbmNsdWRlL2NvbW1jdHJsLmhdCisJQWRkZWQgdG9vbHRpcCBzdXBwb3J0LgorCisJKiBbZG9jdW1lbnRhdGlvbi9jb21tb25fY29udHJvbHNdCisJVXBkYXRlZC4KKworVGh1IEF1ZyAgNiAwMDowNToyMiAxOTk4ICBVd2UgQm9ubmVzICA8Ym9uQGVsZWt0cm9uLmlrcC5waHlzaWsudHUtZGFybXN0YWR0LmRlPgorCisJKiBbaW5jbHVkZS92ZXIuaF0gW21pc2MvdmVyLmNdCisJV3JpdGUgVklGX0JVRkZUT09TTUFMTCwgbm90IFZJRl9CVUZUT1NNQUxMLgorCisJKiBbZGVidWdnZXIvaGFzaC5jXSBbZGVidWdnZXIvc3RhYnMuY10KKwlNYWtlIGRlYnVnIG91dHB1dCBtb3JlIGZyaWVuZGx5IGZvciBwb3N0aW5nLgorCisJKiBbZmlsZXMvZmlsZS5jXQorCVBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2YgT0ZfU0hBUkVfRVhDTFVTSVZFLgorCU5lZWRlZCBmb3IgUXVpY2tsb2dpYy9RdWlja0NoaXAgKEluc3RhbGxTaGllbGQpLgorCisJKiBbZmlsZXMvcHJvZmlsZS5jXQorCVdoZW4gYSBjYWNoZWQtb25seSBlbnRyeSBpcyBmb3VuZCwgcmV0dXJuIGl0LgorCisJKiBbZ3JhcGhpY3MveDExZHJ2L3hmb250LmNdCisJQWNjZXB0IGEgc3BhY2UgYXMgZGVsaW1pdGVyIGZvciBhIGZvbnRuYW1lIGFuZCBpbmhpYml0IG92ZXJydW4KKwkoTWFrZSB4cGxhc2ltLmV4IGZyb20gdGhlIFBoaWxsaXBzIENvb2xydW5uZXIgQ1BMRCBzdWl0ZSBwcm9jZWVkKS4KKworCSogW21pc2NlbXUvbWFpbi5jXQorCURlbGF5IHNldHRpbmcgSUYxNjMyX0NhbGxMYXJnZVN0YWNrIGFmdGVyIGxvYWRpbmcgdGhlIGV4ZWN1dGFibGVzLgorCVN0b3BzIGZwZ2FleHAuZXhlIGZyb20gdGhlIFZpZXdsb2dpYyBGUEdBIHN1aXRlIGZyb20gY3Jhc2hpbmcgd2hlbgorIAlzaG93aW5nIHRoZSBCbGlua2VyIGVycm9yIE1lc3NhZ2UgQm94LgorCisJKiBbbWlzYy9uZXR3b3JrLmNdCisJTWFrZSBXTmV0R2V0Q29ubmVjdGlvbjE2IHJlY29nbmlzZSBhIENEUk9NIGFzIGEgbG9jYWwgZHJpdmUuCisKKwkqIFttdWx0aW1lZGlhL21tc3lzdGVtLmNdCisJUHJlbGltaW5hcnkgY2hlY2sgZm9yIE1DSV9BTExfREVWSUNFX0lEIGluIE1DSV9DbG9zZSBieSBhIEZJWE1FLgorCisKK1R1ZSBBdWcgNCAyMToxNToyMyAxOTk4ICBKYW1lcyBKdXJhbiA8anJqMTIwQHBzdS5lZHU+CisKKwkqIFtvbGUvb2xlMm5scy5jXQorCUZpeGVkIGJ1ZyBpbiBDb21wYXJlU3RyaW5nMzJBLiAgc3RyY21wKCkgZG9lc24ndCBuZWNlc3NhcmlseQorCXJldHVybiAtMSwgMCwgb3IgMSwgd2hpY2ggdGhlIHByZXZpb3VzIGNvZGUgZGVwZW5kZWQgb24uCisJQ2hhbmdlZCBuYW1lIG9mIGlzX3B1bmN0dWF0aW9uIHRvIE9MRTJOTFNfaXNQdW5jdHVhdGlvbi4KKwlNYWRlIE5PUk1fSUdOT1JFV0lEVEggbm90IHByaW50IGEgRklYTUUgbWVzc2FnZSBpbiAKKwlMQ01hcFN0cmluZzMyQS4KKwlPdGhlciBkZWJ1Z2dpbmcgbWVzc2FnZXMsIGRvY3VtZW50YXRpb24sIGFuZCBjb2RlIGNsZWFudXBzLgorCisJKiBbb2JqZWN0cy9mb250LmNdIFtyZWxheTMyL2dkaTMyLnNwZWNdIFtpbmNsdWRlL3dpbmVycm9yLmhdCisJQWRkZWQgc3R1YiBmb3IgR2V0Rm9udERhdGEzMiwgYW5kIGFkZGVkIEdESV9FUlJPUiBjb25zdGFudCAKKwl0byB3aW5lcnJvci5oLgorCitUdWUgQXVnICA0IDA3OjQ0OjQzIDE5OTggIE92ZSBLYWF2ZW4gPG92ZWtAYXJjdGljbmV0Lm5vPgorCisJKiBbbXVsdGltZWRpYS9tbWlvLmNdCisJSW1wbGVtZW50ZWQgbW1pb1NldEJ1ZmZlciwgbW1pb0FkdmFuY2UsIG1taW9Bc2NlbmQsIGFuZAorCW1taW9DcmVhdGVDaHVuayB0byB0aGUgYmVzdCBvZiBteSBrbm93bGVkZ2UuIEJ1dCB3YXRjaCBvdXQsCisJdGhlcmUncyBib3VuZCB0byBiZSBidWdzIGluIHRoZXJlLi4uCisKKwkqIFtpbmNsdWRlL21tc3lzdGVtLmhdIFttdWx0aW1lZGlhL21tc3lzdGVtLmNdCisJSGFja2VkIGluIHN1cHBvcnQgZm9yIDMyLWJpdCBtdWx0aW1lZGlhIGZ1bmN0aW9uIGNhbGxiYWNrcy4KKworCSogW0FVVEhPUlNdIFttaXNjL3NoZWxsLmNdCisJU2VsZmlzaGx5IGNyZWRpdGVkIG15IGF1dGhvcnNoaXAuIEhvcGVmdWxseSBJJ20gZXhjdXNlZC4KKworCSogW2luY2x1ZGUvZG9zZXhlLmhdIFtpbmNsdWRlL21vZHVsZS5oXSBbbG9hZGVyL2Rvcy8qXQorCSAgW2xvYWRlci9tb2R1bGUuY10gW2xvYWRlci90YXNrLmNdIFtNYWtlZmlsZS5pbl0KKwkgIFtjb25maWd1cmUuaW5dIFtNYWtlZmlsZS5pbl0KKwlBZGRlZCBET1MgRVhFIChNWikgbG9hZGVyIGFuZCB2aXJ0dWFsIG1hY2hpbmUuIFRhc2sKKwlzdHJ1Y3R1cmUgaW50ZWdyYXRpb24gdGhhbmtzIHRvIFVscmljaCBXZWlnYW5kLgorCisJKiBbZmlsZXMvZG9zX2ZzLmNdCisJV29yayBhcm91bmQgYSBudWxsIHBvaW50ZXIgZGVyZWZlcmVuY2UgaWYgaW9jdGxHZXREZXZpY2VJbmZvLWluZworCWEgRklMRV9EdXBVbml4SGFuZGxlJ2QgZmlsZSAoaS5lLiBHZXRTdGRIYW5kbGUnZCkuCisKKwkqIFtpbmNsdWRlL21pc2NlbXUuaF0gW2luY2x1ZGUvd2lubnQuaF0gW2xvYWRlci9tYWluLmNdCisJICBbbWVtb3J5L2dsb2JhbC5jXSBbbXNkb3MvZHBtaS5jXSBbbXNkb3MvZG9zbWVtLmNdCisJQWRkZWQgc3VwcG9ydCBmb3IgRE9TIG1lbW9yeSBpbWFnZXMsIGFuZCBhZGRlZAorCURPU01FTV9SZXNpemVCbG9jaygpIGFuZCBET1NNRU1fQXZhaWxhYmxlKCkuCisKKwkqIFttc2Rvcy9pbnQyMS5jXQorCUFkZGVkIHN1cHBvcnQgZm9yIHRoZSBET1MgdmlydHVhbCBtYWNoaW5lLCB0d2Vha2VkIGhhbmRsZQorCWFzc2lnbm1lbnQgdG8gYXZvaWQgc3RkaW8gY2xhc2hlcywgZm9yY2VkIElOVDIxX0ZpbmROZXh0IHRvIGV4aXQKKwl3aWxkY2FyZGxlc3Mgc2VhcmNoZXMgYWZ0ZXIgZmluZGluZyBvbmUgZW50cnksIGFkZGVkIEFIPTcsIDgsIDksCisJQywgNDgsIDQ5LCA0QSwgYW5kIDcxNjAgQ0w9MSAoR2V0IFNob3J0IEZpbGVuYW1lKSwgYW5kIG1hZGUgdGhlCisJbG9uZyBmaWxlbmFtZSBjYWxscyBvbmx5IHJlc3BvbmQgaWYgcnVubmluZyB3aXRoIHdpdGggLXdpbnZlcgorCXdpbjk1LgorCisJKiBbb2JqZWN0cy9jdXJzb3JpY29uLmNdCisJRGVzdHJveUN1cnNvcjMyIGFuZCBEZXN0cm95SWNvbjMyIHNob3VsZCBub3cgZnJlZSB0aGUgb2JqZWN0cworCShob3BlZnVsbHkpIGNvcnJlY3RseS4KKworU3VuIEF1ZyAgMiAyMTo0MjowOSAxOTk4ICBIdXcgRCBNIERhdmllcyA8ZGF2aWVzaEBhYmFjdXMucGh5c2ljcy5veC5hYy51az4KKworCSogW2dyYXBoaWNzL3BzZHJ2LypdIFtpbmNsdWRlL3BzZHJ2LmhdCisJQWRkZWQgUFBEIGZpbGUgcGFyc2luZyAtIGF0IHRoZSBtb21lbnQgaXQgcmVhZHMgYSBmaWxlIGNhbGxlZAorCWRlZmF1bHQucHBkIGZyb20gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB5b3Ugc3RhcnQgV2luZS4gUGFnZSBzaXplcworCW90aGVyIHRoYW4gQTQgc2hvdWxkIG5vdyB3b3JrIChsYW5kc2NhcGUgbWF5IG5vdCkuIEFsbCBmb250cyB0aGF0IGFyZQorCXByZXNlbnQgb24geW91ciBwcmludGVyIChhY2NvcmRpbmcgdG8gdGhlIFBQRCkgc2hvdWxkIGJlIGF2YWlsYWJsZSwKKwlwcm92aWRpbmcgeW91IGhhdmUgdGhlIEFGTSBmaWxlcy4gRm9udHMgc2hvdWxkIG5vdyBiZSB0aGUgY29ycmVjdCBzaXplLgorCUdyYXBoaWNzIGlzIHN0aWxsIGJhc2ljYWxseSBsaW5lcyBvbmx5LiBTZWUgZ3JhcGhpY3MvcHNkcnYvUkVBRE1FIC4KKworCSogW21pc2MvcHJpbnRkcnYuY10KKwlZZXQgbW9yZSBEcnZbR2V0L1NldF1QcmludGVyRGF0YSBmaXhlcy4KKworRnJpIEp1bCAzMSAyMTozMzoyMiAxOTk4ICBQZXIgTGluZHN0cvZtIDxwZWxpbnN0ckBhbGdvbmV0LnNlPgorCisJKiBbcmVsYXkzMi9jcnRkbGwuc3BlY10gW21pc2MvY3J0ZGxsLmNdCisJQWRkZWQgc3R1YiBmb3IgZnJlb3BlbiwgX2ZpbmRmaXJzdCwgX2ZpbmRuZXh0LCBfZnN0YXQgYW5kIF9yZWFkLgorCisJKiBbZmlsZXMvZGlyZWN0b3J5LmNdCisJTW9kaWZpZWQgd2FybmluZyBtZXNzYWdlLgorCitXZWQgSnVsIDI5IDExOjI1OjI4IDE5OTggIEx1aXogT3RhdmlvIEwuIFpvcnplbGxhICA8em9yemVsbGFAbnIuY29uZXh3YXJlLmNvbT4KKworCSogW29iamVjdHMvZm9udC5jXQorCUFkZGVkIHN0dWIgZm9yIEdldEZvbnREYXRhLgorCisJKiBbbXVsdGltZWRpYS9tc3ZpZGVvLmNdCisJQ3JlYXRlZCB0aGlzIGZpbGUgdG8gaG9sZCB0aGUgbXN2aWRlby5kbGwgY2FsbHMgKGFuZCBtYXliZSBhbHNvCisJbXN2ZnczMi5kbGwpLiAKKworCSogW29iamVjdHMvY3Vyc29yaWNvbi5jXQorCUFkZGVkIHNlYXJjaCBpbiBHbG9iYWwgSGVhcCBmb3IgY3Vyc29yIHdoZW4gdHJ5aW5nIHRvIGRlc3Ryb3kgaXQKKwl3aXRoIERlc3Ryb3lDdXJzb3IxNi4gVGhpcyB0ZXN0IHNob3VsZCBiZSBkb25lIGluIG1hbnkgKGFsbD8pCisJb3RoZXIgZnVuY3Rpb25zIHRoYXQgdXNlIEZyZWVSZXNvdXJjZS4KKworCSogW2NvbnRyb2xzL3RyZWV2aWV3LmNdIFtpbmNsdWRlL2NvbW1jdHJsLmhdCisJTWlub3IgY29ycmVjdGlvbiBpbiBuYW1lIGFuZCBhZGRpdGlvbiBvZiBtYW55IHBsYWNlaG9sZGVycyBmb3IgVFZNCisJbWVzc2FnZXMgaW4gVFJFRVZJRVdfV2luZG93UHJvYy4KKworCSogW21zZG9zL2RwbWkuY10KKwlGaXhlZCBhIGJ1ZyBpbiBEUE1JX3hyZWFsbG9jIHdoZXJlIGluIGEgY29weSBvZiBhIG1lbW9yeSByZWdpb24KKwkiQSIgb2Ygc2l6ZSAiYSIgdG8gYSByZWdpb24gIkIiIG9mIHNpemUgImIiLCAiYiIgYnl0ZXMgd2VyZSBiZWluZworCWNvcGllZCwgaW5zdGVhZCBvZiAiYSIsIGFzIHRoZSBuZXcgdmVyc2lvbiBkb2VzLiBUaGlzIGJvdGgKKwlpbmNyZWFzZXMgc3BlZWQsIGFzIHdlbGwgYXMgYXZvaWRzIHNlZ2ZhdWx0cy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU2F0IEp1bCAyNSAxOTo0NTo0NSAxOTk4ICBKdWVyZ2VuIFNjaG1pZWQgPGp1ZXJnZW4uc2NobWllZEBtZXRyb25ldC5kZT4KIAogCSogW2luY2x1ZGUvc2hsb2JqLmhdW21pc2Mvc2hlbGwuY11bbWlzYy9zaGVsbG9yZC5jXVtvbGUvZm9sZGVycy5jXQpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuaW4gYi9NYWtlZmlsZS5pbgppbmRleCBlNzkwMDhjLi41MmEzYjZhIDEwMDY0NAotLS0gYS9NYWtlZmlsZS5pbgorKysgYi9NYWtlZmlsZS5pbgpAQCAtMzQsNiArMzQsNyBAQAogCWxpYnJhcnkgXAogCWxvYWRlciBcCiAJbG9hZGVyL25lIFwKKwlsb2FkZXIvZG9zIFwKIAltZW1vcnkgXAogCW1pc2MgXAogCW1zZG9zIFwKQEAgLTgxLDYgKzgyLDcgQEAKIAlpcGMvaXBjLm8gXAogCWxvYWRlci9sb2FkZXIubyBcCiAJbG9hZGVyL25lL25lLm8gXAorCWxvYWRlci9kb3MvZG9zLm8gXAogCW1lbW9yeS9tZW1vcnkubyBcCiAJbWlzYy9taXNjLm8gXAogCW1zZG9zL21zZG9zLm8gXApAQCAtMTMxLDYgKzEzMyw3IEBACiAJLW1rZGlyaGllciAkKGxpYmRpcikKIAkkKElOU1RBTExfUFJPR1JBTSkgd2luZSAkKGJpbmRpcikvd2luZQogCSQoSU5TVEFMTF9EQVRBKSB3aW5lLnN5bSAkKGxpYmRpcikvd2luZS5zeW0KKwkkKElOU1RBTExfUFJPR1JBTSkgbG9hZGVyL2Rvcy9kb3Ntb2QgJChiaW5kaXIpL2Rvc21vZAogCiBpbnN0YWxsX2xpYjogaW5zdGFsbF9pbmNsdWRlcwogCSQoSU5TVEFMTF9EQVRBKSAkKExJQl9UQVJHRVQpICQobGliZGlyKQpkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCmluZGV4IDI1YmU4ZjQuLmYyNjdkZTEgMTAwNjQ0Ci0tLSBhL1JFQURNRQorKysgYi9SRUFETUUKQEAgLTE1LDcgKzE1LDcgQEAKIAogCUxpbnV4IHZlcnNpb24gMC45OS4xMyBvciBhYm92ZQogCU5ldEJTRC1jdXJyZW50Ci0JRnJlZUJTRC1jdXJyZW50IG9yIEZyZWVCU0QgMS4xCisJRnJlZUJTRC1jdXJyZW50IG9yIEZyZWVCU0QgMS4xIG9yIGxhdGVyCiAJT3BlbkJTRC9pMzg2IDIuMSBvciBsYXRlcgogCVNvbGFyaXMgeDg2IDIuNSBvciBsYXRlcgogCmRpZmYgLS1naXQgYS9jb25maWd1cmUgYi9jb25maWd1cmUKaW5kZXggMDQ2OTViMi4uODQwOTM4ZSAxMDA3NTUKLS0tIGEvY29uZmlndXJlCisrKyBiL2NvbmZpZ3VyZQpAQCAtMjQ1Nyw3ICsyNDU3LDcgQEAKIGZpCiAKIAotZm9yIGFjX2Z1bmMgaW4gY2xvbmUgZ2V0cGFnZXNpemUgbWVtbW92ZSBzaWdhbHRzdGFjayBzdHJlcnJvciBzdHJpY21wIHRjZ2V0YXR0ciB0aW1lZ20gdXNsZWVwIHdhaXQ0IHdhaXRwaWQgdmZzY2FuZgorZm9yIGFjX2Z1bmMgaW4gY2xvbmUgZ2V0cGFnZXNpemUgbWVtbW92ZSBzZW5kbXNnIHNpZ2FsdHN0YWNrIHN0cmVycm9yIHN0cmljbXAgdGNnZXRhdHRyIHRpbWVnbSB1c2xlZXAgd2FpdDQgd2FpdHBpZCB2ZnNjYW5mCiBkbwogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKIGVjaG8gImNvbmZpZ3VyZToyNDY0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQpAQCAtMjg2MSwxNSArMjg2MSw2NiBAQAogCiAKIAoraWYgdGVzdCAkYWNfY3ZfZnVuY19zZW5kbXNnID0gbm87IHRoZW4KKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igc2VuZG1zZyBpbiAtbHNvY2tldCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Mjg2NzogY2hlY2tpbmcgZm9yIHNlbmRtc2cgaW4gLWxzb2NrZXQiID4mNQorYWNfbGliX3Zhcj1gZWNobyBzb2NrZXQnXydzZW5kbXNnIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbHNvY2tldCAgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAyODc1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgc2VuZG1zZygpOworCitpbnQgbWFpbigpIHsKK3NlbmRtc2coKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI4ODY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gc29ja2V0IHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCisgICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2xpYiAxCitFT0YKKworICBMSUJTPSItbHNvY2tldCAkTElCUyIKKworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2ZpCisKKwogaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zeXNfdmZzX2giID0gInllcyIKIHRoZW4KICAgICBlY2hvICRhY19uICJjaGVja2luZyAid2hldGhlciBzeXMvdmZzLmggZGVmaW5lcyBzdGF0ZnMiIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODY4OiBjaGVja2luZyAid2hldGhlciBzeXMvdmZzLmggZGVmaW5lcyBzdGF0ZnMiIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyOTE5OiBjaGVja2luZyAid2hldGhlciBzeXMvdmZzLmggZGVmaW5lcyBzdGF0ZnMiIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneyd3aW5lX2N2X3N5c192ZnNfaGFzX3N0YXRmcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4NzMgImNvbmZpZ3VyZSIKKyNsaW5lIDI5MjQgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiAJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpAQCAtMjg4Niw3ICsyOTM3LDcgQEAKIAkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODkwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI5NDE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICB3aW5lX2N2X3N5c192ZnNfaGFzX3N0YXRmcz15ZXMKIGVsc2UKQEAgLTI5MTMsMTIgKzI5NjQsMTIgQEAKIGlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc3lzX3N0YXRmc19oIiA9ICJ5ZXMiCiB0aGVuCiAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgIndoZXRoZXIgc3lzL3N0YXRmcy5oIGRlZmluZXMgc3RhdGZzIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjkxNzogY2hlY2tpbmcgIndoZXRoZXIgc3lzL3N0YXRmcy5oIGRlZmluZXMgc3RhdGZzIiIgPiY1CitlY2hvICJjb25maWd1cmU6Mjk2ODogY2hlY2tpbmcgIndoZXRoZXIgc3lzL3N0YXRmcy5oIGRlZmluZXMgc3RhdGZzIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snd2luZV9jdl9zeXNfc3RhdGZzX2hhc19zdGF0ZnMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTIyICJjb25maWd1cmUiCisjbGluZSAyOTczICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTI5MzMsNyArMjk4NCw3IEBACiAJCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjkzNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTg4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgd2luZV9jdl9zeXNfc3RhdGZzX2hhc19zdGF0ZnM9eWVzCiBlbHNlCkBAIC0yOTYwLDEyICszMDExLDEyIEBACiBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N5c19tb3VudF9oIiA9ICJ5ZXMiCiB0aGVuCiAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgIndoZXRoZXIgc3lzL21vdW50LmggZGVmaW5lcyBzdGF0ZnMiIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyOTY0OiBjaGVja2luZyAid2hldGhlciBzeXMvbW91bnQuaCBkZWZpbmVzIHN0YXRmcyIiID4mNQorZWNobyAiY29uZmlndXJlOjMwMTU6IGNoZWNraW5nICJ3aGV0aGVyIHN5cy9tb3VudC5oIGRlZmluZXMgc3RhdGZzIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snd2luZV9jdl9zeXNfbW91bnRfaGFzX3N0YXRmcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5NjkgImNvbmZpZ3VyZSIKKyNsaW5lIDMwMjAgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiAJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpAQCAtMjk4MCw3ICszMDMxLDcgQEAKIAkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTg0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwMzU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICB3aW5lX2N2X3N5c19tb3VudF9oYXNfc3RhdGZzPXllcwogZWxzZQpAQCAtMzAwNiw3ICszMDU3LDcgQEAKIAogCiBlY2hvICRhY19uICJjaGVja2luZyAiZm9yIHN0YXRmcy5mX2JmcmVlIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzAxMDogY2hlY2tpbmcgImZvciBzdGF0ZnMuZl9iZnJlZSIiID4mNQorZWNobyAiY29uZmlndXJlOjMwNjE6IGNoZWNraW5nICJmb3Igc3RhdGZzLmZfYmZyZWUiIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneyd3aW5lX2N2X3N0YXRmc19iZnJlZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0zMDE1LDcgKzMwNjYsNyBAQAogICAgICAgICB3aW5lX2N2X3N0YXRmc19iZnJlZT1ubwogICAgIGVsc2UKICAgICAJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzAxOSAiY29uZmlndXJlIgorI2xpbmUgMzA3MCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIAkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC0zMDQyLDcgKzMwOTMsNyBAQAogCQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwNDY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzA5NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIHdpbmVfY3Zfc3RhdGZzX2JmcmVlPXllcwogZWxzZQpAQCAtMzA2Niw3ICszMTE3LDcgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nICJmb3Igc3RhdGZzLmZfYmF2YWlsIiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA3MDogY2hlY2tpbmcgImZvciBzdGF0ZnMuZl9iYXZhaWwiIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTozMTIxOiBjaGVja2luZyAiZm9yIHN0YXRmcy5mX2JhdmFpbCIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J3dpbmVfY3Zfc3RhdGZzX2JhdmFpbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0zMDc1LDcgKzMxMjYsNyBAQAogICAgICAgICB3aW5lX2N2X3N0YXRmc19iYXZhaWw9bm8KICAgICBlbHNlCiAgICAgCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwNzkgImNvbmZpZ3VyZSIKKyNsaW5lIDMxMzAgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiAJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpAQCAtMzEwMiw3ICszMTUzLDcgQEAKIAkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTA2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxNTc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICB3aW5lX2N2X3N0YXRmc19iYXZhaWw9eWVzCiBlbHNlCkBAIC0zMTI3LDcgKzMxNzgsNyBAQAogCiAKIGVjaG8gJGFjX24gImNoZWNraW5nICJmb3Igd29ya2luZyBzaWdhbHRzdGFjayIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxMzE6IGNoZWNraW5nICJmb3Igd29ya2luZyBzaWdhbHRzdGFjayIiID4mNQorZWNobyAiY29uZmlndXJlOjMxODI6IGNoZWNraW5nICJmb3Igd29ya2luZyBzaWdhbHRzdGFjayIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfd29ya2luZ19zaWdhbHRzdGFjaycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0zMTM2LDcgKzMxODcsNyBAQAogCiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMxNDAgImNvbmZpZ3VyZSIKKyNsaW5lIDMxOTEgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiAJI2luY2x1ZGUgPHN0ZGlvLmg+CkBAIC0zMTc0LDcgKzMyMjUsNyBAQAogCX0KIAkKIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTc4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyMjk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKIHRoZW4KICAgYWNfY3ZfY193b3JraW5nX3NpZ2FsdHN0YWNrPSJ5ZXMiCiBlbHNlCkBAIC0zMjAxLDEyICszMjUyLDEyIEBACiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgImZvciBtc2dfYWNjcmlnaHRzIGluIHN0cnVjdCBtc2doZHIiIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjA1OiBjaGVja2luZyAiZm9yIG1zZ19hY2NyaWdodHMgaW4gc3RydWN0IG1zZ2hkciIiID4mNQorZWNobyAiY29uZmlndXJlOjMyNTY6IGNoZWNraW5nICJmb3IgbXNnX2FjY3JpZ2h0cyBpbiBzdHJ1Y3QgbXNnaGRyIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19tc2dfYWNjcmlnaHRzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzIxMCAiY29uZmlndXJlIgorI2xpbmUgMzI2MSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgpAQCAtMzIxNCw3ICszMjY1LDcgQEAKIHN0cnVjdCBtc2doZHIgaGRyOyBoZHIubXNnX2FjY3JpZ2h0cz0wCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzIxODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjY5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19tc2dfYWNjcmlnaHRzPSJ5ZXMiCiBlbHNlCkBAIC0zMzU4LDYgKzM0MDksNyBAQAogbGlidGVzdC9NYWtlZmlsZQogbG9hZGVyL01ha2VmaWxlCiBsb2FkZXIvbmUvTWFrZWZpbGUKK2xvYWRlci9kb3MvTWFrZWZpbGUKIG1lbW9yeS9NYWtlZmlsZQogbWlzYy9NYWtlZmlsZQogbWlzY2VtdS9NYWtlZmlsZQpAQCAtMzQ5Miw2ICszNTQ0LDcgQEAKIGxpYnRlc3QvTWFrZWZpbGUKIGxvYWRlci9NYWtlZmlsZQogbG9hZGVyL25lL01ha2VmaWxlCitsb2FkZXIvZG9zL01ha2VmaWxlCiBtZW1vcnkvTWFrZWZpbGUKIG1pc2MvTWFrZWZpbGUKIG1pc2NlbXUvTWFrZWZpbGUKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5pbiBiL2NvbmZpZ3VyZS5pbgppbmRleCA1MjU2ZTI1Li4xOTczMWRmIDEwMDY0NAotLS0gYS9jb25maWd1cmUuaW4KKysrIGIvY29uZmlndXJlLmluCkBAIC0yNDAsMTMgKzI0MCwxOSBAQAogCiBkbmwgKioqKiBDaGVjayBmb3IgZnVuY3Rpb25zIGFuZCBoZWFkZXIgZmlsZXMgKioqKgogCi1BQ19DSEVDS19GVU5DUyhjbG9uZSBnZXRwYWdlc2l6ZSBtZW1tb3ZlIHNpZ2FsdHN0YWNrIHN0cmVycm9yIHN0cmljbXAgdGNnZXRhdHRyIHRpbWVnbSB1c2xlZXAgd2FpdDQgd2FpdHBpZCB2ZnNjYW5mKQorQUNfQ0hFQ0tfRlVOQ1MoY2xvbmUgZ2V0cGFnZXNpemUgbWVtbW92ZSBzZW5kbXNnIHNpZ2FsdHN0YWNrIHN0cmVycm9yIHN0cmljbXAgdGNnZXRhdHRyIHRpbWVnbSB1c2xlZXAgd2FpdDQgd2FpdHBpZCB2ZnNjYW5mKQogQUNfQ0hFQ0tfSEVBREVSUyh3Y3R5cGUuaCBzeXMvc3lzY2FsbC5oIHN5c2NhbGwuaCBzeXMvcGFyYW0uaCBzeXMvdmZzLmggc3lzL21vdW50Lmggc3lzL3N0YXRmcy5oIGZsb2F0LmggbGludXgvY2Ryb20uaCBsaW51eC91Y2Ryb20uaCBzeXMvY2Rpby5oIHN5cy9maWxpby5oIHN5cy9tb2RlbS5oIHN0cmluZ3MuaCBzeXMvc3RydGlvLmgpCiBBQ19IRUFERVJfU1RBVCgpCiBBQ19DX0NPTlNUKCkKIEFDX1RZUEVfU0laRV9UKCkKIEFDX0NIRUNLX1NJWkVPRihsb25nIGxvbmcsMCkKIAorZG5sICoqKiogQ2hlY2sgZm9yIHNlbmRtc2cgaW4gLWxzb2NrZXQgaWYgbm90IGZvdW5kIGFib3ZlICoqKioKKworaWYgdGVzdCAkYWNfY3ZfZnVuY19zZW5kbXNnID0gbm87IHRoZW4KKyAgICBBQ19DSEVDS19MSUIoc29ja2V0LHNlbmRtc2cpCitmaQorCiBkbmwgKioqKiBzdGF0ZnMgY2hlY2tzICoqKioKIAogaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zeXNfdmZzX2giID0gInllcyIKQEAgLTQ2Nyw2ICs0NzMsNyBAQAogbGlidGVzdC9NYWtlZmlsZQogbG9hZGVyL01ha2VmaWxlCiBsb2FkZXIvbmUvTWFrZWZpbGUKK2xvYWRlci9kb3MvTWFrZWZpbGUKIG1lbW9yeS9NYWtlZmlsZQogbWlzYy9NYWtlZmlsZQogbWlzY2VtdS9NYWtlZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJvbHMvY29tY3RsMzJ1bmRvYy5jIGIvY29udHJvbHMvY29tY3RsMzJ1bmRvYy5jCmluZGV4IDdjYzI0YWEuLjcwMjc5NjAgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2NvbWN0bDMydW5kb2MuYworKysgYi9jb250cm9scy9jb21jdGwzMnVuZG9jLmMKQEAgLTQyLDkgKzQyLDYgQEAKIH0gRFBBX0RBVEEsICpMUERQQV9EQVRBOwogCiAKLURXT1JEIFdJTkFQSSBEU0FfQ3JlYXRlIChEV09SRCwgRFdPUkQpOwotCi0KIERXT1JEIFdJTkFQSSBEUEFfQ3JlYXRlIChEV09SRCk7CiBEV09SRCBXSU5BUEkgRFBBX0dldFB0ciAoRFdPUkQsIERXT1JEKTsKIERXT1JEIFdJTkFQSSBEUEFfSW5zZXJ0UHRyIChEV09SRCwgRFdPUkQsIERXT1JEKTsKQEAgLTI1NSwyNCArMjUyLDI0IEBACiAKIAogRFdPUkQgV0lOQVBJCi1EU0FfSW5zZXJ0SXRlbSAoRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yLCBEV09SRCBkd1BhcmFtMykKK0RTQV9JbnNlcnRJdGVtIChEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIsIExQU1RSIGxwU3RyaW5nKQogewogICAgIExQRFNBX0RBVEEgZHNhUHRyID0gKExQRFNBX0RBVEEpZHdQYXJhbTE7CiAgICAgRFdPUkQgZHdJbmRleDsKICAgICBJTlQzMiBsZW47CiAKICAgICBUUkFDRSAoY29tbWN0cmwsICIoMHglMDhseCAweCUwOGx4IFwiJXNcIik6c2VtaS1zdHViIVxuIiwKLQkgICBkd1BhcmFtMSwgZHdQYXJhbTIsIChMUFNUUilkd1BhcmFtMyk7CisJICAgZHdQYXJhbTEsIGR3UGFyYW0yLCBscFN0cmluZyk7CiAKICAgICBpZiAoZHNhUHRyLT5wdHJzID09IE5VTEwpIHsKIAlkc2FQdHItPnB0cnMgPSAoTFBTVFIqKUhlYXBBbGxvYyAoR2V0UHJvY2Vzc0hlYXAgKCksIEhFQVBfWkVST19NRU1PUlksCiAJCQkJCSAgZHNhUHRyLT5kd0luaXRpYWwgKiBzaXplb2YoTFBWT0lEKSk7CiAJZHNhUHRyLT5kd01heENvdW50ID0gZHNhUHRyLT5kd0luaXRpYWw7CiAgICAgICAgIGR3SW5kZXggPSAwOwotCWxlbiA9IGxzdHJsZW4zMkEgKChMUFNUUilkd1BhcmFtMyk7CisJbGVuID0gbHN0cmxlbjMyQSAobHBTdHJpbmcpOwogCWRzYVB0ci0+cHRyc1tkd0luZGV4XSA9CiAJICAgIChMUFNUUilIZWFwQWxsb2MgKEdldFByb2Nlc3NIZWFwICgpLCBIRUFQX1pFUk9fTUVNT1JZLCBsZW4rMSk7Ci0JbHN0cmNweTMyQSAoZHNhUHRyLT5wdHJzW2R3SW5kZXhdLCAoTFBTVFIpZHdQYXJhbTMpOworCWxzdHJjcHkzMkEgKGRzYVB0ci0+cHRyc1tkd0luZGV4XSwgbHBTdHJpbmcpOwogICAgIH0KICAgICBlbHNlIHsKIAlUUkFDRSAoY29tbWN0cmwsICIoMHglMDhseCAweCUwOGx4KVxuIiwKQEAgLTI4MCwxMCArMjc3LDEwIEBACiAJaWYgKGR3UGFyYW0yID49IGRzYVB0ci0+ZHdFbnRyeUNvdW50KSB7CiAJICAgIGlmIChkc2FQdHItPmR3RW50cnlDb3VudCA8IGRzYVB0ci0+ZHdNYXhDb3VudCkgewogCQlkd0luZGV4ID0gZHNhUHRyLT5kd0VudHJ5Q291bnQ7Ci0JCWxlbiA9IGxzdHJsZW4zMkEgKChMUFNUUilkd1BhcmFtMyk7CisJCWxlbiA9IGxzdHJsZW4zMkEgKGxwU3RyaW5nKTsKIAkJZHNhUHRyLT5wdHJzW2R3SW5kZXhdID0KIAkJICAgIChMUFNUUilIZWFwQWxsb2MgKEdldFByb2Nlc3NIZWFwICgpLCBIRUFQX1pFUk9fTUVNT1JZLCBsZW4rMSk7Ci0JCWxzdHJjcHkzMkEgKGRzYVB0ci0+cHRyc1tkd0luZGV4XSwgKExQU1RSKWR3UGFyYW0zKTsKKwkJbHN0cmNweTMyQSAoZHNhUHRyLT5wdHJzW2R3SW5kZXhdLCBscFN0cmluZyk7CiAJICAgIH0KIAkgICAgZWxzZSB7CiAJCS8qIGFsbG9jYXRlIG5ldyBwb2ludGVyIGxpc3QgYW5kIGNvcHkgYWxsIHBvaW50ZXJzICovCkBAIC0yOTgsMTAgKzI5NSwxMCBAQAogCiAJCS8qIGFkZCBuZXcgc3RyaW5nICovCiAJCWR3SW5kZXggPSBkc2FQdHItPmR3RW50cnlDb3VudDsKLQkJbGVuID0gbHN0cmxlbjMyQSAoKExQU1RSKWR3UGFyYW0zKTsKKwkJbGVuID0gbHN0cmxlbjMyQSAobHBTdHJpbmcpOwogCQlkc2FQdHItPnB0cnNbZHdJbmRleF0gPQogCQkgICAgKExQU1RSKUhlYXBBbGxvYyAoR2V0UHJvY2Vzc0hlYXAgKCksIEhFQVBfWkVST19NRU1PUlksIGxlbisxKTsKLQkJbHN0cmNweTMyQSAoZHNhUHRyLT5wdHJzW2R3SW5kZXhdLCAoTFBTVFIpZHdQYXJhbTMpOworCQlsc3RyY3B5MzJBIChkc2FQdHItPnB0cnNbZHdJbmRleF0sIGxwU3RyaW5nKTsKIAkgICAgfQogCX0KIAllbHNlIHsKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2NvbW1jdHJsLmMgYi9jb250cm9scy9jb21tY3RybC5jCmluZGV4IDcyOGYxMjMuLjRiZTY1NDAgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2NvbW1jdHJsLmMKKysrIGIvY29udHJvbHMvY29tbWN0cmwuYwpAQCAtMjIsNyArMjIsMTggQEAKICNpbmNsdWRlICJ1cGRvd24uaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvbUN0bDMyTGliTWFpbgorICovCiAKK0JPT0wzMiBXSU5BUEkgQ29tQ3RsMzJMaWJNYWluIChISU5TVEFOQ0UzMiBoaW5zdERMTCwgRFdPUkQgZmR3UmVhc29uLCBMUFZPSUQgbHB2UmVzZXJ2ZWQpCit7IFRSQUNFKGNvbW1jdHJsLCIleCwlbHgsJXBcbiIsaGluc3RETEwsZmR3UmVhc29uLGxwdlJlc2VydmVkKTsKKyAgaWYgKCBmZHdSZWFzb24gPT0gRExMX1BST0NFU1NfQVRUQUNIKQorICB7IEluaXRDb21tb25Db250cm9scygpOworICB9CisgIHJldHVybiBUUlVFOworCit9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIERyYXdTdGF0dXNUZXh0MzJBIFtDT01DVEwzMi41XVtDT01DVEwzMi4yN10KICAqCkBAIC0xNTcsNiArMTY4LDggQEAKICAgSU5UMzIgY0NvdW50OwogICBEV09SRCBkd01hc2s7CiAKKyAgVFJBQ0UoY29tbWN0cmwsIlxuIik7CisgIAogICBpZiAobHBJbml0Q3RybHMgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwogICBpZiAobHBJbml0Q3RybHMtPmR3U2l6ZSA8IHNpemVvZihJTklUQ09NTU9OQ09OVFJPTFNFWCkpIHJldHVybiBGQUxTRTsKIApAQCAtNTQ0LDQgKzU1NywzIEBACiAKICAgICByZXR1cm4gRkFMU0U7CiB9Ci0KZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3N0YXRpYy5jIGIvY29udHJvbHMvc3RhdGljLmMKaW5kZXggMjU1ZjAxZi4uYWM1M2JiZCAxMDA2NDQKLS0tIGEvY29udHJvbHMvc3RhdGljLmMKKysrIGIvY29udHJvbHMvc3RhdGljLmMKQEAgLTExNSwxOCArMTE1LDIyIEBACiAKICAgICBpZiAod25kUHRyLT5mbGFncyAmIFdJTl9JU1dJTjMyKQogICAgIHsKLSAgICAgICAgaGljb24gPSBMb2FkSWNvbjMyQSggd25kUHRyLT5oSW5zdGFuY2UsIG5hbWUgKTsKLSAgICAgICAgaWYgKCFoaWNvbikgIC8qIFRyeSBPRU0gaWNvbiAoRklYTUU6IGlzIHRoaXMgcmlnaHQ/KSAqLwotICAgICAgICAgICAgaGljb24gPSBMb2FkSWNvbjMyQSggMCwgbmFtZSApOwotICAgIH0KLSAgICBlbHNlCi0gICAgeworCWlmICghSElXT1JEKHduZFB0ci0+aEluc3RhbmNlKSkgeworCSAgICBMUFNUUiBzZWduYW1lID0gU0VHUFRSX1NUUkRVUChuYW1lKTsKKwkgICAgaGljb24gPSBMb2FkSWNvbjE2KCB3bmRQdHItPmhJbnN0YW5jZSwgU0VHUFRSX0dFVChzZWduYW1lKSApOworCSAgICBTRUdQVFJfRlJFRShzZWduYW1lKTsKKwl9IGVsc2UKKwkgICAgaGljb24gPSBMb2FkSWNvbjMyQSggd25kUHRyLT5oSW5zdGFuY2UsIG5hbWUgKTsKKyAgICB9IGVsc2UgewogICAgICAgICBMUFNUUiBzZWduYW1lID0gU0VHUFRSX1NUUkRVUChuYW1lKTsKKworCWlmIChISVdPUkQod25kUHRyLT5oSW5zdGFuY2UpKQorCQlGSVhNRShzdGF0aWMsIndpbjE2IHdpbmRvdyBjbGFzcywgYnV0IHdpbjMyIGhpbnN0YW5jZT8/XG4iKTsKICAgICAgICAgaGljb24gPSBMb2FkSWNvbjE2KCB3bmRQdHItPmhJbnN0YW5jZSwgU0VHUFRSX0dFVChzZWduYW1lKSApOwotICAgICAgICBpZiAoIWhpY29uKSAgLyogVHJ5IE9FTSBpY29uIChGSVhNRTogaXMgdGhpcyByaWdodD8pICovCi0gICAgICAgICAgICBoaWNvbiA9IExvYWRJY29uMzJBKCAwLCBzZWduYW1lICk7CiAgICAgICAgIFNFR1BUUl9GUkVFKHNlZ25hbWUpOwogICAgIH0KKyAgICBpZiAoIWhpY29uKQorCWhpY29uID0gTG9hZEljb24zMkEoIDAsIG5hbWUgKTsKICAgICByZXR1cm4gaGljb247CiB9CiAKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3N0YXR1cy5jIGIvY29udHJvbHMvc3RhdHVzLmMKaW5kZXggZjBiY2QyOC4uNjUzNmZhOSAxMDA2NDQKLS0tIGEvY29udHJvbHMvc3RhdHVzLmMKKysrIGIvY29udHJvbHMvc3RhdHVzLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlICJjb21tY3RybC5oIgogI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJ3aW4uaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgogCiAvKgogICogUnVuIHRlc3RzIHVzaW5nIFdhaXRlIEdyb3VwIFdpbmRvd3M5NSBBUEkgQmlibGUgVm9sLiAxJjIKQEAgLTIwLDcgKzIxLDcgQEAKIC8qCiAgKiBGaXhtZS9Ub2RvCiAgKiAxKSBEb24ndCBoYXJkIGNvZGUgYmFyIHRvIGJvdHRvbSBvZiB3aW5kb3csIGFsbG93IENDU19UT1AgYWxzby4KLSArIDIpIFRvb2x0aXAgc3VwcG9ydC4KKyArIDIpIFRvb2x0aXAgc3VwcG9ydCAoYWxtb3N0IGRvbmUpLgogICovCiAKICNkZWZpbmUgX01BWChhLGIpICgoKGEpPihiKSk/KGEpOihiKSkKQEAgLTMwLDE4ICszMSwxMSBAQAogI2RlZmluZSBWRVJUX0JPUkRFUiAyCiAjZGVmaW5lIEhPUlpfR0FQICAgIDIKIAotCi1zdGF0aWMgU1RBVFVTV0lORE9XSU5GTyAqR2V0U3RhdHVzSW5mbyhIV05EMzIgaHduZCkKLXsKLSAgICBXTkQgKnduZFB0cjsKLQotICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOwotICAgIHJldHVybiAoKFNUQVRVU1dJTkRPV0lORk8gKikgd25kUHRyLT53RXh0cmFbMF0pOwotfQorI2RlZmluZSBTVEFUVVNCQVJfR2V0SW5mb1B0cih3bmRQdHIpICgoU1RBVFVTV0lORE9XSU5GTyAqKXduZFB0ci0+d0V4dHJhWzBdKQogCiAKIHN0YXRpYyB2b2lkCi1TVEFUVVNfRHJhd1NpemVHcmlwIChIREMzMiBoZGMsIExQUkVDVDMyIGxwUmVjdCkKK1NUQVRVU0JBUl9EcmF3U2l6ZUdyaXAgKEhEQzMyIGhkYywgTFBSRUNUMzIgbHBSZWN0KQogewogICAgIEhQRU4zMiBoT2xkUGVuOwogICAgIFBPSU5UMzIgcHQ7CkBAIC03OCwzMiArNzIsMzEgQEAKIAogCiBzdGF0aWMgdm9pZCAKLVNCX0RyYXdQYXJ0KCBIREMzMiBoZGMsIExQUkVDVDMyIGxwcmMsIEhJQ09OMzIgaEljb24sCi0gICAgICAgICAgICAgTFBDU1RSIHRleHQsIFVJTlQzMiBzdHlsZSApCitTVEFUVVNCQVJfRHJhd1BhcnQgKEhEQzMyIGhkYywgU1RBVFVTV0lORE9XUEFSVCAqcGFydCkKIHsKLSAgICBSRUNUMzIgciA9ICpscHJjOworICAgIFJFQ1QzMiByID0gcGFydC0+Ym91bmQ7CiAgICAgVUlOVDMyIGJvcmRlciA9IEJEUl9TVU5LRU5PVVRFUjsKIAotICAgIGlmIChzdHlsZT09U0JUX1BPUE9VVCkKKyAgICBpZiAocGFydC0+c3R5bGU9PVNCVF9QT1BPVVQpCiAgICAgICBib3JkZXIgPSBCRFJfUkFJU0VET1VURVI7Ci0gICAgZWxzZSBpZiAoc3R5bGU9PVNCVF9OT0JPUkRFUlMpCisgICAgZWxzZSBpZiAocGFydC0+c3R5bGU9PVNCVF9OT0JPUkRFUlMpCiAgICAgICBib3JkZXIgPSAwOwogCiAgICAgRHJhd0VkZ2UzMihoZGMsICZyLCBib3JkZXIsIEJGX1JFQ1R8QkZfQURKVVNUKTsKIAogICAgIC8qIGRyYXcgdGhlIGljb24gKi8KLSAgICBpZiAoaEljb24pIHsKKyAgICBpZiAocGFydC0+aEljb24pIHsKIAlJTlQzMiBjeSA9IHIuYm90dG9tIC0gci50b3A7CiAKIAlyLmxlZnQgKz0gMjsKLQlEcmF3SWNvbkV4MzIgKGhkYywgci5sZWZ0LCByLnRvcCwgaEljb24sIGN5LCBjeSwgMCwgMCwgRElfTk9STUFMKTsKKwlEcmF3SWNvbkV4MzIgKGhkYywgci5sZWZ0LCByLnRvcCwgcGFydC0+aEljb24sIGN5LCBjeSwgMCwgMCwgRElfTk9STUFMKTsKIAlyLmxlZnQgKz0gY3k7CiAgICAgfQogCiAgICAgLyogbm93IGRyYXcgdGV4dCAqLwotICAgIGlmICh0ZXh0KSB7CisgICAgaWYgKHBhcnQtPnRleHQpIHsKICAgICAgIGludCBvbGRia21vZGUgPSBTZXRCa01vZGUzMihoZGMsIFRSQU5TUEFSRU5UKTsKLSAgICAgIExQU1RSIHAgPSAoTFBTVFIpdGV4dDsKKyAgICAgIExQU1RSIHAgPSAoTFBTVFIpcGFydC0+dGV4dDsKICAgICAgIFVJTlQzMiBhbGlnbiA9IERUX0xFRlQ7CiAgICAgICBpZiAoKnAgPT0gJ1x0JykgewogCXArKzsKQEAgLTEyMiwyMiArMTE1LDY2IEBACiB9CiAKIAotc3RhdGljIEJPT0wzMgotU1dfUmVmcmVzaCggSFdORDMyIGh3bmQsIEhEQzMyIGhkYywgU1RBVFVTV0lORE9XSU5GTyAqc2VsZiApCitzdGF0aWMgVk9JRAorU1RBVFVTQkFSX1JlZnJlc2hQYXJ0IChXTkQgKnduZFB0ciwgU1RBVFVTV0lORE9XUEFSVCAqcGFydCwgSERDMzIgaGRjKQogeworICAgIFNUQVRVU1dJTkRPV0lORk8gKnNlbGYgPSBTVEFUVVNCQVJfR2V0SW5mb1B0ciAod25kUHRyKTsKKyAgICBIQlJVU0gzMiBoYnJCazsKKyAgICBIRk9OVDMyICBoT2xkRm9udDsKKworICAgIGlmICghSXNXaW5kb3dWaXNpYmxlMzIod25kUHRyLT5od25kU2VsZikpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChzZWxmLT5jbHJCayAhPSBDTFJfREVGQVVMVCkKKwloYnJCayA9IENyZWF0ZVNvbGlkQnJ1c2gzMiAoc2VsZi0+Y2xyQmspOworICAgIGVsc2UKKwloYnJCayA9IEdldFN5c0NvbG9yQnJ1c2gzMiAoQ09MT1JfM0RGQUNFKTsKKyAgICBGaWxsUmVjdDMyKGhkYywgJnBhcnQtPmJvdW5kLCBoYnJCayk7CisKKyAgICBoT2xkRm9udCA9IFNlbGVjdE9iamVjdDMyIChoZGMsIHNlbGYtPmhGb250ID8gc2VsZi0+aEZvbnQgOiBzZWxmLT5oRGVmYXVsdEZvbnQpOworCisgICAgaWYgKHBhcnQtPnN0eWxlID09IFNCVF9PV05FUkRSQVcpIHsKKwlEUkFXSVRFTVNUUlVDVDMyIGRpczsKKworCWRpcy5DdGxJRCA9IHduZFB0ci0+d0lEbWVudTsKKwlkaXMuaXRlbUlEID0gLTE7CisJZGlzLmh3bmRJdGVtID0gd25kUHRyLT5od25kU2VsZjsKKwlkaXMuaERDID0gaGRjOworCWRpcy5yY0l0ZW0gPSBwYXJ0LT5ib3VuZDsKKwlkaXMuaXRlbURhdGEgPSAoSU5UMzIpcGFydC0+dGV4dDsKKwlTZW5kTWVzc2FnZTMyQSAoR2V0UGFyZW50MzIgKHduZFB0ci0+aHduZFNlbGYpLCBXTV9EUkFXSVRFTSwKKwkJCShXUEFSQU0zMil3bmRQdHItPndJRG1lbnUsIChMUEFSQU0pJmRpcyk7CisgICAgfQorICAgIGVsc2UKKwlTVEFUVVNCQVJfRHJhd1BhcnQgKGhkYywgcGFydCk7CisKKyAgICBTZWxlY3RPYmplY3QzMiAoaGRjLCBoT2xkRm9udCk7CisKKyAgICBpZiAoc2VsZi0+Y2xyQmsgIT0gQ0xSX0RFRkFVTFQpCisJRGVsZXRlT2JqZWN0MzIgKGhickJrKTsKKworICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBTQkFSU19TSVpFR1JJUCkgeworCVJFQ1QzMiByZWN0OworCisJR2V0Q2xpZW50UmVjdDMyICh3bmRQdHItPmh3bmRTZWxmLCAmcmVjdCk7CisJU1RBVFVTQkFSX0RyYXdTaXplR3JpcCAoaGRjLCAmcmVjdCk7CisgICAgfQorfQorCisKK3N0YXRpYyBCT09MMzIKK1NUQVRVU0JBUl9SZWZyZXNoIChXTkQgKnduZFB0ciwgSERDMzIgaGRjKQoreworICAgIFNUQVRVU1dJTkRPV0lORk8gKnNlbGYgPSBTVEFUVVNCQVJfR2V0SW5mb1B0ciAod25kUHRyKTsKICAgICBpbnQgICAgICBpOwogICAgIFJFQ1QzMiAgIHJlY3Q7CiAgICAgSEJSVVNIMzIgaGJyQms7Ci0gICAgSEZPTlQzMiBoT2xkRm9udDsKLSAgICBXTkQgKnduZFB0cjsKKyAgICBIRk9OVDMyICBoT2xkRm9udDsKIAotICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOwotCi0gICAgaWYgKCFJc1dpbmRvd1Zpc2libGUzMihod25kKSkgeworICAgIGlmICghSXNXaW5kb3dWaXNpYmxlMzIod25kUHRyLT5od25kU2VsZikpCiAgICAgICAgIHJldHVybiAoVFJVRSk7Ci0gICAgfQogCi0gICAgR2V0Q2xpZW50UmVjdDMyIChod25kLCAmcmVjdCk7CisgICAgR2V0Q2xpZW50UmVjdDMyICh3bmRQdHItPmh3bmRTZWxmLCAmcmVjdCk7CiAKICAgICBpZiAoc2VsZi0+Y2xyQmsgIT0gQ0xSX0RFRkFVTFQpCiAJaGJyQmsgPSBDcmVhdGVTb2xpZEJydXNoMzIgKHNlbGYtPmNsckJrKTsKQEAgLTE0OCwzMyArMTg1LDI0IEBACiAgICAgaE9sZEZvbnQgPSBTZWxlY3RPYmplY3QzMiAoaGRjLCBzZWxmLT5oRm9udCA/IHNlbGYtPmhGb250IDogc2VsZi0+aERlZmF1bHRGb250KTsKIAogICAgIGlmIChzZWxmLT5zaW1wbGUpIHsKLQlTQl9EcmF3UGFydCAoaGRjLAotCQkgICAgICZzZWxmLT5wYXJ0MC5ib3VuZCwKLQkJICAgICBzZWxmLT5wYXJ0MC5oSWNvbiwKLQkJICAgICBzZWxmLT5wYXJ0MC50ZXh0LAotCQkgICAgIHNlbGYtPnBhcnQwLnN0eWxlKTsKKwlTVEFUVVNCQVJfRHJhd1BhcnQgKGhkYywgJnNlbGYtPnBhcnQwKTsKICAgICB9CiAgICAgZWxzZSB7CiAJZm9yIChpID0gMDsgaSA8IHNlbGYtPm51bVBhcnRzOyBpKyspIHsKIAkgICAgaWYgKHNlbGYtPnBhcnRzW2ldLnN0eWxlID09IFNCVF9PV05FUkRSQVcpIHsKIAkJRFJBV0lURU1TVFJVQ1QzMiBkaXM7Ci0JCVdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7CiAKIAkJZGlzLkN0bElEID0gd25kUHRyLT53SURtZW51OwogCQlkaXMuaXRlbUlEID0gLTE7Ci0JCWRpcy5od25kSXRlbSA9IGh3bmQ7CisJCWRpcy5od25kSXRlbSA9IHduZFB0ci0+aHduZFNlbGY7CiAJCWRpcy5oREMgPSBoZGM7Ci0JCWRpcy5yY0l0ZW0gPSBzZWxmLT5wYXJ0MC5ib3VuZDsKLQkJZGlzLml0ZW1EYXRhID0gKElOVDMyKXNlbGYtPnBhcnQwLnRleHQ7Ci0JCVNlbmRNZXNzYWdlMzJBIChHZXRQYXJlbnQzMiAoaHduZCksIFdNX0RSQVdJVEVNLCAKKwkJZGlzLnJjSXRlbSA9IHNlbGYtPnBhcnRzW2ldLmJvdW5kOworCQlkaXMuaXRlbURhdGEgPSAoSU5UMzIpc2VsZi0+cGFydHNbaV0udGV4dDsKKwkJU2VuZE1lc3NhZ2UzMkEgKEdldFBhcmVudDMyICh3bmRQdHItPmh3bmRTZWxmKSwgV01fRFJBV0lURU0sCiAJCQkJKFdQQVJBTTMyKXduZFB0ci0+d0lEbWVudSwgKExQQVJBTSkmZGlzKTsKIAkgICAgfQogCSAgICBlbHNlCi0JCVNCX0RyYXdQYXJ0IChoZGMsCi0JCQkgICAgICZzZWxmLT5wYXJ0c1tpXS5ib3VuZCwKLQkJCSAgICAgc2VsZi0+cGFydHNbaV0uaEljb24sCi0JCQkgICAgIHNlbGYtPnBhcnRzW2ldLnRleHQsCi0JCQkgICAgIHNlbGYtPnBhcnRzW2ldLnN0eWxlKTsKKwkJU1RBVFVTQkFSX0RyYXdQYXJ0IChoZGMsICZzZWxmLT5wYXJ0c1tpXSk7CiAJfQogICAgIH0KIApAQCAtMTg0LDMzICsyMTIsMjIgQEAKIAlEZWxldGVPYmplY3QzMiAoaGJyQmspOwogCiAgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFNCQVJTX1NJWkVHUklQKQotCVNUQVRVU19EcmF3U2l6ZUdyaXAgKGhkYywgJnJlY3QpOworCVNUQVRVU0JBUl9EcmF3U2l6ZUdyaXAgKGhkYywgJnJlY3QpOwogCiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKIAotX19pbmxpbmVfXyBzdGF0aWMgTFJFU1VMVAotU1dfR2V0Qm9yZGVycyAoTFBBUkFNIGxQYXJhbSkKLXsKLSAgICBMUElOVDMyIG91dCA9IChMUElOVDMyKSBsUGFyYW07Ci0KLSAgICBvdXRbMF0gPSBIT1JaX0JPUkRFUjsgLyogaG9yaXpvbnRhbCBib3JkZXIgd2lkdGggKi8KLSAgICBvdXRbMV0gPSBWRVJUX0JPUkRFUjsgLyogdmVydGljYWwgYm9yZGVyIHdpZHRoICovCi0gICAgb3V0WzJdID0gSE9SWl9HQVA7IC8qIHdpZHRoIG9mIGJvcmRlciBiZXR3ZWVuIHJlY3RhbmdsZXMgKi8KLQotICAgIHJldHVybiBUUlVFOwotfQotCiBzdGF0aWMgdm9pZAotU1dfU2V0UGFydEJvdW5kcyhIV05EMzIgaHduZCwgU1RBVFVTV0lORE9XSU5GTyAqc2VsZikKK1NUQVRVU0JBUl9TZXRQYXJ0Qm91bmRzIChXTkQgKnduZFB0cikKIHsKLSAgICBpbnQJaTsKLSAgICBSRUNUMzIJcmVjdCwgKnI7CisgICAgU1RBVFVTV0lORE9XSU5GTyAqc2VsZiA9IFNUQVRVU0JBUl9HZXRJbmZvUHRyICh3bmRQdHIpOwogICAgIFNUQVRVU1dJTkRPV1BBUlQgKnBhcnQ7CisgICAgUkVDVDMyIHJlY3QsICpyOworICAgIGludAlpOwogCiAgICAgLyogZ2V0IG91ciB3aW5kb3cgc2l6ZSAqLwotICAgIEdldENsaWVudFJlY3QzMihod25kLCAmcmVjdCk7CisgICAgR2V0Q2xpZW50UmVjdDMyICh3bmRQdHItPmh3bmRTZWxmLCAmcmVjdCk7CiAKICAgICByZWN0LnRvcCArPSBWRVJUX0JPUkRFUjsKIApAQCAtMjMxLDk3ICsyNDgsNzYgQEAKIAkgICAgci0+cmlnaHQgPSByZWN0LnJpZ2h0OwogCWVsc2UKIAkgICAgci0+cmlnaHQgPSBwYXJ0LT54OworCisJaWYgKHNlbGYtPmh3bmRUb29sVGlwKSB7CisJICAgIFRUVE9PTElORk8zMkEgdGk7CisKKwkgICAgdGkuY2JTaXplID0gc2l6ZW9mKFRUVE9PTElORk8zMkEpOworCSAgICB0aS5od25kID0gd25kUHRyLT5od25kU2VsZjsKKwkgICAgdGkudUlkID0gaTsKKwkgICAgdGkucmVjdCA9ICpyOworCSAgICBTZW5kTWVzc2FnZTMyQSAoc2VsZi0+aHduZFRvb2xUaXAsIFRUTV9ORVdUT09MUkVDVDMyQSwKKwkJCSAgICAwLCAoTFBBUkFNKSZ0aSk7CisJfQogICAgIH0KIH0KIAotc3RhdGljIExSRVNVTFQKLVNXX1NldFRleHQoU1RBVFVTV0lORE9XSU5GTyAqc2VsZiwgSFdORDMyIGh3bmQsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKKworc3RhdGljIFZPSUQKK1NUQVRVU0JBUl9SZWxheUV2ZW50IChIV05EMzIgaHduZFRpcCwgSFdORDMyIGh3bmRNc2csIFVJTlQzMiB1TXNnLAorCQkgICAgICBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7Ci0gICAgaW50CXBhcnRfbnVtOwotICAgIGludAlzdHlsZTsKLSAgICBMUFNUUgl0ZXh0OwotICAgIGludAlsZW47Ci0gICAgU1RBVFVTV0lORE9XUEFSVCAqcGFydDsKKyAgICBNU0czMiBtc2c7CiAKLSAgICB0ZXh0ID0gKExQU1RSKSBsUGFyYW07Ci0gICAgcGFydF9udW0gPSAoKElOVDMyKSB3UGFyYW0pICYgMHgwMGZmOwotICAgIHN0eWxlID0gKChJTlQzMikgd1BhcmFtKSAmIDB4ZmYwMDsKKyAgICBtc2cuaHduZCA9IGh3bmRNc2c7CisgICAgbXNnLm1lc3NhZ2UgPSB1TXNnOworICAgIG1zZy53UGFyYW0gPSB3UGFyYW07CisgICAgbXNnLmxQYXJhbSA9IGxQYXJhbTsKKyAgICBtc2cudGltZSA9IEdldE1lc3NhZ2VUaW1lICgpOworICAgIG1zZy5wdC54ID0gTE9XT1JEKEdldE1lc3NhZ2VQb3MgKCkpOworICAgIG1zZy5wdC55ID0gSElXT1JEKEdldE1lc3NhZ2VQb3MgKCkpOwogCi0gICAgaWYgKChzZWxmLT5zaW1wbGUpIHx8IChzZWxmLT5wYXJ0cz09TlVMTCkgfHwgKHBhcnRfbnVtPT0yNTUpKQotCXBhcnQgPSAmc2VsZi0+cGFydDA7CisgICAgU2VuZE1lc3NhZ2UzMkEgKGh3bmRUaXAsIFRUTV9SRUxBWUVWRU5ULCAwLCAoTFBBUkFNKSZtc2cpOworfQorCisKK19faW5saW5lX18gc3RhdGljIExSRVNVTFQKK1NUQVRVU0JBUl9HZXRCb3JkZXJzIChMUEFSQU0gbFBhcmFtKQoreworICAgIExQSU5UMzIgb3V0ID0gKExQSU5UMzIpIGxQYXJhbTsKKworICAgIG91dFswXSA9IEhPUlpfQk9SREVSOyAvKiBob3Jpem9udGFsIGJvcmRlciB3aWR0aCAqLworICAgIG91dFsxXSA9IFZFUlRfQk9SREVSOyAvKiB2ZXJ0aWNhbCBib3JkZXIgd2lkdGggKi8KKyAgICBvdXRbMl0gPSBIT1JaX0dBUDsgLyogd2lkdGggb2YgYm9yZGVyIGJldHdlZW4gcmVjdGFuZ2xlcyAqLworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIExSRVNVTFQKK1NUQVRVU0JBUl9HZXRJY29uIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtKQoreworICAgIFNUQVRVU1dJTkRPV0lORk8gKnNlbGYgPSBTVEFUVVNCQVJfR2V0SW5mb1B0ciAod25kUHRyKTsKKyAgICBJTlQzMiBuUGFydDsKKworICAgIG5QYXJ0ID0gKElOVDMyKXdQYXJhbSAmIDB4MDBmZjsKKyAgICBpZiAoKG5QYXJ0IDwgLTEpIHx8IChuUGFydCA+PSBzZWxmLT5udW1QYXJ0cykpIHJldHVybiAwOworCisgICAgaWYgKG5QYXJ0ID09IC0xKQorICAgICAgICByZXR1cm4gKHNlbGYtPnBhcnQwLmhJY29uKTsKICAgICBlbHNlCi0JcGFydCA9ICZzZWxmLT5wYXJ0c1twYXJ0X251bV07Ci0gICAgaWYgKCFwYXJ0KSByZXR1cm4gRkFMU0U7Ci0gICAgcGFydC0+c3R5bGUgPSBzdHlsZTsKLSAgICBpZiAoc3R5bGUgPT0gU0JUX09XTkVSRFJBVykgewotCXBhcnQtPnRleHQgPSB0ZXh0OwotICAgIH0KLSAgICBlbHNlIHsKLQkvKiBkdXBsaWNhdGUgc3RyaW5nICovCi0JaWYgKHBhcnQtPnRleHQpCi0JICAgIEhlYXBGcmVlKFN5c3RlbUhlYXAsIDAsIHBhcnQtPnRleHQpOwotCXBhcnQtPnRleHQgPSAwOwotCWlmICh0ZXh0ICYmIChsZW4gPSBsc3RybGVuMzJBKHRleHQpKSkgewotCSAgICBwYXJ0LT50ZXh0ID0gSGVhcEFsbG9jKFN5c3RlbUhlYXAsIDAsIGxlbisxKTsKLQkgICAgbHN0cmNweTMyQShwYXJ0LT50ZXh0LCB0ZXh0KTsKLQl9Ci0gICAgfQotICAgIEludmFsaWRhdGVSZWN0MzIoaHduZCwgJnBhcnQtPmJvdW5kLCBGQUxTRSk7Ci0vLyAgICBTV19SZWZyZXNoUGFydCAoaGRjLCBwYXJ0KTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIChzZWxmLT5wYXJ0c1tuUGFydF0uaEljb24pOwogfQogCi1zdGF0aWMgTFJFU1VMVAotU1dfU2V0UGFydHMoU1RBVFVTV0lORE9XSU5GTyAqc2VsZiwgSFdORDMyIGh3bmQsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKLXsKLSAgICBIREMzMgloZGM7Ci0gICAgTFBJTlQzMiBwYXJ0czsKLSAgICBTVEFUVVNXSU5ET1dQQVJUICoJdG1wOwotICAgIGludAlpOwotICAgIGludAlvbGROdW1QYXJ0czsKLQotICAgIGlmIChzZWxmLT5zaW1wbGUpIHsKLQlzZWxmLT5zaW1wbGUgPSBGQUxTRTsKLSAgICB9Ci0gICAgb2xkTnVtUGFydHMgPSBzZWxmLT5udW1QYXJ0czsKLSAgICBzZWxmLT5udW1QYXJ0cyA9IChJTlQzMikgd1BhcmFtOwotICAgIHBhcnRzID0gKExQSU5UMzIpIGxQYXJhbTsKLSAgICBpZiAob2xkTnVtUGFydHMgPiBzZWxmLT5udW1QYXJ0cykgewotCWZvciAoaSA9IHNlbGYtPm51bVBhcnRzIDsgaSA8IG9sZE51bVBhcnRzOyBpKyspIHsKLQkgICAgaWYgKHNlbGYtPnBhcnRzW2ldLnRleHQgJiYgKHNlbGYtPnBhcnRzW2ldLnN0eWxlICE9IFNCVF9PV05FUkRSQVcpKQotCQlIZWFwRnJlZShTeXN0ZW1IZWFwLCAwLCBzZWxmLT5wYXJ0c1tpXS50ZXh0KTsKLQl9Ci0gICAgfQotICAgIGVsc2UgaWYgKG9sZE51bVBhcnRzIDwgc2VsZi0+bnVtUGFydHMpIHsKLQl0bXAgPSBIZWFwQWxsb2MoU3lzdGVtSGVhcCwgSEVBUF9aRVJPX01FTU9SWSwKLQkJCXNpemVvZihTVEFUVVNXSU5ET1dQQVJUKSAqIHNlbGYtPm51bVBhcnRzKTsKLQlmb3IgKGkgPSAwOyBpIDwgb2xkTnVtUGFydHM7IGkrKykgewotCSAgICB0bXBbaV0gPSBzZWxmLT5wYXJ0c1tpXTsKLQl9Ci0JaWYgKHNlbGYtPnBhcnRzKQotCSAgICBIZWFwRnJlZShTeXN0ZW1IZWFwLCAwLCBzZWxmLT5wYXJ0cyk7Ci0Jc2VsZi0+cGFydHMgPSB0bXA7Ci0gICAgfQotICAgIAotICAgIGZvciAoaSA9IDA7IGkgPCBzZWxmLT5udW1QYXJ0czsgaSsrKSB7Ci0Jc2VsZi0+cGFydHNbaV0ueCA9IHBhcnRzW2ldOwotICAgIH0KLSAgICBTV19TZXRQYXJ0Qm91bmRzKGh3bmQsIHNlbGYpOwotCi0gICAgaGRjID0gR2V0REMzMihod25kKTsKLSAgICBTV19SZWZyZXNoKGh3bmQsIGhkYywgc2VsZik7Ci0gICAgUmVsZWFzZURDMzIoaHduZCwgaGRjKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KIAogc3RhdGljIExSRVNVTFQKLVNXX0dldFBhcnRzKFNUQVRVU1dJTkRPV0lORk8gKnNlbGYsIEhXTkQzMiBod25kLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitTVEFUVVNCQVJfR2V0UGFydHMgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CisgICAgU1RBVFVTV0lORE9XSU5GTyAqc2VsZiA9IFNUQVRVU0JBUl9HZXRJbmZvUHRyICh3bmRQdHIpOwogICAgIExQSU5UMzIgcGFydHM7Ci0gICAgSU5UMzIJbnVtX3BhcnRzOwotICAgIGludAlpOworICAgIElOVDMyICAgbnVtX3BhcnRzOworICAgIGludAkgICAgaTsKIAotICAgIHNlbGYgPSBHZXRTdGF0dXNJbmZvKGh3bmQpOwogICAgIG51bV9wYXJ0cyA9IChJTlQzMikgd1BhcmFtOwogICAgIHBhcnRzID0gKExQSU5UMzIpIGxQYXJhbTsKICAgICBpZiAocGFydHMpIHsKQEAgLTMzMyw3OCArMzI5LDExIEBACiAgICAgcmV0dXJuIChzZWxmLT5udW1QYXJ0cyk7CiB9CiAKLXN0YXRpYyBMUkVTVUxUCi1TV19DcmVhdGUoSFdORDMyIGh3bmQsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKLXsKLSAgICBMUENSRUFURVNUUlVDVDMyQSBscENyZWF0ZSA9IChMUENSRUFURVNUUlVDVDMyQSkgbFBhcmFtOwotICAgIE5PTkNMSUVOVE1FVFJJQ1MzMkEgbmNsbTsKLSAgICBSRUNUMzIJcmVjdDsKLSAgICBpbnQJICAgICAgICB3aWR0aCwgbGVuOwotICAgIEhEQzMyCWhkYzsKLSAgICBIV05EMzIJcGFyZW50OwotICAgIFdORCAqd25kUHRyOwotICAgIFNUQVRVU1dJTkRPV0lORk8gKnNlbGY7Ci0KLSAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKLSAgICBzZWxmID0gKFNUQVRVU1dJTkRPV0lORk8qKUhlYXBBbGxvYyAoU3lzdGVtSGVhcCwgSEVBUF9aRVJPX01FTU9SWSwKLQkJCQkJIHNpemVvZihTVEFUVVNXSU5ET1dJTkZPKSk7Ci0gICAgd25kUHRyLT53RXh0cmFbMF0gPSAoRFdPUkQpc2VsZjsKLQotICAgIHNlbGYtPm51bVBhcnRzID0gMTsKLSAgICBzZWxmLT5wYXJ0cyA9IDA7Ci0gICAgc2VsZi0+c2ltcGxlID0gRkFMU0U7Ci0gICAgc2VsZi0+Y2xyQmsgPSBDTFJfREVGQVVMVDsKLSAgICBzZWxmLT5oRm9udCA9IDA7Ci0gICAgR2V0Q2xpZW50UmVjdDMyKGh3bmQsICZyZWN0KTsKLQotICAgIG5jbG0uY2JTaXplID0gc2l6ZW9mKE5PTkNMSUVOVE1FVFJJQ1MzMkEpOwotICAgIFN5c3RlbVBhcmFtZXRlcnNJbmZvMzJBIChTUElfR0VUTk9OQ0xJRU5UTUVUUklDUywgMCwgJm5jbG0sIDApOwotICAgIHNlbGYtPmhEZWZhdWx0Rm9udCA9IENyZWF0ZUZvbnRJbmRpcmVjdDMyQSAoJm5jbG0ubGZTdGF0dXNGb250KTsKLQotICAgIC8qIGluaXRpYWxpemUgc2ltcGxlIGNhc2UgKi8KLSAgICBzZWxmLT5wYXJ0MC5ib3VuZCA9IHJlY3Q7Ci0gICAgc2VsZi0+cGFydDAudGV4dCA9IDA7Ci0gICAgc2VsZi0+cGFydDAueCA9IDA7Ci0gICAgc2VsZi0+cGFydDAuc3R5bGUgPSAwOwotICAgIHNlbGYtPnBhcnQwLmhJY29uID0gMDsKLQotICAgIC8qIGluaXRpYWxpemUgZmlyc3QgcGFydCAqLwotICAgIHNlbGYtPnBhcnRzID0gSGVhcEFsbG9jIChTeXN0ZW1IZWFwLCBIRUFQX1pFUk9fTUVNT1JZLAotCQkJICAgICBzaXplb2YoU1RBVFVTV0lORE9XUEFSVCkpOwotICAgIHNlbGYtPnBhcnRzWzBdLmJvdW5kID0gcmVjdDsKLSAgICBzZWxmLT5wYXJ0c1swXS50ZXh0ID0gMDsKLSAgICBzZWxmLT5wYXJ0c1swXS54ID0gLTE7Ci0gICAgc2VsZi0+cGFydHNbMF0uc3R5bGUgPSAwOwotICAgIHNlbGYtPnBhcnRzWzBdLmhJY29uID0gMDsKLQotICAgIGlmICgobGVuID0gbHN0cmxlbjMyQSAobHBDcmVhdGUtPmxwc3pOYW1lKSkpIHsKLSAgICAgICAgc2VsZi0+cGFydHNbMF0udGV4dCA9IEhlYXBBbGxvYyAoU3lzdGVtSGVhcCwgMCwgbGVuICsgMSk7Ci0gICAgICAgIGxzdHJjcHkzMkEgKHNlbGYtPnBhcnRzWzBdLnRleHQsIGxwQ3JlYXRlLT5scHN6TmFtZSk7Ci0gICAgfQotCi0gICAgaWYgKChoZGMgPSBHZXREQzMyICgwKSkpIHsKLQlURVhUTUVUUklDMzJBIHRtOwotCUhGT05UMzIgaE9sZEZvbnQ7Ci0KLQloT2xkRm9udCA9IFNlbGVjdE9iamVjdDMyIChoZGMsc2VsZi0+aERlZmF1bHRGb250KTsKLQlHZXRUZXh0TWV0cmljczMyQShoZGMsICZ0bSk7Ci0Jc2VsZi0+dGV4dEhlaWdodCA9IHRtLnRtSGVpZ2h0OwotCVNlbGVjdE9iamVjdDMyIChoZGMsIGhPbGRGb250KTsKLQlSZWxlYXNlREMzMigwLCBoZGMpOwotICAgIH0KLQotICAgIHBhcmVudCA9IEdldFBhcmVudDMyIChod25kKTsKLSAgICBHZXRDbGllbnRSZWN0MzIgKHBhcmVudCwgJnJlY3QpOwotICAgIHdpZHRoID0gcmVjdC5yaWdodCAtIHJlY3QubGVmdDsKLSAgICBzZWxmLT5oZWlnaHQgPSBzZWxmLT50ZXh0SGVpZ2h0ICsgNCArIFZFUlRfQk9SREVSOwotICAgIE1vdmVXaW5kb3czMiAoaHduZCwgbHBDcmVhdGUtPngsIGxwQ3JlYXRlLT55LTEsIHdpZHRoLCBzZWxmLT5oZWlnaHQsIEZBTFNFKTsKLSAgICBTV19TZXRQYXJ0Qm91bmRzIChod25kLCBzZWxmKTsKLSAgICByZXR1cm4gMDsKLX0KIAogc3RhdGljIExSRVNVTFQKLVNXX0dldFJlY3QoU1RBVFVTV0lORE9XSU5GTyAqc2VsZiwgSFdORDMyIGh3bmQsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK1NUQVRVU0JBUl9HZXRSZWN0IChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogeworICAgIFNUQVRVU1dJTkRPV0lORk8gKnNlbGYgPSBTVEFUVVNCQVJfR2V0SW5mb1B0ciAod25kUHRyKTsKICAgICBpbnQJcGFydF9udW07CiAgICAgTFBSRUNUMzIgIHJlY3Q7CiAKQEAgLTQxNywxMyArMzQ2LDE1IEBACiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKKwogc3RhdGljIExSRVNVTFQKLVNXX0dldFRleHQoU1RBVFVTV0lORE9XSU5GTyAqc2VsZiwgSFdORDMyIGh3bmQsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK1NUQVRVU0JBUl9HZXRUZXh0MzJBIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotICAgIGludAlwYXJ0X251bTsKLSAgICBMUkVTVUxUCXJlc3VsdDsKKyAgICBTVEFUVVNXSU5ET1dJTkZPICpzZWxmID0gU1RBVFVTQkFSX0dldEluZm9QdHIgKHduZFB0cik7CiAgICAgU1RBVFVTV0lORE9XUEFSVCAqcGFydDsKLSAgICBMUFNUUglvdXRfdGV4dDsKKyAgICBpbnQJcGFydF9udW07CisgICAgTFJFU1VMVCByZXN1bHQ7CisgICAgTFBTVFIgICBvdXRfdGV4dDsKIAogICAgIHBhcnRfbnVtID0gKChJTlQzMikgd1BhcmFtKSAmIDB4MDBmZjsKICAgICBvdXRfdGV4dCA9IChMUFNUUikgbFBhcmFtOwpAQCAtNDQ0LDExICszNzUsMTYgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCisKKy8vICA8PCBTVEFUVVNCQVJfR2V0VGV4dDMyVyA+PgorCisKIHN0YXRpYyBMUkVTVUxUCi1TV19HZXRUZXh0TGVuZ3RoKFNUQVRVU1dJTkRPV0lORk8gKnNlbGYsIEhXTkQzMiBod25kLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitTVEFUVVNCQVJfR2V0VGV4dExlbmd0aDMyQSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLSAgICBpbnQJcGFydF9udW07CisgICAgU1RBVFVTV0lORE9XSU5GTyAqc2VsZiA9IFNUQVRVU0JBUl9HZXRJbmZvUHRyICh3bmRQdHIpOwogICAgIFNUQVRVU1dJTkRPV1BBUlQgKnBhcnQ7CisgICAgaW50CXBhcnRfbnVtOwogICAgIERXT1JECXJlc3VsdDsKIAogICAgIHBhcnRfbnVtID0gKChJTlQzMikgd1BhcmFtKSAmIDB4MDBmZjsKQEAgLTQ2NywxMjkgKzQwMyw0MTcgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgTFJFU1VMVAotU1dfU2V0TWluSGVpZ2h0KFNUQVRVU1dJTkRPV0lORk8gKnNlbGYsIEhXTkQzMiBod25kLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCi17Ci0gICAgSU5UMzIJd2lkdGgsIHgsIHk7Ci0gICAgUkVDVDMyCXBhcmVudF9yZWN0OwotICAgIEhXTkQzMglwYXJlbnQ7CiAKLSAgICBpZiAoSXNXaW5kb3dWaXNpYmxlMzIgKGh3bmQpKSB7Ci0JcGFyZW50ID0gR2V0UGFyZW50MzIoaHduZCk7Ci0JR2V0Q2xpZW50UmVjdDMyKHBhcmVudCwgJnBhcmVudF9yZWN0KTsKLQlzZWxmLT5oZWlnaHQgPSAoSU5UMzIpd1BhcmFtICsgVkVSVF9CT1JERVI7Ci0Jd2lkdGggPSBwYXJlbnRfcmVjdC5yaWdodCAtIHBhcmVudF9yZWN0LmxlZnQ7Ci0JeCA9IHBhcmVudF9yZWN0LmxlZnQ7Ci0JeSA9IHBhcmVudF9yZWN0LmJvdHRvbSAtIHNlbGYtPmhlaWdodDsKLQlNb3ZlV2luZG93MzIoaHduZCwgcGFyZW50X3JlY3QubGVmdCwgcGFyZW50X3JlY3QuYm90dG9tIC0gc2VsZi0+aGVpZ2h0LAotCQkgICAgIHdpZHRoLCBzZWxmLT5oZWlnaHQsIFRSVUUpOwotCVNXX1NldFBhcnRCb3VuZHMoaHduZCwgc2VsZik7CisvLyAgPDwgU1RBVFVTQkFSX0dldFRleHRMZW5ndGgzMlcgPj4KKworCitzdGF0aWMgTFJFU1VMVAorU1RBVFVTQkFSX0dldFRpcFRleHQzMkEgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgU1RBVFVTV0lORE9XSU5GTyAqaW5mb1B0ciA9IFNUQVRVU0JBUl9HZXRJbmZvUHRyICh3bmRQdHIpOworCisgICAgaWYgKGluZm9QdHItPmh3bmRUb29sVGlwKSB7CisJVFRUT09MSU5GTzMyQSB0aTsKKworCXRpLmNiU2l6ZSA9IHNpemVvZihUVFRPT0xJTkZPMzJBKTsKKwl0aS5od25kID0gd25kUHRyLT5od25kU2VsZjsKKwl0aS51SWQgPSBMT1dPUkQod1BhcmFtKTsKKwlTZW5kTWVzc2FnZTMyQSAoaW5mb1B0ci0+aHduZFRvb2xUaXAsIFRUTV9HRVRURVhUMzJBLCAwLCAoTFBBUkFNKSZ0aSk7CisKKwlpZiAodGkubHBzelRleHQpCisJICAgIGxzdHJjcHluMzJBICgoTFBTVFIpbFBhcmFtLCB0aS5scHN6VGV4dCwgSElXT1JEKHdQYXJhbSkpOwogICAgIH0KIAotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgTFJFU1VMVAotU1dfU2V0QmtDb2xvcihTVEFUVVNXSU5ET1dJTkZPICpzZWxmLCBIV05EMzIgaHduZCwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorCisvLyAgPDwgU1RBVFVTQkFSX0dldFRpcFRleHQzMlcgPj4KKy8vICA8PCBTVEFUVVNCQVJfR2V0VW5pY29kZUZvcm1hdCA+PgorCisKK19faW5saW5lX18gc3RhdGljIExSRVNVTFQKK1NUQVRVU0JBUl9Jc1NpbXBsZSAoV05EICp3bmRQdHIpCiB7CisgICAgU1RBVFVTV0lORE9XSU5GTyAqc2VsZiA9IFNUQVRVU0JBUl9HZXRJbmZvUHRyICh3bmRQdHIpOworCisgICAgcmV0dXJuIHNlbGYtPnNpbXBsZTsKK30KKworCitzdGF0aWMgTFJFU1VMVAorU1RBVFVTQkFSX1NldEJrQ29sb3IgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgU1RBVFVTV0lORE9XSU5GTyAqc2VsZiA9IFNUQVRVU0JBUl9HZXRJbmZvUHRyICh3bmRQdHIpOwogICAgIENPTE9SUkVGIG9sZEJrQ29sb3I7CiAgICAgSERDMzIgICAgaGRjOwogCiAgICAgb2xkQmtDb2xvciA9IHNlbGYtPmNsckJrOwogICAgIHNlbGYtPmNsckJrID0gKENPTE9SUkVGKWxQYXJhbTsKLSAgICBoZGMgPSBHZXREQzMyKGh3bmQpOwotICAgIFNXX1JlZnJlc2goaHduZCwgaGRjLCBzZWxmKTsKLSAgICBSZWxlYXNlREMzMihod25kLCBoZGMpOworICAgIGhkYyA9IEdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOworICAgIFNUQVRVU0JBUl9SZWZyZXNoICh3bmRQdHIsIGhkYyk7CisgICAgUmVsZWFzZURDMzIgKHduZFB0ci0+aHduZFNlbGYsIGhkYyk7CisKICAgICByZXR1cm4gb2xkQmtDb2xvcjsKIH0KIAogCiBzdGF0aWMgTFJFU1VMVAotU1dfU2V0SWNvbiAoU1RBVFVTV0lORE9XSU5GTyAqc2VsZiwgSFdORDMyIGh3bmQsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK1NUQVRVU0JBUl9TZXRJY29uIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotICAgIElOVDMyICBuUGFydCA9IChJTlQzMil3UGFyYW0gJiAweDAwZmY7CisgICAgU1RBVFVTV0lORE9XSU5GTyAqc2VsZiA9IFNUQVRVU0JBUl9HZXRJbmZvUHRyICh3bmRQdHIpOworICAgIElOVDMyIG5QYXJ0ID0gKElOVDMyKXdQYXJhbSAmIDB4MDBmZjsKKyAgICBIREMzMiBoZGM7IAogCiAgICAgaWYgKChuUGFydCA8IC0xKSB8fCAoblBhcnQgPj0gc2VsZi0+bnVtUGFydHMpKSByZXR1cm4gRkFMU0U7CiAKKyAgICBoZGMgPSBHZXREQzMyICh3bmRQdHItPmh3bmRTZWxmKTsKICAgICBpZiAoblBhcnQgPT0gLTEpIHsKLSAgICAgICAgc2VsZi0+cGFydDAuaEljb24gPSAoSElDT04zMilsUGFyYW07Ci0gICAgICAgIGlmIChzZWxmLT5zaW1wbGUpIAotICAgICAgICAgICAgSW52YWxpZGF0ZVJlY3QzMihod25kLCAmc2VsZi0+cGFydDAuYm91bmQsIEZBTFNFKTsKKwlzZWxmLT5wYXJ0MC5oSWNvbiA9IChISUNPTjMyKWxQYXJhbTsKKwlpZiAoc2VsZi0+c2ltcGxlKQorCSAgICBTVEFUVVNCQVJfUmVmcmVzaFBhcnQgKHduZFB0ciwgJnNlbGYtPnBhcnQwLCBoZGMpOwogICAgIH0KICAgICBlbHNlIHsKLSAgICAgICAgc2VsZi0+cGFydHNbblBhcnRdLmhJY29uID0gKEhJQ09OMzIpbFBhcmFtOwotICAgICAgICBpZiAoIShzZWxmLT5zaW1wbGUpKQotICAgICAgICAgICAgSW52YWxpZGF0ZVJlY3QzMihod25kLCAmc2VsZi0+cGFydHNbblBhcnRdLmJvdW5kLCBGQUxTRSk7CisJc2VsZi0+cGFydHNbblBhcnRdLmhJY29uID0gKEhJQ09OMzIpbFBhcmFtOworCWlmICghKHNlbGYtPnNpbXBsZSkpCisJICAgIFNUQVRVU0JBUl9SZWZyZXNoUGFydCAod25kUHRyLCAmc2VsZi0+cGFydHNbblBhcnRdLCBoZGMpOwogICAgIH0KKyAgICBSZWxlYXNlREMzMiAod25kUHRyLT5od25kU2VsZiwgaGRjKTsKKwogICAgIHJldHVybiBUUlVFOwogfQogCisKIHN0YXRpYyBMUkVTVUxUCi1TV19HZXRJY29uKFNUQVRVU1dJTkRPV0lORk8gKnNlbGYsIEhXTkQzMiBod25kLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitTVEFUVVNCQVJfU2V0TWluSGVpZ2h0IChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotICAgIElOVDMyICAgIG5QYXJ0OworICAgIFNUQVRVU1dJTkRPV0lORk8gKnNlbGYgPSBTVEFUVVNCQVJfR2V0SW5mb1B0ciAod25kUHRyKTsKIAotICAgIG5QYXJ0ID0gKElOVDMyKXdQYXJhbSAmIDB4MDBmZjsKLSAgICBpZiAoKG5QYXJ0IDwgLTEpIHx8IChuUGFydCA+PSBzZWxmLT5udW1QYXJ0cykpIHJldHVybiAwOworICAgIGlmIChJc1dpbmRvd1Zpc2libGUzMiAod25kUHRyLT5od25kU2VsZikpIHsKKwlIV05EMzIgcGFyZW50ID0gR2V0UGFyZW50MzIgKHduZFB0ci0+aHduZFNlbGYpOworCUlOVDMyICB3aWR0aCwgeCwgeTsKKwlSRUNUMzIgcGFyZW50X3JlY3Q7CiAKLSAgICBpZiAoblBhcnQgPT0gLTEpCi0gICAgICAgIHJldHVybiAoc2VsZi0+cGFydDAuaEljb24pOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIChzZWxmLT5wYXJ0c1tuUGFydF0uaEljb24pOworCUdldENsaWVudFJlY3QzMiAocGFyZW50LCAmcGFyZW50X3JlY3QpOworCXNlbGYtPmhlaWdodCA9IChJTlQzMil3UGFyYW0gKyBWRVJUX0JPUkRFUjsKKwl3aWR0aCA9IHBhcmVudF9yZWN0LnJpZ2h0IC0gcGFyZW50X3JlY3QubGVmdDsKKwl4ID0gcGFyZW50X3JlY3QubGVmdDsKKwl5ID0gcGFyZW50X3JlY3QuYm90dG9tIC0gc2VsZi0+aGVpZ2h0OworCU1vdmVXaW5kb3czMiAod25kUHRyLT5od25kU2VsZiwgcGFyZW50X3JlY3QubGVmdCwKKwkJICAgICAgcGFyZW50X3JlY3QuYm90dG9tIC0gc2VsZi0+aGVpZ2h0LAorCQkgICAgICB3aWR0aCwgc2VsZi0+aGVpZ2h0LCBUUlVFKTsKKwlTVEFUVVNCQVJfU2V0UGFydEJvdW5kcyAod25kUHRyKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKIH0KIAorCiBzdGF0aWMgTFJFU1VMVAotU1dfU2ltcGxlKFNUQVRVU1dJTkRPV0lORk8gKnNlbGYsIEhXTkQzMiBod25kLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitTVEFUVVNCQVJfU2V0UGFydHMgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7Ci0gICAgV05EICp3bmRQdHI7CisgICAgU1RBVFVTV0lORE9XSU5GTyAqc2VsZiA9IFNUQVRVU0JBUl9HZXRJbmZvUHRyICh3bmRQdHIpOworICAgIEhEQzMyCWhkYzsKKyAgICBMUElOVDMyIHBhcnRzOworICAgIFNUQVRVU1dJTkRPV1BBUlQgKgl0bXA7CisgICAgaW50CWk7CisgICAgaW50CW9sZE51bVBhcnRzOworCisgICAgaWYgKHNlbGYtPnNpbXBsZSkKKwlzZWxmLT5zaW1wbGUgPSBGQUxTRTsKKworICAgIG9sZE51bVBhcnRzID0gc2VsZi0+bnVtUGFydHM7CisgICAgc2VsZi0+bnVtUGFydHMgPSAoSU5UMzIpIHdQYXJhbTsKKyAgICBwYXJ0cyA9IChMUElOVDMyKSBsUGFyYW07CisgICAgaWYgKG9sZE51bVBhcnRzID4gc2VsZi0+bnVtUGFydHMpIHsKKwlmb3IgKGkgPSBzZWxmLT5udW1QYXJ0cyA7IGkgPCBvbGROdW1QYXJ0czsgaSsrKSB7CisJICAgIGlmIChzZWxmLT5wYXJ0c1tpXS50ZXh0ICYmIChzZWxmLT5wYXJ0c1tpXS5zdHlsZSAhPSBTQlRfT1dORVJEUkFXKSkKKwkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAgKCksIDAsIHNlbGYtPnBhcnRzW2ldLnRleHQpOworCX0KKyAgICB9CisgICAgZWxzZSBpZiAob2xkTnVtUGFydHMgPCBzZWxmLT5udW1QYXJ0cykgeworCXRtcCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCAoKSwgSEVBUF9aRVJPX01FTU9SWSwKKwkJCXNpemVvZihTVEFUVVNXSU5ET1dQQVJUKSAqIHNlbGYtPm51bVBhcnRzKTsKKwlmb3IgKGkgPSAwOyBpIDwgb2xkTnVtUGFydHM7IGkrKykgeworCSAgICB0bXBbaV0gPSBzZWxmLT5wYXJ0c1tpXTsKKwl9CisJaWYgKHNlbGYtPnBhcnRzKQorCSAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCAoKSwgMCwgc2VsZi0+cGFydHMpOworCXNlbGYtPnBhcnRzID0gdG1wOworICAgIH0KKyAgICAKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2VsZi0+bnVtUGFydHM7IGkrKykgeworCXNlbGYtPnBhcnRzW2ldLnggPSBwYXJ0c1tpXTsKKyAgICB9CisKKyAgICBpZiAoc2VsZi0+aHduZFRvb2xUaXApIHsKKwlJTlQzMiBuVGlwQ291bnQgPQorCSAgICBTZW5kTWVzc2FnZTMyQSAoc2VsZi0+aHduZFRvb2xUaXAsIFRUTV9HRVRUT09MQ09VTlQsIDAsIDApOworCisJaWYgKG5UaXBDb3VudCA8IHNlbGYtPm51bVBhcnRzKSB7CisJICAgIC8qIGFkZCB0b29scyAqLworCSAgICBUVFRPT0xJTkZPMzJBIHRpOworCSAgICBJTlQzMiBpOworCisJICAgIFplcm9NZW1vcnkgKCZ0aSwgc2l6ZW9mKFRUVE9PTElORk8zMkEpKTsKKwkgICAgdGkuY2JTaXplID0gc2l6ZW9mKFRUVE9PTElORk8zMkEpOworCSAgICB0aS5od25kID0gd25kUHRyLT5od25kU2VsZjsKKwkgICAgZm9yIChpID0gblRpcENvdW50OyBpIDwgc2VsZi0+bnVtUGFydHM7IGkrKykgeworCQlUUkFDRSAoc3RhdHVzYmFyLCAiYWRkIHRvb2wgJWRcbiIsIGkpOworCQl0aS51SWQgPSBpOworCQlTZW5kTWVzc2FnZTMyQSAoc2VsZi0+aHduZFRvb2xUaXAsIFRUTV9BRERUT09MMzJBLAorCQkJCTAsIChMUEFSQU0pJnRpKTsKKwkgICAgfQorCX0KKwllbHNlIGlmIChuVGlwQ291bnQgPiBzZWxmLT5udW1QYXJ0cykgeworCSAgICAvKiBkZWxldGUgdG9vbHMgKi8KKwkgICAgSU5UMzIgaTsKKworCSAgICBmb3IgKGkgPSBuVGlwQ291bnQgLSAxOyBpID49IHNlbGYtPm51bVBhcnRzOyBpLS0pIHsKKworCQlUUkFDRSAoc3RhdHVzYmFyLCAiZGVsZXRlIHRvb2wgJWRcbiIsIGkpOworCisJICAgIH0KKwl9CisgICAgfQorCisgICAgU1RBVFVTQkFSX1NldFBhcnRCb3VuZHMgKHduZFB0cik7CisKKyAgICBoZGMgPSBHZXREQzMyICh3bmRQdHItPmh3bmRTZWxmKTsKKyAgICBTVEFUVVNCQVJfUmVmcmVzaCAod25kUHRyLCBoZGMpOworICAgIFJlbGVhc2VEQzMyICh3bmRQdHItPmh3bmRTZWxmLCBoZGMpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIExSRVNVTFQKK1NUQVRVU0JBUl9TZXRUZXh0MzJBIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFNUQVRVU1dJTkRPV0lORk8gKnNlbGYgPSBTVEFUVVNCQVJfR2V0SW5mb1B0ciAod25kUHRyKTsKKyAgICBTVEFUVVNXSU5ET1dQQVJUICpwYXJ0OworICAgIGludAlwYXJ0X251bTsKKyAgICBpbnQJc3R5bGU7CisgICAgTFBTVFIgdGV4dDsKKyAgICBpbnQJbGVuOworICAgIEhEQzMyIGhkYzsKKworICAgIHRleHQgPSAoTFBTVFIpIGxQYXJhbTsKKyAgICBwYXJ0X251bSA9ICgoSU5UMzIpIHdQYXJhbSkgJiAweDAwZmY7CisgICAgc3R5bGUgPSAoKElOVDMyKSB3UGFyYW0pICYgMHhmZjAwOworCisgICAgaWYgKChzZWxmLT5zaW1wbGUpIHx8IChzZWxmLT5wYXJ0cz09TlVMTCkgfHwgKHBhcnRfbnVtPT0yNTUpKQorCXBhcnQgPSAmc2VsZi0+cGFydDA7CisgICAgZWxzZQorCXBhcnQgPSAmc2VsZi0+cGFydHNbcGFydF9udW1dOworICAgIGlmICghcGFydCkgcmV0dXJuIEZBTFNFOworICAgIHBhcnQtPnN0eWxlID0gc3R5bGU7CisgICAgaWYgKHN0eWxlID09IFNCVF9PV05FUkRSQVcpIHsKKwlwYXJ0LT50ZXh0ID0gdGV4dDsKKyAgICB9CisgICAgZWxzZSB7CisJLyogZHVwbGljYXRlIHN0cmluZyAqLworCWlmIChwYXJ0LT50ZXh0KQorCSAgICBIZWFwRnJlZSAoR2V0UHJvY2Vzc0hlYXAgKCksIDAsIHBhcnQtPnRleHQpOworCXBhcnQtPnRleHQgPSAwOworCWlmICh0ZXh0ICYmIChsZW4gPSBsc3RybGVuMzJBKHRleHQpKSkgeworCSAgICBwYXJ0LT50ZXh0ID0gSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgbGVuKzEpOworCSAgICBsc3RyY3B5MzJBKHBhcnQtPnRleHQsIHRleHQpOworCX0KKyAgICB9CisKKyAgICBoZGMgPSBHZXREQzMyICh3bmRQdHItPmh3bmRTZWxmKTsKKyAgICBTVEFUVVNCQVJfUmVmcmVzaFBhcnQgKHduZFB0ciwgcGFydCwgaGRjKTsKKyAgICBSZWxlYXNlREMzMiAod25kUHRyLT5od25kU2VsZiwgaGRjKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisKKy8vICA8PCBTVEFUVVNCQVJfU2V0VGV4dDMyVyA+PgorCisKK3N0YXRpYyBMUkVTVUxUCitTVEFUVVNCQVJfU2V0VGlwVGV4dDMyQSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBTVEFUVVNXSU5ET1dJTkZPICpzZWxmID0gU1RBVFVTQkFSX0dldEluZm9QdHIgKHduZFB0cik7CisgICAgVFRUT09MSU5GTzMyQSB0aTsKKworICAgIFRSQUNFIChzdGF0dXNiYXIsICJwYXJ0ICVkOiBcIiVzXCJcbiIsIChJTlQzMil3UGFyYW0sIChMUFNUUilsUGFyYW0pOworICAgIGlmIChzZWxmLT5od25kVG9vbFRpcCkgeworCXRpLmNiU2l6ZSA9IHNpemVvZihUVFRPT0xJTkZPMzJBKTsKKwl0aS5od25kID0gd25kUHRyLT5od25kU2VsZjsKKwl0aS51SWQgPSAoSU5UMzIpd1BhcmFtOworCXRpLmhpbnN0ID0gMDsKKwl0aS5scHN6VGV4dCA9IChMUFNUUilsUGFyYW07CisJU2VuZE1lc3NhZ2UzMkEgKHNlbGYtPmh3bmRUb29sVGlwLCBUVE1fVVBEQVRFVElQVEVYVDMyQSwKKwkJCTAsIChMUEFSQU0pJnRpKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCisvLyAgPDwgU1RBVFVTQkFSX1NldFRpcFRleHQzMlcgPj4KKy8vICA8PCBTVEFUVVNCQVJfU2V0VW5pY29kZUZvcm1hdCA+PgorCisKK3N0YXRpYyBMUkVTVUxUCitTVEFUVVNCQVJfU2ltcGxlIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFNUQVRVU1dJTkRPV0lORk8gKnNlbGYgPSBTVEFUVVNCQVJfR2V0SW5mb1B0ciAod25kUHRyKTsKICAgICBCT09MMzIgc2ltcGxlOwogICAgIEhEQzMyICBoZGM7CiAgICAgTk1IRFIgIG5taGRyOwogCi0gICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7Ci0KICAgICBzaW1wbGUgPSAoQk9PTDMyKSB3UGFyYW07CiAgICAgc2VsZi0+c2ltcGxlID0gc2ltcGxlOwogCiAgICAgLyogc2VuZCBub3RpZmljYXRpb24gKi8KLSAgICBubWhkci5od25kRnJvbSA9IGh3bmQ7CisgICAgbm1oZHIuaHduZEZyb20gPSB3bmRQdHItPmh3bmRTZWxmOwogICAgIG5taGRyLmlkRnJvbSA9IHduZFB0ci0+d0lEbWVudTsKICAgICBubWhkci5jb2RlID0gU0JOX1NJTVBMRU1PREVDSEFOR0U7Ci0gICAgU2VuZE1lc3NhZ2UzMkEgKEdldFBhcmVudDMyIChod25kKSwgV01fTk9USUZZLCAwLCAoTFBBUkFNKSZubWhkcik7CisgICAgU2VuZE1lc3NhZ2UzMkEgKEdldFBhcmVudDMyICh3bmRQdHItPmh3bmRTZWxmKSwgV01fTk9USUZZLAorCQkgICAgMCwgKExQQVJBTSkmbm1oZHIpOwogCi0gICAgaGRjID0gR2V0REMzMihod25kKTsKLSAgICBTV19SZWZyZXNoKGh3bmQsIGhkYywgc2VsZik7Ci0gICAgUmVsZWFzZURDMzIoaHduZCwgaGRjKTsKKyAgICBoZGMgPSBHZXREQzMyICh3bmRQdHItPmh3bmRTZWxmKTsKKyAgICBTVEFUVVNCQVJfUmVmcmVzaCAod25kUHRyLCBoZGMpOworICAgIFJlbGVhc2VEQzMyICh3bmRQdHItPmh3bmRTZWxmLCBoZGMpOwogCiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKIAogc3RhdGljIExSRVNVTFQKLVNXX0Rlc3Ryb3koU1RBVFVTV0lORE9XSU5GTyAqc2VsZiwgSFdORDMyIGh3bmQsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK1NUQVRVU0JBUl9XTUNyZWF0ZSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLSAgICBpbnQJaTsKKyAgICBMUENSRUFURVNUUlVDVDMyQSBscENyZWF0ZSA9IChMUENSRUFURVNUUlVDVDMyQSkgbFBhcmFtOworICAgIE5PTkNMSUVOVE1FVFJJQ1MzMkEgbmNsbTsKKyAgICBSRUNUMzIJcmVjdDsKKyAgICBpbnQJICAgICAgICB3aWR0aCwgbGVuOworICAgIEhEQzMyCWhkYzsKKyAgICBTVEFUVVNXSU5ET1dJTkZPICpzZWxmOwogCi0gICAgZm9yIChpID0gMDsgaSA8IHNlbGYtPm51bVBhcnRzOyBpKyspIHsKLQlpZiAoc2VsZi0+cGFydHNbaV0udGV4dCAmJiAoc2VsZi0+cGFydHNbaV0uc3R5bGUgIT0gU0JUX09XTkVSRFJBVykpCi0JICAgIEhlYXBGcmVlKFN5c3RlbUhlYXAsIDAsIHNlbGYtPnBhcnRzW2ldLnRleHQpOworICAgIHNlbGYgPSAoU1RBVFVTV0lORE9XSU5GTyopSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCAoKSwgSEVBUF9aRVJPX01FTU9SWSwKKwkJCQkJIHNpemVvZihTVEFUVVNXSU5ET1dJTkZPKSk7CisgICAgd25kUHRyLT53RXh0cmFbMF0gPSAoRFdPUkQpc2VsZjsKKworICAgIHNlbGYtPm51bVBhcnRzID0gMTsKKyAgICBzZWxmLT5wYXJ0cyA9IDA7CisgICAgc2VsZi0+c2ltcGxlID0gRkFMU0U7CisgICAgc2VsZi0+Y2xyQmsgPSBDTFJfREVGQVVMVDsKKyAgICBzZWxmLT5oRm9udCA9IDA7CisgICAgR2V0Q2xpZW50UmVjdDMyICh3bmRQdHItPmh3bmRTZWxmLCAmcmVjdCk7CisKKyAgICBuY2xtLmNiU2l6ZSA9IHNpemVvZihOT05DTElFTlRNRVRSSUNTMzJBKTsKKyAgICBTeXN0ZW1QYXJhbWV0ZXJzSW5mbzMyQSAoU1BJX0dFVE5PTkNMSUVOVE1FVFJJQ1MsIDAsICZuY2xtLCAwKTsKKyAgICBzZWxmLT5oRGVmYXVsdEZvbnQgPSBDcmVhdGVGb250SW5kaXJlY3QzMkEgKCZuY2xtLmxmU3RhdHVzRm9udCk7CisKKyAgICAvKiBpbml0aWFsaXplIHNpbXBsZSBjYXNlICovCisgICAgc2VsZi0+cGFydDAuYm91bmQgPSByZWN0OworICAgIHNlbGYtPnBhcnQwLnRleHQgPSAwOworICAgIHNlbGYtPnBhcnQwLnggPSAwOworICAgIHNlbGYtPnBhcnQwLnN0eWxlID0gMDsKKyAgICBzZWxmLT5wYXJ0MC5oSWNvbiA9IDA7CisKKyAgICAvKiBpbml0aWFsaXplIGZpcnN0IHBhcnQgKi8KKyAgICBzZWxmLT5wYXJ0cyA9IEhlYXBBbGxvYyAoR2V0UHJvY2Vzc0hlYXAgKCksIEhFQVBfWkVST19NRU1PUlksCisJCQkgICAgIHNpemVvZihTVEFUVVNXSU5ET1dQQVJUKSk7CisgICAgc2VsZi0+cGFydHNbMF0uYm91bmQgPSByZWN0OworICAgIHNlbGYtPnBhcnRzWzBdLnRleHQgPSAwOworICAgIHNlbGYtPnBhcnRzWzBdLnggPSAtMTsKKyAgICBzZWxmLT5wYXJ0c1swXS5zdHlsZSA9IDA7CisgICAgc2VsZi0+cGFydHNbMF0uaEljb24gPSAwOworCisgICAgaWYgKChsZW4gPSBsc3RybGVuMzJBIChscENyZWF0ZS0+bHBzek5hbWUpKSkgeworICAgICAgICBzZWxmLT5wYXJ0c1swXS50ZXh0ID0gSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgbGVuICsgMSk7CisgICAgICAgIGxzdHJjcHkzMkEgKHNlbGYtPnBhcnRzWzBdLnRleHQsIGxwQ3JlYXRlLT5scHN6TmFtZSk7CiAgICAgfQotICAgIGlmIChzZWxmLT5wYXJ0MC50ZXh0ICYmIChzZWxmLT5wYXJ0MC5zdHlsZSAhPSBTQlRfT1dORVJEUkFXKSkKLQlIZWFwRnJlZShTeXN0ZW1IZWFwLCAwLCBzZWxmLT5wYXJ0MC50ZXh0KTsKLSAgICBIZWFwRnJlZShTeXN0ZW1IZWFwLCAwLCBzZWxmLT5wYXJ0cyk7CiAKLSAgICAvKiBkZWxldGUgZGVmYXVsdCBmb250ICovCi0gICAgaWYgKHNlbGYtPmhEZWZhdWx0Rm9udCkKLQlEZWxldGVPYmplY3QzMiAoc2VsZi0+aERlZmF1bHRGb250KTsKKyAgICBpZiAoKGhkYyA9IEdldERDMzIgKDApKSkgeworCVRFWFRNRVRSSUMzMkEgdG07CisJSEZPTlQzMiBoT2xkRm9udDsKIAotICAgIEhlYXBGcmVlKFN5c3RlbUhlYXAsIDAsIHNlbGYpOworCWhPbGRGb250ID0gU2VsZWN0T2JqZWN0MzIgKGhkYyxzZWxmLT5oRGVmYXVsdEZvbnQpOworCUdldFRleHRNZXRyaWNzMzJBKGhkYywgJnRtKTsKKwlzZWxmLT50ZXh0SGVpZ2h0ID0gdG0udG1IZWlnaHQ7CisJU2VsZWN0T2JqZWN0MzIgKGhkYywgaE9sZEZvbnQpOworCVJlbGVhc2VEQzMyKDAsIGhkYyk7CisgICAgfQorCisgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFNCVF9UT09MVElQUykgeworCXNlbGYtPmh3bmRUb29sVGlwID0KKwkgICAgQ3JlYXRlV2luZG93RXgzMkEgKDAsIFRPT0xUSVBTX0NMQVNTMzJBLCBOVUxMLCAwLAorCQkJICAgICAgIENXX1VTRURFRkFVTFQzMiwgQ1dfVVNFREVGQVVMVDMyLAorCQkJICAgICAgIENXX1VTRURFRkFVTFQzMiwgQ1dfVVNFREVGQVVMVDMyLAorCQkJICAgICAgIHduZFB0ci0+aHduZFNlbGYsIDAsCisJCQkgICAgICAgd25kUHRyLT5oSW5zdGFuY2UsIE5VTEwpOworCisJaWYgKHNlbGYtPmh3bmRUb29sVGlwKSB7CisJICAgIE5NVE9PTFRJUFNDUkVBVEVEIG5tdHRjOworCisJICAgIG5tdHRjLmhkci5od25kRnJvbSA9IHduZFB0ci0+aHduZFNlbGY7CisJICAgIG5tdHRjLmhkci5pZEZyb20gPSB3bmRQdHItPndJRG1lbnU7CisJICAgIG5tdHRjLmhkci5jb2RlID0gTk1fVE9PTFRJUFNDUkVBVEVEOworCSAgICBubXR0Yy5od25kVG9vbFRpcHMgPSBzZWxmLT5od25kVG9vbFRpcDsKKworCSAgICBTZW5kTWVzc2FnZTMyQSAoR2V0UGFyZW50MzIgKHduZFB0ci0+aHduZFNlbGYpLCBXTV9OT1RJRlksCisJCQkgICAgKFdQQVJBTTMyKXduZFB0ci0+d0lEbWVudSwgKExQQVJBTSkmbm10dGMpOworCX0KKyAgICB9CisKKyAgICBHZXRDbGllbnRSZWN0MzIgKEdldFBhcmVudDMyICh3bmRQdHItPmh3bmRTZWxmKSwgJnJlY3QpOworICAgIHdpZHRoID0gcmVjdC5yaWdodCAtIHJlY3QubGVmdDsKKyAgICBzZWxmLT5oZWlnaHQgPSBzZWxmLT50ZXh0SGVpZ2h0ICsgNCArIFZFUlRfQk9SREVSOworICAgIE1vdmVXaW5kb3czMiAod25kUHRyLT5od25kU2VsZiwgbHBDcmVhdGUtPngsIGxwQ3JlYXRlLT55LTEsCisJCSAgd2lkdGgsIHNlbGYtPmhlaWdodCwgRkFMU0UpOworICAgIFNUQVRVU0JBUl9TZXRQYXJ0Qm91bmRzICh3bmRQdHIpOworCiAgICAgcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIExSRVNVTFQKLVNXX1dNR2V0VGV4dCAoU1RBVFVTV0lORE9XSU5GTyAqc2VsZiwgSFdORDMyIGh3bmQsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK1NUQVRVU0JBUl9XTURlc3Ryb3kgKFdORCAqd25kUHRyKQogeworICAgIFNUQVRVU1dJTkRPV0lORk8gKnNlbGYgPSBTVEFUVVNCQVJfR2V0SW5mb1B0ciAod25kUHRyKTsKKyAgICBpbnQJaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzZWxmLT5udW1QYXJ0czsgaSsrKSB7CisJaWYgKHNlbGYtPnBhcnRzW2ldLnRleHQgJiYgKHNlbGYtPnBhcnRzW2ldLnN0eWxlICE9IFNCVF9PV05FUkRSQVcpKQorCSAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCAoKSwgMCwgc2VsZi0+cGFydHNbaV0udGV4dCk7CisgICAgfQorICAgIGlmIChzZWxmLT5wYXJ0MC50ZXh0ICYmIChzZWxmLT5wYXJ0MC5zdHlsZSAhPSBTQlRfT1dORVJEUkFXKSkKKwlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCAoKSwgMCwgc2VsZi0+cGFydDAudGV4dCk7CisgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAgKCksIDAsIHNlbGYtPnBhcnRzKTsKKworICAgIC8qIGRlbGV0ZSBkZWZhdWx0IGZvbnQgKi8KKyAgICBpZiAoc2VsZi0+aERlZmF1bHRGb250KQorCURlbGV0ZU9iamVjdDMyIChzZWxmLT5oRGVmYXVsdEZvbnQpOworCisgICAgLyogZGVsZXRlIHRvb2wgdGlwIGNvbnRyb2wgKi8KKyAgICBpZiAoc2VsZi0+aHduZFRvb2xUaXApCisJRGVzdHJveVdpbmRvdzMyIChzZWxmLT5od25kVG9vbFRpcCk7CisKKyAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCAoKSwgMCwgc2VsZik7CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgX19pbmxpbmVfXyBMUkVTVUxUCitTVEFUVVNCQVJfV01HZXRGb250IChXTkQgKnduZFB0cikKK3sKKyAgICBTVEFUVVNXSU5ET1dJTkZPICpzZWxmID0gU1RBVFVTQkFSX0dldEluZm9QdHIgKHduZFB0cik7CisKKyAgICByZXR1cm4gc2VsZi0+aEZvbnQ7Cit9CisKKworc3RhdGljIExSRVNVTFQKK1NUQVRVU0JBUl9XTUdldFRleHQgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgU1RBVFVTV0lORE9XSU5GTyAqc2VsZiA9IFNUQVRVU0JBUl9HZXRJbmZvUHRyICh3bmRQdHIpOwogICAgIElOVDMyIGxlbjsKIAogICAgIGlmICghKHNlbGYtPnBhcnRzWzBdLnRleHQpKQpAQCAtNjA1LDIxICs4MjksMzYgQEAKIAogCiBzdGF0aWMgTFJFU1VMVAotU1dfV01HZXRUZXh0TGVuZ3RoIChTVEFUVVNXSU5ET1dJTkZPICpzZWxmLCBIV05EMzIgaHduZCwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorU1RBVFVTQkFSX1dNR2V0VGV4dExlbmd0aCAoV05EICp3bmRQdHIpCiB7CisgICAgU1RBVFVTV0lORE9XSU5GTyAqc2VsZiA9IFNUQVRVU0JBUl9HZXRJbmZvUHRyICh3bmRQdHIpOworCiAgICAgaWYgKCEoc2VsZi0+cGFydHNbMF0udGV4dCkpCiAgICAgICAgIHJldHVybiAwOworCiAgICAgcmV0dXJuIChsc3RybGVuMzJBIChzZWxmLT5wYXJ0c1swXS50ZXh0KSk7CiB9CiAKIAotc3RhdGljIExSRVNVTFQKLVNXX05jSGl0VGVzdCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK19faW5saW5lX18gc3RhdGljIExSRVNVTFQKK1NUQVRVU0JBUl9XTU1vdXNlTW92ZSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLSAgICBSRUNUMzIgIHJlY3Q7Ci0gICAgUE9JTlQzMiBwdDsKKyAgICBTVEFUVVNXSU5ET1dJTkZPICpzZWxmID0gU1RBVFVTQkFSX0dldEluZm9QdHIgKHduZFB0cik7CiAKKyAgICBpZiAoc2VsZi0+aHduZFRvb2xUaXApCisJU1RBVFVTQkFSX1JlbGF5RXZlbnQgKHNlbGYtPmh3bmRUb29sVGlwLCB3bmRQdHItPmh3bmRTZWxmLAorCQkJICAgICAgV01fTU9VU0VNT1ZFLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIExSRVNVTFQKK1NUQVRVU0JBUl9XTU5DSGl0VGVzdCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKICAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgU0JBUlNfU0laRUdSSVApIHsKKwlSRUNUMzIgIHJlY3Q7CisJUE9JTlQzMiBwdDsKKwogCUdldENsaWVudFJlY3QzMiAod25kUHRyLT5od25kU2VsZiwgJnJlY3QpOwogCiAJcHQueCA9IChJTlQzMilMT1dPUkQobFBhcmFtKTsKQEAgLTYzNyw4NiArODc2LDkzIEBACiB9CiAKIAotc3RhdGljIExSRVNVTFQKLVNXX05jTEJ1dHRvbkRvd24gKEhXTkQzMiBod25kLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitzdGF0aWMgX19pbmxpbmVfXyBMUkVTVUxUCitTVEFUVVNCQVJfV01OQ0xCdXR0b25Eb3duIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotICAgIFBvc3RNZXNzYWdlMzJBIChHZXRQYXJlbnQzMiAoaHduZCksIFdNX05DTEJVVFRPTkRPV04sCisgICAgUG9zdE1lc3NhZ2UzMkEgKEdldFBhcmVudDMyICh3bmRQdHItPmh3bmRTZWxmKSwgV01fTkNMQlVUVE9ORE9XTiwKKwkJICAgIHdQYXJhbSwgbFBhcmFtKTsKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgX19pbmxpbmVfXyBMUkVTVUxUCitTVEFUVVNCQVJfV01OQ0xCdXR0b25VcCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBQb3N0TWVzc2FnZTMyQSAoR2V0UGFyZW50MzIgKHduZFB0ci0+aHduZFNlbGYpLCBXTV9OQ0xCVVRUT05VUCwKIAkJICAgIHdQYXJhbSwgbFBhcmFtKTsKICAgICByZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgTFJFU1VMVAotU1dfTmNMQnV0dG9uVXAgKEhXTkQzMiBod25kLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitTVEFUVVNCQVJfV01QYWludCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSkKIHsKLSAgICBQb3N0TWVzc2FnZTMyQSAoR2V0UGFyZW50MzIgKGh3bmQpLCBXTV9OQ0xCVVRUT05VUCwKLQkJICAgIHdQYXJhbSwgbFBhcmFtKTsKKyAgICBIREMzMiBoZGM7CisgICAgUEFJTlRTVFJVQ1QzMiBwczsKKworICAgIGhkYyA9IHdQYXJhbT09MCA/IEJlZ2luUGFpbnQzMiAod25kUHRyLT5od25kU2VsZiwgJnBzKSA6IChIREMzMil3UGFyYW07CisgICAgU1RBVFVTQkFSX1JlZnJlc2ggKHduZFB0ciwgaGRjKTsKKyAgICBpZiAoIXdQYXJhbSkKKwlFbmRQYWludDMyICh3bmRQdHItPmh3bmRTZWxmLCAmcHMpOworCiAgICAgcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIExSRVNVTFQKLVNXX1BhaW50KFNUQVRVU1dJTkRPV0lORk8gKnNlbGYsIEhXTkQzMiBod25kKQorU1RBVFVTQkFSX1dNU2V0Rm9udCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLSAgICBIREMzMiBoZGM7Ci0gICAgUEFJTlRTVFJVQ1QzMglwczsKLQotICAgIGhkYyA9IEJlZ2luUGFpbnQzMihod25kLCAmcHMpOwotICAgIFNXX1JlZnJlc2goaHduZCwgaGRjLCBzZWxmKTsKLSAgICBFbmRQYWludDMyKGh3bmQsICZwcyk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIExSRVNVTFQKLVNXX1dNU2V0Rm9udCAoU1RBVFVTV0lORE9XSU5GTyAqc2VsZiwgSFdORDMyIGh3bmQsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKLXsKLSAgICBIREMzMiBoZGM7CisgICAgU1RBVFVTV0lORE9XSU5GTyAqc2VsZiA9IFNUQVRVU0JBUl9HZXRJbmZvUHRyICh3bmRQdHIpOwogCiAgICAgc2VsZi0+aEZvbnQgPSAoSEZPTlQzMil3UGFyYW07CiAgICAgaWYgKExPV09SRChsUGFyYW0pID09IFRSVUUpIHsKLSAgICAgICAgaGRjID0gR2V0REMzMihod25kKTsKLSAgICAgICAgU1dfUmVmcmVzaChod25kLCBoZGMsIHNlbGYpOwotICAgICAgICBSZWxlYXNlREMzMihod25kLCBoZGMpOworCUhEQzMyIGhkYyA9IEdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOworICAgICAgICBTVEFUVVNCQVJfUmVmcmVzaCAod25kUHRyLCBoZGMpOworICAgICAgICBSZWxlYXNlREMzMiAod25kUHRyLT5od25kU2VsZiwgaGRjKTsKICAgICB9CisKICAgICByZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgTFJFU1VMVAotU1dfV01TZXRUZXh0IChTVEFUVVNXSU5ET1dJTkZPICpzZWxmLCBIV05EMzIgaHduZCwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorU1RBVFVTQkFSX1dNU2V0VGV4dCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLSAgICBpbnQgbGVuOworICAgIFNUQVRVU1dJTkRPV0lORk8gKnNlbGYgPSBTVEFUVVNCQVJfR2V0SW5mb1B0ciAod25kUHRyKTsKICAgICBTVEFUVVNXSU5ET1dQQVJUICpwYXJ0OworICAgIGludCBsZW47CisgICAgSERDMzIgaGRjOwogCi0gICAgaWYgKHNlbGYtPm51bVBhcnRzID09IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAoc2VsZi0+bnVtUGFydHMgPT0gMCkKKwlyZXR1cm4gRkFMU0U7CiAKICAgICBwYXJ0ID0gJnNlbGYtPnBhcnRzWzBdOwogICAgIC8qIGR1cGxpY2F0ZSBzdHJpbmcgKi8KICAgICBpZiAocGFydC0+dGV4dCkKLSAgICAgICAgSGVhcEZyZWUoU3lzdGVtSGVhcCwgMCwgcGFydC0+dGV4dCk7CisgICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwICgpLCAwLCBwYXJ0LT50ZXh0KTsKICAgICBwYXJ0LT50ZXh0ID0gMDsKICAgICBpZiAobFBhcmFtICYmIChsZW4gPSBsc3RybGVuMzJBKChMUENTVFIpbFBhcmFtKSkpIHsKLSAgICAgICAgcGFydC0+dGV4dCA9IEhlYXBBbGxvYyAoU3lzdGVtSGVhcCwgMCwgbGVuKzEpOworICAgICAgICBwYXJ0LT50ZXh0ID0gSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgbGVuKzEpOwogICAgICAgICBsc3RyY3B5MzJBIChwYXJ0LT50ZXh0LCAoTFBDU1RSKWxQYXJhbSk7CiAgICAgfQotICAgIEludmFsaWRhdGVSZWN0MzIoaHduZCwgJnBhcnQtPmJvdW5kLCBGQUxTRSk7Ci0vLyAgICBTV19SZWZyZXNoUGFydCAoaGRjLCBwYXJ0KTsKKworICAgIGhkYyA9IEdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOworICAgIFNUQVRVU0JBUl9SZWZyZXNoUGFydCAod25kUHRyLCBwYXJ0LCBoZGMpOworICAgIFJlbGVhc2VEQzMyICh3bmRQdHItPmh3bmRTZWxmLCBoZGMpOwogCiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKIAogc3RhdGljIExSRVNVTFQKLVNXX1NpemUoU1RBVFVTV0lORE9XSU5GTyAqc2VsZiwgSFdORDMyIGh3bmQsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK1NUQVRVU0JBUl9XTVNpemUgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7Ci0gICAgLyogTmVlZCB0byByZXNpemUgd2lkdGggdG8gbWF0Y2ggcGFyZW50ICovCi0gICAgSU5UMzIJd2lkdGgsIHgsIHk7CisgICAgU1RBVFVTV0lORE9XSU5GTyAqc2VsZiA9IFNUQVRVU0JBUl9HZXRJbmZvUHRyICh3bmRQdHIpOworICAgIElOVDMyCXdpZHRoLCB4LCB5LCBmbGFnczsKICAgICBSRUNUMzIJcGFyZW50X3JlY3Q7CiAgICAgSFdORDMyCXBhcmVudDsKIAotICAgIElOVDMyICAJZmxhZ3M7Ci0KKyAgICAvKiBOZWVkIHRvIHJlc2l6ZSB3aWR0aCB0byBtYXRjaCBwYXJlbnQgKi8KICAgICBmbGFncyA9IChJTlQzMikgd1BhcmFtOwogCiAgICAgLyogRklYTUUgZm9yIGZsYWdzID0KQEAgLTcyNSwzMSArOTcxLDMwIEBACiAKICAgICBpZiAoZmxhZ3MgPT0gU0laRV9SRVNUT1JFRCkgewogCS8qIHdpZHRoIGFuZCBoZWlnaHQgZG9uJ3QgYXBwbHkgKi8KLQlwYXJlbnQgPSBHZXRQYXJlbnQzMihod25kKTsKLQlHZXRDbGllbnRSZWN0MzIocGFyZW50LCAmcGFyZW50X3JlY3QpOworCXBhcmVudCA9IEdldFBhcmVudDMyICh3bmRQdHItPmh3bmRTZWxmKTsKKwlHZXRDbGllbnRSZWN0MzIgKHBhcmVudCwgJnBhcmVudF9yZWN0KTsKIAl3aWR0aCA9IHBhcmVudF9yZWN0LnJpZ2h0IC0gcGFyZW50X3JlY3QubGVmdDsKIAl4ID0gcGFyZW50X3JlY3QubGVmdDsKIAl5ID0gcGFyZW50X3JlY3QuYm90dG9tIC0gc2VsZi0+aGVpZ2h0OwotCU1vdmVXaW5kb3czMihod25kLCBwYXJlbnRfcmVjdC5sZWZ0LCBwYXJlbnRfcmVjdC5ib3R0b20gLSBzZWxmLT5oZWlnaHQsCi0JCSAgICAgd2lkdGgsIHNlbGYtPmhlaWdodCwgVFJVRSk7Ci0JU1dfU2V0UGFydEJvdW5kcyhod25kLCBzZWxmKTsKKwlNb3ZlV2luZG93MzIgKHduZFB0ci0+aHduZFNlbGYsIHBhcmVudF9yZWN0LmxlZnQsIAorCQkgICAgICBwYXJlbnRfcmVjdC5ib3R0b20gLSBzZWxmLT5oZWlnaHQsCisJCSAgICAgIHdpZHRoLCBzZWxmLT5oZWlnaHQsIFRSVUUpOworCVNUQVRVU0JBUl9TZXRQYXJ0Qm91bmRzICh3bmRQdHIpOwogICAgIH0KICAgICByZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgTFJFU1VMVAotU1dfU2VuZE5vdGlmeSAoSFdORDMyIGh3bmQsIFVJTlQzMiBjb2RlKQorU1RBVFVTQkFSX1NlbmROb3RpZnkgKFdORCAqd25kUHRyLCBVSU5UMzIgY29kZSkKIHsKLSAgICBXTkQgICAgKnduZFB0cjsKICAgICBOTUhEUiAgbm1oZHI7CiAKLSAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKLSAgICBubWhkci5od25kRnJvbSA9IGh3bmQ7CisgICAgbm1oZHIuaHduZEZyb20gPSB3bmRQdHItPmh3bmRTZWxmOwogICAgIG5taGRyLmlkRnJvbSA9IHduZFB0ci0+d0lEbWVudTsKICAgICBubWhkci5jb2RlID0gY29kZTsKLSAgICBTZW5kTWVzc2FnZTMyQSAoR2V0UGFyZW50MzIgKGh3bmQpLCBXTV9OT1RJRlksIDAsIChMUEFSQU0pJm5taGRyKTsKLQorICAgIFNlbmRNZXNzYWdlMzJBIChHZXRQYXJlbnQzMiAod25kUHRyLT5od25kU2VsZiksIFdNX05PVElGWSwKKwkJICAgIDAsIChMUEFSQU0pJm5taGRyKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNzU4LDgwICsxMDAzLDEyMyBAQAogTFJFU1VMVCBXSU5BUEkKIFN0YXR1c1dpbmRvd1Byb2MgKEhXTkQzMiBod25kLCBVSU5UMzIgbXNnLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7Ci0gICAgU1RBVFVTV0lORE9XSU5GTyAqc2VsZjsKLSAgICBXTkQgKnduZFB0cjsKLQotICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOwotICAgIHNlbGYgPSBHZXRTdGF0dXNJbmZvKGh3bmQpOworICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIgKGh3bmQpOwogCiAgICAgc3dpdGNoIChtc2cpIHsKLSAgICBjYXNlIFNCX0dFVEJPUkRFUlM6Ci0JcmV0dXJuIFNXX0dldEJvcmRlcnMgKGxQYXJhbSk7Ci0gICAgY2FzZSBTQl9HRVRJQ09OOgotICAgICAgICByZXR1cm4gU1dfR2V0SWNvbihzZWxmLCBod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgY2FzZSBTQl9HRVRQQVJUUzoKLQlyZXR1cm4gU1dfR2V0UGFydHMoc2VsZiwgaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgIGNhc2UgU0JfR0VUUkVDVDoKLQlyZXR1cm4gU1dfR2V0UmVjdChzZWxmLCBod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgY2FzZSBTQl9HRVRURVhUMzJBOgotCXJldHVybiBTV19HZXRUZXh0KHNlbGYsIGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICBjYXNlIFNCX0dFVFRFWFRMRU5HVEgzMkE6Ci0JcmV0dXJuIFNXX0dldFRleHRMZW5ndGgoc2VsZiwgaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgIGNhc2UgU0JfSVNTSU1QTEU6Ci0gICAgICAgIHJldHVybiBzZWxmLT5zaW1wbGU7Ci0gICAgY2FzZSBTQl9TRVRCS0NPTE9SOgotICAgICAgICByZXR1cm4gU1dfU2V0QmtDb2xvcihzZWxmLCBod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgY2FzZSBTQl9TRVRJQ09OOgotICAgICAgICByZXR1cm4gU1dfU2V0SWNvbihzZWxmLCBod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgY2FzZSBTQl9TRVRNSU5IRUlHSFQ6Ci0JcmV0dXJuIFNXX1NldE1pbkhlaWdodChzZWxmLCBod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgY2FzZSBTQl9TRVRQQVJUUzoJCi0JcmV0dXJuIFNXX1NldFBhcnRzKHNlbGYsIGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICBjYXNlIFNCX1NFVFRFWFQzMkE6Ci0JcmV0dXJuIFNXX1NldFRleHQoc2VsZiwgaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgIGNhc2UgU0JfU0lNUExFOgotCXJldHVybiBTV19TaW1wbGUoc2VsZiwgaHduZCwgd1BhcmFtLCBsUGFyYW0pOworCWNhc2UgU0JfR0VUQk9SREVSUzoKKwkgICAgcmV0dXJuIFNUQVRVU0JBUl9HZXRCb3JkZXJzIChsUGFyYW0pOwogCi0gICAgY2FzZSBXTV9DUkVBVEU6Ci0JcmV0dXJuIFNXX0NyZWF0ZShod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgY2FzZSBXTV9ERVNUUk9ZOgotCXJldHVybiBTV19EZXN0cm95KHNlbGYsIGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICBjYXNlIFdNX0dFVEZPTlQ6Ci0gICAgICAgIHJldHVybiBzZWxmLT5oRm9udDsKLSAgICBjYXNlIFdNX0dFVFRFWFQ6Ci0gICAgICAgIHJldHVybiBTV19XTUdldFRleHQoc2VsZiwgaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgIGNhc2UgV01fR0VUVEVYVExFTkdUSDoKLSAgICAgICAgcmV0dXJuIFNXX1dNR2V0VGV4dExlbmd0aChzZWxmLCBod25kLCB3UGFyYW0sIGxQYXJhbSk7CisJY2FzZSBTQl9HRVRJQ09OOgorCSAgICByZXR1cm4gU1RBVFVTQkFSX0dldEljb24gKHduZFB0ciwgd1BhcmFtKTsKIAotICAgIGNhc2UgV01fTEJVVFRPTkRCTENMSzoKLSAgICAgICAgcmV0dXJuIFNXX1NlbmROb3RpZnkgKGh3bmQsIE5NX0RCTENMSyk7CisJY2FzZSBTQl9HRVRQQVJUUzoKKwkgICAgcmV0dXJuIFNUQVRVU0JBUl9HZXRQYXJ0cyAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAKLSAgICBjYXNlIFdNX0xCVVRUT05VUDoKLQlyZXR1cm4gU1dfU2VuZE5vdGlmeSAoaHduZCwgTk1fQ0xJQ0spOworCWNhc2UgU0JfR0VUUkVDVDoKKwkgICAgcmV0dXJuIFNUQVRVU0JBUl9HZXRSZWN0ICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAotICAgIGNhc2UgV01fTkNISVRURVNUOgotICAgICAgICByZXR1cm4gU1dfTmNIaXRUZXN0ICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwljYXNlIFNCX0dFVFRFWFQzMkE6CisJICAgIHJldHVybiBTVEFUVVNCQVJfR2V0VGV4dDMyQSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAKLSAgICBjYXNlIFdNX05DTEJVVFRPTkRPV046Ci0JcmV0dXJuIFNXX05jTEJ1dHRvbkRvd24gKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKy8vCWNhc2UgU0JfR0VUVEVYVDMyVzoKIAotICAgIGNhc2UgV01fTkNMQlVUVE9OVVA6Ci0JcmV0dXJuIFNXX05jTEJ1dHRvblVwIChod25kLCB3UGFyYW0sIGxQYXJhbSk7CisJY2FzZSBTQl9HRVRURVhUTEVOR1RIMzJBOgorCSAgICByZXR1cm4gU1RBVFVTQkFSX0dldFRleHRMZW5ndGgzMkEgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCi0gICAgY2FzZSBXTV9QQUlOVDoKLQlyZXR1cm4gU1dfUGFpbnQoc2VsZiwgaHduZCk7Ci0gICAgY2FzZSBXTV9SQlVUVE9OREJMQ0xLOgotICAgICAgICByZXR1cm4gU1dfU2VuZE5vdGlmeSAoaHduZCwgTk1fUkRCTENMSyk7Ci0gICAgY2FzZSBXTV9SQlVUVE9OVVA6Ci0gICAgICAgIHJldHVybiBTV19TZW5kTm90aWZ5IChod25kLCBOTV9SQ0xJQ0spOwotICAgIGNhc2UgV01fU0VURk9OVDoKLSAgICAgICAgcmV0dXJuIFNXX1dNU2V0Rm9udChzZWxmLCBod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgY2FzZSBXTV9TRVRURVhUOgotICAgICAgICByZXR1cm4gU1dfV01TZXRUZXh0KHNlbGYsIGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICBjYXNlIFdNX1NJWkU6Ci0JcmV0dXJuIFNXX1NpemUoc2VsZiwgaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgIGRlZmF1bHQ6Ci0JcmV0dXJuIERlZldpbmRvd1Byb2MzMkEgKGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOworLy8JY2FzZSBTQl9HRVRURVhUTEVOR0hUMzJXOgorCisJY2FzZSBTQl9HRVRUSVBURVhUMzJBOgorCSAgICByZXR1cm4gU1RBVFVTQkFSX0dldFRpcFRleHQzMkEgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisvLwljYXNlIFNCX0dFVFRJUFRFWFQzMlc6CisvLwljYXNlIFNCX0dFVFVOSUNPREVGT1JNQVQ6CisKKwljYXNlIFNCX0lTU0lNUExFOgorCSAgICByZXR1cm4gU1RBVFVTQkFSX0lzU2ltcGxlICh3bmRQdHIpOworCisJY2FzZSBTQl9TRVRCS0NPTE9SOgorCSAgICByZXR1cm4gU1RBVFVTQkFSX1NldEJrQ29sb3IgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisJY2FzZSBTQl9TRVRJQ09OOgorCSAgICByZXR1cm4gU1RBVFVTQkFSX1NldEljb24gKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisJY2FzZSBTQl9TRVRNSU5IRUlHSFQ6CisJICAgIHJldHVybiBTVEFUVVNCQVJfU2V0TWluSGVpZ2h0ICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworCWNhc2UgU0JfU0VUUEFSVFM6CQorCSAgICByZXR1cm4gU1RBVFVTQkFSX1NldFBhcnRzICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworCWNhc2UgU0JfU0VUVEVYVDMyQToKKwkgICAgcmV0dXJuIFNUQVRVU0JBUl9TZXRUZXh0MzJBICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworLy8JY2FzZSBTQl9TRVRURVhUMzJXOgorCisJY2FzZSBTQl9TRVRUSVBURVhUMzJBOgorCSAgICByZXR1cm4gU1RBVFVTQkFSX1NldFRpcFRleHQzMkEgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisvLwljYXNlIFNCX1NFVFRJUFRFWFQzMlc6CisvLwljYXNlIFNCX1NFVFVOSUNPREVGT1JNQVQ6CisKKwljYXNlIFNCX1NJTVBMRToKKwkgICAgcmV0dXJuIFNUQVRVU0JBUl9TaW1wbGUgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisKKwljYXNlIFdNX0NSRUFURToKKwkgICAgcmV0dXJuIFNUQVRVU0JBUl9XTUNyZWF0ZSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKwljYXNlIFdNX0RFU1RST1k6CisJICAgIHJldHVybiBTVEFUVVNCQVJfV01EZXN0cm95ICh3bmRQdHIpOworCisJY2FzZSBXTV9HRVRGT05UOgorICAgICAgICAgICAgcmV0dXJuIFNUQVRVU0JBUl9XTUdldEZvbnQgKHduZFB0cik7CisKKwljYXNlIFdNX0dFVFRFWFQ6CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTQkFSX1dNR2V0VGV4dCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKwljYXNlIFdNX0dFVFRFWFRMRU5HVEg6CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTQkFSX1dNR2V0VGV4dExlbmd0aCAod25kUHRyKTsKKworCWNhc2UgV01fTEJVVFRPTkRCTENMSzoKKyAgICAgICAgICAgIHJldHVybiBTVEFUVVNCQVJfU2VuZE5vdGlmeSAod25kUHRyLCBOTV9EQkxDTEspOworCisJY2FzZSBXTV9MQlVUVE9OVVA6CisJICAgIHJldHVybiBTVEFUVVNCQVJfU2VuZE5vdGlmeSAod25kUHRyLCBOTV9DTElDSyk7CisKKwljYXNlIFdNX01PVVNFTU9WRToKKyAgICAgICAgICAgIHJldHVybiBTVEFUVVNCQVJfV01Nb3VzZU1vdmUgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisJY2FzZSBXTV9OQ0hJVFRFU1Q6CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTQkFSX1dNTkNIaXRUZXN0ICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworCWNhc2UgV01fTkNMQlVUVE9ORE9XTjoKKwkgICAgcmV0dXJuIFNUQVRVU0JBUl9XTU5DTEJ1dHRvbkRvd24gKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisJY2FzZSBXTV9OQ0xCVVRUT05VUDoKKwkgICAgcmV0dXJuIFNUQVRVU0JBUl9XTU5DTEJ1dHRvblVwICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworCWNhc2UgV01fUEFJTlQ6CisJICAgIHJldHVybiBTVEFUVVNCQVJfV01QYWludCAod25kUHRyLCB3UGFyYW0pOworCisJY2FzZSBXTV9SQlVUVE9OREJMQ0xLOgorCSAgICByZXR1cm4gU1RBVFVTQkFSX1NlbmROb3RpZnkgKHduZFB0ciwgTk1fUkRCTENMSyk7CisKKwljYXNlIFdNX1JCVVRUT05VUDoKKwkgICAgcmV0dXJuIFNUQVRVU0JBUl9TZW5kTm90aWZ5ICh3bmRQdHIsIE5NX1JDTElDSyk7CisKKwljYXNlIFdNX1NFVEZPTlQ6CisJICAgIHJldHVybiBTVEFUVVNCQVJfV01TZXRGb250ICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworCWNhc2UgV01fU0VUVEVYVDoKKwkgICAgcmV0dXJuIFNUQVRVU0JBUl9XTVNldFRleHQgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisJY2FzZSBXTV9TSVpFOgorCSAgICByZXR1cm4gU1RBVFVTQkFSX1dNU2l6ZSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKwlkZWZhdWx0OgorCSAgICBpZiAobXNnID49IFdNX1VTRVIpCisJCUVSUiAoc3RhdHVzYmFyLCAidW5rbm93biBtc2cgJTA0eCB3cD0lMDR4IGxwPSUwOGx4XG4iLAorCQkgICAgIG1zZywgd1BhcmFtLCBsUGFyYW0pOworCSAgICByZXR1cm4gRGVmV2luZG93UHJvYzMyQSAoaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7CiAgICAgfQogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvY29udHJvbHMvdG9vbGJhci5jIGIvY29udHJvbHMvdG9vbGJhci5jCmluZGV4IGM2MDQ5NTQuLjZhODgzZDUgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL3Rvb2xiYXIuYworKysgYi9jb250cm9scy90b29sYmFyLmMKQEAgLTEwLDcgKzEwLDcgQEAKICAqICAgLSBOb3RpZmljYXRpb25zLgogICogICAtIEZpeCBUQl9HRVRCSVRNQVBGTEFHUy4KICAqICAgLSBGaXggVEJfR0VUUk9XUyBhbmQgVEJfU0VUUk9XUy4KLSAqICAgLSBUb29sdGlwIHN1cHBvcnQgKHBhcnRpYWxseSkuCisgKiAgIC0gVG9vbHRpcCBzdXBwb3J0ICh1bmRlciBjb250cnVjdGlvbikuCiAgKiAgIC0gVW5pY29kZSBzdXBwcG9ydC4KICAqICAgLSBJbnRlcm5hbCBDT01NQ1RMMzIgYml0bWFwcy4KICAqICAgLSBGaXggVE9PTEJBUl9DdXN0b21pemUuIChDdXN0b21pemUgZGlhbG9nLikKQEAgLTI0OSw4ICsyNDksNiBAQAogICAgIEJPT0wzMiBiVmVydGljYWw7CiAgICAgU0laRTMyICBzaXplU3RyaW5nOwogCi0KLSAgICAvKiB0ZXN0ICovCiAgICAgVE9PTEJBUl9DYWxjU3RyaW5ncyAod25kUHRyLCAmc2l6ZVN0cmluZyk7CiAKICAgICBpZiAoc2l6ZVN0cmluZy5jeSA+IDApCkBAIC0zMDEsNiArMjk5LDE4IEBACiAJYnRuUHRyLT5yZWN0LnJpZ2h0ICA9IHggKyBjeDsKIAlidG5QdHItPnJlY3QuYm90dG9tID0geSArIGN5OwogCisJaWYgKGluZm9QdHItPmh3bmRUb29sVGlwKSB7CisJICAgIFRUVE9PTElORk8zMkEgdGk7CisKKwkgICAgWmVyb01lbW9yeSAoJnRpLCBzaXplb2YoVFRUT09MSU5GTzMyQSkpOworCSAgICB0aS5jYlNpemUgPSBzaXplb2YoVFRUT09MSU5GTzMyQSk7CisJICAgIHRpLmh3bmQgPSB3bmRQdHItPmh3bmRTZWxmOworCSAgICB0aS51SWQgPSBidG5QdHItPmlkQ29tbWFuZDsKKwkgICAgdGkucmVjdCA9IGJ0blB0ci0+cmVjdDsKKwkgICAgU2VuZE1lc3NhZ2UzMkEgKGluZm9QdHItPmh3bmRUb29sVGlwLCBUVE1fTkVXVE9PTFJFQ1QzMkEsCisJCQkgICAgMCwgKExQQVJBTSkmdGkpOworCX0KKwogCWlmIChiVmVydGljYWwpIHsKIAkgICAgeCA9IDA7CiAJICAgIHkgKz0gY3k7CkBAIC00MTEsNiArNDIxLDI0IEBACiB9CiAKIAorc3RhdGljIFZPSUQKK1RPT0xCQVJfUmVsYXlFdmVudCAoSFdORDMyIGh3bmRUaXAsIEhXTkQzMiBod25kTXNnLCBVSU5UMzIgdU1zZywKKwkJICAgIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBNU0czMiBtc2c7CisKKyAgICBtc2cuaHduZCA9IGh3bmRNc2c7CisgICAgbXNnLm1lc3NhZ2UgPSB1TXNnOworICAgIG1zZy53UGFyYW0gPSB3UGFyYW07CisgICAgbXNnLmxQYXJhbSA9IGxQYXJhbTsKKyAgICBtc2cudGltZSA9IEdldE1lc3NhZ2VUaW1lICgpOworICAgIG1zZy5wdC54ID0gTE9XT1JEKEdldE1lc3NhZ2VQb3MgKCkpOworICAgIG1zZy5wdC55ID0gSElXT1JEKEdldE1lc3NhZ2VQb3MgKCkpOworCisgICAgU2VuZE1lc3NhZ2UzMkEgKGh3bmRUaXAsIFRUTV9SRUxBWUVWRU5ULCAwLCAoTFBBUkFNKSZtc2cpOworfQorCisKIHN0YXRpYyBMUkVTVUxUCiBUT09MQkFSX0FkZEJpdG1hcCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKQEAgLTUxMiw2ICs1NDAsMjAgQEAKIAlpbmZvUHRyLT5idXR0b25zW25PbGRCdXR0b25zK25Db3VudF0uZnNTdHlsZSAgID0gbHBUYmJbbkNvdW50XS5mc1N0eWxlOwogCWluZm9QdHItPmJ1dHRvbnNbbk9sZEJ1dHRvbnMrbkNvdW50XS5kd0RhdGEgICAgPSBscFRiYltuQ291bnRdLmR3RGF0YTsKIAlpbmZvUHRyLT5idXR0b25zW25PbGRCdXR0b25zK25Db3VudF0uaVN0cmluZyAgID0gbHBUYmJbbkNvdW50XS5pU3RyaW5nOworCisJaWYgKGluZm9QdHItPmh3bmRUb29sVGlwKSB7CisJICAgIFRUVE9PTElORk8zMkEgdGk7CisKKwkgICAgWmVyb01lbW9yeSAoJnRpLCBzaXplb2YoVFRUT09MSU5GTzMyQSkpOworCSAgICB0aS5jYlNpemUgICA9IHNpemVvZiAoVFRUT09MSU5GTzMyQSk7CisJICAgIHRpLmh3bmQgICAgID0gd25kUHRyLT5od25kU2VsZjsKKwkgICAgdGkudUlkICAgICAgPSAoTFBTVFIpbHBUYmJbbkNvdW50XS5pZENvbW1hbmQ7CisJICAgIHRpLmhpbnN0ICAgID0gMDsKKwkgICAgdGkubHBzelRleHQgPSBMUFNUUl9URVhUQ0FMTEJBQ0szMkE7CisKKwkgICAgU2VuZE1lc3NhZ2UzMkEgKGluZm9QdHItPmh3bmRUb29sVGlwLCBUVE1fQUREVE9PTDMyQSwKKwkJCSAgICAwLCAoTFBBUkFNKSZ0aSk7CisJfQogICAgIH0KIAogICAgIFRPT0xCQVJfQ2FsY1Rvb2xiYXIgKHduZFB0cik7CkBAIC02MzYsOCArNjc4LDggQEAKIAljeSArPSAyOwogCiAgICAgaW5mb1B0ci0+YkF1dG9TaXplID0gVFJVRTsKLSAgICBTZXRXaW5kb3dQb3MzMiAod25kUHRyLT5od25kU2VsZiwgMCwgcGFyZW50X3JlY3QubGVmdCwgcGFyZW50X3JlY3QudG9wLAotCQkgICAgY3gsIGN5LCB1UG9zRmxhZ3MgfCBTV1BfTk9aT1JERVIpOworICAgIFNldFdpbmRvd1BvczMyICh3bmRQdHItPmh3bmRTZWxmLCBIV05EX1RPUCwgcGFyZW50X3JlY3QubGVmdCwgcGFyZW50X3JlY3QudG9wLAorCQkgICAgY3gsIGN5LCB1UG9zRmxhZ3MpOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC03NjMsNiArODA1LDE3IEBACiAgICAgaWYgKChuSW5kZXggPCAwKSB8fCAobkluZGV4ID49IGluZm9QdHItPm5OdW1CdXR0b25zKSkKIAlyZXR1cm4gRkFMU0U7CiAKKyAgICBpZiAoaW5mb1B0ci0+aHduZFRvb2xUaXApIHsKKwlUVFRPT0xJTkZPMzJBIHRpOworCisJWmVyb01lbW9yeSAoJnRpLCBzaXplb2YoVFRUT09MSU5GTzMyQSkpOworCXRpLmNiU2l6ZSAgID0gc2l6ZW9mIChUVFRPT0xJTkZPMzJBKTsKKwl0aS5od25kICAgICA9IHduZFB0ci0+aHduZFNlbGY7CisJdGkudUlkICAgICAgPSBpbmZvUHRyLT5idXR0b25zW25JbmRleF0uaWRDb21tYW5kOworCisJU2VuZE1lc3NhZ2UzMkEgKGluZm9QdHItPmh3bmRUb29sVGlwLCBUVE1fREVMVE9PTDMyQSwgMCwgKExQQVJBTSkmdGkpOworICAgIH0KKwogICAgIGlmIChpbmZvUHRyLT5uTnVtQnV0dG9ucyA9PSAxKSB7CiAJVFJBQ0UgKHRvb2xiYXIsICIgc2ltcGxlIGRlbGV0ZSFcbiIpOwogCUhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgaW5mb1B0ci0+YnV0dG9ucyk7CkBAIC04NzUsNyArOTI4LDU1IEBACiB9CiAKIAotLy8gPDwgVE9PTEJBUl9HZXRCdXR0b25JbmZvID4+CitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9HZXRCdXR0b25JbmZvMzJBIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFRPT0xCQVJfSU5GTyAqaW5mb1B0ciA9IFRPT0xCQVJfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIExQVEJCVVRUT05JTkZPMzJBIGxwVGJJbmZvID0gKExQVEJCVVRUT05JTkZPMzJBKWxQYXJhbTsKKyAgICBUQlVUVE9OX0lORk8gKmJ0blB0cjsKKyAgICBJTlQzMiBuSW5kZXg7CisKKyAgICBpZiAoaW5mb1B0ciA9PSBOVUxMKSByZXR1cm4gLTE7CisgICAgaWYgKGxwVGJJbmZvID09IE5VTEwpIHJldHVybiAtMTsKKyAgICBpZiAobHBUYkluZm8tPmNiU2l6ZSA8IHNpemVvZihMUFRCQlVUVE9OSU5GTzMyQSkpIHJldHVybiAtMTsKKworICAgIG5JbmRleCA9IFRPT0xCQVJfR2V0QnV0dG9uSW5kZXggKGluZm9QdHIsIChJTlQzMil3UGFyYW0pOworCisgICAgaWYgKG5JbmRleCA9PSAtMSkKKwlyZXR1cm4gLTE7CisKKyAgICBidG5QdHIgPSAmaW5mb1B0ci0+YnV0dG9uc1tuSW5kZXhdOworCisgICAgaWYgKGxwVGJJbmZvLT5kd01hc2sgJiBUQklGX0NPTU1BTkQpCisJbHBUYkluZm8tPmlkQ29tbWFuZCA9IGJ0blB0ci0+aWRDb21tYW5kOworCisgICAgaWYgKGxwVGJJbmZvLT5kd01hc2sgJiBUQklGX0lNQUdFKQorCWxwVGJJbmZvLT5pSW1hZ2UgPSBidG5QdHItPmlCaXRtYXA7CisKKyAgICBpZiAobHBUYkluZm8tPmR3TWFzayAmIFRCSUZfTFBBUkFNKQorCWxwVGJJbmZvLT5sUGFyYW0gPSBidG5QdHItPmR3RGF0YTsKKworICAgIGlmIChscFRiSW5mby0+ZHdNYXNrICYgVEJJRl9TSVpFKQorCWxwVGJJbmZvLT5jeCA9IChXT1JEKShidG5QdHItPnJlY3QucmlnaHQgLSBidG5QdHItPnJlY3QubGVmdCk7CisKKyAgICBpZiAobHBUYkluZm8tPmR3TWFzayAmIFRCSUZfU1RBVEUpCisJbHBUYkluZm8tPmZzU3RhdGUgPSBidG5QdHItPmZzU3RhdGU7CisKKyAgICBpZiAobHBUYkluZm8tPmR3TWFzayAmIFRCSUZfU1RZTEUpCisJbHBUYkluZm8tPmZzU3R5bGUgPSBidG5QdHItPmZzU3R5bGU7CisKKyAgICBpZiAobHBUYkluZm8tPmR3TWFzayAmIFRCSUZfVEVYVCkgeworCWlmICgoYnRuUHRyLT5pU3RyaW5nID49IDApIHx8IChidG5QdHItPmlTdHJpbmcgPCBpbmZvUHRyLT5uTnVtU3RyaW5ncykpCisJICAgIGxzdHJjcHluMzJBIChscFRiSW5mby0+cHN6VGV4dCwgCisJCQkgKExQU1RSKWluZm9QdHItPnN0cmluZ3NbYnRuUHRyLT5pU3RyaW5nXSwKKwkJCSBscFRiSW5mby0+Y2NoVGV4dCk7CisgICAgfQorCisgICAgcmV0dXJuIG5JbmRleDsKK30KKworCisvLyA8PCBUT09MQkFSX0dldEJ1dHRvbkluZm8zMlcgPj4KIAogCiBzdGF0aWMgTFJFU1VMVApAQCAtOTI5LDcgKzEwMzAsMTMgQEAKIH0KIAogCi0vLyA8PCBUT09MQkFSX0dldEV4dGVuZGVkU3R5bGUgPj4KK19faW5saW5lX18gc3RhdGljIExSRVNVTFQKK1RPT0xCQVJfR2V0RXh0ZW5kZWRTdHlsZSAoV05EICp3bmRQdHIpCit7CisgICAgVE9PTEJBUl9JTkZPICppbmZvUHRyID0gVE9PTEJBUl9HZXRJbmZvUHRyKHduZFB0cik7CisKKyAgICByZXR1cm4gaW5mb1B0ci0+ZHdFeFN0eWxlOworfQogCiAKIHN0YXRpYyBMUkVTVUxUCkBAIC05OTUsNyArMTEwMiw3IEBACiAgICAgVE9PTEJBUl9JTkZPICppbmZvUHRyID0gVE9PTEJBUl9HZXRJbmZvUHRyKHduZFB0cik7CiAgICAgTFBTSVpFMzIgbHBTaXplID0gKExQU0laRTMyKWxQYXJhbTsKIAotCisgICAgRklYTUUgKHRvb2xiYXIsICJlbXB0eSBzdHViIVxuIik7CiAKICAgICByZXR1cm4gVFJVRTsKIH0KQEAgLTExNTUsNiArMTI2MiwyMCBAQAogICAgIGluZm9QdHItPmJ1dHRvbnNbbkluZGV4XS5kd0RhdGEgICAgPSBscFRiYi0+ZHdEYXRhOwogICAgIGluZm9QdHItPmJ1dHRvbnNbbkluZGV4XS5pU3RyaW5nICAgPSBscFRiYi0+aVN0cmluZzsKIAorICAgIGlmIChpbmZvUHRyLT5od25kVG9vbFRpcCkgeworCVRUVE9PTElORk8zMkEgdGk7CisKKwlaZXJvTWVtb3J5ICgmdGksIHNpemVvZihUVFRPT0xJTkZPMzJBKSk7CisJdGkuY2JTaXplICAgPSBzaXplb2YgKFRUVE9PTElORk8zMkEpOworCXRpLmh3bmQgICAgID0gd25kUHRyLT5od25kU2VsZjsKKwl0aS51SWQgICAgICA9IGxwVGJiLT5pZENvbW1hbmQ7CisJdGkuaGluc3QgICAgPSAwOworCXRpLmxwc3pUZXh0ID0gTFBTVFJfVEVYVENBTExCQUNLMzJBOworCisJU2VuZE1lc3NhZ2UzMkEgKGluZm9QdHItPmh3bmRUb29sVGlwLCBUVE1fQUREVE9PTDMyQSwKKwkJCTAsIChMUEFSQU0pJnRpKTsKKyAgICB9CisKICAgICAvKiBwb3N0IGluc2VydCBjb3B5ICovCiAgICAgaWYgKG5JbmRleCA8IGluZm9QdHItPm5OdW1CdXR0b25zIC0gMSkgewogCW1lbWNweSAoJmluZm9QdHItPmJ1dHRvbnNbbkluZGV4KzFdLCAmb2xkQnV0dG9uc1tuSW5kZXhdLApAQCAtMTYxMiwxMCArMTczMywyNSBAQAogCiAgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFRCU1RZTEVfVE9PTFRJUFMpIHsKIAkvKiBDcmVhdGUgdG9vbHRpcCBjb250cm9sICovCi0vLwlpbmZvUHRyLT5od25kVG9vbFRpcCA9IENyZWF0ZVdpbmRvd0V4MzJBICguLi4uKTsKKwlpbmZvUHRyLT5od25kVG9vbFRpcCA9CisJICAgIENyZWF0ZVdpbmRvd0V4MzJBICgwLCBUT09MVElQU19DTEFTUzMyQSwgTlVMTCwgVFRTX0FMV0FZU1RJUCwKKwkJCSAgICAgICBDV19VU0VERUZBVUxUMzIsIENXX1VTRURFRkFVTFQzMiwKKwkJCSAgICAgICBDV19VU0VERUZBVUxUMzIsIENXX1VTRURFRkFVTFQzMiwKKwkJCSAgICAgICB3bmRQdHItPmh3bmRTZWxmLCAwLAorCQkJICAgICAgIHduZFB0ci0+aEluc3RhbmNlLCAwKTsKIAogCS8qIFNlbmQgTk1fVE9PTFRJUFNDUkVBVEVEIG5vdGlmaWNhdGlvbiAqLworCWlmIChpbmZvUHRyLT5od25kVG9vbFRpcCkgeworCSAgICBOTVRPT0xUSVBTQ1JFQVRFRCBubXR0YzsKIAorCSAgICBubXR0Yy5oZHIuaHduZEZyb20gPSB3bmRQdHItPmh3bmRTZWxmOworCSAgICBubXR0Yy5oZHIuaWRGcm9tID0gd25kUHRyLT53SURtZW51OworCSAgICBubXR0Yy5oZHIuY29kZSA9IE5NX1RPT0xUSVBTQ1JFQVRFRDsKKwkgICAgbm10dGMuaHduZFRvb2xUaXBzID0gaW5mb1B0ci0+aHduZFRvb2xUaXA7CisKKwkgICAgU2VuZE1lc3NhZ2UzMkEgKGluZm9QdHItPmh3bmROb3RpZnksIFdNX05PVElGWSwKKwkJCSAgICAoV1BBUkFNMzIpd25kUHRyLT53SURtZW51LCAoTFBBUkFNKSZubXR0Yyk7CisJfQogICAgIH0KIAogICAgIHJldHVybiAwOwpAQCAtMTcyNCw2ICsxODYwLDEwIEBACiAgICAgSU5UMzIgICBuSGl0OwogICAgIEhEQzMyICAgaGRjOwogCisgICAgaWYgKGluZm9QdHItPmh3bmRUb29sVGlwKQorCVRPT0xCQVJfUmVsYXlFdmVudCAoaW5mb1B0ci0+aHduZFRvb2xUaXAsIHduZFB0ci0+aHduZFNlbGYsCisJCQkgICAgV01fTEJVVFRPTkRPV04sIHdQYXJhbSwgbFBhcmFtKTsKKwogICAgIHB0LnggPSAoSU5UMzIpTE9XT1JEKGxQYXJhbSk7CiAgICAgcHQueSA9IChJTlQzMilISVdPUkQobFBhcmFtKTsKICAgICBuSGl0ID0gVE9PTEJBUl9JbnRlcm5hbEhpdFRlc3QgKHduZFB0ciwgJnB0KTsKQEAgLTE3NjEsNiArMTkwMSwxMCBAQAogICAgIEhEQzMyICAgaGRjOwogICAgIEJPT0wzMiAgYlNlbmRNZXNzYWdlID0gVFJVRTsKIAorICAgIGlmIChpbmZvUHRyLT5od25kVG9vbFRpcCkKKwlUT09MQkFSX1JlbGF5RXZlbnQgKGluZm9QdHItPmh3bmRUb29sVGlwLCB3bmRQdHItPmh3bmRTZWxmLAorCQkJICAgIFdNX0xCVVRUT05VUCwgd1BhcmFtLCBsUGFyYW0pOworCiAgICAgcHQueCA9IChJTlQzMilMT1dPUkQobFBhcmFtKTsKICAgICBwdC55ID0gKElOVDMyKUhJV09SRChsUGFyYW0pOwogICAgIG5IaXQgPSBUT09MQkFSX0ludGVybmFsSGl0VGVzdCAod25kUHRyLCAmcHQpOwpAQCAtMTgyMiw2ICsxOTY2LDEwIEBACiAgICAgSU5UMzIgICBuSGl0OwogICAgIEhEQzMyICAgaGRjOwogCisgICAgaWYgKGluZm9QdHItPmh3bmRUb29sVGlwKQorCVRPT0xCQVJfUmVsYXlFdmVudCAoaW5mb1B0ci0+aHduZFRvb2xUaXAsIHduZFB0ci0+aHduZFNlbGYsCisJCQkgICAgV01fTU9VU0VNT1ZFLCB3UGFyYW0sIGxQYXJhbSk7CisKICAgICBwdC54ID0gKElOVDMyKUxPV09SRChsUGFyYW0pOwogICAgIHB0LnkgPSAoSU5UMzIpSElXT1JEKGxQYXJhbSk7CiAgICAgbkhpdCA9IFRPT0xCQVJfSW50ZXJuYWxIaXRUZXN0ICh3bmRQdHIsICZwdCk7CkBAIC0xODg1LDkgKzIwMzMsMTMgQEAKIAlyZXR1cm4gMDsKICAgICB9CiAKLSAgICAvKiB0aGlzIGlzIGp1c3QgZm9yIHNlY3VyaXR5IChyZWxpYWJsZT8/KSovCisgICAgLyogcGFyYW5vaWQhISAqLwogICAgIGluZm9QdHItPmR3U3RydWN0U2l6ZSA9IHNpemVvZihUQkJVVFRPTik7CiAKKyAgICAvKiBmaXggaW5zdGFuY2UgaGFuZGxlLCBpZiB0aGUgdG9vbGJhciB3YXMgY3JlYXRlZCBieSBDcmVhdGVUb29sYmFyRXgoKSAqLworICAgIGlmICghd25kUHRyLT5oSW5zdGFuY2UpCisJd25kUHRyLT5oSW5zdGFuY2UgPSB3bmRQdHItPnBhcmVudC0+aEluc3RhbmNlOworCiAgICAgcmV0dXJuIERlZldpbmRvd1Byb2MzMkEgKHduZFB0ci0+aHduZFNlbGYsIFdNX05DQ1JFQVRFLCB3UGFyYW0sIGxQYXJhbSk7CiB9CiAKQEAgLTE5MTAsOCArMjA2Miw3IEBACiAJCSAgICAgICAgd25kUHRyLT5yZWN0Q2xpZW50LnRvcC13bmRQdHItPnJlY3RXaW5kb3cudG9wLAogCQkgICAgICAgIHduZFB0ci0+cmVjdENsaWVudC5yaWdodC13bmRQdHItPnJlY3RXaW5kb3cubGVmdCwKIAkJICAgICAgICB3bmRQdHItPnJlY3RDbGllbnQuYm90dG9tLXduZFB0ci0+cmVjdFdpbmRvdy50b3AgKQotCT09IE5VTExSRUdJT04pCi0gICAgeworCT09IE5VTExSRUdJT04pewogCVJlbGVhc2VEQzMyKCBod25kLCBoZGMgKTsKIAlyZXR1cm4gMDsKICAgICB9CkBAIC0xOTM5LDYgKzIwOTAsMjMgQEAKIH0KIAogCitfX2lubGluZV9fIHN0YXRpYyBMUkVTVUxUCitUT09MQkFSX05vdGlmeSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBMUE5NSERSIGxwbm1oID0gKExQTk1IRFIpbFBhcmFtOworCisgICAgaWYgKChpbmZvUHRyLT5od25kVG9vbFRpcCkgJiYgKChscG5taC0+Y29kZSA9PSBUVE5fR0VURElTUElORk8zMkEpIHx8CisJKGxwbm1oLT5jb2RlID09IFRUTl9HRVRESVNQSU5GTzMyVykpKSB7CisKKwlTZW5kTWVzc2FnZTMyQSAoR2V0UGFyZW50MzIgKHduZFB0ci0+aHduZFNlbGYpLCBXTV9OT1RJRlksCisJCQl3UGFyYW0sIGxQYXJhbSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKwogc3RhdGljIExSRVNVTFQKIFRPT0xCQVJfUGFpbnQgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0pCiB7CkBAIC0yMDc5LDcgKzIyNDcsMTAgQEAKIAljYXNlIFRCX0dFVEJVVFRPTjoKIAkgICAgcmV0dXJuIFRPT0xCQVJfR2V0QnV0dG9uICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAotLy8JY2FzZSBUQl9HRVRCVVRUT05JTkZPOgkJCS8qIDQuNzEgKi8KKwljYXNlIFRCX0dFVEJVVFRPTklORk8zMkE6CisJICAgIHJldHVybiBUT09MQkFSX0dldEJ1dHRvbkluZm8zMkEgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisvLwljYXNlIFRCX0dFVEJVVFRPTklORk8zMlc6CQkvKiA0LjcxICovCiAKIAljYXNlIFRCX0dFVEJVVFRPTlNJWkU6CiAJICAgIHJldHVybiBUT09MQkFSX0dldEJ1dHRvblNpemUgKHduZFB0cik7CkBAIC0yMDkzLDcgKzIyNjQsOCBAQAogCWNhc2UgVEJfR0VURElTQUJMRURJTUFHRUxJU1Q6CiAJICAgIHJldHVybiBUT09MQkFSX0dldERpc2FibGVkSW1hZ2VMaXN0ICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAotLy8JY2FzZSBUQl9HRVRFWFRFTkRFRFNUWUxFOgkJLyogNC43MSAqLworCWNhc2UgVEJfR0VURVhURU5ERURTVFlMRToKKwkgICAgcmV0dXJuIFRPT0xCQVJfR2V0RXh0ZW5kZWRTdHlsZSAod25kUHRyKTsKIAogCWNhc2UgVEJfR0VUSE9USU1BR0VMSVNUOgogCSAgICByZXR1cm4gVE9PTEJBUl9HZXRIb3RJbWFnZUxpc3QgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwpAQCAtMjE4NSw3ICsyMzU3LDggQEAKIAljYXNlIFRCX1NFVEJJVE1BUFNJWkU6CiAJICAgIHJldHVybiBUT09MQkFSX1NldEJpdG1hcFNpemUgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCi0vLwljYXNlIFRCX1NFVEJVVFRPTklORk86CQkJLyogNC43MSAqLworLy8JY2FzZSBUQl9TRVRCVVRUT05JTkZPMzJBOgkJLyogNC43MSAqLworLy8JY2FzZSBUQl9TRVRCVVRUT05JTkZPMzJXOgkJLyogNC43MSAqLwogCiAJY2FzZSBUQl9TRVRCVVRUT05TSVpFOgogCSAgICByZXR1cm4gVE9PTEJBUl9TZXRCdXR0b25TaXplICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKQEAgLTIyNDMsMTUgKzI0MTYsMjMgQEAKIAkgICAgcmV0dXJuIFRPT0xCQVJfU2V0VW5pY29kZUZvcm1hdCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAKIAorLy8JY2FzZSBXTV9DSEFSOgorCiAJY2FzZSBXTV9DUkVBVEU6CiAJICAgIHJldHVybiBUT09MQkFSX0NyZWF0ZSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAKKy8vCWNhc2UgV01fQ09NTUFORDoKKwogCWNhc2UgV01fREVTVFJPWToKIAkgICAgcmV0dXJuIFRPT0xCQVJfRGVzdHJveSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAKIAljYXNlIFdNX0VSQVNFQktHTkQ6CiAJICAgIHJldHVybiBUT09MQkFSX0VyYXNlQmFja2dyb3VuZCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAKKy8vCWNhc2UgV01fR0VURk9OVDoKKy8vCWNhc2UgV01fS0VZRE9XTjoKKy8vCWNhc2UgV01fS0lMTEZPQ1VTOgorCiAJY2FzZSBXTV9MQlVUVE9OREJMQ0xLOgogCSAgICByZXR1cm4gVE9PTEJBUl9MQnV0dG9uRGJsQ2xrICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIApAQCAtMjI3Niw4ICsyNDU3LDEwIEBACiAJY2FzZSBXTV9OQ1BBSU5UOgogCSAgICByZXR1cm4gVE9PTEJBUl9OQ1BhaW50ICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAotLy8JY2FzZSBXTV9OT1RJRlk6Ci0vLwkgICAgU2VuZE1lc3NhZ2UzMkEgKEdldFBhcmVudDMyIChod25kKSwgdU1zZywgd1BhcmFtLCBsUGFyYW0pOworCWNhc2UgV01fTk9USUZZOgorCSAgICByZXR1cm4gVE9PTEJBUl9Ob3RpZnkgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisvLwljYXNlIFdNX05PVElGWUZPUk1BVDoKIAogCWNhc2UgV01fUEFJTlQ6CiAJICAgIHJldHVybiBUT09MQkFSX1BhaW50ICh3bmRQdHIsIHdQYXJhbSk7CkBAIC0yMzA2LDggKzI0ODksNyBAQAogfQogCiAKLXZvaWQKLVRPT0xCQVJfUmVnaXN0ZXIgKHZvaWQpCit2b2lkIFRPT0xCQVJfUmVnaXN0ZXIgKHZvaWQpCiB7CiAgICAgV05EQ0xBU1MzMkEgd25kQ2xhc3M7CiAKQEAgLTIzMjQsNCArMjUwNiwzIEBACiAgCiAgICAgUmVnaXN0ZXJDbGFzczMyQSAoJnduZENsYXNzKTsKIH0KLQpkaWZmIC0tZ2l0IGEvY29udHJvbHMvdG9vbHRpcHMuYyBiL2NvbnRyb2xzL3Rvb2x0aXBzLmMKaW5kZXggNjlhMDBlZi4uZTBlODQ3NyAxMDA2NDQKLS0tIGEvY29udHJvbHMvdG9vbHRpcHMuYworKysgYi9jb250cm9scy90b29sdGlwcy5jCkBAIC00LDE3ICs0LDI0IEBACiAgKiBDb3B5cmlnaHQgMTk5OCBFcmljIEtvaGwKICAqCiAgKiBUT0RPOgotICogICAtIFNvbWUgbWVzc2FnZXMuCi0gKiAgIC0gQWxsIG5vdGlmaWNhdGlvbnMuCisgKiAgIC0gU3ViY2xhc3NpbmcuCisgKiAgIC0gVHJhY2tpbmcgdG9vbHRpcHMgKHVuZGVyIGNvbnN0cnVjdGlvbikuCisgKiAgIC0gVFRTX0FMV0FZU1RJUCAodW5kZWZpbmVkKS4KKyAqICAgLSBVbmljb2RlIHN1cHBvcnQuCisgKiAgIC0gQ3VzdG9tIGRyYXcgc3VwcG9ydC4KICAqCiAgKiBUZXN0aW5nOgogICogICAtIFJ1biB0ZXN0cyB1c2luZyBXYWl0ZSBHcm91cCBXaW5kb3dzOTUgQVBJIEJpYmxlIFZvbHVtZSAyLgotICogICAgIFRoZSBzZWNvbmQgY2Ryb20gY29udGFpbnMgZXhlY3V0YWJsZXMgZW51bXRvb2xzLmV4ZSAuLi4KLSAqICAgLSBhZGRpdGlvbmFsIGZlYXR1cmVzLgorICogICAgIFRoZSBzZWNvbmQgY2Ryb20gKGNoYXB0ZXIgMykgY29udGFpbnMgZXhlY3V0YWJsZXMgYWN0aXZhdGUuZXhlLAorICogICAgIGN1cnRvb2wuZXhlLCBkZWx0b29sLmV4ZSwgZW51bXRvb2xzLmV4ZSwgZ2V0aW5mby5leGUsIGdldGlwdHh0LmV4ZSwKKyAqICAgICBoaXR0ZXN0LmV4ZSwgbmVlZHRleHQuZXhlLCBuZXdyZWN0LmV4ZSwgdXBkdGV4dC5leGUgYW5kIHdpbmZycHQuZXhlLgogICoKLSAqIEZJWE1FOgotICogICAtIERpc3BsYXkgY29kZS4KLSAqICAgLSBNaXNzaW5nIFVuaWNvZGUgc3VwcG9ydC4KKyAqICAgLSBBY3RpdmF0ZS5leGUsIGRlbHRvb2wuZXhlLCBlbnVtdG9vbC5leGUsIGdldGluZm8uZXhlIGFuZCBnZXRpcHR4dC5leGUKKyAqICAgICBhcmUgdGhlIG9ubHkgd29ya2luZyBleGFtcGxlcywgc2luY2Ugc3ViY2xhc3NpbmcgaXMgbm90IGltcGxlbWVudGVkLgorICoKKyAqIEZpeG1lOgorICogICAtIFRoZSAibFBhcmFtIiB2YXJpYWJsZSBmcm9tIE5NVFRESVNQSU5GTzMyQSBpcyBub3QgaGFuZGxlZAorICogICAgIGluIFRPT0xUSVBTX0dldFRpcFRleHQuCiAgKi8KIAogI2luY2x1ZGUgIndpbmRvd3MuaCIKQEAgLTI1LDggKzMyLDkgQEAKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAKLSNkZWZpbmUgSURfVElNRVIxICAxCi0jZGVmaW5lIElEX1RJTUVSMiAgMgorI2RlZmluZSBJRF9USU1FUjEgIDEgICAgLyogc2hvdyBkZWxheSB0aW1lciAqLworI2RlZmluZSBJRF9USU1FUjIgIDIgICAgLyogYXV0byBwb3AgdGltZXIgKi8KKyNkZWZpbmUgSURfVElNRVIzICAzICAgIC8qIHRvb2wgbGVhdmUgdGltZXIgKi8KIAogI2RlZmluZSBUT09MVElQU19HZXRJbmZvUHRyKHduZFB0cikgKChUT09MVElQU19JTkZPICopd25kUHRyLT53RXh0cmFbMF0pCiAKQEAgLTM4LDEyICs0NiwyMSBAQAogICAgIFJFQ1QzMiByYzsKICAgICBJTlQzMiBvbGRCa01vZGU7CiAgICAgSEZPTlQzMiBoT2xkRm9udDsKKyAgICBVSU5UMzIgdUZsYWdzID0gRFRfRVhURVJOQUxMRUFESU5HOwogCisgICAgaWYgKGluZm9QdHItPm5NYXhUaXBXaWR0aCA+IC0xKQorCXVGbGFncyB8PSBEVF9XT1JEQlJFQUs7CisgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFRUU19OT1BSRUZJWCkKKwl1RmxhZ3MgfD0gRFRfTk9QUkVGSVg7CiAgICAgR2V0Q2xpZW50UmVjdDMyICh3bmRQdHItPmh3bmRTZWxmLCAmcmMpOworICAgIHJjLmxlZnQgICArPSAoMiArIGluZm9QdHItPnJjTWFyZ2luLmxlZnQpOworICAgIHJjLnRvcCAgICArPSAoMiArIGluZm9QdHItPnJjTWFyZ2luLnRvcCk7CisgICAgcmMucmlnaHQgIC09ICgyICsgaW5mb1B0ci0+cmNNYXJnaW4ucmlnaHQpOworICAgIHJjLmJvdHRvbSAtPSAoMiArIGluZm9QdHItPnJjTWFyZ2luLmJvdHRvbSk7CiAgICAgb2xkQmtNb2RlID0gU2V0QmtNb2RlMzIgKGhkYywgVFJBTlNQQVJFTlQpOwogICAgIFNldFRleHRDb2xvcjMyIChoZGMsIGluZm9QdHItPmNsclRleHQpOwogICAgIGhPbGRGb250ID0gU2VsZWN0T2JqZWN0MzIgKGhkYywgaW5mb1B0ci0+aEZvbnQpOwotICAgIERyYXdUZXh0MzJBIChoZGMsIGluZm9QdHItPnN6VGlwVGV4dCwgLTEsICZyYywgRFRfRVhURVJOQUxMRUFESU5HKTsKKyAgICBEcmF3VGV4dDMyQSAoaGRjLCBpbmZvUHRyLT5zelRpcFRleHQsIC0xLCAmcmMsIHVGbGFncyk7CiAgICAgU2VsZWN0T2JqZWN0MzIgKGhkYywgaE9sZEZvbnQpOwogICAgIGlmIChvbGRCa01vZGUgIT0gVFJBTlNQQVJFTlQpCiAJU2V0QmtNb2RlMzIgKGhkYywgb2xkQmtNb2RlKTsKQEAgLTU2LDI4ICs3Myw3MiBAQAogICAgIFRUVE9PTF9JTkZPICp0b29sUHRyID0gJmluZm9QdHItPnRvb2xzW2luZm9QdHItPm5DdXJyZW50VG9vbF07CiAKICAgICBpZiAodG9vbFB0ci0+aGluc3QpIHsKKwlUUkFDRSAodG9vbHRpcHMsICJnZXQgcmVzIHN0cmluZyAleCAleFxuIiwKKwkgICAgICAgdG9vbFB0ci0+aGluc3QsIChpbnQpdG9vbFB0ci0+bHBzelRleHQpOwogCUxvYWRTdHJpbmczMkEgKHRvb2xQdHItPmhpbnN0LCAoVUlOVDMyKXRvb2xQdHItPmxwc3pUZXh0LAogCQkgICAgICAgaW5mb1B0ci0+c3pUaXBUZXh0LCBJTkZPVElQU0laRSk7CiAgICAgfQogICAgIGVsc2UgaWYgKHRvb2xQdHItPmxwc3pUZXh0KSB7CiAJaWYgKHRvb2xQdHItPmxwc3pUZXh0ID09IExQU1RSX1RFWFRDQUxMQkFDSzMyQSkgewotCSAgICBOTVRURElTUElORk9BIHR0bm1kaTsKKwkgICAgTk1UVERJU1BJTkZPMzJBIHR0bm1kaTsKIAogCSAgICAvKiBmaWxsIE5NSERSIHN0cnVjdCAqLworCSAgICBaZXJvTWVtb3J5ICgmdHRubWRpLCBzaXplb2YoTk1UVERJU1BJTkZPMzJBKSk7CiAJICAgIHR0bm1kaS5oZHIuaHduZEZyb20gPSB3bmRQdHItPmh3bmRTZWxmOwotCSAgICB0dG5tZGkuaGRyLmlkRnJvbSA9IGluZm9QdHItPm5DdXJyZW50VG9vbDsKLQkgICAgdHRubWRpLmhkci5jb2RlID0gVFROX0dFVERJU1BJTkZPQTsKKwkgICAgdHRubWRpLmhkci5pZEZyb20gPSB0b29sUHRyLT51SWQ7CisJICAgIHR0bm1kaS5oZHIuY29kZSA9IFRUTl9HRVRESVNQSU5GTzMyQTsKKwkgICAgdHRubWRpLnVGbGFncyA9IHRvb2xQdHItPnVGbGFnczsKKwkgICAgdHRubWRpLmxwc3pUZXh0ID0gaW5mb1B0ci0+c3pUaXBUZXh0OwogCisJICAgIFRSQUNFICh0b29sdGlwcywgImhkci5pZEZyb20gPSAleFxuIiwgdHRubWRpLmhkci5pZEZyb20pOwogCSAgICBTZW5kTWVzc2FnZTMyQSAoR2V0UGFyZW50MzIgKHduZFB0ci0+aHduZFNlbGYpLCBXTV9OT1RJRlksCiAJCQkgICAgKFdQQVJBTTMyKXduZFB0ci0+d0lEbWVudSwgKExQQVJBTSkmdHRubWRpKTsKIAotCSAgICAvKiBGSVhNRTogcGFydGlhbCAqLwotCSAgICBsc3RyY3B5bjMyQSAoaW5mb1B0ci0+c3pUaXBUZXh0LCB0dG5tZGkuc3pUZXh0LCBJTkZPVElQU0laRSk7Ci0KKwkgICAgaWYgKHR0bm1kaS5oaW5zdCkgeworCQlMb2FkU3RyaW5nMzJBICh0dG5tZGkuaGluc3QsIChVSU5UMzIpdHRubWRpLnN6VGV4dCwKKwkJCSAgICAgICBpbmZvUHRyLT5zelRpcFRleHQsIElORk9USVBTSVpFKTsKKwkJaWYgKHR0bm1kaS51RmxhZ3MgJiBUVEZfRElfU0VUSVRFTSkgeworCQkgICAgdG9vbFB0ci0+aGluc3QgPSB0dG5tZGkuaGluc3Q7CisJCSAgICB0b29sUHRyLT5scHN6VGV4dCA9IHR0bm1kaS5zelRleHQ7CisJCX0KKwkgICAgfQorCSAgICBlbHNlIGlmICh0dG5tZGkuc3pUZXh0WzBdKSB7CisJCWxzdHJjcHluMzJBIChpbmZvUHRyLT5zelRpcFRleHQsIHR0bm1kaS5zelRleHQsIDgwKTsKKwkJaWYgKHR0bm1kaS51RmxhZ3MgJiBUVEZfRElfU0VUSVRFTSkgeworCQkgICAgSU5UMzIgbGVuID0gbHN0cmxlbjMyQSAodHRubWRpLnN6VGV4dCkgKyAxOworCQkgICAgdG9vbFB0ci0+aGluc3QgPSAwOworCQkgICAgdG9vbFB0ci0+bHBzelRleHQgPQkKKwkJCUhlYXBBbGxvYyAoR2V0UHJvY2Vzc0hlYXAgKCksIEhFQVBfWkVST19NRU1PUlksIGxlbik7CisJCSAgICBsc3RyY3B5MzJBICh0b29sUHRyLT5scHN6VGV4dCwgdHRubWRpLnN6VGV4dCk7CisJCX0KKwkgICAgfQorCSAgICBlbHNlIGlmICh0dG5tZGkubHBzelRleHQgPT0gMCkgeworCQkvKiBubyB0ZXh0IGF2YWlsYWJsZSAqLworCQlpbmZvUHRyLT5zelRpcFRleHRbMF0gPSAnXDAnOworCSAgICB9CisJICAgIGVsc2UgaWYgKHR0bm1kaS5scHN6VGV4dCAhPSBMUFNUUl9URVhUQ0FMTEJBQ0szMkEpIHsKKwkJaWYgKHR0bm1kaS5scHN6VGV4dCAhPSBpbmZvUHRyLT5zelRpcFRleHQpCisJCSAgICBsc3RyY3B5bjMyQSAoaW5mb1B0ci0+c3pUaXBUZXh0LCB0dG5tZGkubHBzelRleHQsCisJCQkJIElORk9USVBTSVpFKTsKKwkJaWYgKHR0bm1kaS51RmxhZ3MgJiBUVEZfRElfU0VUSVRFTSkgeworCQkgICAgSU5UMzIgbGVuID0gbHN0cmxlbjMyQSAodHRubWRpLmxwc3pUZXh0KSArIDE7CisJCSAgICB0b29sUHRyLT5oaW5zdCA9IDA7CisJCSAgICB0b29sUHRyLT5scHN6VGV4dCA9CQorCQkJSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCAoKSwgSEVBUF9aRVJPX01FTU9SWSwgbGVuKTsKKwkJICAgIGxzdHJjcHkzMkEgKHRvb2xQdHItPmxwc3pUZXh0LCB0dG5tZGkubHBzelRleHQpOworCQl9CisJICAgIH0KKwkgICAgZWxzZQorCQlFUlIgKHRvb2x0aXBzLCAicmVjdXJzaXZlIHRleHQgY2FsbGJhY2shXG4iKTsKIAl9CiAJZWxzZQogCSAgICBsc3RyY3B5bjMyQSAoaW5mb1B0ci0+c3pUaXBUZXh0LCB0b29sUHRyLT5scHN6VGV4dCwgSU5GT1RJUFNJWkUpOwogICAgIH0KKyAgICBlbHNlCisJLyogbm8gdGV4dCBhdmFpbGFibGUgKi8KKwlpbmZvUHRyLT5zelRpcFRleHRbMF0gPSAnXDAnOworCisgICAgVFJBQ0UgKHRvb2x0aXBzLCAiXCIlc1wiXG4iLCBpbmZvUHRyLT5zelRpcFRleHQpOwogfQogCiAKQEAgLTg2LDM2ICsxNDcsOTQgQEAKIHsKICAgICBIREMzMiBoZGM7CiAgICAgSEZPTlQzMiBoT2xkRm9udDsKLSAgICBSRUNUMzIgcmM7CisgICAgVUlOVDMyIHVGbGFncyA9IERUX0VYVEVSTkFMTEVBRElORyB8IERUX0NBTENSRUNUOworICAgIFJFQ1QzMiByYyA9IHswLCAwLCAwLCAwfTsKKworICAgIGlmIChpbmZvUHRyLT5uTWF4VGlwV2lkdGggPiAtMSkgeworCXJjLnJpZ2h0ID0gaW5mb1B0ci0+bk1heFRpcFdpZHRoOworCXVGbGFncyB8PSBEVF9XT1JEQlJFQUs7CisgICAgfQorICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBUVFNfTk9QUkVGSVgpCisJdUZsYWdzIHw9IERUX05PUFJFRklYOworICAgIFRSQUNFICh0b29sdGlwcywgIlwiJXNcIlxuIiwgaW5mb1B0ci0+c3pUaXBUZXh0KTsKIAogICAgIGhkYyA9IEdldERDMzIgKHduZFB0ci0+aHduZFNlbGYpOwogICAgIGhPbGRGb250ID0gU2VsZWN0T2JqZWN0MzIgKGhkYywgaW5mb1B0ci0+aEZvbnQpOwotICAgIERyYXdUZXh0MzJBIChoZGMsIGluZm9QdHItPnN6VGlwVGV4dCwgLTEsICZyYywgRFRfRVhURVJOQUxMRUFESU5HIHwgRFRfQ0FMQ1JFQ1QpOworICAgIERyYXdUZXh0MzJBIChoZGMsIGluZm9QdHItPnN6VGlwVGV4dCwgLTEsICZyYywgdUZsYWdzKTsKICAgICBTZWxlY3RPYmplY3QzMiAoaGRjLCBoT2xkRm9udCk7Ci0gICAgUmVsZWFzZURDMzIgKGhkYywgd25kUHRyLT5od25kU2VsZik7CisgICAgUmVsZWFzZURDMzIgKHduZFB0ci0+aHduZFNlbGYsIGhkYyk7CiAKLSAgICBscFNpemUtPmN4ID0gcmMucmlnaHQgLSByYy5sZWZ0ICsgNDsKLSAgICBscFNpemUtPmN5ID0gcmMuYm90dG9tIC0gcmMudG9wICsgNDsKKyAgICBscFNpemUtPmN4ID0gcmMucmlnaHQgLSByYy5sZWZ0ICsgNCArIAorCQkgaW5mb1B0ci0+cmNNYXJnaW4ubGVmdCArIGluZm9QdHItPnJjTWFyZ2luLnJpZ2h0OworICAgIGxwU2l6ZS0+Y3kgPSByYy5ib3R0b20gLSByYy50b3AgKyA0ICsKKwkJIGluZm9QdHItPnJjTWFyZ2luLmJvdHRvbSArIGluZm9QdHItPnJjTWFyZ2luLnRvcDsKIH0KIAogCiBzdGF0aWMgVk9JRAogVE9PTFRJUFNfU2hvdyAoV05EICp3bmRQdHIsIFRPT0xUSVBTX0lORk8gKmluZm9QdHIpCiB7CisgICAgVFRUT09MX0lORk8gKnRvb2xQdHI7CiAgICAgUE9JTlQzMiBwdDsKICAgICBTSVpFMzIgc2l6ZTsKKyAgICBOTUhEUiBoZHI7CisKKyAgICBpZiAoaW5mb1B0ci0+blRvb2wgPT0gLTEpIHsKKwlUUkFDRSAodG9vbHRpcHMsICJpbnZhbGlkIHRvb2wgKC0xKSFcbiIpOworCXJldHVybjsKKyAgICB9CiAKICAgICBpbmZvUHRyLT5uQ3VycmVudFRvb2wgPSBpbmZvUHRyLT5uVG9vbDsKLSAgICBGSVhNRSAodG9vbHRpcHMsICJTaG93IHRvb2x0aXAgJWQhXG4iLCBpbmZvUHRyLT5uQ3VycmVudFRvb2wpOwogCi0gICAgR2V0Q3Vyc29yUG9zMzIgKCZwdCk7CisgICAgVFJBQ0UgKHRvb2x0aXBzLCAiU2hvdyB0b29sdGlwIHByZSAlZCFcbiIsIGluZm9QdHItPm5Ub29sKTsKIAogICAgIFRPT0xUSVBTX0dldFRpcFRleHQgKHduZFB0ciwgaW5mb1B0cik7CisKKyAgICBpZiAoaW5mb1B0ci0+c3pUaXBUZXh0WzBdID09ICdcMCcpIHsKKwlpbmZvUHRyLT5uQ3VycmVudFRvb2wgPSAtMTsKKwlyZXR1cm47CisgICAgfQorCisgICAgVFJBQ0UgKHRvb2x0aXBzLCAiU2hvdyB0b29sdGlwICVkIVxuIiwgaW5mb1B0ci0+blRvb2wpOworCisgICAgaGRyLmh3bmRGcm9tID0gd25kUHRyLT5od25kU2VsZjsKKyAgICBoZHIuaWRGcm9tID0gaW5mb1B0ci0+blRvb2w7CisgICAgaGRyLmNvZGUgPSBUVE5fU0hPVzsKKyAgICBTZW5kTWVzc2FnZTMyQSAoR2V0UGFyZW50MzIgKHduZFB0ci0+aHduZFNlbGYpLCBXTV9OT1RJRlksCisJCSAgICAoV1BBUkFNMzIpd25kUHRyLT53SURtZW51LCAoTFBBUkFNKSZoZHIpOworCiAgICAgVFJBQ0UgKHRvb2x0aXBzLCAiXCIlc1wiXG4iLCBpbmZvUHRyLT5zelRpcFRleHQpOwogCisgICAgdG9vbFB0ciA9ICZpbmZvUHRyLT50b29sc1tpbmZvUHRyLT5uVG9vbF07CiAgICAgVE9PTFRJUFNfQ2FsY1RpcFNpemUgKHduZFB0ciwgaW5mb1B0ciwgJnNpemUpOworICAgIFRSQUNFICh0b29sdGlwcywgInNpemUgJWQgLSAlZFxuIiwgc2l6ZS5jeCwgc2l6ZS5jeSk7CiAKLSAgICBTZXRXaW5kb3dQb3MzMiAod25kUHRyLT5od25kU2VsZiwgSFdORF9UT1AsIHB0LngsIHB0LnkgKyAyMCwKKyAgICBpZiAoKHRvb2xQdHItPnVGbGFncyAmIFRURl9UUkFDSykgJiYgKHRvb2xQdHItPnVGbGFncyAmIFRURl9BQlNPTFVURSkpIHsKKwlwdC54ID0gaW5mb1B0ci0+eFRyYWNrUG9zOworCXB0LnkgPSBpbmZvUHRyLT55VHJhY2tQb3M7CisgICAgfQorICAgIGVsc2UgaWYgKHRvb2xQdHItPnVGbGFncyAmIFRURl9DRU5URVJUSVApIHsKKwlSRUNUMzIgcmVjdDsKKworCWlmICh0b29sUHRyLT51RmxhZ3MgJiBUVEZfSURJU0hXTkQpCisJICAgIEdldFdpbmRvd1JlY3QzMiAoKEhXTkQzMil0b29sUHRyLT51SWQsICZyZWN0KTsKKwllbHNlIHsKKwkgICAgcmVjdCA9IHRvb2xQdHItPnJlY3Q7CisJICAgIE1hcFdpbmRvd1BvaW50czMyICh0b29sUHRyLT5od25kLCAoSFdORDMyKTAsIChMUFBPSU5UMzIpJnJlY3QsIDIpOworCX0KKwlwdC54ID0gKHJlY3QubGVmdCArIHJlY3QucmlnaHQgLSBzaXplLmN4KSAvIDI7CisJcHQueSA9IHJlY3QuYm90dG9tICsgMjsKKyAgICB9CisgICAgZWxzZSB7CisJR2V0Q3Vyc29yUG9zMzIgKCZwdCk7CisJcHQueSArPSAyMDsKKyAgICB9CisKKyAgICBUUkFDRSAodG9vbHRpcHMsICJwb3MgJWQgLSAlZFxuIiwgcHQueCwgcHQueSk7CisKKy8vICAgIFNldFdpbmRvd1BvczMyICh3bmRQdHItPmh3bmRTZWxmLCBIV05EX1RPUCwgcHQueCwgcHQueSwKKy8vCQkgICAgc2l6ZS5jeCwgc2l6ZS5jeSwgU1dQX1NIT1dXSU5ET1cpOworICAgIFNldFdpbmRvd1BvczMyICh3bmRQdHItPmh3bmRTZWxmLCBIV05EX1RPUCwgMSwgMSwKIAkJICAgIHNpemUuY3gsIHNpemUuY3ksIFNXUF9TSE9XV0lORE9XKTsKIAogICAgIFNldFRpbWVyMzIgKHduZFB0ci0+aHduZFNlbGYsIElEX1RJTUVSMiwgaW5mb1B0ci0+bkF1dG9Qb3BUaW1lLCAwKTsKQEAgLTEyNSwyOCArMjQ0LDYzIEBACiBzdGF0aWMgVk9JRAogVE9PTFRJUFNfSGlkZSAoV05EICp3bmRQdHIsIFRPT0xUSVBTX0lORk8gKmluZm9QdHIpCiB7CisgICAgTk1IRFIgaGRyOworCiAgICAgaWYgKGluZm9QdHItPm5DdXJyZW50VG9vbCA9PSAtMSkKIAlyZXR1cm47CiAKLSAgICBGSVhNRSAodG9vbHRpcHMsICJIaWRlIHRvb2x0aXAgJWQhXG4iLCBpbmZvUHRyLT5uQ3VycmVudFRvb2wpOworICAgIFRSQUNFICh0b29sdGlwcywgIkhpZGUgdG9vbHRpcCAlZCFcbiIsIGluZm9QdHItPm5DdXJyZW50VG9vbCk7CiAgICAgS2lsbFRpbWVyMzIgKHduZFB0ci0+aHduZFNlbGYsIElEX1RJTUVSMik7CisKKyAgICBoZHIuaHduZEZyb20gPSB3bmRQdHItPmh3bmRTZWxmOworICAgIGhkci5pZEZyb20gPSBpbmZvUHRyLT5uQ3VycmVudFRvb2w7CisgICAgaGRyLmNvZGUgPSBUVE5fUE9QOworICAgIFNlbmRNZXNzYWdlMzJBIChHZXRQYXJlbnQzMiAod25kUHRyLT5od25kU2VsZiksIFdNX05PVElGWSwKKwkJICAgIChXUEFSQU0zMil3bmRQdHItPndJRG1lbnUsIChMUEFSQU0pJmhkcik7CisKICAgICBpbmZvUHRyLT5uQ3VycmVudFRvb2wgPSAtMTsKKwogICAgIFNldFdpbmRvd1BvczMyICh3bmRQdHItPmh3bmRTZWxmLCBIV05EX1RPUCwgMCwgMCwgMCwgMCwgU1dQX0hJREVXSU5ET1cpOwogfQogCiAKIHN0YXRpYyBJTlQzMgotVE9PTFRJUFNfR2V0SW5kZXhGcm9tSW5mb0EgKFRPT0xUSVBTX0lORk8gKmluZm9QdHIsIExQVFRUT09MSU5GT0EgbHBUb29sSW5mbykKK1RPT0xUSVBTX0dldFRvb2xGcm9tSW5mb0EgKFRPT0xUSVBTX0lORk8gKmluZm9QdHIsIExQVFRUT09MSU5GTzMyQSBscFRvb2xJbmZvKQogewogICAgIFRUVE9PTF9JTkZPICp0b29sUHRyOwotICAgIElOVDMyIG5JbmRleDsKKyAgICBJTlQzMiBuVG9vbDsKIAotICAgIGZvciAobkluZGV4ID0gMDsgbkluZGV4IDwgaW5mb1B0ci0+dU51bVRvb2xzOyBuSW5kZXgrKykgewotCXRvb2xQdHIgPSAmaW5mb1B0ci0+dG9vbHNbbkluZGV4XTsKKyNpZiAwCisgICAgZm9yIChuVG9vbCA9IDA7IG5Ub29sIDwgaW5mb1B0ci0+dU51bVRvb2xzOyBuVG9vbCsrKSB7CisJdG9vbFB0ciA9ICZpbmZvUHRyLT50b29sc1tuVG9vbF07CiAKLQlpZiAoKGxwVG9vbEluZm8tPmh3bmQgPT0gdG9vbFB0ci0+aHduZCkgJiYKKwlpZiAodG9vbFB0ci0+dUZsYWdzICYgVFRGX0lESVNIV05EKSB7CisJICAgIGlmIChscFRvb2xJbmZvLT51SWQgPT0gdG9vbFB0ci0+dUlkKQorCQlyZXR1cm4gblRvb2w7CisJfQorCWVsc2UgeworCSAgICBpZiAoKGxwVG9vbEluZm8tPmh3bmQgPT0gdG9vbFB0ci0+aHduZCkgJiYKKwkJKGxwVG9vbEluZm8tPnVJZCA9PSB0b29sUHRyLT51SWQpKQorCQlyZXR1cm4gblRvb2w7CisJfQorICAgIH0KKyNlbmRpZgorCisgICAgZm9yIChuVG9vbCA9IDA7IG5Ub29sIDwgaW5mb1B0ci0+dU51bVRvb2xzOyBuVG9vbCsrKSB7CisJdG9vbFB0ciA9ICZpbmZvUHRyLT50b29sc1tuVG9vbF07CisKKwlpZiAoISh0b29sUHRyLT51RmxhZ3MgJiBUVEZfSURJU0hXTkQpICYmIAorCSAgICAobHBUb29sSW5mby0+aHduZCA9PSB0b29sUHRyLT5od25kKSAmJgogCSAgICAobHBUb29sSW5mby0+dUlkID09IHRvb2xQdHItPnVJZCkpCi0JICAgIHJldHVybiBuSW5kZXg7CisJICAgIHJldHVybiBuVG9vbDsKKyAgICB9CisKKyAgICBmb3IgKG5Ub29sID0gMDsgblRvb2wgPCBpbmZvUHRyLT51TnVtVG9vbHM7IG5Ub29sKyspIHsKKwl0b29sUHRyID0gJmluZm9QdHItPnRvb2xzW25Ub29sXTsKKworCWlmICgodG9vbFB0ci0+dUZsYWdzICYgVFRGX0lESVNIV05EKSAmJgorCSAgICAobHBUb29sSW5mby0+dUlkID09IHRvb2xQdHItPnVJZCkpCisJICAgIHJldHVybiBuVG9vbDsKICAgICB9CiAKICAgICByZXR1cm4gLTE7CkBAIC0xNTQsMjQgKzMwOCwyNCBAQAogCiAKIHN0YXRpYyBJTlQzMgotVE9PTFRJUFNfR2V0SW5kZXhGcm9tUG9pbnQgKFRPT0xUSVBTX0lORk8gKmluZm9QdHIsIEhXTkQzMiBod25kLCBMUFBPSU5UMzIgbHBQdCkKK1RPT0xUSVBTX0dldFRvb2xGcm9tUG9pbnQgKFRPT0xUSVBTX0lORk8gKmluZm9QdHIsIEhXTkQzMiBod25kLCBMUFBPSU5UMzIgbHBQdCkKIHsKICAgICBUVFRPT0xfSU5GTyAqdG9vbFB0cjsKLSAgICBJTlQzMiAgbkluZGV4OworICAgIElOVDMyICBuVG9vbDsKIAotICAgIGZvciAobkluZGV4ID0gMDsgbkluZGV4IDwgaW5mb1B0ci0+dU51bVRvb2xzOyBuSW5kZXgrKykgewotCXRvb2xQdHIgPSAmaW5mb1B0ci0+dG9vbHNbbkluZGV4XTsKKyAgICBmb3IgKG5Ub29sID0gMDsgblRvb2wgPCBpbmZvUHRyLT51TnVtVG9vbHM7IG5Ub29sKyspIHsKKwl0b29sUHRyID0gJmluZm9QdHItPnRvb2xzW25Ub29sXTsKIAogCWlmICh0b29sUHRyLT51RmxhZ3MgJiBUVEZfSURJU0hXTkQpIHsKIAkgICAgaWYgKChIV05EMzIpdG9vbFB0ci0+dUlkID09IGh3bmQpCi0JCXJldHVybiBuSW5kZXg7CisJCXJldHVybiBuVG9vbDsKIAl9CiAJZWxzZSB7CiAJICAgIGlmIChod25kICE9IHRvb2xQdHItPmh3bmQpCiAJCWNvbnRpbnVlOwogCSAgICBpZiAoIVB0SW5SZWN0MzIgKCZ0b29sUHRyLT5yZWN0LCAqbHBQdCkpCiAJCWNvbnRpbnVlOwotCSAgICByZXR1cm4gbkluZGV4OworCSAgICByZXR1cm4gblRvb2w7CiAJfQogICAgIH0KIApAQCAtMTc5LDYgKzMzMywyOCBAQAogfQogCiAKK3N0YXRpYyBCT09MMzIKK1RPT0xUSVBTX0NoZWNrVG9vbCAoV05EICp3bmRQdHIpCit7CisgICAgVE9PTFRJUFNfSU5GTyAqaW5mb1B0ciA9IFRPT0xUSVBTX0dldEluZm9QdHIod25kUHRyKTsKKyAgICBQT0lOVDMyIHB0OworICAgIEhXTkQzMiBod25kVG9vbDsKKyAgICBJTlQzMiBuVG9vbDsKKworICAgIEdldEN1cnNvclBvczMyICgmcHQpOworICAgIGh3bmRUb29sID0KKwlTZW5kTWVzc2FnZTMyQSAod25kUHRyLT5od25kU2VsZiwgVFRNX1dJTkRPV0ZST01QT0lOVCwgMCwgKExQQVJBTSkmcHQpOworICAgIGlmIChod25kVG9vbCA9PSAwKQorCXJldHVybiBGQUxTRTsKKworICAgIFNjcmVlblRvQ2xpZW50MzIgKGh3bmRUb29sLCAmcHQpOworICAgIG5Ub29sID0gVE9PTFRJUFNfR2V0VG9vbEZyb21Qb2ludCAoaW5mb1B0ciwgaHduZFRvb2wsICZwdCk7CisgICAgVFJBQ0UgKHRvb2x0aXBzLCAidG9vbCAlZFxuIiwgblRvb2wpOworCisgICAgcmV0dXJuIChuVG9vbCAhPSAtMSk7Cit9CisKKwogc3RhdGljIExSRVNVTFQKIFRPT0xUSVBTX0FjdGl2YXRlIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewpAQCAtMTg2LDEyICszNjIsMTEgQEAKIAogICAgIGluZm9QdHItPmJBY3RpdmUgPSAoQk9PTDMyKXdQYXJhbTsKIAotICAgIGlmIChpbmZvUHRyLT5iQWN0aXZlKSB7Ci0JRklYTUUgKHRvb2x0aXBzLCAiYWN0aXZhdGVkIVxuIik7Ci0gICAgfQotICAgIGVsc2UgewotCUZJWE1FICh0b29sdGlwcywgImRlYWN0aXZhdGVkIVxuIik7Ci0gICAgfQorICAgIGlmIChpbmZvUHRyLT5iQWN0aXZlKQorCVRSQUNFICh0b29sdGlwcywgImFjdGl2YXRlIVxuIik7CisKKyAgICBpZiAoIShpbmZvUHRyLT5iQWN0aXZlKSAmJiAoaW5mb1B0ci0+bkN1cnJlbnRUb29sICE9IC0xKSkgCisJICAgIFRPT0xUSVBTX0hpZGUgKHduZFB0ciwgaW5mb1B0cik7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTIwMSwxMSArMzc2LDE4IEBACiBUT09MVElQU19BZGRUb29sMzJBIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogICAgIFRPT0xUSVBTX0lORk8gKmluZm9QdHIgPSBUT09MVElQU19HZXRJbmZvUHRyKHduZFB0cik7Ci0gICAgTFBUVFRPT0xJTkZPQSBscFRvb2xJbmZvID0gKExQVFRUT09MSU5GT0EpbFBhcmFtOworICAgIExQVFRUT09MSU5GTzMyQSBscFRvb2xJbmZvID0gKExQVFRUT09MSU5GTzMyQSlsUGFyYW07CiAgICAgVFRUT09MX0lORk8gKnRvb2xQdHI7CiAKICAgICBpZiAobHBUb29sSW5mbyA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CiAKKyAgICBpZiAobHBUb29sSW5mby0+dUZsYWdzICYgVFRGX1NVQkNMQVNTKQorCUZJWE1FICh0b29sdGlwcywgInN1YmNsYXNzaW5nIG5vdCBzdXBwb3J0ZWQhXG4iKTsKKworICAgIFRSQUNFICh0b29sdGlwcywgImFkZCB0b29sICgleCkgJXggJWQlcyFcbiIsCisJICAgd25kUHRyLT5od25kU2VsZiwgbHBUb29sSW5mby0+aHduZCwgbHBUb29sSW5mby0+dUlkLAorCSAgIChscFRvb2xJbmZvLT51RmxhZ3MgJiBUVEZfSURJU0hXTkQpID8gIiBUVEZfSURJU0hXTkQiIDogIiIpOworCiAgICAgaWYgKGluZm9QdHItPnVOdW1Ub29scyA9PSAwKSB7CiAJaW5mb1B0ci0+dG9vbHMgPQogCSAgICBIZWFwQWxsb2MgKEdldFByb2Nlc3NIZWFwICgpLCBIRUFQX1pFUk9fTUVNT1JZLApAQCAtMjMzLDIwICs0MTUsMjQgQEAKICAgICB0b29sUHRyLT5oaW5zdCAgPSBscFRvb2xJbmZvLT5oaW5zdDsKIAogICAgIGlmIChscFRvb2xJbmZvLT5oaW5zdCkgeworCVRSQUNFICh0b29sdGlwcywgImFkZCBzdHJpbmcgaWQgJXghXG4iLCAoaW50KWxwVG9vbEluZm8tPmxwc3pUZXh0KTsKIAl0b29sUHRyLT5scHN6VGV4dCA9IGxwVG9vbEluZm8tPmxwc3pUZXh0OwogICAgIH0KICAgICBlbHNlIGlmIChscFRvb2xJbmZvLT5scHN6VGV4dCkgewotCWlmIChscFRvb2xJbmZvLT5scHN6VGV4dCA9PSBMUFNUUl9URVhUQ0FMTEJBQ0szMkEpCisJaWYgKGxwVG9vbEluZm8tPmxwc3pUZXh0ID09IExQU1RSX1RFWFRDQUxMQkFDSzMyQSkgeworCSAgICBUUkFDRSAodG9vbHRpcHMsICJhZGQgQ0FMTEJBQ0shXG4iKTsKIAkgICAgdG9vbFB0ci0+bHBzelRleHQgPSBscFRvb2xJbmZvLT5scHN6VGV4dDsKKwl9CiAJZWxzZSB7CiAJICAgIElOVDMyIGxlbiA9IGxzdHJsZW4zMkEgKGxwVG9vbEluZm8tPmxwc3pUZXh0KTsKKwkgICAgVFJBQ0UgKHRvb2x0aXBzLCAiYWRkIHRleHQgXCIlc1wiIVxuIiwgbHBUb29sSW5mby0+bHBzelRleHQpOwogCSAgICB0b29sUHRyLT5scHN6VGV4dCA9CiAJCUhlYXBBbGxvYyAoR2V0UHJvY2Vzc0hlYXAgKCksIEhFQVBfWkVST19NRU1PUlksIGxlbiArIDEpOwogCSAgICBsc3RyY3B5MzJBICh0b29sUHRyLT5scHN6VGV4dCwgbHBUb29sSW5mby0+bHBzelRleHQpOwogCX0KICAgICB9CiAKLSAgICBpZiAobHBUb29sSW5mby0+Y2JTaXplID49IHNpemVvZihUVFRPT0xJTkZPQSkpCisgICAgaWYgKGxwVG9vbEluZm8tPmNiU2l6ZSA+PSBzaXplb2YoVFRUT09MSU5GTzMyQSkpCiAJdG9vbFB0ci0+bFBhcmFtID0gbHBUb29sSW5mby0+bFBhcmFtOwogCiAgICAgcmV0dXJuIFRSVUU7CkBAIC0yNjAsMjAgKzQ0NiwyMCBAQAogVE9PTFRJUFNfRGVsVG9vbDMyQSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKICAgICBUT09MVElQU19JTkZPICppbmZvUHRyID0gVE9PTFRJUFNfR2V0SW5mb1B0cih3bmRQdHIpOwotICAgIExQVFRUT09MSU5GT0EgbHBUb29sSW5mbyA9IChMUFRUVE9PTElORk9BKWxQYXJhbTsKKyAgICBMUFRUVE9PTElORk8zMkEgbHBUb29sSW5mbyA9IChMUFRUVE9PTElORk8zMkEpbFBhcmFtOwogICAgIFRUVE9PTF9JTkZPICp0b29sUHRyOwotICAgIElOVDMyIG5JbmRleDsKKyAgICBJTlQzMiBuVG9vbDsKIAogICAgIGlmIChscFRvb2xJbmZvID09IE5VTEwpIHJldHVybiAwOwogICAgIGlmIChpbmZvUHRyLT51TnVtVG9vbHMgPT0gMCkgcmV0dXJuIDA7CiAKLSAgICBuSW5kZXggPSBUT09MVElQU19HZXRJbmRleEZyb21JbmZvQSAoaW5mb1B0ciwgbHBUb29sSW5mbyk7Ci0gICAgaWYgKG5JbmRleCA9PSAtMSkgcmV0dXJuIDA7CisgICAgblRvb2wgPSBUT09MVElQU19HZXRUb29sRnJvbUluZm9BIChpbmZvUHRyLCBscFRvb2xJbmZvKTsKKyAgICBpZiAoblRvb2wgPT0gLTEpIHJldHVybiAwOwogCi0gICAgVFJBQ0UgKHRvb2x0aXBzLCAiaW5kZXg9JWRcbiIsIG5JbmRleCk7CisgICAgVFJBQ0UgKHRvb2x0aXBzLCAidG9vbCAlZFxuIiwgblRvb2wpOwogCiAgICAgLyogZGVsZXRlIHRleHQgc3RyaW5nICovCi0gICAgdG9vbFB0ciA9ICZpbmZvUHRyLT50b29sc1tuSW5kZXhdOyAKKyAgICB0b29sUHRyID0gJmluZm9QdHItPnRvb2xzW25Ub29sXTsgCiAgICAgaWYgKCh0b29sUHRyLT5oaW5zdCkgJiYgKHRvb2xQdHItPmxwc3pUZXh0KSkgewogCWlmICh0b29sUHRyLT5scHN6VGV4dCAhPSBMUFNUUl9URVhUQ0FMTEJBQ0szMkEpCiAJICAgIEhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgdG9vbFB0ci0+bHBzelRleHQpOwpAQCAtMjkwLDEzICs0NzYsMTMgQEAKIAkgICAgSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCAoKSwgSEVBUF9aRVJPX01FTU9SWSwKIAkJICAgICAgIHNpemVvZihUVFRPT0xfSU5GTykgKiAoaW5mb1B0ci0+dU51bVRvb2xzIC0gMSkpOwogCi0JaWYgKG5JbmRleCA+IDApCisJaWYgKG5Ub29sID4gMCkKIAkgICAgbWVtY3B5ICgmaW5mb1B0ci0+dG9vbHNbMF0sICZvbGRUb29sc1swXSwKLQkJICAgIG5JbmRleCAqIHNpemVvZihUVFRPT0xfSU5GTykpOworCQkgICAgblRvb2wgKiBzaXplb2YoVFRUT09MX0lORk8pKTsKIAotCWlmIChuSW5kZXggPCBpbmZvUHRyLT51TnVtVG9vbHMgLSAxKQotCSAgICBtZW1jcHkgKCZpbmZvUHRyLT50b29sc1tuSW5kZXhdLCAmb2xkVG9vbHNbbkluZGV4ICsgMV0sCi0JCSAgICAoaW5mb1B0ci0+dU51bVRvb2xzIC0gbkluZGV4IC0gMSkgKiBzaXplb2YoVFRUT09MX0lORk8pKTsKKwlpZiAoblRvb2wgPCBpbmZvUHRyLT51TnVtVG9vbHMgLSAxKQorCSAgICBtZW1jcHkgKCZpbmZvUHRyLT50b29sc1tuVG9vbF0sICZvbGRUb29sc1tuVG9vbCArIDFdLAorCQkgICAgKGluZm9QdHItPnVOdW1Ub29scyAtIG5Ub29sIC0gMSkgKiBzaXplb2YoVFRUT09MX0lORk8pKTsKIAogCUhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgb2xkVG9vbHMpOwogICAgIH0KQEAgLTMxNSw3ICs1MDEsNyBAQAogewogICAgIFRPT0xUSVBTX0lORk8gKmluZm9QdHIgPSBUT09MVElQU19HZXRJbmZvUHRyKHduZFB0cik7CiAgICAgVUlOVDMyIHVJbmRleCA9IChVSU5UMzIpd1BhcmFtOwotICAgIExQVFRUT09MSU5GT0EgbHBUb29sSW5mbyA9IChMUFRUVE9PTElORk9BKWxQYXJhbTsKKyAgICBMUFRUVE9PTElORk8zMkEgbHBUb29sSW5mbyA9IChMUFRUVE9PTElORk8zMkEpbFBhcmFtOwogICAgIFRUVE9PTF9JTkZPICp0b29sUHRyOwogCiAgICAgaWYgKHVJbmRleCA+PSBpbmZvUHRyLT51TnVtVG9vbHMpIHJldHVybiBGQUxTRTsKQEAgLTMzMyw3ICs1MTksNyBAQAogICAgIGxwVG9vbEluZm8tPmhpbnN0ICAgID0gdG9vbFB0ci0+aGluc3Q7CiAgICAgbHBUb29sSW5mby0+bHBzelRleHQgPSB0b29sUHRyLT5scHN6VGV4dDsKIAotICAgIGlmIChscFRvb2xJbmZvLT5jYlNpemUgPj0gc2l6ZW9mKFRUVE9PTElORk9BKSkKKyAgICBpZiAobHBUb29sSW5mby0+Y2JTaXplID49IHNpemVvZihUVFRPT0xJTkZPMzJBKSkKIAlscFRvb2xJbmZvLT5sUGFyYW0gPSB0b29sUHRyLT5sUGFyYW07CiAKICAgICByZXR1cm4gVFJVRTsKQEAgLTM0Nyw3ICs1MzMsNyBAQAogVE9PTFRJUFNfR2V0Q3VycmVudFRvb2wzMkEgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAgICAgVE9PTFRJUFNfSU5GTyAqaW5mb1B0ciA9IFRPT0xUSVBTX0dldEluZm9QdHIod25kUHRyKTsKLSAgICBMUFRUVE9PTElORk9BIGxwdGkgPSAoTFBUVFRPT0xJTkZPQSlsUGFyYW07CisgICAgTFBUVFRPT0xJTkZPMzJBIGxwdGkgPSAoTFBUVFRPT0xJTkZPMzJBKWxQYXJhbTsKICAgICBUVFRPT0xfSU5GTyAqdG9vbFB0cjsKIAogICAgIGlmIChscHRpKSB7CkBAIC0zNjAsNyArNTQ2LDcgQEAKIAkgICAgbHB0aS0+aGluc3QgICAgPSB0b29sUHRyLT5oaW5zdDsKIAkgICAgbHB0aS0+bHBzelRleHQgPSB0b29sUHRyLT5scHN6VGV4dDsKIAotCSAgICBpZiAobHB0aS0+Y2JTaXplID49IHNpemVvZihUVFRPT0xJTkZPQSkpCisJICAgIGlmIChscHRpLT5jYlNpemUgPj0gc2l6ZW9mKFRUVE9PTElORk8zMkEpKQogCQlscHRpLT5sUGFyYW0gPSB0b29sUHRyLT5sUGFyYW07CiAKIAkgICAgcmV0dXJuIFRSVUU7CkBAIC00MjksMTYgKzYxNSwxNiBAQAogVE9PTFRJUFNfR2V0VGV4dDMyQSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKICAgICBUT09MVElQU19JTkZPICppbmZvUHRyID0gVE9PTFRJUFNfR2V0SW5mb1B0cih3bmRQdHIpOwotICAgIExQVFRUT09MSU5GT0EgbHB0aSA9IChMUFRUVE9PTElORk9BKWxQYXJhbTsKLSAgICBJTlQzMiBuSW5kZXg7CisgICAgTFBUVFRPT0xJTkZPMzJBIGxwdGkgPSAoTFBUVFRPT0xJTkZPMzJBKWxQYXJhbTsKKyAgICBJTlQzMiBuVG9vbDsKIAogICAgIGlmICghKGxwdGkpKSByZXR1cm4gMDsKLSAgICBpZiAobHB0aS0+Y2JTaXplIDwgc2l6ZW9mKFRUVE9PTElORk9BKSkgcmV0dXJuIDA7CisgICAgaWYgKGxwdGktPmNiU2l6ZSA8IHNpemVvZihUVFRPT0xJTkZPMzJBKSkgcmV0dXJuIDA7CiAKLSAgICBuSW5kZXggPSBUT09MVElQU19HZXRJbmRleEZyb21JbmZvQSAoaW5mb1B0ciwgbHB0aSk7Ci0gICAgaWYgKG5JbmRleCA9PSAtMSkgcmV0dXJuIDA7CisgICAgblRvb2wgPSBUT09MVElQU19HZXRUb29sRnJvbUluZm9BIChpbmZvUHRyLCBscHRpKTsKKyAgICBpZiAoblRvb2wgPT0gLTEpIHJldHVybiAwOwogCi0gICAgbHN0cmNweTMyQSAobHB0aS0+bHBzelRleHQsIGluZm9QdHItPnRvb2xzW25JbmRleF0ubHBzelRleHQpOworICAgIGxzdHJjcHkzMkEgKGxwdGktPmxwc3pUZXh0LCBpbmZvUHRyLT50b29sc1tuVG9vbF0ubHBzelRleHQpOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC00NzUsMTkgKzY2MSwxOSBAQAogVE9PTFRJUFNfR2V0VG9vbEluZm8zMkEgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAgICAgVE9PTFRJUFNfSU5GTyAqaW5mb1B0ciA9IFRPT0xUSVBTX0dldEluZm9QdHIod25kUHRyKTsKLSAgICBMUFRUVE9PTElORk9BIGxwVG9vbEluZm8gPSAoTFBUVFRPT0xJTkZPQSlsUGFyYW07CisgICAgTFBUVFRPT0xJTkZPMzJBIGxwVG9vbEluZm8gPSAoTFBUVFRPT0xJTkZPMzJBKWxQYXJhbTsKICAgICBUVFRPT0xfSU5GTyAqdG9vbFB0cjsKLSAgICBJTlQzMiBuSW5kZXg7CisgICAgSU5UMzIgblRvb2w7CiAKICAgICBpZiAobHBUb29sSW5mbyA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CiAgICAgaWYgKGluZm9QdHItPnVOdW1Ub29scyA9PSAwKSByZXR1cm4gRkFMU0U7CiAKLSAgICBuSW5kZXggPSBUT09MVElQU19HZXRJbmRleEZyb21JbmZvQSAoaW5mb1B0ciwgbHBUb29sSW5mbyk7Ci0gICAgaWYgKG5JbmRleCA9PSAtMSkgcmV0dXJuIEZBTFNFOworICAgIG5Ub29sID0gVE9PTFRJUFNfR2V0VG9vbEZyb21JbmZvQSAoaW5mb1B0ciwgbHBUb29sSW5mbyk7CisgICAgaWYgKG5Ub29sID09IC0xKSByZXR1cm4gRkFMU0U7CiAKLSAgICBUUkFDRSAodG9vbHRpcHMsICJpbmRleD0lZFxuIiwgbkluZGV4KTsKKyAgICBUUkFDRSAodG9vbHRpcHMsICJ0b29sICVkXG4iLCBuVG9vbCk7CiAKLSAgICB0b29sUHRyID0gJmluZm9QdHItPnRvb2xzW25JbmRleF07CisgICAgdG9vbFB0ciA9ICZpbmZvUHRyLT50b29sc1tuVG9vbF07CiAKICAgICAvKiBjb3B5IHRvb2wgZGF0YSAqLwogICAgIGxwVG9vbEluZm8tPnVGbGFncyAgID0gdG9vbFB0ci0+dUZsYWdzOwpAQCAtNDk1LDcgKzY4MSw3IEBACiAgICAgbHBUb29sSW5mby0+aGluc3QgICAgPSB0b29sUHRyLT5oaW5zdDsKICAgICBscFRvb2xJbmZvLT5scHN6VGV4dCA9IHRvb2xQdHItPmxwc3pUZXh0OwogCi0gICAgaWYgKGxwVG9vbEluZm8tPmNiU2l6ZSA+PSBzaXplb2YoVFRUT09MSU5GT0EpKQorICAgIGlmIChscFRvb2xJbmZvLT5jYlNpemUgPj0gc2l6ZW9mKFRUVE9PTElORk8zMkEpKQogCWxwVG9vbEluZm8tPmxQYXJhbSA9IHRvb2xQdHItPmxQYXJhbTsKIAogICAgIHJldHVybiBUUlVFOwpAQCAtNTA5LDIyICs2OTUsMjIgQEAKIFRPT0xUSVBTX0hpdFRlc3QzMkEgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAgICAgVE9PTFRJUFNfSU5GTyAqaW5mb1B0ciA9IFRPT0xUSVBTX0dldEluZm9QdHIod25kUHRyKTsKLSAgICBMUFRUSElUVEVTVElORk9BIGxwdHRoaXQgPSAoTFBUVEhJVFRFU1RJTkZPQSlsUGFyYW07CisgICAgTFBUVEhJVFRFU1RJTkZPMzJBIGxwdHRoaXQgPSAoTFBUVEhJVFRFU1RJTkZPMzJBKWxQYXJhbTsKICAgICBUVFRPT0xfSU5GTyAqdG9vbFB0cjsKICAgICBJTlQzMiBuVG9vbDsKIAogICAgIGlmIChscHR0aGl0ID09IDApCiAJcmV0dXJuIEZBTFNFOwogCi0gICAgblRvb2wgPSBUT09MVElQU19HZXRJbmRleEZyb21Qb2ludCAoaW5mb1B0ciwgbHB0dGhpdC0+aHduZCwgJmxwdHRoaXQtPnB0KTsKKyAgICBuVG9vbCA9IFRPT0xUSVBTX0dldFRvb2xGcm9tUG9pbnQgKGluZm9QdHIsIGxwdHRoaXQtPmh3bmQsICZscHR0aGl0LT5wdCk7CiAgICAgaWYgKG5Ub29sID09IC0xKQogCXJldHVybiBGQUxTRTsKIAotICAgIFRSQUNFICh0b29sdGlwcywgIm5Ub29sID0gJWQhXG4iLCBuVG9vbCk7CisgICAgVFJBQ0UgKHRvb2x0aXBzLCAidG9vbCAlZCFcbiIsIG5Ub29sKTsKIAogICAgIC8qIGNvcHkgdG9vbCBkYXRhICovCiAgICAgdG9vbFB0ciA9ICZpbmZvUHRyLT50b29sc1tuVG9vbF07Ci0gICAgbHB0dGhpdC0+dGkuY2JTaXplICAgPSBzaXplb2YoVFRUT09MSU5GT0EpOworICAgIGxwdHRoaXQtPnRpLmNiU2l6ZSAgID0gc2l6ZW9mKFRUVE9PTElORk8zMkEpOwogICAgIGxwdHRoaXQtPnRpLnVGbGFncyAgID0gdG9vbFB0ci0+dUZsYWdzOwogICAgIGxwdHRoaXQtPnRpLmh3bmQgICAgID0gdG9vbFB0ci0+aHduZDsKICAgICBscHR0aGl0LT50aS51SWQgICAgICA9IHRvb2xQdHItPnVJZDsKQEAgLTU0NCwxNiArNzMwLDE2IEBACiBUT09MVElQU19OZXdUb29sUmVjdDMyQSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKICAgICBUT09MVElQU19JTkZPICppbmZvUHRyID0gVE9PTFRJUFNfR2V0SW5mb1B0cih3bmRQdHIpOwotICAgIExQVFRUT09MSU5GT0EgbHB0aSA9IChMUFRUVE9PTElORk9BKWxQYXJhbTsKLSAgICBJTlQzMiBuSW5kZXg7CisgICAgTFBUVFRPT0xJTkZPMzJBIGxwdGkgPSAoTFBUVFRPT0xJTkZPMzJBKWxQYXJhbTsKKyAgICBJTlQzMiBuVG9vbDsKIAogICAgIGlmICghKGxwdGkpKSByZXR1cm4gMDsKLSAgICBpZiAobHB0aS0+Y2JTaXplIDwgc2l6ZW9mKFRUVE9PTElORk9BKSkgcmV0dXJuIDA7CisgICAgaWYgKGxwdGktPmNiU2l6ZSA8IHNpemVvZihUVFRPT0xJTkZPMzJBKSkgcmV0dXJuIDA7CiAKLSAgICBuSW5kZXggPSBUT09MVElQU19HZXRJbmRleEZyb21JbmZvQSAoaW5mb1B0ciwgbHB0aSk7Ci0gICAgaWYgKG5JbmRleCA9PSAtMSkgcmV0dXJuIDA7CisgICAgblRvb2wgPSBUT09MVElQU19HZXRUb29sRnJvbUluZm9BIChpbmZvUHRyLCBscHRpKTsKKyAgICBpZiAoblRvb2wgPT0gLTEpIHJldHVybiAwOwogCi0gICAgaW5mb1B0ci0+dG9vbHNbbkluZGV4XS5yZWN0ID0gbHB0aS0+cmVjdDsKKyAgICBpbmZvUHRyLT50b29sc1tuVG9vbF0ucmVjdCA9IGxwdGktPnJlY3Q7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTU4MSwxNSArNzY3LDE1IEBACiAgICAgUE9JTlQzMiBwdDsKIAogICAgIGlmIChscE1zZyA9PSBOVUxMKSB7Ci0JV0FSTiAodG9vbHRpcHMsICJscE1zZyA9PSBOVUxMIVxuIik7CisJRVJSICh0b29sdGlwcywgImxwTXNnID09IE5VTEwhXG4iKTsKIAlyZXR1cm4gMDsKICAgICB9CiAKICAgICBwdCA9IGxwTXNnLT5wdDsKICAgICBTY3JlZW5Ub0NsaWVudDMyIChscE1zZy0+aHduZCwgJnB0KTsKICAgICBpbmZvUHRyLT5uT2xkVG9vbCA9IGluZm9QdHItPm5Ub29sOwotICAgIGluZm9QdHItPm5Ub29sID0gVE9PTFRJUFNfR2V0SW5kZXhGcm9tUG9pbnQgKGluZm9QdHIsIGxwTXNnLT5od25kLCAmcHQpOwotICAgIFRSQUNFICh0b29sdGlwcywgIm5Ub29sID0gJWRcbiIsIGluZm9QdHItPm5Ub29sKTsKKyAgICBpbmZvUHRyLT5uVG9vbCA9IFRPT0xUSVBTX0dldFRvb2xGcm9tUG9pbnQgKGluZm9QdHIsIGxwTXNnLT5od25kLCAmcHQpOworICAgIFRSQUNFICh0b29sdGlwcywgInRvb2wgKCV4KSAlZCAlZFxuIiwgd25kUHRyLT5od25kU2VsZiwgaW5mb1B0ci0+bk9sZFRvb2wsIGluZm9QdHItPm5Ub29sKTsKIAogICAgIHN3aXRjaCAobHBNc2ctPm1lc3NhZ2UpIHsKIAljYXNlIFdNX0xCVVRUT05ET1dOOgpAQCAtNjAyLDEzICs3ODgsMjQgQEAKIAkgICAgYnJlYWs7CiAKIAljYXNlIFdNX01PVVNFTU9WRToKLQkgICAgVFJBQ0UgKHRvb2x0aXBzLCAiV01fTU9VU0VNT1ZFICglZCAlZClcbiIsIHB0LngsIHB0LnkpOwotCSAgICBpZiAoaW5mb1B0ci0+blRvb2wgIT0gaW5mb1B0ci0+bk9sZFRvb2wpIHsKLQkJaWYgKGluZm9QdHItPm5PbGRUb29sID09IC0xKQotCQkgICAgU2V0VGltZXIzMiAod25kUHRyLT5od25kU2VsZiwgSURfVElNRVIxLCBpbmZvUHRyLT5uSW5pdGlhbFRpbWUsIDApOwotCQllbHNlCisJICAgIFRSQUNFICh0b29sdGlwcywgIldNX01PVVNFTU9WRSAoJTA0eCAlZCAlZClcbiIsCisJCSAgIHduZFB0ci0+aHduZFNlbGYsIHB0LngsIHB0LnkpOworCSAgICBpZiAoKGluZm9QdHItPmJBY3RpdmUpICYmIChpbmZvUHRyLT5uVG9vbCAhPSBpbmZvUHRyLT5uT2xkVG9vbCkpIHsKKwkJaWYgKGluZm9QdHItPm5PbGRUb29sID09IC0xKSB7CisJCSAgICBTZXRUaW1lcjMyICh3bmRQdHItPmh3bmRTZWxmLCBJRF9USU1FUjEsCisJCQkJaW5mb1B0ci0+bkluaXRpYWxUaW1lLCAwKTsKKwkJICAgIFRSQUNFICh0b29sdGlwcywgInRpbWVyIDEgc3RhcnRlZCFcbiIpOworCQl9CisJCWVsc2UgewogCQkgICAgVE9PTFRJUFNfSGlkZSAod25kUHRyLCBpbmZvUHRyKTsKLQkJICAgIFNldFRpbWVyMzIgKHduZFB0ci0+aHduZFNlbGYsIElEX1RJTUVSMSwgaW5mb1B0ci0+blJlc2hvd1RpbWUsIDApOworCQkgICAgU2V0VGltZXIzMiAod25kUHRyLT5od25kU2VsZiwgSURfVElNRVIxLAorCQkJCWluZm9QdHItPm5SZXNob3dUaW1lLCAwKTsKKwkJICAgIFRSQUNFICh0b29sdGlwcywgInRpbWVyIDIgc3RhcnRlZCFcbiIpOworCQl9CisJICAgIH0KKwkgICAgaWYgKGluZm9QdHItPm5DdXJyZW50VG9vbCAhPSAtMSkgeworCQlTZXRUaW1lcjMyICh3bmRQdHItPmh3bmRTZWxmLCBJRF9USU1FUjMsIDEwMCwgMCk7CisJCVRSQUNFICh0b29sdGlwcywgInRpbWVyIDMgc3RhcnRlZCFcbiIpOwogCSAgICB9CiAJICAgIGJyZWFrOwogICAgIH0KQEAgLTcwOSwxOCArOTA2LDE4IEBACiBUT09MVElQU19TZXRUb29sSW5mbzMyQSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKICAgICBUT09MVElQU19JTkZPICppbmZvUHRyID0gVE9PTFRJUFNfR2V0SW5mb1B0cih3bmRQdHIpOwotICAgIExQVFRUT09MSU5GT0EgbHBUb29sSW5mbyA9IChMUFRUVE9PTElORk9BKWxQYXJhbTsKKyAgICBMUFRUVE9PTElORk8zMkEgbHBUb29sSW5mbyA9IChMUFRUVE9PTElORk8zMkEpbFBhcmFtOwogICAgIFRUVE9PTF9JTkZPICp0b29sUHRyOwotICAgIElOVDMyIG5JbmRleDsKKyAgICBJTlQzMiBuVG9vbDsKIAogICAgIGlmIChscFRvb2xJbmZvID09IE5VTEwpIHJldHVybiAwOwogCi0gICAgbkluZGV4ID0gVE9PTFRJUFNfR2V0SW5kZXhGcm9tSW5mb0EgKGluZm9QdHIsIGxwVG9vbEluZm8pOwotICAgIGlmIChuSW5kZXggPT0gLTEpIHJldHVybiAwOworICAgIG5Ub29sID0gVE9PTFRJUFNfR2V0VG9vbEZyb21JbmZvQSAoaW5mb1B0ciwgbHBUb29sSW5mbyk7CisgICAgaWYgKG5Ub29sID09IC0xKSByZXR1cm4gMDsKIAotICAgIFRSQUNFICh0b29sdGlwcywgIm5JbmRleD0lZFxuIiwgbkluZGV4KTsKKyAgICBUUkFDRSAodG9vbHRpcHMsICJ0b29sICVkXG4iLCBuVG9vbCk7CiAKLSAgICB0b29sUHRyID0gJmluZm9QdHItPnRvb2xzW25JbmRleF07CisgICAgdG9vbFB0ciA9ICZpbmZvUHRyLT50b29sc1tuVG9vbF07CiAKICAgICAvKiBjb3B5IHRvb2wgZGF0YSAqLwogICAgIHRvb2xQdHItPnVGbGFncyA9IGxwVG9vbEluZm8tPnVGbGFnczsKQEAgLTc0NCw3ICs5NDEsNyBAQAogCX0KICAgICB9CiAKLSAgICBpZiAobHBUb29sSW5mby0+Y2JTaXplID49IHNpemVvZihUVFRPT0xJTkZPQSkpCisgICAgaWYgKGxwVG9vbEluZm8tPmNiU2l6ZSA+PSBzaXplb2YoVFRUT09MSU5GTzMyQSkpCiAJdG9vbFB0ci0+bFBhcmFtID0gbHBUb29sSW5mby0+bFBhcmFtOwogCiAgICAgcmV0dXJuIDA7CkBAIC03NTIsMTIgKzk0OSwxMTIgQEAKIAogCiAvLyA8PCBUT09MVElQU19TZXRUb29sSW5mbzMyVyA+PgotLy8gPDwgVE9PTFRJUFNfVHJhY2tBY3RpdmUgPj4KLS8vIDw8IFRPT0xUSVBTX1RyYWNrUG9zaXRpb24gPj4KLS8vIDw8IFRPT0xUSVBTX1VwZGF0ZSA+PgotLy8gPDwgVE9PTFRJUFNfVXBkYXRlVGlwVGV4dDMyQSA+PgorCisKK3N0YXRpYyBMUkVTVUxUCitUT09MVElQU19UcmFja0FjdGl2YXRlIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFRPT0xUSVBTX0lORk8gKmluZm9QdHIgPSBUT09MVElQU19HZXRJbmZvUHRyKHduZFB0cik7CisgICAgTFBUVFRPT0xJTkZPMzJBIGxwVG9vbEluZm8gPSAoTFBUVFRPT0xJTkZPMzJBKWxQYXJhbTsKKworICAgIGlmICgoQk9PTDMyKXdQYXJhbSkgeworCS8qIGFjdGl2YXRlICovCisJaW5mb1B0ci0+blRyYWNrVG9vbCA9IFRPT0xUSVBTX0dldFRvb2xGcm9tSW5mb0EgKGluZm9QdHIsIGxwVG9vbEluZm8pOworCWlmIChpbmZvUHRyLT5uVHJhY2tUb29sICE9IC0xKSB7CisJICAgIGluZm9QdHItPmJUcmFja0FjdGl2ZSA9IFRSVUU7CisKKwkgICAgLyogRklYTUUgOiBzaG93IHRvb2wgdGlwICovCisJfQorICAgIH0KKyAgICBlbHNlIHsKKwkvKiBkZWFjdGl2YXRlICovCisJLyogRklYTUUgOiBoaWRlIHRvb2wgdGlwICovCisKKwlpbmZvUHRyLT5iVHJhY2tBY3RpdmUgPSBGQUxTRTsKKwlpbmZvUHRyLT5uVHJhY2tUb29sID0gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIExSRVNVTFQKK1RPT0xUSVBTX1RyYWNrUG9zaXRpb24gKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgVE9PTFRJUFNfSU5GTyAqaW5mb1B0ciA9IFRPT0xUSVBTX0dldEluZm9QdHIod25kUHRyKTsKKworICAgIGluZm9QdHItPnhUcmFja1BvcyA9IChJTlQzMilMT1dPUkQobFBhcmFtKTsKKyAgICBpbmZvUHRyLT55VHJhY2tQb3MgPSAoSU5UMzIpSElXT1JEKGxQYXJhbSk7CisKKyAgICBpZiAoaW5mb1B0ci0+YlRyYWNrQWN0aXZlKSB7CisKKwlGSVhNRSAodG9vbHRpcHMsICJzZXQgcG9zaXRpb24hXG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgTFJFU1VMVAorVE9PTFRJUFNfVXBkYXRlIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFRPT0xUSVBTX0lORk8gKmluZm9QdHIgPSBUT09MVElQU19HZXRJbmZvUHRyKHduZFB0cik7CisKKyAgICBpZiAoaW5mb1B0ci0+bkN1cnJlbnRUb29sICE9IC0xKQorCVVwZGF0ZVdpbmRvdzMyICh3bmRQdHItPmh3bmRTZWxmKTsKKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBMUkVTVUxUCitUT09MVElQU19VcGRhdGVUaXBUZXh0MzJBIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFRPT0xUSVBTX0lORk8gKmluZm9QdHIgPSBUT09MVElQU19HZXRJbmZvUHRyKHduZFB0cik7CisgICAgTFBUVFRPT0xJTkZPMzJBIGxwVG9vbEluZm8gPSAoTFBUVFRPT0xJTkZPMzJBKWxQYXJhbTsKKyAgICBUVFRPT0xfSU5GTyAqdG9vbFB0cjsKKyAgICBJTlQzMiBuVG9vbDsKKworICAgIGlmIChscFRvb2xJbmZvID09IE5VTEwpIHJldHVybiAwOworCisgICAgblRvb2wgPSBUT09MVElQU19HZXRUb29sRnJvbUluZm9BIChpbmZvUHRyLCBscFRvb2xJbmZvKTsKKyAgICBpZiAoblRvb2wgPT0gLTEpIHJldHVybiAwOworCisgICAgVFJBQ0UgKHRvb2x0aXBzLCAidG9vbCAlZFxuIiwgblRvb2wpOworCisgICAgdG9vbFB0ciA9ICZpbmZvUHRyLT50b29sc1tuVG9vbF07CisKKyAgICAvKiBjb3B5IHRvb2wgdGV4dCAqLworICAgIHRvb2xQdHItPmhpbnN0ICA9IGxwVG9vbEluZm8tPmhpbnN0OworCisgICAgaWYgKGxwVG9vbEluZm8tPmhpbnN0KSB7CisJdG9vbFB0ci0+bHBzelRleHQgPSBscFRvb2xJbmZvLT5scHN6VGV4dDsKKyAgICB9CisgICAgZWxzZSBpZiAobHBUb29sSW5mby0+bHBzelRleHQpIHsKKwlpZiAobHBUb29sSW5mby0+bHBzelRleHQgPT0gTFBTVFJfVEVYVENBTExCQUNLMzJBKQorCSAgICB0b29sUHRyLT5scHN6VGV4dCA9IGxwVG9vbEluZm8tPmxwc3pUZXh0OworCWVsc2UgeworCSAgICBJTlQzMiBsZW4gPSBsc3RybGVuMzJBIChscFRvb2xJbmZvLT5scHN6VGV4dCk7CisJICAgIEhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgdG9vbFB0ci0+bHBzelRleHQpOworCSAgICB0b29sUHRyLT5scHN6VGV4dCA9CisJCUhlYXBBbGxvYyAoR2V0UHJvY2Vzc0hlYXAgKCksIEhFQVBfWkVST19NRU1PUlksIGxlbiArIDEpOworCSAgICBsc3RyY3B5MzJBICh0b29sUHRyLT5scHN6VGV4dCwgbHBUb29sSW5mby0+bHBzelRleHQpOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCiAvLyA8PCBUT09MVElQU19VcGRhdGVUaXBUZXh0MzJXID4+Ci0vLyA8PCBUT09MVElQU19XaW5kb3dGcm9tUG9pbnQgPj4KKworCitzdGF0aWMgTFJFU1VMVAorVE9PTFRJUFNfV2luZG93RnJvbVBvaW50IChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIHJldHVybiBXaW5kb3dGcm9tUG9pbnQzMiAoKigoTFBQT0lOVDMyKWxQYXJhbSkpOworfQorCiAKIAogc3RhdGljIExSRVNVTFQKQEAgLTc3OCw2ICsxMDc1LDcgQEAKIAogICAgIC8qIGluaXRpYWxpemUgaW5mbyBzdHJ1Y3R1cmUgKi8KICAgICBpbmZvUHRyLT5iQWN0aXZlID0gVFJVRTsKKyAgICBpbmZvUHRyLT5iVHJhY2tBY3RpdmUgPSBGQUxTRTsKICAgICBpbmZvUHRyLT5jbHJCayAgID0gR2V0U3lzQ29sb3IzMiAoQ09MT1JfSU5GT0JLKTsKICAgICBpbmZvUHRyLT5jbHJUZXh0ID0gR2V0U3lzQ29sb3IzMiAoQ09MT1JfSU5GT1RFWFQpOwogCkBAIC03ODgsMTIgKzEwODYsMTUgQEAKICAgICBpbmZvUHRyLT5uVG9vbCA9IC0xOwogICAgIGluZm9QdHItPm5PbGRUb29sID0gLTE7CiAgICAgaW5mb1B0ci0+bkN1cnJlbnRUb29sID0gLTE7CisgICAgaW5mb1B0ci0+blRyYWNrVG9vbCA9IC0xOwogCiAgICAgaW5mb1B0ci0+bkF1dG9tYXRpY1RpbWUgPSA1MDA7CiAgICAgaW5mb1B0ci0+blJlc2hvd1RpbWUgICAgPSAxMDA7CiAgICAgaW5mb1B0ci0+bkF1dG9Qb3BUaW1lICAgPSA1MDAwOwogICAgIGluZm9QdHItPm5Jbml0aWFsVGltZSAgID0gNTAwOwogCisgICAgU2V0V2luZG93UG9zMzIgKHduZFB0ci0+aHduZFNlbGYsIEhXTkRfVE9QLCAwLCAwLCAwLCAwLCBTV1BfSElERVdJTkRPVyk7CisKICAgICByZXR1cm4gMDsKIH0KIApAQCAtODAzLDcgKzExMDQsNiBAQAogewogICAgIFRPT0xUSVBTX0lORk8gKmluZm9QdHIgPSBUT09MVElQU19HZXRJbmZvUHRyKHduZFB0cik7CiAKLQogICAgIC8qIGZyZWUgdG9vbHMgKi8KICAgICBpZiAoaW5mb1B0ci0+dG9vbHMpIHsKIAlJTlQzMiBpOwpAQCAtODE2LDYgKzExMTYsOSBAQAogCUhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgaW5mb1B0ci0+dG9vbHMpOwogICAgIH0KIAorICAgIC8qIGRlbGV0ZSBmb250ICovCisgICAgRGVsZXRlT2JqZWN0MzIgKGluZm9QdHItPmhGb250KTsKKwogICAgIC8qIGZyZWUgdG9vbCB0aXBzIGluZm8gZGF0YSAqLwogICAgIEhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgaW5mb1B0cik7CiAKQEAgLTg5MCw5ICsxMTkzLDggQEAKIAogICAgIGluZm9QdHItPmhGb250ID0gKEhGT05UMzIpd1BhcmFtOwogCi0gICAgaWYgKExPV09SRChsUGFyYW0pKSB7Ci0JLyogcmVkcmF3ICovCi0KKyAgICBpZiAoKExPV09SRChsUGFyYW0pKSAmIChpbmZvUHRyLT5uQ3VycmVudFRvb2wgIT0gLTEpKSB7CisJRklYTUUgKHRvb2x0aXBzLCAiZnVsbCByZWRyYXcgbmVlZGVkIVxuIik7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CkBAIC05MDQsNiArMTIwNiw4IEBACiB7CiAgICAgVE9PTFRJUFNfSU5GTyAqaW5mb1B0ciA9IFRPT0xUSVBTX0dldEluZm9QdHIod25kUHRyKTsKIAorICAgIFRSQUNFICh0b29sdGlwcywgInRpbWVyICVkICgleCkgZXhwaXJlZCFcbiIsIHdQYXJhbSwgd25kUHRyLT5od25kU2VsZik7CisKICAgICBzd2l0Y2ggKHdQYXJhbSkKICAgICB7CiAJY2FzZSBJRF9USU1FUjE6CkBAIC05MTQsMTIgKzEyMTgsMzUgQEAKIAljYXNlIElEX1RJTUVSMjoKIAkgICAgVE9PTFRJUFNfSGlkZSAod25kUHRyLCBpbmZvUHRyKTsKIAkgICAgYnJlYWs7CisKKwljYXNlIElEX1RJTUVSMzoKKwkgICAgS2lsbFRpbWVyMzIgKHduZFB0ci0+aHduZFNlbGYsIElEX1RJTUVSMyk7CisJICAgIGlmIChUT09MVElQU19DaGVja1Rvb2wgKHduZFB0cikgPT0gRkFMU0UpIHsKKwkJaW5mb1B0ci0+blRvb2wgPSAtMTsKKwkJaW5mb1B0ci0+bk9sZFRvb2wgPSAtMTsKKwkJVE9PTFRJUFNfSGlkZSAod25kUHRyLCBpbmZvUHRyKTsKKwkgICAgfQorCSAgICBicmVhazsKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CiAKIAotLy8gPDwgVE9PTFRJUFNfV2luSW5pQ2hhbmdlID4+CitzdGF0aWMgTFJFU1VMVAorVE9PTFRJUFNfV2luSW5pQ2hhbmdlIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFRPT0xUSVBTX0lORk8gKmluZm9QdHIgPSBUT09MVElQU19HZXRJbmZvUHRyKHduZFB0cik7CisgICAgTE9HRk9OVDMyQSBsb2dGb250OworCisgICAgaW5mb1B0ci0+Y2xyQmsgICA9IEdldFN5c0NvbG9yMzIgKENPTE9SX0lORk9CSyk7CisgICAgaW5mb1B0ci0+Y2xyVGV4dCA9IEdldFN5c0NvbG9yMzIgKENPTE9SX0lORk9URVhUKTsKKworICAgIERlbGV0ZU9iamVjdDMyIChpbmZvUHRyLT5oRm9udCk7CisgICAgU3lzdGVtUGFyYW1ldGVyc0luZm8zMkEoIFNQSV9HRVRJQ09OVElUTEVMT0dGT05ULCAwLCAmbG9nRm9udCwgMCApOworICAgIGluZm9QdHItPmhGb250ID0gQ3JlYXRlRm9udEluZGlyZWN0MzJBKCAmbG9nRm9udCApOworCisgICAgcmV0dXJuIDA7Cit9CiAKIAogTFJFU1VMVCBXSU5BUEkKQEAgLTEwMTUsMTIgKzEzNDIsMjMgQEAKIAkgICAgcmV0dXJuIFRPT0xUSVBTX1NldFRvb2xJbmZvMzJBICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAogLy8JY2FzZSBUVE1fU0VUVE9PTElORk8zMlc6Ci0vLwljYXNlIFRUTV9UUkFDS0FDVElWRToJCQkvKiA0LjcwICovCi0vLwljYXNlIFRUTV9UUkFDS1BPU0lUSU9OOgkJCS8qIDQuNzAgKi8KLS8vCWNhc2UgVFRNX1VQREFURToJCQkvKiA0LjcxICovCi0vLwljYXNlIFRUTV9VUERBVEVUSVBURVhUMzJBOgorCisJY2FzZSBUVE1fVFJBQ0tBQ1RJVkFURToKKwkgICAgcmV0dXJuIFRPT0xUSVBTX1RyYWNrQWN0aXZhdGUgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisJY2FzZSBUVE1fVFJBQ0tQT1NJVElPTjoKKwkgICAgcmV0dXJuIFRPT0xUSVBTX1RyYWNrUG9zaXRpb24gKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisJY2FzZSBUVE1fVVBEQVRFOgorCSAgICByZXR1cm4gVE9PTFRJUFNfVXBkYXRlICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworCWNhc2UgVFRNX1VQREFURVRJUFRFWFQzMkE6CisJICAgIHJldHVybiBUT09MVElQU19VcGRhdGVUaXBUZXh0MzJBICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwogLy8JY2FzZSBUVE1fVVBEQVRFVElQVEVYVDMyVzoKLS8vCWNhc2UgVFRNX1dJTkRPV0ZST01QT0lOVDoKKworCWNhc2UgVFRNX1dJTkRPV0ZST01QT0lOVDoKKwkgICAgcmV0dXJuIFRPT0xUSVBTX1dpbmRvd0Zyb21Qb2ludCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAKIAogCWNhc2UgV01fQ1JFQVRFOgpAQCAtMTAzNSwyMiArMTM3MywzNiBAQAogCWNhc2UgV01fR0VURk9OVDoKIAkgICAgcmV0dXJuIFRPT0xUSVBTX0dldEZvbnQgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCisvLwljYXNlIFdNX0dFVFRFWFQ6CisvLwljYXNlIFdNX0dFVFRFWFRMRU5HVEg6CisvLwljYXNlIFdNX0xCVVRUT05ET1dOOgorLy8JY2FzZSBXTV9NQlVUVE9ORE9XTjoKKwogCWNhc2UgV01fTU9VU0VNT1ZFOgogCSAgICByZXR1cm4gVE9PTFRJUFNfTW91c2VNb3ZlICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAogCWNhc2UgV01fTkNDUkVBVEU6CiAJICAgIHJldHVybiBUT09MVElQU19OY0NyZWF0ZSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAKKy8vCWNhc2UgV01fTkNISVRURVNUOgorLy8JY2FzZSBXTV9OT1RJRllGT1JNQVQ6CisKIAljYXNlIFdNX1BBSU5UOgogCSAgICByZXR1cm4gVE9PTFRJUFNfUGFpbnQgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCisvLwljYXNlIFdNX1BSSU5UQ0xJRU5UOgorLy8JY2FzZSBXTV9SQlVUVE9ORE9XTjoKKwogCWNhc2UgV01fU0VURk9OVDoKIAkgICAgcmV0dXJuIFRPT0xUSVBTX1NldEZvbnQgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCisvLwljYXNlIFdNX1NUWUxFQ0hBTkdFRDoKKwogCWNhc2UgV01fVElNRVI6CiAJICAgIHJldHVybiBUT09MVElQU19UaW1lciAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAKLS8vCWNhc2UgV01fV0lOSU5JQ0hBTkdFOgorCWNhc2UgV01fV0lOSU5JQ0hBTkdFOgorCSAgICByZXR1cm4gVE9PTFRJUFNfV2luSW5pQ2hhbmdlICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAogCWRlZmF1bHQ6CiAJICAgIGlmICh1TXNnID49IFdNX1VTRVIpCkBAIC0xMDgwLDQgKzE0MzIsMyBAQAogIAogICAgIFJlZ2lzdGVyQ2xhc3MzMkEgKCZ3bmRDbGFzcyk7CiB9Ci0KZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3RyZWV2aWV3LmMgYi9jb250cm9scy90cmVldmlldy5jCmluZGV4IGYwNGY0MGUuLjk5MmI1ZDggMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL3RyZWV2aWV3LmMKKysrIGIvY29udHJvbHMvdHJlZXZpZXcuYwpAQCAtNDAsNyArNDAsNyBAQAogCWluZm9QdHItPmhpbWxTdGF0ZSA9IChISU1BR0VMSVNUKWxQYXJhbTsKICAgICB9CiAgICAgZWxzZQotCXJldHVybiBOVUxMOworCXJldHVybiAwOwogCiAgICAgcmV0dXJuIChMUkVTVUxUKWhpbWxUZW1wOwogfQpAQCAtMTA5LDIzICsxMDksMTMyIEBACiAKIAogTFJFU1VMVCBXSU5BUEkKLVRyZWV2aWV3V2luZG93UHJvYyAoSFdORDMyIGh3bmQsIFVJTlQzMiB1TXNnLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitUUkVFVklFV19XaW5kb3dQcm9jIChIV05EMzIgaHduZCwgVUlOVDMyIHVNc2csIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKICAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOwogCiAgICAgc3dpdGNoICh1TXNnKQogICAgIHsKIAorICAgIGNhc2UgVFZNX0lOU0VSVElURU1BOgorICAgICAgRklYTUUgKHRyZWV2aWV3LCAiVW5pbXBsZW1lbnRlZCBtc2cgVFZNX0lOU0VSVElURU1BXG4iKTsKKyAgICAgIHJldHVybiAwOwogCi0vLwljYXNlIFRWTV9HRVRJTUFHRUxJU1Q6Ci0vLwkgICAgcmV0dXJuIFRSRUVWSUVXX0dldEltYWdlTGlzdCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgY2FzZSBUVk1fSU5TRVJUSVRFTVc6CisgICAgICBGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fSU5TRVJUSVRFTVdcbiIpOworICAgICAgcmV0dXJuIDA7CiAKKyAgICBjYXNlIFRWTV9ERUxFVEVJVEVNOgorICAgICAgRklYTUUgKHRyZWV2aWV3LCAiVW5pbXBsZW1lbnRlZCBtc2cgVFZNX0RFTEVURUlURU1cbiIpOworICAgICAgcmV0dXJuIDA7CiAKKyAgICBjYXNlIFRWTV9FWFBBTkQ6CisgICAgICBGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fRVhQQU5EXG4iKTsKKyAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBUVk1fR0VUSVRFTVJFQ1Q6CisgICAgICBGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fR0VUSVRFTVJFQ1RcbiIpOworICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIFRWTV9HRVRDT1VOVDoKKyAgICAgIEZJWE1FICh0cmVldmlldywgIlVuaW1wbGVtZW50ZWQgbXNnIFRWTV9HRVRDT1VOVFxuIik7CisgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgVFZNX0dFVElOREVOVDoKKyAgICAgIEZJWE1FICh0cmVldmlldywgIlVuaW1wbGVtZW50ZWQgbXNnIFRWTV9HRVRJTkRFTlRcbiIpOworICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIFRWTV9TRVRJTkRFTlQ6CisgICAgICBGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fU0VUSU5ERU5UXG4iKTsKKyAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBUVk1fR0VUSU1BR0VMSVNUOgorICAgICAgRklYTUUgKHRyZWV2aWV3LCAiVW5pbXBsZW1lbnRlZCBtc2cgVFZNX0dFVElNQUdFTElTVFxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICAgIC8vcmV0dXJuIFRSRUVWSUVXX0dldEltYWdlTGlzdCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAKIAljYXNlIFRWTV9TRVRJTUFHRUxJU1Q6CiAJICAgIHJldHVybiBUUkVFVklFV19TZXRJbWFnZUxpc3QgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCisgICAgY2FzZSBUVk1fR0VUTkVYVElURU06CisgICAgICBGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fR0VUTkVYVElURU1cbiIpOworICAgICAgcmV0dXJuIDA7CiAKKyAgICBjYXNlIFRWTV9TRUxFQ1RJVEVNOgorICAgICAgRklYTUUgKHRyZWV2aWV3LCAiVW5pbXBsZW1lbnRlZCBtc2cgVFZNX1NFTEVDVElURU0gXG4iKTsKKyAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBUVk1fR0VUSVRFTUE6CisgICAgICBGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fR0VUSVRFTUFcbiIpOworICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIFRWTV9HRVRJVEVNVzoKKyAgICAgIEZJWE1FICh0cmVldmlldywgIlVuaW1wbGVtZW50ZWQgbXNnIFRWTV9HRVRJVEVNV1xuIik7CisgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgVFZNX1NFVElURU1BOgorICAgICAgRklYTUUgKHRyZWV2aWV3LCAiVW5pbXBsZW1lbnRlZCBtc2cgVFZNX1NFVElURU1BXG4iKTsKKyAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBUVk1fU0VUSVRFTVc6CisgICAgICBGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fU0VUSVRFTVdcbiIpOworICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIFRWTV9FRElUTEFCRUxBOgorICAgICAgRklYTUUgKHRyZWV2aWV3LCAiVW5pbXBsZW1lbnRlZCBtc2cgVFZNX0VESVRMQUJFTEEgXG4iKTsKKyAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBUVk1fRURJVExBQkVMVzoKKyAgICAgIEZJWE1FICh0cmVldmlldywgIlVuaW1wbGVtZW50ZWQgbXNnIFRWTV9FRElUTEFCRUxXIFxuIik7CisgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgVFZNX0dFVEVESVRDT05UUk9MOgorICAgICAgRklYTUUgKHRyZWV2aWV3LCAiVW5pbXBsZW1lbnRlZCBtc2cgVFZNX0dFVEVESVRDT05UUk9MXG4iKTsKKyAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBUVk1fR0VUVklTSUJMRUNPVU5UOgorICAgICAgRklYTUUgKHRyZWV2aWV3LCAiVW5pbXBsZW1lbnRlZCBtc2cgVFZNX0dFVFZJU0lCTEVDT1VOVFxuIik7CisgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgVFZNX0hJVFRFU1Q6CisgICAgICBGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fSElUVEVTVFxuIik7CisgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgVFZNX0NSRUFURURSQUdJTUFHRToKKyAgICAgIEZJWE1FICh0cmVldmlldywgIlVuaW1wbGVtZW50ZWQgbXNnIFRWTV9DUkVBVEVEUkFHSU1BR0VcbiIpOworICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIFRWTV9TT1JUQ0hJTERSRU46CisgICAgICBGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fU09SVENISUxEUkVOXG4iKTsKKyAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBUVk1fRU5TVVJFVklTSUJMRToKKyAgICAgIEZJWE1FICh0cmVldmlldywgIlVuaW1wbGVtZW50ZWQgbXNnIFRWTV9FTlNVUkVWSVNJQkxFXG4iKTsKKyAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBUVk1fU09SVENISUxEUkVOQ0I6CisgICAgICBGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fU09SVENISUxEUkVOQ0JcbiIpOworICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIFRWTV9FTkRFRElUTEFCRUxOT1c6CisgICAgICBGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fRU5ERURJVExBQkVMTk9XXG4iKTsKKyAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBUVk1fR0VUSVNFQVJDSFNUUklOR0E6CisgICAgICBGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fR0VUSVNFQVJDSFNUUklOR0FcbiIpOworICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIFRWTV9HRVRJU0VBUkNIU1RSSU5HVzoKKyAgICAgIEZJWE1FICh0cmVldmlldywgIlVuaW1wbGVtZW50ZWQgbXNnIFRWTV9HRVRJU0VBUkNIU1RSSU5HV1xuIik7CisgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgVFZNX1NFVFRPT0xUSVBTOgorICAgICAgRklYTUUgKHRyZWV2aWV3LCAiVW5pbXBsZW1lbnRlZCBtc2cgVFZNX1NFVFRPT0xUSVBTXG4iKTsKKyAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBUVk1fR0VUVE9PTFRJUFM6CisgICAgICBGSVhNRSAodHJlZXZpZXcsICJVbmltcGxlbWVudGVkIG1zZyBUVk1fR0VUVE9PTFRJUFNcbiIpOworICAgICAgcmV0dXJuIDA7CiAKIAljYXNlIFdNX0NSRUFURToKIAkgICAgcmV0dXJuIFRSRUVWSUVXX0NyZWF0ZSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CkBAIC0xNDEsNyArMjUwLDYgQEAKIAljYXNlIFdNX0dFVERMR0NPREU6CiAJICAgIHJldHVybiBETEdDX1dBTlRBUlJPV1MgfCBETEdDX1dBTlRDSEFSUzsKIAotCiAvLwljYXNlIFdNX1BBSU5UOgogLy8JICAgIHJldHVybiBUUkVFVklFV19QYWludCAod25kUHRyLCB3UGFyYW0pOwogCkBAIC0xNTMsNyArMjYxLDcgQEAKIAogCWRlZmF1bHQ6CiAJICAgIGlmICh1TXNnID49IFdNX1VTRVIpCi0JCUVSUiAodHJlZXZpZXcsICJ1bmtub3duIG1zZyAlMDR4IHdwPSUwOHggbHA9JTA4bHhcbiIsCisJRklYTUUgKHRyZWV2aWV3LCAiVW5rbm93biBtc2cgJTA0eCB3cD0lMDh4IGxwPSUwOGx4XG4iLAogCQkgICAgIHVNc2csIHdQYXJhbSwgbFBhcmFtKTsKIAkgICAgcmV0dXJuIERlZldpbmRvd1Byb2MzMkEgKGh3bmQsIHVNc2csIHdQYXJhbSwgbFBhcmFtKTsKICAgICB9CkBAIC0xNjYsMTEgKzI3NCwxMyBAQAogewogICAgIFdORENMQVNTMzJBIHduZENsYXNzOwogCisgICAgVFJBQ0UgKHRyZWV2aWV3LCJcbiIpOworCiAgICAgaWYgKEdsb2JhbEZpbmRBdG9tMzJBIChXQ19UUkVFVklFVzMyQSkpIHJldHVybjsKIAogICAgIFplcm9NZW1vcnkgKCZ3bmRDbGFzcywgc2l6ZW9mKFdORENMQVNTMzJBKSk7CiAgICAgd25kQ2xhc3Muc3R5bGUgICAgICAgICA9IENTX0dMT0JBTENMQVNTIHwgQ1NfREJMQ0xLUzsKLSAgICB3bmRDbGFzcy5scGZuV25kUHJvYyAgID0gKFdORFBST0MzMilUcmVldmlld1dpbmRvd1Byb2M7CisgICAgd25kQ2xhc3MubHBmblduZFByb2MgICA9IChXTkRQUk9DMzIpVFJFRVZJRVdfV2luZG93UHJvYzsKICAgICB3bmRDbGFzcy5jYkNsc0V4dHJhICAgID0gMDsKICAgICB3bmRDbGFzcy5jYlduZEV4dHJhICAgID0gc2l6ZW9mKFRSRUVWSUVXX0lORk8gKik7CiAgICAgd25kQ2xhc3MuaEN1cnNvciAgICAgICA9IExvYWRDdXJzb3IzMkEgKDAsIElEQ19BUlJPVzMyQSk7CmRpZmYgLS1naXQgYS9jb250cm9scy93aWRnZXRzLmMgYi9jb250cm9scy93aWRnZXRzLmMKaW5kZXggZGFhODlkOS4uMjBjYTM0NyAxMDA2NDQKLS0tIGEvY29udHJvbHMvd2lkZ2V0cy5jCisrKyBiL2NvbnRyb2xzL3dpZGdldHMuYwpAQCAtMTAzLDggKzEwMyw2IEBACiAgICAgICAgIGlmICghKGJpY0F0b21UYWJsZVtpXSA9IFJlZ2lzdGVyQ2xhc3MzMkEoIGNscyApKSkgcmV0dXJuIEZBTFNFOwogICAgIH0KIAotICAgIC8qIEZJWE1FOiBoYWNrIHRvIGVuYWJsZSB1c2luZyBidWlsdC1pbiBjb250cm9scyB3aXRoIFdpbmRvd3MgQ09NQ1RMMzIgKi8KLSAgICBJbml0Q29tbW9uQ29udHJvbHMoKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApkaWZmIC0tZ2l0IGEvZGVidWdnZXIvZGJnLnkgYi9kZWJ1Z2dlci9kYmcueQppbmRleCA0MDY2ODI0Li45YWE5NWYyIDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9kYmcueQorKysgYi9kZWJ1Z2dlci9kYmcueQpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgIndpbm50LmgiCiAjaW5jbHVkZSAiZGVidWdnZXIuaCIKICNpbmNsdWRlICJuZWV4ZS5oIgorI2luY2x1ZGUgInByb2Nlc3MuaCIKIAogI2luY2x1ZGUgImV4cHIuaCIKIApAQCAtNDM2LDcgKzQzNyw2IEBACiAJICogZG9uJ3QgZ3JvayB0aGF0IHlldCwgYW5kIGluIHRoaXMgY2FzZSB3ZSBmYWxsIGJhY2sgdG8gdXNpbmcKIAkgKiB0aGUgd2luZS5zeW0gZmlsZS4KIAkgKi8KLQlmcHJpbnRmKHN0ZGVyciwiTG9hZGluZyBzeW1ib2xzOiAiKTsKIAlpZiggREVCVUdfUmVhZEV4ZWN1dGFibGVEYmdJbmZvKCkgPT0gRkFMU0UgKQogICAgICAgICB7CiAJICAgIGNoYXIgKnN5bWZpbGVuYW1lID0gIndpbmUuc3ltIjsKQEAgLTQ1MSw3ICs0NTEsNiBAQAogCiAgICAgICAgIERFQlVHX0xvYWRFbnRyeVBvaW50cygpOwogCURFQlVHX1Byb2Nlc3NEZWZlcnJlZERlYnVnKCk7Ci0JZnByaW50ZihzdGRlcnIsIlxuIik7CiAgICAgfQogCiAjaWYgMApAQCAtNDgxLDYgKzQ4MCw4IEBACiAgICAgICAgIGlmIChuZXdtb2RlICE9IGRiZ19tb2RlKQogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkluICVkIGJpdCBtb2RlLlxuIiwgZGJnX21vZGUgPSBuZXdtb2RlKTsKIAorICAgICAgICBQUk9DRVNTX1N1c3BlbmRPdGhlclRocmVhZHMoKTsKKwogCURFQlVHX0RvRGlzcGxheSgpOwogCiAgICAgICAgIGlmIChzaWduYWwgIT0gU0lHVFJBUCkgIC8qIFRoaXMgaXMgYSByZWFsIGNyYXNoLCBkdW1wIHNvbWUgaW5mbyAqLwpAQCAtNTQyLDYgKzU0Myw3IEBACiAgICAgaWYoIGRiZ19leGVjX21vZGUgPT0gRVhFQ19DT05UICkKICAgICAgIHsKIAlkYmdfZXhlY19jb3VudCA9IDA7CisgICAgICAgIFBST0NFU1NfUmVzdW1lT3RoZXJUaHJlYWRzKCk7CiAgICAgICB9CiAKICAgICBpbl9kZWJ1Z2dlciA9IEZBTFNFOwpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvaGFzaC5jIGIvZGVidWdnZXIvaGFzaC5jCmluZGV4IDRiZWZhNDcuLmZmYjRkNmYgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL2hhc2guYworKysgYi9kZWJ1Z2dlci9oYXNoLmMKQEAgLTg3NCwxOSArODc0LDM1IEBACiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwogICAgIEJPT0wzMiBvazsKICAgICBXSU5FX01PRFJFRgkqd207CisgICAgaW50IHJvd2NvdW50ID0gMzsKIAorICAgIGZwcmludGYoIHN0ZGVyciwgIiAgICIgKTsKICAgICBmb3IgKG9rID0gTW9kdWxlRmlyc3QoJmVudHJ5KTsgb2s7IG9rID0gTW9kdWxlTmV4dCgmZW50cnkpKQogICAgIHsKICAgICAgICAgaWYgKCEocE1vZHVsZSA9IE5FX0dldFB0ciggZW50cnkuaE1vZHVsZSApKSkgY29udGludWU7CisJaWYgKChyb3djb3VudCArIHN0cmxlbihlbnRyeS5zek1vZHVsZSkpID4gNzYpCisgICAgICAgIHsKKwkgICAgZnByaW50Ziggc3RkZXJyLCJcbiAgICIpOworCSAgICByb3djb3VudCA9IDM7CisgICAgICAgIH0KICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiICVzIiwgZW50cnkuc3pNb2R1bGUgKTsKKyAgICAgICAgcm93Y291bnQgKz0gc3RybGVuKGVudHJ5LnN6TW9kdWxlKSArIDE7CiAKICAgICAgICAgaWYgKCEocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfV0lOMzIpKSAgLyogTkUgbW9kdWxlICovCiAgICAgICAgICAgICBERUJVR19Mb2FkRW50cnlQb2ludHMxNiggZW50cnkuaE1vZHVsZSwgcE1vZHVsZSwgZW50cnkuc3pNb2R1bGUgKTsKICAgICB9Ci0gICAgZm9yICh3bT1QUk9DRVNTX0N1cnJlbnQoKS0+bW9kcmVmX2xpc3Q7d207d209d20tPm5leHQpIHsKKyAgICBmb3IgKHdtPVBST0NFU1NfQ3VycmVudCgpLT5tb2RyZWZfbGlzdDt3bTt3bT13bS0+bmV4dCkKKyAgICB7CisgICAgICAgIGlmICgocm93Y291bnQgKyBzdHJsZW4od20tPm1vZG5hbWUpKSA+IDc2KQorICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsIlxuICAgIik7CisgICAgICAgICAgICByb3djb3VudCA9IDM7CisgICAgICAgIH0KICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiICVzIiwgd20tPm1vZG5hbWUgKTsKKyAgICAgICAgcm93Y291bnQgKz0gc3RybGVuKHdtLT5tb2RuYW1lKSArIDE7CiAJREVCVUdfTG9hZEVudHJ5UG9pbnRzMzIoIHdtLT5tb2R1bGUsIHdtLT5tb2RuYW1lICk7CiAgICAgfQorICAgIGZwcmludGYoIHN0ZGVyciwgIlxuIiApOwogfQogCiAKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL21lbW9yeS5jIGIvZGVidWdnZXIvbWVtb3J5LmMKaW5kZXggMGIyNjc0OC4uZmJkNTA0NyAxMDA2NDQKLS0tIGEvZGVidWdnZXIvbWVtb3J5LmMKKysrIGIvZGVidWdnZXIvbWVtb3J5LmMKQEAgLTE5LDcgKzE5LDcgQEAKICAqICAgICB3cml0ZSAocndmbGFnID09IDApCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZkZWYgbGludXgKKyNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQogQk9PTDMyIERFQlVHX2NoZWNrbWFwX2JhZCggY29uc3QgY2hhciAqYWRkciwgc2l6ZV90IHNpemUsIGludCByd2ZsYWcpCiB7CiAgIEZJTEUgKmZwOwpAQCAtMjgsNiArMjgsNyBAQAogICBjaGFyICpzdGFydCwgKmVuZDsKICAgaW50IHJldCA9IFRSVUU7CiAKKyNpZmRlZiBsaW51eAogICAvKiAKICAgICAgVGhlIGVudHJpZXMgaW4gL3Byb2Mvc2VsZi9tYXBzIGFyZSBvZiB0aGUgZm9ybToKICAgICAgMDgwMDAwMDAtMDgwMDIwMDAgci14cCAwMDAwMDAwMCAwMzo0MSAyMzYxCkBAIC00MSwxMiArNDIsMzQgQEAKIAogICAgICBPbmx5IHBlcm1pc3Npb25zIHN0YXJ0IGFuZCBlbmQgYXJlIHVzZWQgaGVyZQogICAgICAqLworI2Vsc2UKKy8qCisgICAgJSBjYXQgL3Byb2MvY3VycHJvYy9tYXAKKyAgICBzdGFydCAgICAgIGVuZCAgICAgICAgIHJlc2lkZW50ICAgcHJpdmF0ZSBwZXJtICAgIHR5cGUKKyAgICAweDEwMDAgICAgIDB4ZTAwMCAgICAgICAgICAgIDEyICAgICAgICAgMCByLXggQ09XIHZub2RlCisgICAgMHhlMDAwICAgICAweDEwMDAwICAgICAgICAgICAgMiAgICAgICAgIDIgcnd4IENPVyB2bm9kZQorICAgIDB4MTAwMDAgICAgMHgyNzAwMCAgICAgICAgICAgIDQgICAgICAgICA0IHJ3eCAgICAgZGVmYXVsdAorICAgIDB4ODAwZTAwMCAgMHg4MDBmMDAwICAgICAgICAgIDEgICAgICAgICAxIHJ3LSAgICAgZGVmYXVsdAorICAgIDB4ZWZiZGUwMDAgMHhlZmJmZTAwMCAgICAgICAgIDEgICAgICAgICAxIHJ3eCAgICAgZGVmYXVsdAorICAgIAorICAgIENPVyA9ICJjb3B5IG9uIHdyaXRlIgorKi8KKyNlbmRpZgorCiAgIAorI2lmZGVmIGxpbnV4CiAgIGlmICghKGZwID0gZm9wZW4oIi9wcm9jL3NlbGYvbWFwcyIsICJyIikpKQorI2Vsc2UKKyAgaWYgKCEoZnAgPSBmb3BlbigiL3Byb2MvY3VycHJvYy9tYXAiLCAiciIpKSkKKyNlbmRpZgogICAgIHJldHVybiBGQUxTRTsgCiAKICAgd2hpbGUgKGZnZXRzKCBidWYsIDc5LCBmcCkpIHsKKyNpZmRlZiBsaW51eAogICAgIHNzY2FuZihidWYsICIleC0leCAlM3MiLCAoaW50ICopICZzdGFydCwgKGludCAqKSAmZW5kLCBwcm90KTsKKyNlbHNlCisgICAgc3NjYW5mKGJ1ZiwgIiV4ICV4ICUqZCAlKmQgJTNzIiwgKGludCAqKSAmc3RhcnQsIChpbnQgKikgJmVuZCwgcHJvdCk7CisjZW5kaWYKICAgICBpZiAoIGVuZCA8PSBhZGRyKQogICAgICAgY29udGludWU7CiAgICAgaWYgKHN0YXJ0IDw9IGFkZHIgJiYgYWRkcitzaXplIDwgZW5kKSB7CkBAIC02MCwxMyArODMsMTMgQEAKICAgZmNsb3NlKCBmcCk7CiAgIHJldHVybiByZXQ7CiB9Ci0jZWxzZSAgLyogbGludXggKi8KKyNlbHNlICAvKiBsaW51eCB8fCBGcmVlQlNEICovCiAvKiBGSVhNRTogY29kZSBuZWVkZWQgZm9yIEJTRCBldCBhbC4gKi8KIEJPT0wzMiBERUJVR19jaGVja21hcF9iYWQoY2hhciAqYWRkciwgc2l6ZV90IHNpemUsIGludCByd2ZsYWcpCiB7CiAgICAgcmV0dXJuIEZBTFNFOwogfQotI2VuZGlmICAvKiBsaW51eCAqLworI2VuZGlmICAvKiBsaW51eCB8fCBGcmVlQlNEICovCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9zdGFicy5jIGIvZGVidWdnZXIvc3RhYnMuYwppbmRleCAxMGFkYTVkLi5mM2QwODBiIDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9zdGFicy5jCisrKyBiL2RlYnVnZ2VyL3N0YWJzLmMKQEAgLTEwNzcsOCArMTA3Nyw3IEBACiAJZnJlZShmbik7CiAJaWYgKHQpIHMgPSB0KzE7CiAgICAgICB9Ci0gICAgICBpZiAoIXMgfHwgISpzKQotICAgICAgCWZwcmludGYoc3RkZXJyLCIgJXMgbm90IGZvdW5kIixmaWxlbmFtZSk7CisgICAgICBpZiAoIXMgfHwgISpzKSBmcHJpbnRmKHN0ZGVyciwiIG5vdCBmb3VuZCIpOwogICAgICAgZnJlZShwYXRocyk7CiAgICAgICBnb3RvIGxlYXZlOwogICAgIH0KQEAgLTExMDAsMTIgKzEwOTksNiBAQAogICAgICAgZ290byBsZWF2ZTsKIAogICAvKgotICAgKiBHaXZlIGEgbmljZSBzdGF0dXMgbWVzc2FnZSBoZXJlLi4uCi0gICAqIFdlbGwgbm90LCBqdXN0IHByaW50IHRoZSBuYW1lLgotICAgKi8KLSAgZnByaW50ZihzdGRlcnIsICIgJXMiLCBmaWxlbmFtZSk7Ci0KLSAgLyoKICAgICogTmV4dCwgd2UgbmVlZCB0byBmaW5kIGEgZmV3IG9mIHRoZSBpbnRlcm5hbCBFTEYgaGVhZGVycyB3aXRoaW4KICAgICogdGhpcyB0aGluZy4gIFdlIG5lZWQgdGhlIG1haW4gZXhlY3V0YWJsZSBoZWFkZXIsIGFuZCB0aGUgc2VjdGlvbgogICAgKiB0YWJsZS4KQEAgLTExODIsNiArMTE3NSw3IEBACiAgIHN0cnVjdCBsaW5rX21hcCAgICAgKiBscG50ID0gTlVMTDsKICAgZXh0ZXJuIEVsZjMyX0R5biAgICAgIF9EWU5BTUlDW107CiAgIGludAkJCXJ0biA9IEZBTFNFOworICBpbnQgICAgICAgICAgICAgICAgICAgcm93Y291bnQ7CiAKICAgZXhlX25hbWUgPSBERUJVR19hcmd2MDsKIApAQCAtMTE5MSw2ICsxMTg1LDggQEAKICAgaWYoIGV4ZV9uYW1lID09IE5VTEwgKQogICAgICAgZ290byBsZWF2ZTsKIAorICBmcHJpbnRmKCBzdGRlcnIsICJMb2FkaW5nIHN5bWJvbHM6ICVzIiwgZXhlX25hbWUgKTsKKyAgcm93Y291bnQgPSAxNyArIHN0cmxlbihleGVfbmFtZSk7CiAgIERFQlVHX1Byb2Nlc3NFbGZPYmplY3QoZXhlX25hbWUsIDApOwogCiAgIC8qCkBAIC0xMjM4LDEzICsxMjM0LDIyIEBACiAJICBjb250aW51ZTsKIAogICAgICAgaWYoIGxwbnQtPmxfbmFtZSAhPSBOVUxMICkKKyAgICAgIHsKKyAgICAgICAgICBpZiAocm93Y291bnQgKyBzdHJsZW4obHBudC0+bF9uYW1lKSA+IDc2KQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiXG4gICAiICk7CisgICAgICAgICAgICAgIHJvd2NvdW50ID0gMzsKKyAgICAgICAgICB9CisgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiICVzIiwgbHBudC0+bF9uYW1lICk7CisgICAgICAgICAgcm93Y291bnQgKz0gc3RybGVuKGxwbnQtPmxfbmFtZSkgKyAxOwogCSAgREVCVUdfUHJvY2Vzc0VsZk9iamVjdChscG50LT5sX25hbWUsIGxwbnQtPmxfYWRkcik7CisgICAgICB9CiAgICAgfQogCiAgIHJ0biA9IFRSVUU7CiAKIGxlYXZlOgotCisgIGZwcmludGYoIHN0ZGVyciwgIlxuIiApOwogICByZXR1cm4gKHJ0bik7CiAKIH0KQEAgLTEzMDksNyArMTMxNCw3IEBACiAgIC8qCiAgICAqIEdpdmUgYSBuaWNlIHN0YXR1cyBtZXNzYWdlIGhlcmUuLi4KICAgICovCi0gIGZwcmludGYoc3RkZXJyLCAiICVzIiwgZXhlX25hbWUpOworICBmcHJpbnRmKCBzdGRlcnIsICJMb2FkaW5nIHN5bWJvbHM6ICVzIiwgZXhlX25hbWUgKTsKIAogICBydG4gPSBUUlVFOwogCmRpZmYgLS1naXQgYS9kb2N1bWVudGF0aW9uL2NvbW1vbl9jb250cm9scyBiL2RvY3VtZW50YXRpb24vY29tbW9uX2NvbnRyb2xzCmluZGV4IDcyMmVkZWMuLjZmODU0YTIgMTAwNjQ0Ci0tLSBhL2RvY3VtZW50YXRpb24vY29tbW9uX2NvbnRyb2xzCisrKyBiL2RvY3VtZW50YXRpb24vY29tbW9uX2NvbnRyb2xzCkBAIC0xNzUsMTAgKzE3NSw4IEBACiAgICAgICAtIEFsbW9zdCBmaW5pc2hlZC4KIAogICBOb3RlczoKLSAgICAgIC0gVG9vbCB0aXBzIG5lZWQgdG8gYmUgYWRkZWQsIGJ1dCBzaW5jZSB0aGV5IGFyZSBub3QgZG9uZSB5ZXQuLi4KLQotICBOb3RlczoKLSAgICAgIEhhdmUgYSBsb29rIGF0IGNvbnRyb2xzL3N0YXR1cy5jIGZvciBhIGxpc3Qgb2YgYnVncyBhbmQgbWlzc2luZyBmZWF0dXJlcy4KKyAgICAgIC0gVW5pY29kZSBzdXBwb3J0IGlzIHN0aWxsIG1pc3NpbmcuCisgICAgICAtIFRvb2x0aXAgaW50ZWdyYXRpb24gaXMgYWxtb3N0IGNvbXBsZXRlLgogCiAKIDMuMTcgVGFiIENvbnRyb2wKQEAgLTIwMCw3ICsxOTgsNyBAQAogICAgICAgLSBEZXZlbG9wbWVudCBpbiBwcm9ncmVzcy4KICAgICAgIC0gQmFzaWMgZnVuY3Rpb25hbGl0eSBpcyBhbG1vc3QgZG9uZS4gKGRsbCB2ZXJzaW9uIDQuMCkKIAotICBOb3RlcworICBOb3RlczoKICAgICAgIEJpdG1hcHMgYXJlIG5vdCBjb3JyZWN0bHkgZGlzcGxheWVkLgogCiAKQEAgLTIxMCwxMCArMjA4LDExIEBACiAgICAgICBFcmljIEtvaGwgPGVrb2hsQGFiby5yaGVpbi16ZWl0dW5nLmRlPgogCiAgIFN0YXR1czoKLSAgICAgIC0gRGV2ZWxvcG1lbnQgaW4gcHJvZ3Jlc3MuIEFsbW9zdCBkb25lLgorICAgICAgLSBBbG1vc3QgZmluaXNoZWQuCiAKLSAgTm90ZXMKLSAgICAgIFRoZSBjb250cm9sIGRvZXMgbm90IGJlaGF2ZSB2ZXJ5IHdlbGwuIFRoaXMgd2lsbCBiZSBmaXhlZAorICBOb3RlczoKKyAgICAgIC0gVW5pY29kZSBzdXBwb3J0IGlzIHN0aWxsIG1pc3NpbmcuCisgICAgICAtIE5vIHN1YmNsYXNzaW5nLgogCiAKIDMuMjAgVHJhY2tiYXIgQ29udHJvbApAQCAtMjMyLDYgKzIzMSw3IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEF1dGhvcjoKICAgICAgIER1bW15IHdyaXR0ZW4gYnkgRXJpYyBLb2hsLgorICAgICAgQWxleCBQcmllbSAoYWxleHBAc2NpLmt1bi5ubCkKIAogICBTdGF0dXM6CiAgICAgICAtIER1bW15IGNvbnRyb2wuIE5vIGZ1bmN0aW9uYWxpdHkuCmRpZmYgLS1naXQgYS9kb2N1bWVudGF0aW9uL3dpbjk1bG9vayBiL2RvY3VtZW50YXRpb24vd2luOTVsb29rCmluZGV4IGJkMDRiZjkuLmRkYWIwNWEgMTAwNjQ0Ci0tLSBhL2RvY3VtZW50YXRpb24vd2luOTVsb29rCisrKyBiL2RvY3VtZW50YXRpb24vd2luOTVsb29rCkBAIC0yMSw3ICsyMSw2IEBACiAKIFtUd2Vhay5MYXlvdXRdCiBXaW45NUxvb2s9W3RydWV8ZmFsc2VdICAgICAgICAjIEVuYWJsZXMvZGlzYWJsZXMgdGhlIFdpbjk1IGxvb2sgYW5kIGZlZWwKLU1lbnVIZWlnaHQ9PHBpeGVscz4gICAgICAgICAgICMgU2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBtZW51IGJhcgogTWVudUJhckl0ZW1Ub3BOdWRnZT08cGl4ZWxzPiAgIyBOdWRnZXMgdGhlIG1lbnUgYmFyIGl0ZW1zIGRvd24vdXAKIE1lbnVCYXJJdGVtTGVmdE51ZGdlPTxwaXhlbHM+ICMgTnVkZ2VzIHRoZSBtZW51IGJhciBpdGVtcyBsZWZ0L3JpZ2h0CiBNZW51SXRlbVRvcE51ZGdlPTxwaXhlbHM+ICAgICAjIE51ZGdlcyB0aGUgbWVudSBpdGVtcyBkb3duL3VwCkBAIC0zMCwxOCArMjksNCBAQAogTWVudUhpZ2hsaWdodExlZnROdWRnZT08cGl4ZWxzPiAjIE51ZGdlcyB0aGUgbGVmdCBzaWRlIG9mIHRoZSBoaWdobGlnaHQgYmFyCiBNZW51SGlnaGxpZ2h0UmlnaHROdWRnZT08cGl4ZWxzPiAjIE51ZGdlcyB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgaGlnaGxpZ2h0IGJhcgogTWVudUhpZ2hsaWdodEJvdHRvbU51ZGdlPTxwaXhlbHM+ICMgTnVkZ2VzIHRoZSBib3R0b20gb2YgdGhlIGhpZ2hsaWdodCBiYXIKLUNhcHRpb25BbGlnbm1lbnQ9W2xlZnR8cmlnaHR8Y2VudGVyXSAjIFNldHMgdGhlIGFsaWdubWVudCBvZiBjYXB0aW9uIHRleHQKLVN5c0NvbnRyb2xOdWRnZT08cGl4ZWxzPiAgICAgICMgTnVkZ2VzIHRoZSBzeXN0ZW0gbWVudSBsZWZ0L3JpZ2h0Ci1NYXhDb250cm9sTnVkZ2U9PHBpeGVscz4gICAgICAjIE51ZGdlcyB0aGUgbWF4aW1pemUgY29udHJvbCBsZWZ0L3JpZ2h0Ci1NaW5Db250cm9sTnVkZ2U9PHBpeGVscz4gICAgICAjIE51ZGdlcyB0aGUgbWluaW1pemUgY29udHJvbCBsZWZ0L3JpZ2h0Ci1TY3JvbGxCYXJXaWR0aD08cGl4ZWxzPiAgICAgICAjIFNldHMgc2Nyb2xsIGJhciBzaXplcwotRGlhbG9nRnJhbWVXaWR0aD08cGl4ZWxzPiAgICAgIyBTZXRzIHRoZSBmcmFtZSB3aWR0aCBvZiBkaWFsb2cgYm94ZXMKIAotW1R3ZWFrLkNvbG9yc10KLVBlbkZGOTUuUmVkPTwwLTI1NT4gICAgICAgICAgICMgU2V0cyB0aGUgcmVkIHZhbHVlIG9mIHRoZSBXaW45NSB3aGl0ZSBwZW4KLVBlbkZGOTUuR3JuPTwwLTI1NT4gICAgICAgICAgICMgU2V0cyB0aGUgZ3JlZW4gdmFsdWUgb2YgdGhlIFdpbjk1IHdoaXRlIHBlbgotUGVuRkY5NS5CbHU9PDAtMjU1PiAgICAgICAgICAgIyBTZXRzIHRoZSBibHVlIHZhbHVlIG9mIHRoZSBXaW45NSB3aGl0ZSBwZW4KLVBlbkUwOTUueHh4ICAgICAgICAgICAgICAgICAgICMgU2V0cyB0aGUgUkdCIHZhbHVlcyBvZiB0aGUgV2luOTUgZ3JleS04OCBwZW4KLVBlbkMwOTUueHh4ICAgICAgICAgICAgICAgICAgICMgU2V0cyB0aGUgUkdCIHZhbHVlcyBvZiB0aGUgV2luOTUgZ3JleS03NSBwZW4KLVBlbjgwOTUueHh4ICAgICAgICAgICAgICAgICAgICMgU2V0cyB0aGUgUkdCIHZhbHVlcyBvZiB0aGUgV2luOTUgZ3JleS01MCBwZW4KLVBlbjAwOTUueHh4ICAgICAgICAgICAgICAgICAgICMgU2V0cyB0aGUgUkdCIHZhbHVlcyBvZiB0aGUgV2luOTUgYmxhY2sgcGVuCmRpZmYgLS1naXQgYS9maWxlcy9NYWtlZmlsZS5pbiBiL2ZpbGVzL01ha2VmaWxlLmluCmluZGV4IDU1Yjc2YTkuLmViMzdiODkgMTAwNjQ0Ci0tLSBhL2ZpbGVzL01ha2VmaWxlLmluCisrKyBiL2ZpbGVzL01ha2VmaWxlLmluCkBAIC04LDYgKzgsNyBAQAogTU9EVUxFICAgICA9IGZpbGVzCiAKIENfU1JDUyA9IFwKKwljaGFuZ2UuYyBcCiAJZGlyZWN0b3J5LmMgXAogCWRvc19mcy5jIFwKIAlkcml2ZS5jIFwKZGlmZiAtLWdpdCBhL2ZpbGVzL2NoYW5nZS5jIGIvZmlsZXMvY2hhbmdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EwOWU1YwotLS0gL2Rldi9udWxsCisrKyBiL2ZpbGVzL2NoYW5nZS5jCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogV2luMzIgZmlsZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAxOTk4IFVscmljaCBXZWlnYW5kCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJ3aW5iYXNlLmgiCisjaW5jbHVkZSAid2luZXJyb3IuaCIKKyNpbmNsdWRlICJwcm9jZXNzLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCisjaW5jbHVkZSAiaGVhcC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKK3N0YXRpYyBCT09MMzIgQ0hBTkdFX1NpZ25hbGVkKCBLMzJPQkogKm9iaiwgRFdPUkQgdGhyZWFkX2lkICk7CitzdGF0aWMgQk9PTDMyIENIQU5HRV9TYXRpc2ZpZWQoIEszMk9CSiAqb2JqLCBEV09SRCB0aHJlYWRfaWQgKTsKK3N0YXRpYyB2b2lkIENIQU5HRV9BZGRXYWl0KCBLMzJPQkogKm9iaiwgRFdPUkQgdGhyZWFkX2lkICk7CitzdGF0aWMgdm9pZCBDSEFOR0VfUmVtb3ZlV2FpdCggSzMyT0JKICpvYmosIERXT1JEIHRocmVhZF9pZCApOworc3RhdGljIHZvaWQgQ0hBTkdFX0Rlc3Ryb3koIEszMk9CSiAqb2JqICk7CisKK2NvbnN0IEszMk9CSl9PUFMgQ0hBTkdFX09wcyA9Cit7CisgICAgQ0hBTkdFX1NpZ25hbGVkLCAgICAvKiBzaWduYWxlZCAqLworICAgIENIQU5HRV9TYXRpc2ZpZWQsICAgLyogc2F0aXNmaWVkICovCisgICAgQ0hBTkdFX0FkZFdhaXQsICAgICAvKiBhZGRfd2FpdCAqLworICAgIENIQU5HRV9SZW1vdmVXYWl0LCAgLyogcmVtb3ZlX3dhaXQgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgIC8qIHJlYWQgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgIC8qIHdyaXRlICovCisgICAgQ0hBTkdFX0Rlc3Ryb3kgICAgICAvKiBkZXN0cm95ICovCit9OworCisvKiBUaGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBvYmplY3QgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgSzMyT0JKICAgICAgIGhlYWRlcjsKKworICAgIExQU1RSICAgICAgICBscFBhdGhOYW1lOworICAgIEJPT0wzMiAgICAgICBiV2F0Y2hTdWJ0cmVlOworICAgIERXT1JEICAgICAgICBkd05vdGlmeUZpbHRlcjsKKworICAgIFRIUkVBRF9RVUVVRSB3YWl0X3F1ZXVlOyAgICAKKyAgICBCT09MMzIgICAgICAgbm90aWZ5OworCit9IENIQU5HRV9PQkpFQ1Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENIQU5HRV9TaWduYWxlZAorICovCitzdGF0aWMgQk9PTDMyIENIQU5HRV9TaWduYWxlZCggSzMyT0JKICpvYmosIERXT1JEIHRocmVhZF9pZCApCit7CisgICAgQ0hBTkdFX09CSkVDVCAqY2hhbmdlID0gKENIQU5HRV9PQkpFQ1QgKilvYmo7CisgICAgYXNzZXJ0KCBvYmotPnR5cGUgPT0gSzMyT0JKX0NIQU5HRSApOworICAgIHJldHVybiBjaGFuZ2UtPm5vdGlmeTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0hBTkdFX1NhdGlzZmllZAorICoKKyAqIFdhaXQgb24gdGhpcyBvYmplY3QgaGFzIGJlZW4gc2F0aXNmaWVkLgorICovCitzdGF0aWMgQk9PTDMyIENIQU5HRV9TYXRpc2ZpZWQoIEszMk9CSiAqb2JqLCBEV09SRCB0aHJlYWRfaWQgKQoreworICAgIGFzc2VydCggb2JqLT50eXBlID09IEszMk9CSl9DSEFOR0UgKTsKKyAgICByZXR1cm4gRkFMU0U7ICAvKiBOb3QgYWJhbmRvbmVkICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENIQU5HRV9BZGRXYWl0CisgKgorICogQWRkIHRocmVhZCB0byBvYmplY3Qgd2FpdCBxdWV1ZS4KKyAqLworc3RhdGljIHZvaWQgQ0hBTkdFX0FkZFdhaXQoIEszMk9CSiAqb2JqLCBEV09SRCB0aHJlYWRfaWQgKQoreworICAgIENIQU5HRV9PQkpFQ1QgKmNoYW5nZSA9IChDSEFOR0VfT0JKRUNUICopb2JqOworICAgIGFzc2VydCggb2JqLT50eXBlID09IEszMk9CSl9DSEFOR0UgKTsKKyAgICBUSFJFQURfQWRkUXVldWUoICZjaGFuZ2UtPndhaXRfcXVldWUsIFRIUkVBRF9JRF9UT19USERCKHRocmVhZF9pZCkgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0hBTkdFX1JlbW92ZVdhaXQKKyAqCisgKiBSZW1vdmUgdGhyZWFkIGZyb20gb2JqZWN0IHdhaXQgcXVldWUuCisgKi8KK3N0YXRpYyB2b2lkIENIQU5HRV9SZW1vdmVXYWl0KCBLMzJPQkogKm9iaiwgRFdPUkQgdGhyZWFkX2lkICkKK3sKKyAgICBDSEFOR0VfT0JKRUNUICpjaGFuZ2UgPSAoQ0hBTkdFX09CSkVDVCAqKW9iajsKKyAgICBhc3NlcnQoIG9iai0+dHlwZSA9PSBLMzJPQkpfQ0hBTkdFICk7CisgICAgVEhSRUFEX1JlbW92ZVF1ZXVlKCAmY2hhbmdlLT53YWl0X3F1ZXVlLCBUSFJFQURfSURfVE9fVEhEQih0aHJlYWRfaWQpICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJQ0hBTkdFX0Rlc3Ryb3kKKyAqLworc3RhdGljIHZvaWQgQ0hBTkdFX0Rlc3Ryb3koIEszMk9CSiAqb2JqICkKK3sKKyAgICBDSEFOR0VfT0JKRUNUICpjaGFuZ2UgPSAoQ0hBTkdFX09CSkVDVCAqKW9iajsKKyAgICBhc3NlcnQoIG9iai0+dHlwZSA9PSBLMzJPQkpfQ0hBTkdFICk7CisKKyAgICBpZiAoIGNoYW5nZS0+bHBQYXRoTmFtZSApCisgICAgeworICAgICAgICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgY2hhbmdlLT5scFBhdGhOYW1lICk7CisgICAgICAgIGNoYW5nZS0+bHBQYXRoTmFtZSA9IE5VTEw7CisgICAgfQorCisgICAgb2JqLT50eXBlID0gSzMyT0JKX1VOS05PV047CisgICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIGNoYW5nZSApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCUZpbmRGaXJzdENoYW5nZU5vdGlmaWNhdGlvbjMyQSAoS0VSTkVMMzIuMjQ4KQorICovCitIQU5ETEUzMiBXSU5BUEkgRmluZEZpcnN0Q2hhbmdlTm90aWZpY2F0aW9uMzJBKCBMUENTVFIgbHBQYXRoTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBiV2F0Y2hTdWJ0cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdOb3RpZnlGaWx0ZXIgKSAKK3sKKyAgICBIQU5ETEUzMiBoYW5kbGU7CisgICAgQ0hBTkdFX09CSkVDVCAqY2hhbmdlOworCisgICAgY2hhbmdlID0gSGVhcEFsbG9jKCBTeXN0ZW1IZWFwLCAwLCBzaXplb2YoQ0hBTkdFX09CSkVDVCkgKTsKKyAgICBpZiAoIWNoYW5nZSkgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFMzI7CisKKyAgICBjaGFuZ2UtPmhlYWRlci50eXBlID0gSzMyT0JKX0NIQU5HRTsKKyAgICBjaGFuZ2UtPmhlYWRlci5yZWZjb3VudCA9IDE7CisKKyAgICBjaGFuZ2UtPmxwUGF0aE5hbWUgPSBIRUFQX3N0cmR1cEEoIFN5c3RlbUhlYXAsIDAsIGxwUGF0aE5hbWUgKTsKKyAgICBjaGFuZ2UtPmJXYXRjaFN1YnRyZWUgPSBiV2F0Y2hTdWJ0cmVlOworICAgIGNoYW5nZS0+ZHdOb3RpZnlGaWx0ZXIgPSBkd05vdGlmeUZpbHRlcjsKKworICAgIGNoYW5nZS0+d2FpdF9xdWV1ZSA9IE5VTEw7CisgICAgY2hhbmdlLT5ub3RpZnkgPSBGQUxTRTsKKworICAgIGhhbmRsZSA9IEhBTkRMRV9BbGxvYyggUFJPQ0VTU19DdXJyZW50KCksICZjaGFuZ2UtPmhlYWRlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX0FMTF9BQ0NFU1MgLypGSVhNRSovLCBUUlVFLCAtMSApOworICAgIC8qIElmIHRoZSBhbGxvY2F0aW9uIGZhaWxlZCwgdGhlIG9iamVjdCBpcyBhbHJlYWR5IGRlc3Ryb3llZCAqLworICAgIGlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMikgY2hhbmdlID0gTlVMTDsKKyAgICByZXR1cm4gaGFuZGxlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCUZpbmRGaXJzdENoYW5nZU5vdGlmaWNhdGlvbjMyVyAoS0VSTkVMMzIuMjQ5KQorICovCitIQU5ETEUzMiBXSU5BUEkgRmluZEZpcnN0Q2hhbmdlTm90aWZpY2F0aW9uMzJXKCBMUENXU1RSIGxwUGF0aE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgYldhdGNoU3VidHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3Tm90aWZ5RmlsdGVyKSAKK3sKKyAgICBMUFNUUiBuYW1lQSA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBQYXRoTmFtZSApOworICAgIEhBTkRMRTMyIHJldCA9IEZpbmRGaXJzdENoYW5nZU5vdGlmaWNhdGlvbjMyQSggbmFtZUEsIGJXYXRjaFN1YnRyZWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3Tm90aWZ5RmlsdGVyICk7CisgICAgaWYgKG5hbWVBKSBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbmFtZUEgKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCUZpbmROZXh0Q2hhbmdlTm90aWZpY2F0aW9uIChLRVJORUwzMi4yNTIpCisgKi8KK0JPT0wzMiBXSU5BUEkgRmluZE5leHRDaGFuZ2VOb3RpZmljYXRpb24oIEhBTkRMRTMyIGhhbmRsZSApIAoreworICAgIENIQU5HRV9PQkpFQ1QgKmNoYW5nZTsKKworICAgIFNZU1RFTV9MT0NLKCk7CisgICAgaWYgKCEoY2hhbmdlID0gKENIQU5HRV9PQkpFQ1QgKilIQU5ETEVfR2V0T2JqUHRyKCBQUk9DRVNTX0N1cnJlbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwgSzMyT0JKX0NIQU5HRSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qRklYTUUqLywgTlVMTCApKSApCisgICAgeworICAgICAgICBTWVNURU1fVU5MT0NLKCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBjaGFuZ2UtPm5vdGlmeSA9IEZBTFNFOworICAgIEszMk9CSl9EZWNDb3VudCggJmNoYW5nZS0+aGVhZGVyICk7CisgICAgU1lTVEVNX1VOTE9DSygpOworICAgIHJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCUZpbmRDbG9zZUNoYW5nZU5vdGlmaWNhdGlvbiAoS0VSTkVMMzIuMjQ3KQorICovCitCT09MMzIgV0lOQVBJIEZpbmRDbG9zZUNoYW5nZU5vdGlmaWNhdGlvbiggSEFORExFMzIgaGFuZGxlKSAKK3sKKyAgICByZXR1cm4gQ2xvc2VIYW5kbGUoIGhhbmRsZSApOworfQorCmRpZmYgLS1naXQgYS9maWxlcy9kaXJlY3RvcnkuYyBiL2ZpbGVzL2RpcmVjdG9yeS5jCmluZGV4IDk4MzVhN2QuLmNkY2JhMDggMTAwNjQ0Ci0tLSBhL2ZpbGVzL2RpcmVjdG9yeS5jCisrKyBiL2ZpbGVzL2RpcmVjdG9yeS5jCkBAIC04NSw3ICs4NSw3IEBACiAgICAgaWYgKC0xID09IGFjY2VzcyggdG1wX2Rpci5sb25nX25hbWUsIFdfT0sgKSkKICAgICB7CiAgICAgCWlmIChlcnJubz09RUFDQ0VTKQotCQlNU0coIldhcm5pbmc6IFRoZSBUZW1wb3JhcnkgRGlyZWN0b3J5IChhcyBzcGVjaWZpZWQgaW4gd2luZS5jb25mKSBpcyBOT1Qgd3JpdGVhYmxlLiBQbGVhc2UgY2hlY2sgeW91ciBjb25maWd1cmF0aW9uLlxuIik7CisJCU1TRygiV2FybmluZzogVGhlIFRlbXBvcmFyeSBEaXJlY3RvcnkgKGFzIHNwZWNpZmllZCBpbiB3aW5lLmNvbmYgb3Igfi8ud2luZXJjKSBpcyBOT1Qgd3JpdGVhYmxlLiBQbGVhc2UgY2hlY2sgeW91ciBjb25maWd1cmF0aW9uLlxuIik7CiAJZWxzZQogCQlNU0coIldhcm5pbmc6IEFjY2VzcyB0byBUZW1wb3JhcnkgRGlyZWN0b3J5IGZhaWxlZCAoJXMpLlxuIiwKIAkJICAgIHN0cmVycm9yKGVycm5vKSk7CmRpZmYgLS1naXQgYS9maWxlcy9kb3NfZnMuYyBiL2ZpbGVzL2Rvc19mcy5jCmluZGV4IDEyMDRkMDkuLmU2MWU4ZTcgMTAwNjQ0Ci0tLSBhL2ZpbGVzL2Rvc19mcy5jCisrKyBiL2ZpbGVzL2Rvc19mcy5jCkBAIC01NzcsNiArNTc3LDcgQEAKICAgICBpbnQJaTsKICAgICBjb25zdCBjaGFyICpwOwogCisgICAgaWYgKCFuYW1lKSByZXR1cm4gTlVMTDsgLyogaWYgRklMRV9EdXBVbml4SGFuZGxlIHdhcyB1c2VkICovCiAgICAgaWYgKG5hbWVbMF0gJiYgKG5hbWVbMV0gPT0gJzonKSkgbmFtZSArPSAyOwogICAgIGlmICgocCA9IHN0cnJjaHIoIG5hbWUsICcvJyApKSkgbmFtZSA9IHAgKyAxOwogICAgIGlmICgocCA9IHN0cnJjaHIoIG5hbWUsICdcXCcgKSkpIG5hbWUgPSBwICsgMTsKQEAgLTYwNCw2ICs2MDUsNyBAQAogICAgIEZJTEVfT0JKRUNUICpmaWxlOwogICAgIEhGSUxFMzIgaGFuZGxlOwogCisgICAgaWYgKCFuYW1lKSByZXR1cm4gTlVMTDsgLyogaWYgRklMRV9EdXBVbml4SGFuZGxlIHdhcyB1c2VkICovCiAgICAgaWYgKG5hbWVbMF0gJiYgKG5hbWVbMV0gPT0gJzonKSkgbmFtZSArPSAyOwogICAgIGlmICgocCA9IHN0cnJjaHIoIG5hbWUsICcvJyApKSkgbmFtZSA9IHAgKyAxOwogICAgIGlmICgocCA9IHN0cnJjaHIoIG5hbWUsICdcXCcgKSkpIG5hbWUgPSBwICsgMTsKZGlmZiAtLWdpdCBhL2ZpbGVzL2RyaXZlLmMgYi9maWxlcy9kcml2ZS5jCmluZGV4IDhkY2Y2OWUuLmZhODEzYWYgMTAwNjQ0Ci0tLSBhL2ZpbGVzL2RyaXZlLmMKKysrIGIvZmlsZXMvZHJpdmUuYwpAQCAtOTk4LDcgKzk5OCwxMiBAQAogICAgIC8qIFNldCB0aGUgZmlsZXN5c3RlbSBpbmZvcm1hdGlvbiAqLwogICAgIC8qIE5vdGU6IHdlIG9ubHkgZW11bGF0ZSBhIEZBVCBmcyBhdCB0aGUgcHJlc2VudCAqLwogCi0gICAgaWYgKGZpbGVuYW1lX2xlbikgKmZpbGVuYW1lX2xlbiA9IDEyOworICAgIGlmIChmaWxlbmFtZV9sZW4pIHsKKyAgICAJaWYgKERPU0RyaXZlc1tkcml2ZV0uZmxhZ3MgJiBEUklWRV9TSE9SVF9OQU1FUykKKwkgICAgKmZpbGVuYW1lX2xlbiA9IDEyOworCWVsc2UKKwkgICAgKmZpbGVuYW1lX2xlbiA9IDI1NTsKKyAgICB9CiAgICAgaWYgKGZsYWdzKSAqZmxhZ3MgPSAwOwogICAgIGlmIChmc25hbWUpIHsKICAgICAJLyogRGlhYmxvIGNoZWNrcyB0aGF0IHJldHVybiBjb2RlIC4uLiAqLwpkaWZmIC0tZ2l0IGEvZmlsZXMvZmlsZS5jIGIvZmlsZXMvZmlsZS5jCmluZGV4IGQ5YWM5NzcuLjZhZThkNjAgMTAwNjQ0Ci0tLSBhL2ZpbGVzL2ZpbGUuYworKysgYi9maWxlcy9maWxlLmMKQEAgLTkwLDcgKzkwLDcgQEAKIAogICAgIGhhbmRsZSA9IEhBTkRMRV9BbGxvYyggUFJPQ0VTU19DdXJyZW50KCksICYoKmZpbGUpLT5oZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX0FMTF9BQ0NFU1MgfCBHRU5FUklDX1JFQUQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19XUklURSB8IEdFTkVSSUNfRVhFQ1VURSAvKkZJWE1FKi8sIFRSVUUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTkVSSUNfV1JJVEUgfCBHRU5FUklDX0VYRUNVVEUgLypGSVhNRSovLCBUUlVFLCAtMSApOwogICAgIC8qIElmIHRoZSBhbGxvY2F0aW9uIGZhaWxlZCwgdGhlIG9iamVjdCBpcyBhbHJlYWR5IGRlc3Ryb3llZCAqLwogICAgIGlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMikgKmZpbGUgPSBOVUxMOwogICAgIHJldHVybiBoYW5kbGU7CkBAIC0xODgsNyArMTg4LDcgQEAKIEZJTEVfT0JKRUNUICpGSUxFX0dldEZpbGUoIEhGSUxFMzIgaGFuZGxlICkKIHsKICAgICByZXR1cm4gKEZJTEVfT0JKRUNUICopSEFORExFX0dldE9ialB0ciggUFJPQ0VTU19DdXJyZW50KCksIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzMyT0JKX0ZJTEUsIDAgLypGSVhNRSovICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEszMk9CSl9GSUxFLCAwIC8qRklYTUUqLywgTlVMTCApOwogfQogCiAKQEAgLTUwOCw3ICs1MDgsNyBAQAogICAgIERPU19GVUxMX05BTUUgZnVsbF9uYW1lOwogICAgIEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OIGluZm87CiAKLSAgICBpZiAobmFtZSA9PSBOVUxMKSByZXR1cm4gLTE7CisgICAgaWYgKG5hbWUgPT0gTlVMTCB8fCAqbmFtZT09J1wwJykgcmV0dXJuIC0xOwogCiAgICAgaWYgKCFET1NGU19HZXRGdWxsTmFtZSggbmFtZSwgVFJVRSwgJmZ1bGxfbmFtZSApKSByZXR1cm4gLTE7CiAgICAgaWYgKCFGSUxFX1N0YXQoIGZ1bGxfbmFtZS5sb25nX25hbWUsICZpbmZvICkpIHJldHVybiAtMTsKQEAgLTc5Niw2ICs3OTYsMjIgQEAKICAgICBsc3RyY3B5bjMyQSggb2ZzLT5zelBhdGhOYW1lLCBmdWxsX25hbWUuc2hvcnRfbmFtZSwKICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9mcy0+c3pQYXRoTmFtZSkgKTsKIAorICAgIGlmIChtb2RlICYgT0ZfU0hBUkVfRVhDTFVTSVZFKQorICAgICAgeworCWNoYXIgKmxhc3QgPSBzdHJyY2hyKGZ1bGxfbmFtZS5sb25nX25hbWUsJy8nKTsKKwlpZiAoIWxhc3QpCisJICBsYXN0ID0gZnVsbF9uYW1lLmxvbmdfbmFtZSAtIDE7CisJLyogU29tZSBJbnN0YWxsU2hpZWxkIHZlcnNpb24gdXNlcyBPRl9TSEFSRV9FWENMVVNJVkUgCisJIG9uIHRoZSBmaWxlIDx0ZW1wZGlyPi9faW5zMDQzMi5fbXAgdG8gZGV0ZXJtaW5lIGhvdworCSBmYXIgaW5zdGFsbGF0aW9uIGhhcyBwcm9jZWVkZWQqLworCWlmIChHZXRNb2R1bGVIYW5kbGUxNihsYXN0KzEpKQorCSAgeworCSAgICBUUkFDRShmaWxlLCJEZW55aW5nIHNoYXJlZCBvcGVuIGZvciAlc1xuIixmdWxsX25hbWUubG9uZ19uYW1lKTsKKwkgICAgcmV0dXJuIEhGSUxFX0VSUk9SMzI7CisJICB9CisJRklYTUUoZmlsZSwiT0ZfU0hBUkVfRVhDTFVTSVZFIG9ubHkgcGFydGlhbCBpbXBsZW1lbnRlZFxuIik7CisgICAgICB9CisKICAgICBpZiAobW9kZSAmIE9GX0RFTEVURSkKICAgICB7CiAgICAgICAgIGlmICh1bmxpbmsoIGZ1bGxfbmFtZS5sb25nX25hbWUgKSA9PSAtMSkgZ290byBub3RfZm91bmQ7CkBAIC05MjUsNyArOTQxLDcgQEAKIAogICAgIFRSQUNFKCBmaWxlLCAiJWQgJXAgJWRcbiIsIGhhbmRsZSwgYnVmZmVyLCBjb3VudCk7CiAgICAgaWYgKCEocHRyID0gSEFORExFX0dldE9ialB0ciggUFJPQ0VTU19DdXJyZW50KCksIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLMzJPQkpfVU5LTk9XTiwgMCkpKSByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzMyT0JKX1VOS05PV04sIDAsIE5VTEwpKSkgcmV0dXJuIC0xOwogICAgIGlmIChLMzJPQkpfT1BTKHB0ciktPnJlYWQpCiAgICAgICAgIHJlc3VsdCA9IEszMk9CSl9PUFMocHRyKS0+cmVhZChwdHIsIGJ1ZmZlciwgY291bnQsICZudW1Xcml0dGVuLCBOVUxMKTsKICAgICBLMzJPQkpfRGVjQ291bnQoIHB0ciApOwpAQCAtMTE0Nyw3ICsxMTYzLDcgQEAKIAl9CiAJCiAJaWYgKCEoaW9wdHIgPSBIQU5ETEVfR2V0T2JqUHRyKCBQUk9DRVNTX0N1cnJlbnQoKSwgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEszMk9CSl9VTktOT1dOLCAwICkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEszMk9CSl9VTktOT1dOLCAwLCBOVUxMICkpKQogICAgICAgICAgICAgcmV0dXJuIEhGSUxFX0VSUk9SMzI7CiAgICAgICAgIGlmIChLMzJPQkpfT1BTKGlvcHRyKS0+d3JpdGUpCiAgICAgICAgICAgICBzdGF0dXMgPSBLMzJPQkpfT1BTKGlvcHRyKS0+d3JpdGUoaW9wdHIsIGJ1ZmZlciwgY291bnQsICZyZXN1bHQsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZmlsZXMvcHJvZmlsZS5jIGIvZmlsZXMvcHJvZmlsZS5jCmluZGV4IGMxZjBkYWYuLmVjZGQwOWMgMTAwNjQ0Ci0tLSBhL2ZpbGVzL3Byb2ZpbGUuYworKysgYi9maWxlcy9wcm9maWxlLmMKQEAgLTQ1MiwxMyArNDUyLDEyIEBACiAgICAgICAgICAgICAgQ3VyUHJvZmlsZT10ZW1wUHJvZmlsZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICBpZighc3RhdChDdXJQcm9maWxlLT51bml4X25hbWUsJmJ1ZikgJiYgQ3VyUHJvZmlsZS0+bXRpbWU9PWJ1Zi5zdF9tdGltZSkKLSAgICAgICAgICAgIHsKICAgICAgICAgICAgICBUUkFDRShwcm9maWxlLCAiKCVzKTogYWxyZWFkeSBvcGVuZWQgKG1ydT0lZClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgaSApOwotICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgIFRSQUNFKHByb2ZpbGUsICIoJXMpOiBhbHJlYWR5IG9wZW5lZCwgbmVlZHMgcmVmcmVzaGluZyAobXJ1PSVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBpICk7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBUUkFDRShwcm9maWxlLCAiKCVzKTogYWxyZWFkeSBvcGVuZWQsIG5lZWRzIHJlZnJlc2hpbmcgKG1ydT0lZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBpICk7CisJICByZXR1cm4gVFJVRTsKICAgICAgICAgIH0KICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvZHJpdmVyLmMgYi9ncmFwaGljcy9kcml2ZXIuYwppbmRleCBjNGEyOGQ2Li4wOGRmMTVlIDEwMDY0NAotLS0gYS9ncmFwaGljcy9kcml2ZXIuYworKysgYi9ncmFwaGljcy9kcml2ZXIuYwpAQCAtNTMsNyArNTMsOCBAQAogY29uc3QgRENfRlVOQ1RJT05TICpEUklWRVJfRmluZERyaXZlciggTFBDU1RSIG5hbWUgKQogewogICAgIEdSQVBISUNTX0RSSVZFUiAqZHJpdmVyID0gZmlyc3REcml2ZXI7Ci0gICAgd2hpbGUgKGRyaXZlcikKKworICAgIHdoaWxlIChkcml2ZXIgJiYgbmFtZSkKICAgICB7CiAgICAgICAgIGlmICghc3RyY2FzZWNtcCggZHJpdmVyLT5uYW1lLCBuYW1lICkpIHJldHVybiBkcml2ZXItPmZ1bmNzOwogICAgICAgICBkcml2ZXIgPSBkcml2ZXItPm5leHQ7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9wc2Rydi9NYWtlZmlsZS5pbiBiL2dyYXBoaWNzL3BzZHJ2L01ha2VmaWxlLmluCmluZGV4IDE2OWYwNmYuLmM4Mjk1NTkgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3BzZHJ2L01ha2VmaWxlLmluCisrKyBiL2dyYXBoaWNzL3BzZHJ2L01ha2VmaWxlLmluCkBAIC0xMyw2ICsxMyw3IEBACiAJZ3JhcGhpY3MuYyBcCiAJaW5pdC5jIFwKIAlvYmplY3RzLmMgXAorCXBwZC5jIFwKIAlwcy5jIFwKIAl0ZXh0LmMKIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvcHNkcnYvUkVBRE1FIGIvZ3JhcGhpY3MvcHNkcnYvUkVBRE1FCmluZGV4IDg1ZmNkODguLjMzYTBhMWIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3BzZHJ2L1JFQURNRQorKysgYi9ncmFwaGljcy9wc2Rydi9SRUFETUUKQEAgLTM5LDYgKzM5LDEzIEBACiAKIGZvciBlYWNoIEFGTSBmaWxlIHRoYXQgeW91IHdpc2ggdG8gdXNlLiBbVGhpcyBtaWdodCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZV0KIAorWW91IGFsc28gcmVxdWlyZSBhIHBwZCBmaWxlIGZvciB5b3VyIHByaW50ZXIuIFRoaXMgZGVzY3JpYmVzIGNlcnRhaW4KK2NoYXJhY3RlcmlzdGljcyBvZiB0aGUgcHJpbnRlciBzdWNoIGFzIHdoaWNoIGZvbnRzIGFyZSBpbnN0YWxsZWQsIGhvdyB0byBzZWxlY3QKK21hbnVhbCBmZWVkIGV0Yy4gQWRvYmUgYWxzbyBoYXMgbWFueSBvZiB0aGVzZSBvbiBpdHMgd2Vic2l0ZSwgaGF2ZSBhIGxvb2sgaW4KK2Z0cDovL2Z0cC5hZG9iZS5jb20vcHViL2Fkb2JlL3ByaW50ZXJkcml2ZXJzL3dpbi9hbGwvCitQdXQgdGhlIHBwZCBpbiB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggeW91IHN0YXJ0IHdpbmUgYW5kIGNhbGwgaXQgZGVmYXVsdC5wcGQKK1t0aGlzIHdpbGwgZGVmaW5pdGVseSBjaGFuZ2Ugc29vbl0uCisKIE5vdGUgdGhhdCB5b3UgbmVlZCBub3Qgc2V0IHByaW50ZXI9b24gaW4gdGhlIFt3aW5lXSBzZWN0aW9uIG9mIHdpbmUuY29uZiwgdGhpcwogZW5hYmxlcyBwcmludGluZyB2aWEgZXh0ZXJuYWwgcHJpbnRlciBkcml2ZXJzIGFuZCBkb2VzIG5vdCBhZmZlY3Qgd2luZXBzLgogCkBAIC01MSw5ICs1OCwxMiBAQAogVE9ETyAvIEJ1Z3MKIC0tLS0tLS0tLS0tCiAKLURyaXZlciBkb2Vzbid0IHJlYWQgUFBEIGZpbGVzIC0gaXQgc2hvdWxkLgorRHJpdmVyIGRvZXMgcmVhZCBQUEQgZmlsZXMsIGJ1dCBpZ25vcmVzIGFsbCBjb25zdHJhaW50cyBhbmQgZG9lc24ndCBsZXQgeW91CitzcGVjaWZ5IHdoZXRoZXIgeW91IGhhdmUgb3B0aW9uYWwgZXh0cmFzIHN1Y2ggYXMgZW52ZWxvcGUgZmVlZGVycy4gWW91IHdpbGwKK3RoZXJlZm9yZSBmaW5kIGEgbGFyZ2VyIHRoYW4gbm9ybWFsIHNlbGVjdGlvbiBvZiBpbnB1dCBiaW5zIGluIHRoZSBwcmludCBzZXR1cAorZGlhbG9nIGJveC4gSSd2ZSBvbmx5IHJlYWxseSB0ZXN0ZWQgcHBkIHBhcnNpbmcgb24gdGhlIGhwNG02X3YxLnBwZCBmaWxlLgogCi1BNCBwb3J0cmFpdCBtb2RlIGlzIGhhcmQgY29kZWQgaW4gYXQgdGhlIG1vbWVudC4KK0xhbmRzY2FwZSBtb2RlIHByb2JhYmx5IGRvZXNuJ3QgcXVpdGUgd29yayB5ZXQgKHRoaXMgaXMgZWFzeSB0byBmaXgpLgogCiBHcmFwaGljcyBhcmUgYmFzaWNhbGx5IG5vbi1leGlzdGVudC4gT25seSBNb3ZlVG8vTGluZVRvL1JlY3RhbmdsZSB3aXRoIGEgdGhpbgogYmxhY2sgcGVuLgpAQCAtNjQsMTIgKzc0LDEzIEBACiAKIE5vIFRydWVUeXBlIGRvd25sb2FkLgogCi1NYW55IHBhcnRpYWwtaW1wbGVtZW50ZWQgZnVuY3Rpb25zLgorTWFueSBwYXJ0aWFsbHkgaW1wbGVtZW50ZWQgZnVuY3Rpb25zLgorCitwcy5jIGlzIGJlY29taW5nIG1lc3N5LgogCiBQcm9iYWJseSBtYW55IG1vcmUuLi4KIAotCi1TaW5jZSB0aGUgZHJpdmVyIGlzIHZlcnkgdmVyeSBhbHBoYSwgdGhpbmdzIGFyZSBsaWtlbHkgdG8gY2hhbmdlIHF1aWNrbHkuCitTaW5jZSB0aGUgZHJpdmVyIGlzIHZlcnkgYWxwaGEsIHRoaW5ncyBhcmUgbGlrZWx5IHRvIGNoYW5nZSBxdWlja2x5LgogUGxlYXNlIGNvbnRhY3QgbWUgaWYgeW91IHdhbnQgdG8gaGVscCBzbyB0aGF0IHdlIGNhbiBhdm9pZCBkdXBsaWNhdGlvbi4KIAogSHV3IERhdmllcyA8aC5kYXZpZXMxQHBoeXNpY3Mub3guYWMudWs+CmRpZmYgLS1naXQgYS9ncmFwaGljcy9wc2Rydi9hZm0uYyBiL2dyYXBoaWNzL3BzZHJ2L2FmbS5jCmluZGV4IGY5N2VlOWYuLjQ0NzdjMjcgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3BzZHJ2L2FmbS5jCisrKyBiL2dyYXBoaWNzL3BzZHJ2L2FmbS5jCkBAIC0xNiw3ICsxNiw3IEBACiAjaW5jbHVkZSA8Y3R5cGUuaD4KIAogLyogcHRyIHRvIGZvbnRzIGZvciB3aGljaCB3ZSBoYXZlIGFmbSBmaWxlcyAqLwotRm9udEZhbWlseSAqUFNEUlZfQUZNRm9udExpc3QgPSBOVUxMOworRk9OVEZBTUlMWSAqUFNEUlZfQUZNRm9udExpc3QgPSBOVUxMOwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzUsNiArMzUsOCBAQAogICAgIGludCBpLCBjaGFybm87CiAKICAgICBmb3IoaSA9IDA7IGkgPCBhZm0tPk51bW9mTWV0cmljczsgaSsrKSB7CisgICAgICAgIGNoYXIgKm5hbWUgPSBOVUxMOworCiAgICAgICAgIGlmKCFmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkpIHsKIAkgICBFUlIocHNkcnYsICJVbmV4cGVjdGVkIEVPRlxuIik7CiAJICAgcmV0dXJuOwpAQCAtNzEsNiArNzMsMjIgQEAKIAkgICAgfQogCSAgICAvKiB3b3VsZCBjYXJyeSBvbiBoZXJlIHRvIHNjYW4gaW4gQkJveCwgbmFtZSBhbmQgbGlncyAqLwogCisJICAgIC8qIENhcnJ5IG9uIHRvIGZpbmQgQkJveCAob3IgYWN0dWFsbHkganVzdCBhc2NlbnQpIG9mIEFyaW5nLiBUaGlzCisJICAgICAgIHdpbGwgcHJvdmlkZSBzb21ldGhpbmcgbGlrZSB0aGUgbGZIZWlnaHQgdmFsdWUgKi8KKworCSAgICBlbHNlIGlmKCFzdHJuY21wKCJOICIsIGl0ZW0sIDIpKSB7CisJICAgICAgICBuYW1lID0gdmFsdWU7IC8qIG1heSBlbmQgaW4gc3BhY2UgKi8KKwkgICAgfQorCisJICAgIGVsc2UgaWYoIXN0cm5jbXAoIkIgIiwgaXRlbSwgMikpIHsKKwkgICAgICAgIGlmKG5hbWUgJiYgIXN0cm5jbXAoIkFyaW5nIiwgbmFtZSwgNSkpIHsKKwkJICAgIGZsb2F0IGxseCwgbGx5LCB1cngsIHVyeTsKKwkJICAgIGxseCA9IGxseSA9IHVyeCA9IHVyeSA9IDAuMDsKKwkJICAgIHNzY2FuZih2YWx1ZSwgIiVmJWYlZiVmIiwgJmxseCwgJmxseSwgJnVyeCwgJnVyeSk7CisJCSAgICBhZm0tPkZ1bGxBc2NlbmRlciA9IHVyeTsKKwkJfQorCSAgICB9CisKIAl9CiAgICAgfQogCkBAIC0xMDAsNyArMTE4LDcgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgYWZtID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihBRk0pKTsKKyAgICBhZm0gPSBIZWFwQWxsb2MoUFNEUlZfSGVhcCwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKEFGTSkpOwogICAgIGlmKCFhZm0pIHsKICAgICAgICAgZmNsb3NlKGZwKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xMTgsMTcgKzEzNiwxNyBAQAogCSAgICB2YWx1ZSsrOwogCiAJaWYoIXN0cm5jbXAoIkZvbnROYW1lIiwgYnVmLCA4KSkgewotCSAgICBhZm0tPkZvbnROYW1lID0gSEVBUF9zdHJkdXBBKEdldFByb2Nlc3NIZWFwKCksIDAsIHZhbHVlKTsKKwkgICAgYWZtLT5Gb250TmFtZSA9IEhFQVBfc3RyZHVwQShQU0RSVl9IZWFwLCAwLCB2YWx1ZSk7CiAJICAgIGNvbnRpbnVlOwogCX0KIAogCWlmKCFzdHJuY21wKCJGdWxsTmFtZSIsIGJ1ZiwgOCkpIHsKLQkgICAgYWZtLT5GdWxsTmFtZSA9IEhFQVBfc3RyZHVwQShHZXRQcm9jZXNzSGVhcCgpLCAwLCB2YWx1ZSk7CisJICAgIGFmbS0+RnVsbE5hbWUgPSBIRUFQX3N0cmR1cEEoUFNEUlZfSGVhcCwgMCwgdmFsdWUpOwogCSAgICBjb250aW51ZTsKIAl9CiAKIAlpZighc3RybmNtcCgiRmFtaWx5TmFtZSIsIGJ1ZiwgMTApKSB7Ci0JICAgIGFmbS0+RmFtaWx5TmFtZSA9IEhFQVBfc3RyZHVwQShHZXRQcm9jZXNzSGVhcCgpLCAwLCB2YWx1ZSk7CisJICAgIGFmbS0+RmFtaWx5TmFtZSA9IEhFQVBfc3RyZHVwQShQU0RSVl9IZWFwLCAwLCB2YWx1ZSk7CiAJICAgIGNvbnRpbnVlOwogCX0KIAkKQEAgLTIwNSwyNCArMjIzLDgxIEBACiAJICAgIGNvbnRpbnVlOwogCX0KIAotICAgIH0KIAorCisKKyAgICB9CiAgICAgZmNsb3NlKGZwKTsKLSAgICBpZihhZm0tPkFzY2VuZGVyID09IDAuMCkgYWZtLT5Bc2NlbmRlciA9IDEwMDAuMDsKKworICAgIGlmKGFmbS0+QXNjZW5kZXIgPT0gMC4wKQorICAgICAgICBhZm0tPkFzY2VuZGVyID0gYWZtLT5Gb250QkJveC51cnk7CisgICAgaWYoYWZtLT5EZXNjZW5kZXIgPT0gMC4wKQorICAgICAgICBhZm0tPkRlc2NlbmRlciA9IGFmbS0+Rm9udEJCb3gubGx5OworICAgIGlmKGFmbS0+RnVsbEFzY2VuZGVyID09IDAuMCkKKyAgICAgICAgYWZtLT5GdWxsQXNjZW5kZXIgPSBhZm0tPkFzY2VuZGVyOworCiAgICAgcmV0dXJuIGFmbTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgorICoJUFNEUlZfRnJlZUFGTUxpc3QKKyAqCisgKiBGcmVlcyB0aGUgZmFtaWx5IGFuZCBhZm1saXN0ZW50cnkgc3RydWN0dXJlcyBpbiBsaXN0IGhlYWQKKyAqLwordm9pZCBQU0RSVl9GcmVlQUZNTGlzdCggRk9OVEZBTUlMWSAqaGVhZCApCit7CisgICAgQUZNTElTVEVOVFJZICphZm1sZSwgKm5leHRhOworICAgIEZPTlRGQU1JTFkgKmZhbWlseSwgKm5leHRmOworCisgICAgZm9yKG5leHRmID0gZmFtaWx5ID0gaGVhZDsgbmV4dGY7IGZhbWlseSA9IG5leHRmKSB7CisgICAgICAgIGZvcihuZXh0YSA9IGFmbWxlID0gZmFtaWx5LT5hZm1saXN0OyBuZXh0YTsgYWZtbGUgPSBuZXh0YSkgeworCSAgICBuZXh0YSA9IGFmbWxlLT5uZXh0OworCSAgICBIZWFwRnJlZSggUFNEUlZfSGVhcCwgMCwgYWZtbGUgKTsKKwl9CisgICAgICAgIG5leHRmID0gZmFtaWx5LT5uZXh0OworCUhlYXBGcmVlKCBQU0RSVl9IZWFwLCAwLCBmYW1pbHkgKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCVBTRFJWX0ZpbmRBRk1pbkxpc3QKKyAqIFJldHVybnMgcHRyIHRvIGFuIEFGTSBpZiBuYW1lICh3aGljaCBpcyBhIFBTIGZvbnQgbmFtZSkgZXhpc3RzIGluIGxpc3QKKyAqIGhlYWRlZCBieSBoZWFkLgorICovCitBRk0gKlBTRFJWX0ZpbmRBRk1pbkxpc3QoRk9OVEZBTUlMWSAqaGVhZCwgY2hhciAqbmFtZSkKK3sKKyAgICBGT05URkFNSUxZICpmYW1pbHk7CisgICAgQUZNTElTVEVOVFJZICphZm1sZTsKKworICAgIGZvcihmYW1pbHkgPSBoZWFkOyBmYW1pbHk7IGZhbWlseSA9IGZhbWlseS0+bmV4dCkgeworICAgICAgICBmb3IoYWZtbGUgPSBmYW1pbHktPmFmbWxpc3Q7IGFmbWxlOyBhZm1sZSA9IGFmbWxlLT5uZXh0KSB7CisJICAgIGlmKCFzdHJjbXAoYWZtbGUtPmFmbS0+Rm9udE5hbWUsIG5hbWUpKQorCSAgICAgICAgcmV0dXJuIGFmbWxlLT5hZm07CisJfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgogICoJUFNEUlZfQWRkQUZNdG9MaXN0CiAgKgotICogQWRkcyBhbiBhZm0gdG8gdGhlIGN1cnJlbnQgZm9udCBsaXN0LiBDcmVhdGVzIG5ldyBmYW1pbHkgbm9kZSBpZiBuZWNlc3NhcnkuCisgKiBBZGRzIGFuIGFmbSB0byB0aGUgbGlzdCB3aG9zZSBoZWFkIGlzIHBvaW50ZWQgdG8gYnkgaGVhZC4gQ3JlYXRlcyBuZXcKKyAqIGZhbWlseSBub2RlIGlmIG5lY2Vzc2FyeSBhbmQgYWx3YXlzIGNyZWF0ZXMgYSBuZXcgQUZNTElTVEVOVFJZLgogICovCi1zdGF0aWMgdm9pZCBQU0RSVl9BZGRBRk10b0xpc3QoQUZNICphZm0pCit2b2lkIFBTRFJWX0FkZEFGTXRvTGlzdChGT05URkFNSUxZICoqaGVhZCwgQUZNICphZm0pCiB7Ci0gICAgRm9udEZhbWlseSAqZmFtaWx5ID0gUFNEUlZfQUZNRm9udExpc3Q7Ci0gICAgRm9udEZhbWlseSAqKmluc2VydCA9ICZQU0RSVl9BRk1Gb250TGlzdDsKLSAgICBBRk0gKnRtcGFmbTsKKyAgICBGT05URkFNSUxZICpmYW1pbHkgPSAqaGVhZDsKKyAgICBGT05URkFNSUxZICoqaW5zZXJ0ID0gaGVhZDsKKyAgICBBRk1MSVNURU5UUlkgKnRtcGFmbWxlLCAqbmV3YWZtbGU7CisKKyAgICBuZXdhZm1sZSA9IEhlYXBBbGxvYyhQU0RSVl9IZWFwLCBIRUFQX1pFUk9fTUVNT1JZLAorCQkJICAgc2l6ZW9mKCpuZXdhZm1sZSkpOworICAgIG5ld2FmbWxlLT5hZm0gPSBhZm07CiAKICAgICB3aGlsZShmYW1pbHkpIHsKICAgICAgICAgaWYoIXN0cmNtcChmYW1pbHktPkZhbWlseU5hbWUsIGFmbS0+RmFtaWx5TmFtZSkpCkBAIC0yMzAsMjIgKzMwNSwyMiBAQAogCWluc2VydCA9ICYoZmFtaWx5LT5uZXh0KTsKIAlmYW1pbHkgPSBmYW1pbHktPm5leHQ7CiAgICAgfQotICAgIAorIAogICAgIGlmKCFmYW1pbHkpIHsKLSAgICAgICAgZmFtaWx5ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksCisgICAgICAgIGZhbWlseSA9IEhlYXBBbGxvYyhQU0RSVl9IZWFwLCBIRUFQX1pFUk9fTUVNT1JZLAogCQkJICAgc2l6ZW9mKCpmYW1pbHkpKTsKIAkqaW5zZXJ0ID0gZmFtaWx5OwotCWZhbWlseS0+RmFtaWx5TmFtZSA9IEhFQVBfc3RyZHVwQShHZXRQcm9jZXNzSGVhcCgpLCAwLAorCWZhbWlseS0+RmFtaWx5TmFtZSA9IEhFQVBfc3RyZHVwQShQU0RSVl9IZWFwLCAwLAogCQkJCQkgIGFmbS0+RmFtaWx5TmFtZSk7Ci0JZmFtaWx5LT5hZm0gPSBhZm07CisJZmFtaWx5LT5hZm1saXN0ID0gbmV3YWZtbGU7CiAJcmV0dXJuOwogICAgIH0KICAgICAKLSAgICB0bXBhZm0gPSBmYW1pbHktPmFmbTsKLSAgICB3aGlsZSh0bXBhZm0tPm5leHQpCi0gICAgICAgIHRtcGFmbSA9IHRtcGFmbS0+bmV4dDsKKyAgICB0bXBhZm1sZSA9IGZhbWlseS0+YWZtbGlzdDsKKyAgICB3aGlsZSh0bXBhZm1sZS0+bmV4dCkKKyAgICAgICAgdG1wYWZtbGUgPSB0bXBhZm1sZS0+bmV4dDsKIAotICAgIHRtcGFmbS0+bmV4dCA9IGFmbTsKKyAgICB0bXBhZm1sZS0+bmV4dCA9IG5ld2FmbWxlOwogCiAgICAgcmV0dXJuOwogfQpAQCAtMjYzLDcgKzMzOCw3IEBACiAKICAgICBhZm0gPSBQU0RSVl9BRk1QYXJzZSh2YWx1ZSk7CiAgICAgaWYoYWZtKQotICAgICAgICBQU0RSVl9BZGRBRk10b0xpc3QoYWZtKTsKKyAgICAgICAgUFNEUlZfQWRkQUZNdG9MaXN0KCZQU0RSVl9BRk1Gb250TGlzdCwgYWZtKTsKICAgICByZXR1cm47CiB9CiAKQEAgLTI3NSwxMyArMzUwLDEzIEBACiAgKi8KIHN0YXRpYyB2b2lkIFBTRFJWX0R1bXBGb250TGlzdCh2b2lkKQogewotICAgIEZvbnRGYW1pbHkgKmZhbWlseTsKLSAgICBBRk0gKmFmbTsKKyAgICBGT05URkFNSUxZICpmYW1pbHk7CisgICAgQUZNTElTVEVOVFJZICphZm1sZTsKIAogICAgIGZvcihmYW1pbHkgPSBQU0RSVl9BRk1Gb250TGlzdDsgZmFtaWx5OyBmYW1pbHkgPSBmYW1pbHktPm5leHQpIHsKICAgICAgICAgVFJBQ0UocHNkcnYsICJGYW1pbHkgJyVzJ1xuIiwgZmFtaWx5LT5GYW1pbHlOYW1lKTsKLQlmb3IoYWZtID0gZmFtaWx5LT5hZm07IGFmbTsgYWZtID0gYWZtLT5uZXh0KSB7Ci0JICAgIFRSQUNFKHBzZHJ2LCAiXHRGb250TmFtZSAnJXMnXG4iLCBhZm0tPkZvbnROYW1lKTsKKwlmb3IoYWZtbGUgPSBmYW1pbHktPmFmbWxpc3Q7IGFmbWxlOyBhZm1sZSA9IGFmbWxlLT5uZXh0KSB7CisJICAgIFRSQUNFKHBzZHJ2LCAiXHRGb250TmFtZSAnJXMnXG4iLCBhZm1sZS0+YWZtLT5Gb250TmFtZSk7CiAJfQogICAgIH0KICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9ncmFwaGljcy9wc2Rydi9kcml2ZXIuYyBiL2dyYXBoaWNzL3BzZHJ2L2RyaXZlci5jCmluZGV4IGQyMTdlOTkuLmVhZDMxYmIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3BzZHJ2L2RyaXZlci5jCisrKyBiL2dyYXBoaWNzL3BzZHJ2L2RyaXZlci5jCkBAIC0xLDcgKzEsNyBAQAogLyoKLSAqIEV4cG9ydGVkIGZ1bmN0aW9ucyBmcm9tIHRoZSBQb3N0c2NyaXB0IGRyaXZlci4KKyAqIEV4cG9ydGVkIGZ1bmN0aW9ucyBmcm9tIHRoZSBQb3N0U2NyaXB0IGRyaXZlci4KICAqCi0gKiBbRXh0XURldmljZU1vZGUsIERldmljZUNhcGFiaWxpdGllcy4gCisgKiBbRXh0XURldmljZU1vZGUsIERldmljZUNhcGFiaWxpdGllcywgQWR2YW5jZWRTZXR1cERpYWxvZy4gCiAgKgogICogV2lsbCBuZWVkIEV4dFRleHRPdXQgZm9yIHdpbndvcmQ2ICh1cmdoISkKICAqCkBAIC05LDUxICs5LDE3MSBAQAogICoKICAqLwogCi0jaW5jbHVkZSAid2luZG93cy5oIgotI2luY2x1ZGUgInBzZHJ2LmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8cHNkcnYuaD4KKyNpbmNsdWRlIDxkZWJ1Zy5oPgorI2luY2x1ZGUgPHJlc291cmNlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8d2luLmg+CisjaW5jbHVkZSA8cHJpbnQuaD4KIAotCi1zdGF0aWMgREVWTU9ERTE2IERlZmF1bHREZXZNb2RlID0gCi17Ci0vKiBkbURldmljZU5hbWUgKi8JIldpbmUgUG9zdHNjcmlwdCBEcml2ZXIiLAotLyogZG1TcGVjVmVyc2lvbiAqLwkweDMwYSwKLS8qIGRtRHJpdmVyVmVyc2lvbiAqLwkweDAwMSwKLS8qIGRtU2l6ZSAqLwkJc2l6ZW9mKERFVk1PREUxNiksCi0vKiBkbURyaXZlckV4dHJhICovCTAsCi0vKiBkbUZpZWxkcyAqLwkJRE1fT1JJRU5UQVRJT04gfCBETV9QQVBFUlNJWkUgfCBETV9QQVBFUkxFTkdUSCB8IAotCQkJICBETV9QQVBFUldJRFRILAotLyogZG1PcmllbnRhdGlvbiAqLwlETU9SSUVOVF9QT1JUUkFJVCwKLS8qIGRtUGFwZXJTaXplICovCURNUEFQRVJfQTQsCi0vKiBkbVBhcGVyTGVuZ3RoICovCTI5MzAsCi0vKiBkbVBhcGVyV2lkdGggKi8gICAgICAyMDAwLAotLyogZG1TY2FsZSAqLwkJMCwKLS8qIGRtQ29waWVzICovCQkwLAotLyogZG1EZWZhdWx0U291cmNlICovCTAsCi0vKiBkbVByaW50UXVhbGl0eSAqLwkwLAotLyogZG1Db2xvciAqLwkJMCwKLS8qIGRtRHVwbGV4ICovCQkwLAotLyogZG1ZUmVzb2x1dGlvbiAqLwkwLAotLyogZG1UVE9wdGlvbiAqLwkwLAotLyogZG1Db2xsYXRlICovCQkwLAotLyogZG1Gb3JtTmFtZSAqLwkiIiwKLS8qIGRtVW51c2VkUGFkZGluZyAqLyAgIDAsCi0vKiBkbUJpdHNQZXJQZWwgKi8JMCwKLS8qIGRtUGVsc1dpZHRoICovCTAsCi0vKiBkbVBlbHNIZWlnaHQgKi8JMCwKLS8qIGRtRGlzcGxheUZsYWdzICovCTAsCi0vKiBkbURpc3BsYXlGcmVxdWVuY3kgKi8gMAotfTsKLQotCi1zdGF0aWMgY2hhciBQYXBlck5hbWVzW11bNjRdID0geyJNeSBBNCJ9Owotc3RhdGljIFdPUkQgUGFwZXJzW10gPSB7RE1QQVBFUl9BNH07Ci1zdGF0aWMgUE9JTlQxNiBQYXBlclNpemVzW10gPSB7ezIxMTAsIDI5NzV9fTsKLXN0YXRpYyBjaGFyIEJpbk5hbWVzW11bMjRdID0geyJNeSBCaW4ifTsKLXN0YXRpYyBXT1JEIEJpbnNbXSA9IHtETUJJTl9BVVRPfTsKIHN0YXRpYyBMT05HIFJlc29sdXRpb25zW11bMl0gPSB7IHs2MDAsNjAwfSB9OwogCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkJUFNEUlZfTWVyZ2VEZXZtb2RlcworICoKKyAqIFVwZGF0ZXMgZG0xIHdpdGggc29tZSBmaWVsZHMgZnJvbSBkbTIKKyAqCisgKi8KK3ZvaWQgUFNEUlZfTWVyZ2VEZXZtb2RlcyhQU0RSVl9ERVZNT0RFMTYgKmRtMSwgUFNEUlZfREVWTU9ERTE2ICpkbTIsCisJCQkgUFJJTlRFUklORk8gKnBpKQoreworICAgIC8qIHNvbWUgc2FuaXR5IGNoZWNrcyBoZXJlIG9uIGRtMiAqLworICAgIGlmKGRtMi0+ZG1QdWJsaWMuZG1GaWVsZHMgJiBETV9PUklFTlRBVElPTikKKyAgICAgICAgZG0xLT5kbVB1YmxpYy5kbU9yaWVudGF0aW9uID0gZG0yLT5kbVB1YmxpYy5kbU9yaWVudGF0aW9uOworCSAgICAvKiBOQiBQYXBlcldpZHRoIGlzIGFsd2F5cyA8IFBhcGVyTGVuZ3RoICovCisgICAgICAgIAorICAgIGlmKGRtMi0+ZG1QdWJsaWMuZG1GaWVsZHMgJiBETV9QQVBFUlNJWkUpIHsKKyAgICAgICAgUEFHRVNJWkUgKnBhZ2U7CisKKwlmb3IocGFnZSA9IHBpLT5wcGQtPlBhZ2VTaXplczsgcGFnZTsgcGFnZSA9IHBhZ2UtPm5leHQpIHsKKwkgICAgaWYocGFnZS0+V2luUGFnZSA9PSBkbTItPmRtUHVibGljLmRtUGFwZXJTaXplKQorCSAgICAgICAgYnJlYWs7CisJfQorCWlmKHBhZ2UpIHsKKwkgICAgZG0xLT5kbVB1YmxpYy5kbVBhcGVyU2l6ZSA9IGRtMi0+ZG1QdWJsaWMuZG1QYXBlclNpemU7CisJICAgIGRtMS0+ZG1QdWJsaWMuZG1QYXBlcldpZHRoID0gcGFnZS0+UGFwZXJEaW1lbnNpb24tPnggKiAyNS40IC8gNzIuMDsKKwkgICAgZG0xLT5kbVB1YmxpYy5kbVBhcGVyTGVuZ3RoID0gcGFnZS0+UGFwZXJEaW1lbnNpb24tPnkgKiAyNS40IC8gNzIuMDsKKwkgICAgVFJBQ0UocHNkcnYsICJDaGFuZ2luZyBwYWdlIHRvICVzICVkIHggJWRcbiIsIHBhZ2UtPkZ1bGxOYW1lLAorCQkgICAgIGRtMS0+ZG1QdWJsaWMuZG1QYXBlcldpZHRoLCBkbTEtPmRtUHVibGljLmRtUGFwZXJMZW5ndGggKTsKKwl9IGVsc2UgeworCSAgICBUUkFDRShwc2RydiwgIlRyeWluZyB0byBjaGFuZ2UgdG8gdW5zdXBwb3J0ZWQgcGFnZXNpemUgJWRcbiIsCisJCSAgICAgIGRtMi0+ZG1QdWJsaWMuZG1QYXBlclNpemUpOworCX0KKyAgICB9CisKKyAgICBpZihkbTItPmRtUHVibGljLmRtRmllbGRzICYgRE1fREVGQVVMVFNPVVJDRSkgeworICAgICAgICBJTlBVVFNMT1QgKnNsb3Q7CisJCisJZm9yKHNsb3QgPSBwaS0+cHBkLT5JbnB1dFNsb3RzOyBzbG90OyBzbG90ID0gc2xvdC0+bmV4dCkgeworCSAgICBpZihzbG90LT5XaW5CaW4gPT0gZG0yLT5kbVB1YmxpYy5kbURlZmF1bHRTb3VyY2UpCisJICAgICAgICBicmVhazsKKwl9CisJaWYoc2xvdCkgeworCSAgICBkbTEtPmRtUHVibGljLmRtRGVmYXVsdFNvdXJjZSA9IGRtMi0+ZG1QdWJsaWMuZG1EZWZhdWx0U291cmNlOworCSAgICBUUkFDRShwc2RydiwgIkNoYW5naW5nIGJpbiB0byAnJXMnXG4iLCBzbG90LT5GdWxsTmFtZSk7CisJfSBlbHNlIHsKKwkgIFRSQUNFKHBzZHJ2LCAiVHJ5aW5nIHRvIGNoYW5nZSB0byB1bnN1cHBvcnRlZCBiaW4gJWRcbiIsCisJCWRtMi0+ZG1QdWJsaWMuZG1EZWZhdWx0U291cmNlKTsKKwl9CisgICAgfQorCisgICAgLyogZXRjICovCisKKyAgICByZXR1cm47Cit9CisKKworI2lmIDAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJCVBTRFJWX05ld1ByaW50ZXJEbGdQcm9jMzIKKyAqCisgKgorICovCitMUkVTVUxUIFdJTkFQSSBQU0RSVl9OZXdQcmludGVyRGxnUHJvYzMyKEhXTkQzMiBoV25kLCBVSU5UMzIgd01zZywKKwkJCQkJICAgIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgc3dpdGNoICh3TXNnKSB7CisgIGNhc2UgV01fSU5JVERJQUxPRzoKKyAgICBUUkFDRShwc2RydiwiV01fSU5JVERJQUxPRyBsUGFyYW09JTA4bFhcbiIsIGxQYXJhbSk7CisgICAgU2hvd1dpbmRvdzMyKGhXbmQsIFNXX1NIT1dOT1JNQUwpOworICAgIHJldHVybiBUUlVFOworIAorICBjYXNlIFdNX0NPTU1BTkQ6CisgICAgc3dpdGNoIChMT1dPUkQod1BhcmFtKSkgeworICAgIGNhc2UgSURPSzoKKyAgICAgIEVuZERpYWxvZzMyKGhXbmQsIFRSVUUpOworICAgICAgcmV0dXJuIFRSVUU7CisgIAorICAgIGNhc2UgSURDQU5DRUw6CisgICAgICBFbmREaWFsb2czMihoV25kLCBGQUxTRSk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICAKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgCisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK0xSRVNVTFQgV0lOQVBJIFBTRFJWX0FkdmFuY2VkU2V0dXBEbGdQcm9jMzIoSFdORDMyIGhXbmQsIFVJTlQzMiB3TXNnLAorCQkJCQkgICAgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICBzd2l0Y2ggKHdNc2cpIHsKKyAgY2FzZSBXTV9JTklURElBTE9HOgorICAgIFRSQUNFKHBzZHJ2LCJXTV9JTklURElBTE9HIGxQYXJhbT0lMDhsWFxuIiwgbFBhcmFtKTsKKyAgICBTZW5kRGxnSXRlbU1lc3NhZ2UzMkEoaFduZCwgOTksIENCX0FERFNUUklORzMyLCAwLCAKKwkJCSAgKExQQVJBTSkiRGVmYXVsdCBUcmF5Iik7CisgICAgU2hvd1dpbmRvdzMyKGhXbmQsIFNXX1NIT1dOT1JNQUwpOworICAgIHJldHVybiBUUlVFOworCisgIGNhc2UgV01fQ09NTUFORDoKKyAgICBzd2l0Y2ggKExPV09SRCh3UGFyYW0pKSB7CisgICAgY2FzZSBJRE9LOgorICAgICAgRW5kRGlhbG9nMzIoaFduZCwgVFJVRSk7CisgICAgICByZXR1cm4gVFJVRTsKKworICAgIGNhc2UgSURDQU5DRUw6CisgICAgICBFbmREaWFsb2czMihoV25kLCBGQUxTRSk7CisgICAgICByZXR1cm4gVFJVRTsKKworICAgIGNhc2UgMjAwOgorICAgICAgRGlhbG9nQm94SW5kaXJlY3RQYXJhbTMyQSggV0lOX0dldFdpbmRvd0luc3RhbmNlKCBoV25kICksCisJCQkgIFNZU1JFU19HZXRSZXNQdHIoIFNZU1JFU19ESUFMT0dfUFNEUlZfTkVXUFJJTlRFUiApLAorCQkJICBoV25kLCBQU0RSVl9OZXdQcmludGVyRGxnUHJvYzMyLCAoTFBBUkFNKSBOVUxMICk7CisgICAgICByZXR1cm4gVFJVRTsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgIGRlZmF1bHQ6ICAgIAorICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorI2VuZGlmIC8qIDAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJUFNEUlZfQWR2YW5jZWRTZXR1cERpYWxvZzE2CVtXSU5FUFMuOTNdCisgKgorICogUHJlc3VtYWJseSBkZXYxIGFuZCBkZXYyIGFyZSBpbiBhbmQgb3V0LCBkb24ndCBrbm93IHdoaWNoIGlzIHdoaWNoIHlldC4KKyAqIE5vdCBzdXJlIGFib3V0IHJldHVybiB2YWx1ZSBlaXRoZXIuIChJIGhhdmVuJ3QgZ290IGFueSBkb2NzIG9uIHRoaXMgYXQgYWxsKQorICoKKyAqLworSU5UMTYgV0lOQVBJIFBTRFJWX0FkdmFuY2VkU2V0dXBEaWFsb2cxNihIV05EMTYgaHduZCwgSEFORExFMTYgaERyaXZlciwKKwkJCQkJIExQREVWTU9ERTE2IGRldjEsIExQREVWTU9ERTE2IGRldjIgKQoreworCisgIFRSQUNFKHBzZHJ2LCAiaHduZCA9ICUwNHgsIGhEcml2ZXIgPSAlMDR4IGRldjE9JXAgZGV2Mj0lcFxuIiwgaHduZCwKKwloRHJpdmVyLCBkZXYxLCBkZXYyKTsKKyAgcmV0dXJuIElEQ0FOQ0VMOworCisKKyNpZiAwCisgIHJldHVybiBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtMzJBKCBXSU5fR2V0V2luZG93SW5zdGFuY2UoIGh3bmQgKSwKKwlTWVNSRVNfR2V0UmVzUHRyKCBTWVNSRVNfRElBTE9HX1BTRFJWX0FEVkFOQ0VEU0VUVVAgKSwKKwlod25kLCBQU0RSVl9BZHZhbmNlZFNldHVwRGxnUHJvYzMyLCAoTFBBUkFNKSBOVUxMICk7CisjZW5kaWYKKworCit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKglQU0RSVl9FeHREZXZpY2VNb2RlMTYJW1dJTkVQUy45MF0KQEAgLTY0LDYgKzE4NCw3IEBACiBMUERFVk1PREUxNiBscGRtT3V0cHV0LCBMUFNUUiBscHN6RGV2aWNlLCBMUFNUUiBscHN6UG9ydCwKIExQREVWTU9ERTE2IGxwZG1JbnB1dCwgTFBTVFIgbHBzelByb2ZpbGUsIFdPUkQgZndNb2RlKQogeworICBQUklOVEVSSU5GTyAqcGkgPSBQU0RSVl9GaW5kUHJpbnRlckluZm8obHBzekRldmljZSk7CiAKICAgVFJBQ0UocHNkcnYsCiAiKGh3bmQ9JTA0eCwgaERyaXZlcj0lMDR4LCBkZXZPdXQ9JXAsIERldmljZT0nJXMnLCBQb3J0PSclcycsIGRldkluPSVwLCBQcm9maWxlPSclcycsIE1vZGU9JTA0eClcbiIsCkBAIC03MSwxNCArMTkyLDIzIEBACiBmd01vZGUpOwogCiAgIGlmKCFmd01vZGUpCi0gICAgcmV0dXJuIHNpemVvZihEZWZhdWx0RGV2TW9kZSk7CisgICAgcmV0dXJuIHNpemVvZihERVZNT0RFMTYpOyAvKiBKdXN0IGNvcHkgZG1QdWJsaWMgYml0IG9mIFBTRFJWX0RFVk1PREUgKi8KIAotICBpZihmd01vZGUgJiBETV9DT1BZKQotICAgIG1lbWNweShscGRtT3V0cHV0LCAmRGVmYXVsdERldk1vZGUsIHNpemVvZihEZWZhdWx0RGV2TW9kZSkpOwotICAKKyAgaWYoKGZ3TW9kZSAmIERNX1BST01QVCkgfHwgKGZ3TW9kZSAmIERNX1VQREFURSkpCisgICAgRklYTUUocHNkcnYsICJNb2RlICVkIG5vdCBpbXBsZW1lbnRlZFxuIiwgZndNb2RlKTsKKworICBpZihmd01vZGUgJiBETV9NT0RJRlkpIHsKKyAgICBUUkFDRShwc2RydiwgIkRNX01PRElGWSBzZXQuIGRldkluLT5kbUZpZWxkcyA9ICUwOGx4XG4iLCBscGRtSW5wdXQtPmRtRmllbGRzKTsKKyAgICBQU0RSVl9NZXJnZURldm1vZGVzKHBpLT5EZXZtb2RlLCAoUFNEUlZfREVWTU9ERTE2ICopbHBkbUlucHV0LCBwaSk7CisgIH0KKworICBpZihmd01vZGUgJiBETV9DT1BZKSB7CisgICAgbWVtY3B5KGxwZG1PdXRwdXQsIHBpLT5EZXZtb2RlLCBzaXplb2YoREVWTU9ERTE2KSk7CisgIH0KICAgcmV0dXJuIElET0s7CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqCVBTRFJWX0RldmljZUNhcGFiaWxpdGllczE2CVtXSU5FUFMuOTFdCkBAIC04NywzNyArMjE3LDg0IEBACiBEV09SRCBXSU5BUEkgUFNEUlZfRGV2aWNlQ2FwYWJpbGl0aWVzMTYoTFBTVFIgbHBzekRldmljZSwgTFBTVFIgbHBzelBvcnQsCiAgIFdPUkQgZndDYXBhYmlsaXR5LCBMUFNUUiBscHN6T3V0cHV0LCBMUERFVk1PREUxNiBscGRtKQogewotICBUUkFDRShwc2RydiwgIkNhcD0lZFxuIiwgZndDYXBhYmlsaXR5KTsKKyAgUFJJTlRFUklORk8gKnBpOworCisgIHBpID0gUFNEUlZfRmluZFByaW50ZXJJbmZvKGxwc3pEZXZpY2UpOworICBUUkFDRShwc2RydiwgIkNhcD0lZC4gR290IFByaW50ZXJJbmZvID0gJXBcbiIsIGZ3Q2FwYWJpbGl0eSwgcGkpOwogCiAgIHN3aXRjaChmd0NhcGFiaWxpdHkpIHsKIAogICBjYXNlIERDX1BBUEVSUzoKLSAgICBpZihscHN6T3V0cHV0ICE9IE5VTEwpCi0gICAgICBtZW1jcHkobHBzek91dHB1dCwgUGFwZXJzLCBzaXplb2YoUGFwZXJzKSk7Ci0gICAgcmV0dXJuIHNpemVvZihQYXBlcnMpIC8gc2l6ZW9mKFdPUkQpOworICAgIHsKKyAgICAgIFBBR0VTSVpFICpwczsKKyAgICAgIFdPUkQgKndwID0gKFdPUkQgKilscHN6T3V0cHV0OworICAgICAgaW50IGkgPSAwOworCisgICAgICBmb3IocHMgPSBwaS0+cHBkLT5QYWdlU2l6ZXM7IHBzOyBwcyA9IHBzLT5uZXh0LCBpKyspCisJaWYobHBzek91dHB1dCAhPSBOVUxMKQorCSAgKndwKysgPSBwcy0+V2luUGFnZTsKKyAgICAgIHJldHVybiBpOworICAgIH0KIAogICBjYXNlIERDX1BBUEVSU0laRToKLSAgICBpZihscHN6T3V0cHV0ICE9IE5VTEwpCi0gICAgICBtZW1jcHkobHBzek91dHB1dCwgUGFwZXJTaXplcywgc2l6ZW9mKFBhcGVyU2l6ZXMpKTsKLSAgICByZXR1cm4gc2l6ZW9mKFBhcGVyU2l6ZXMpIC8gc2l6ZW9mKFBPSU5UMTYpOworICAgIHsKKyAgICAgIFBBR0VTSVpFICpwczsKKyAgICAgIFBPSU5UMTYgKnB0ID0gKFBPSU5UMTYgKilscHN6T3V0cHV0OworICAgICAgaW50IGkgPSAwOwogCi0gIGNhc2UgRENfQklOUzoKLSAgICBpZihscHN6T3V0cHV0ICE9IE5VTEwpCi0gICAgICBtZW1jcHkobHBzek91dHB1dCwgQmlucywgc2l6ZW9mKEJpbnMpKTsKLSAgICByZXR1cm4gc2l6ZW9mKEJpbnMpIC8gc2l6ZW9mKFdPUkQpOwotICAgIAotICBjYXNlIERDX0JJTk5BTUVTOgotICAgIGlmKGxwc3pPdXRwdXQgIT0gTlVMTCkKLSAgICAgIG1lbWNweShscHN6T3V0cHV0LCBCaW5OYW1lcywgc2l6ZW9mKEJpbk5hbWVzKSk7Ci0gICAgcmV0dXJuIHNpemVvZihCaW5OYW1lcykgLyBzaXplb2YoQmluTmFtZXNbMF0pOworICAgICAgZm9yKHBzID0gcGktPnBwZC0+UGFnZVNpemVzOyBwczsgcHMgPSBwcy0+bmV4dCwgaSsrKQorCWlmKGxwc3pPdXRwdXQgIT0gTlVMTCkgeworCSAgcHQtPnggPSBwcy0+UGFwZXJEaW1lbnNpb24tPnggKiAyNTQuMCAvIDcyLjA7CisJICBwdC0+eSA9IHBzLT5QYXBlckRpbWVuc2lvbi0+eSAqIDI1NC4wIC8gNzIuMDsKKwkgIHB0Kys7CisJfQorICAgICAgcmV0dXJuIGk7CisgICAgfQogCiAgIGNhc2UgRENfUEFQRVJOQU1FUzoKLSAgICBpZihscHN6T3V0cHV0ICE9IE5VTEwpCi0gICAgICBtZW1jcHkobHBzek91dHB1dCwgUGFwZXJOYW1lcywgc2l6ZW9mKFBhcGVyTmFtZXMpKTsKLSAgICByZXR1cm4gc2l6ZW9mKFBhcGVyTmFtZXMpIC8gc2l6ZW9mKFBhcGVyTmFtZXNbMF0pOworICAgIHsKKyAgICAgIFBBR0VTSVpFICpwczsKKyAgICAgIGNoYXIgKmNwID0gbHBzek91dHB1dDsKKyAgICAgIGludCBpID0gMDsKKworICAgICAgZm9yKHBzID0gcGktPnBwZC0+UGFnZVNpemVzOyBwczsgcHMgPSBwcy0+bmV4dCwgaSsrKQorCWlmKGxwc3pPdXRwdXQgIT0gTlVMTCkgeworCSAgc3RybmNweShjcCwgcHMtPkZ1bGxOYW1lLCA2NCk7CisJICAqKGNwICsgNjMpID0gJ1wwJzsKKwkgIGNwICs9IDY0OworCX0KKyAgICAgIHJldHVybiBpOworICAgIH0KIAogICBjYXNlIERDX09SSUVOVEFUSU9OOgotICAgIHJldHVybiA5MDsKKyAgICByZXR1cm4gcGktPnBwZC0+TGFuZHNjYXBlT3JpZW50YXRpb24gPyBwaS0+cHBkLT5MYW5kc2NhcGVPcmllbnRhdGlvbiA6IDkwOworCisgIGNhc2UgRENfQklOUzoKKyAgICB7CisgICAgICBJTlBVVFNMT1QgKnNsb3Q7CisgICAgICBXT1JEICp3cCA9IChXT1JEICopbHBzek91dHB1dDsKKyAgICAgIGludCBpID0gMDsKKworICAgICAgZm9yKHNsb3QgPSBwaS0+cHBkLT5JbnB1dFNsb3RzOyBzbG90OyBzbG90ID0gc2xvdC0+bmV4dCwgaSsrKQorCWlmKGxwc3pPdXRwdXQgIT0gTlVMTCkKKwkgICp3cCsrID0gc2xvdC0+V2luQmluOworICAgICAgcmV0dXJuIGk7CisgICAgfQorCisgIGNhc2UgRENfQklOTkFNRVM6CisgICAgeworICAgICAgSU5QVVRTTE9UICpzbG90OworICAgICAgY2hhciAqY3AgPSBscHN6T3V0cHV0OworICAgICAgaW50IGkgPSAwOworICAgICAgCisgICAgICBmb3Ioc2xvdCA9IHBpLT5wcGQtPklucHV0U2xvdHM7IHNsb3Q7IHNsb3QgPSBzbG90LT5uZXh0LCBpKyspCisJaWYobHBzek91dHB1dCAhPSBOVUxMKSB7CisJICBzdHJuY3B5KGNwLCBzbG90LT5GdWxsTmFtZSwgMjQpOworCSAgKihjcCArIDIzKSA9ICdcMCc7CisJICBjcCArPSAyNDsKKwl9CisgICAgICByZXR1cm4gaTsKKyAgICB9CiAKICAgY2FzZSBEQ19FTlVNUkVTT0xVVElPTlM6CiAgICAgaWYobHBzek91dHB1dCAhPSBOVUxMKQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvcHNkcnYvZXNjYXBlLmMgYi9ncmFwaGljcy9wc2Rydi9lc2NhcGUuYwppbmRleCAwMzY1ODJiLi5kNWY0NmU1IDEwMDY0NAotLS0gYS9ncmFwaGljcy9wc2Rydi9lc2NhcGUuYworKysgYi9ncmFwaGljcy9wc2Rydi9lc2NhcGUuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKglQb3N0c2NyaXB0IGRyaXZlciBFc2NhcGUgZnVuY3Rpb24KKyAqCVBvc3RTY3JpcHQgZHJpdmVyIEVzY2FwZSBmdW5jdGlvbgogICoKICAqCUNvcHlyaWdodCAxOTk4ICBIdXcgRCBNIERhdmllcwogICovCmRpZmYgLS1naXQgYS9ncmFwaGljcy9wc2Rydi9mb250LmMgYi9ncmFwaGljcy9wc2Rydi9mb250LmMKaW5kZXggZmM3ZTVkNS4uNmFiYWIzNSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvcHNkcnYvZm9udC5jCisrKyBiL2dyYXBoaWNzL3BzZHJ2L2ZvbnQuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKglQb3N0c2NyaXB0IGRyaXZlciBmb250IGZ1bmN0aW9ucworICoJUG9zdFNjcmlwdCBkcml2ZXIgZm9udCBmdW5jdGlvbnMKICAqCiAgKglDb3B5cmlnaHQgMTk5OCAgSHV3IEQgTSBEYXZpZXMKICAqCkBAIC0yMiw4ICsyMiw5IEBACiAgICAgUFNEUlZfUERFVklDRSAqcGh5c0RldiA9IChQU0RSVl9QREVWSUNFICopZGMtPnBoeXNEZXY7CiAgICAgTE9HRk9OVDE2ICpsZiA9ICYoZm9udC0+bG9nZm9udCk7CiAgICAgQk9PTDMyIGJkID0gRkFMU0UsIGl0ID0gRkFMU0U7CisgICAgQUZNTElTVEVOVFJZICphZm1sZTsKICAgICBBRk0gKmFmbTsKLSAgICBGb250RmFtaWx5ICpmYW1pbHk7CisgICAgRk9OVEZBTUlMWSAqZmFtaWx5OwogICAgIGNoYXIgRmFjZU5hbWVbTEZfRkFDRVNJWkVdOwogCiAKQEAgLTY5LDM5ICs3MCw0MiBAQAogCX0KICAgICB9CiAKLSAgICBmb3IoZmFtaWx5ID0gUFNEUlZfQUZNRm9udExpc3Q7IGZhbWlseTsgZmFtaWx5ID0gZmFtaWx5LT5uZXh0KSB7CisgICAgZm9yKGZhbWlseSA9IHBoeXNEZXYtPnBpLT5Gb250czsgZmFtaWx5OyBmYW1pbHkgPSBmYW1pbHktPm5leHQpIHsKICAgICAgICAgaWYoIWxzdHJuY21wMzJBKEZhY2VOYW1lLCBmYW1pbHktPkZhbWlseU5hbWUsIAogCQkJICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihmYW1pbHktPkZhbWlseU5hbWUpKSkKIAkgICAgYnJlYWs7CiAgICAgfQogICAgIGlmKCFmYW1pbHkpCi0gICAgICAgIGZhbWlseSA9IFBTRFJWX0FGTUZvbnRMaXN0OworICAgICAgICBmYW1pbHkgPSBwaHlzRGV2LT5waS0+Rm9udHM7CiAKICAgICAKLSAgICBmb3IoYWZtID0gZmFtaWx5LT5hZm07IGFmbTsgYWZtID0gYWZtLT5uZXh0KSB7Ci0gICAgICAgIGlmKCAoYmQgPT0gKGFmbS0+V2VpZ2h0ID09IEZXX0JPTEQpKSAmJiAKLQkgICAgKGl0ID09IChhZm0tPkl0YWxpY0FuZ2xlICE9IDAuMCkpICkKKyAgICBmb3IoYWZtbGUgPSBmYW1pbHktPmFmbWxpc3Q7IGFmbWxlOyBhZm1sZSA9IGFmbWxlLT5uZXh0KSB7CisgICAgICAgIGlmKCAoYmQgPT0gKGFmbWxlLT5hZm0tPldlaWdodCA9PSBGV19CT0xEKSkgJiYgCisJICAgIChpdCA9PSAoYWZtbGUtPmFmbS0+SXRhbGljQW5nbGUgIT0gMC4wKSkgKQogCSAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIGlmKCFhZm0pCi0gICAgICAgIGFmbSA9IGZhbWlseS0+YWZtOyAvKiBub3QgaWRlYWwgKi8KKyAgICBpZighYWZtbGUpCisgICAgICAgIGFmbWxlID0gZmFtaWx5LT5hZm1saXN0OyAvKiBub3QgaWRlYWwgKi8KICAgICAKLSAgICBwaHlzRGV2LT5mb250LmFmbSA9IGFmbTsKLSAgICBwaHlzRGV2LT5mb250LnNpemUgPSBZTFNUT0RTKGRjLCBsZi0+bGZIZWlnaHQpOwotICAgIGlmKHBoeXNEZXYtPmZvbnQuc2l6ZSA8IDApIHsKLSAgICAgICAgVFJBQ0UocHNkcnYsICJwaHlzRGV2LT5mb250LnNpemUgPCAwXG4iKTsKLSAgICAgICAgcGh5c0Rldi0+Zm9udC5zaXplID0gYWJzKHBoeXNEZXYtPmZvbnQuc2l6ZSk7Ci0gICAgICAgIFRSQUNFKHBzZHJ2LCAicGh5c0Rldi0+Zm9udC5zaXplIG5vdyAlZFxuIiwgcGh5c0Rldi0+Zm9udC5zaXplKTsKLSAgICB9Ci0gICAgcGh5c0Rldi0+Zm9udC5zY2FsZSA9IHBoeXNEZXYtPmZvbnQuc2l6ZSAvIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFmbS0+QXNjZW5kZXIgLSBhZm0tPkRlc2NlbmRlcik7CisgICAgYWZtID0gYWZtbGUtPmFmbTsKIAorICAgIHBoeXNEZXYtPmZvbnQuYWZtID0gYWZtOworICAgIHBoeXNEZXYtPmZvbnQudG0udG1IZWlnaHQgPSBZTFNUT0RTKGRjLCBsZi0+bGZIZWlnaHQpOworICAgIGlmKHBoeXNEZXYtPmZvbnQudG0udG1IZWlnaHQgPCAwKSB7CisgICAgICAgIHBoeXNEZXYtPmZvbnQudG0udG1IZWlnaHQgKj0gLSAoYWZtLT5GdWxsQXNjZW5kZXIgLSBhZm0tPkRlc2NlbmRlcikgLworCQkJCSAgICAgICAoYWZtLT5Bc2NlbmRlciAtIGFmbS0+RGVzY2VuZGVyKTsKKwlUUkFDRShwc2RydiwgIkZpeGVkIC12ZSBoZWlnaHQgdG8gJWRcbiIsIHBoeXNEZXYtPmZvbnQudG0udG1IZWlnaHQpOworICAgIH0KKyAgICBwaHlzRGV2LT5mb250LnNpemUgPSBwaHlzRGV2LT5mb250LnRtLnRtSGVpZ2h0ICogMTAwMC4wIC8KKwkJCQkoYWZtLT5GdWxsQXNjZW5kZXIgLSBhZm0tPkRlc2NlbmRlcik7CisgICAgcGh5c0Rldi0+Zm9udC5zY2FsZSA9IHBoeXNEZXYtPmZvbnQuc2l6ZSAvIDEwMDAuMDsKICAgICBwaHlzRGV2LT5mb250LmVzY2FwZW1lbnQgPSBsZi0+bGZFc2NhcGVtZW50OwotICAgIHBoeXNEZXYtPmZvbnQudG0udG1IZWlnaHQgPSBwaHlzRGV2LT5mb250LnNpemU7Ci0gICAgcGh5c0Rldi0+Zm9udC50bS50bUFzY2VudCA9IGFmbS0+QXNjZW5kZXIgKiBwaHlzRGV2LT5mb250LnNjYWxlOworICAgIHBoeXNEZXYtPmZvbnQudG0udG1Bc2NlbnQgPSBhZm0tPkZ1bGxBc2NlbmRlciAqIHBoeXNEZXYtPmZvbnQuc2NhbGU7CiAgICAgcGh5c0Rldi0+Zm9udC50bS50bURlc2NlbnQgPSAtYWZtLT5EZXNjZW5kZXIgKiBwaHlzRGV2LT5mb250LnNjYWxlOwotICAgIHBoeXNEZXYtPmZvbnQudG0udG1JbnRlcm5hbExlYWRpbmcgPSBwaHlzRGV2LT5mb250LnRtLnRtSGVpZ2h0ICogMC4yOwotICAgIHBoeXNEZXYtPmZvbnQudG0udG1FeHRlcm5hbExlYWRpbmcgPSBwaHlzRGV2LT5mb250LnRtLnRtSGVpZ2h0ICogMC4yOworICAgIHBoeXNEZXYtPmZvbnQudG0udG1JbnRlcm5hbExlYWRpbmcgPSAoYWZtLT5GdWxsQXNjZW5kZXIgLSBhZm0tPkFzY2VuZGVyKQorCQkJCQkJKiBwaHlzRGV2LT5mb250LnNjYWxlOworICAgIHBoeXNEZXYtPmZvbnQudG0udG1FeHRlcm5hbExlYWRpbmcgPSAoMTAwMC4wIC0gYWZtLT5GdWxsQXNjZW5kZXIpCisJCQkJCQkqIHBoeXNEZXYtPmZvbnQuc2NhbGU7IC8qID8/ICovCiAgICAgcGh5c0Rldi0+Zm9udC50bS50bUF2ZUNoYXJXaWR0aCA9IGFmbS0+Q2hhcldpZHRoc1sxMjBdICogLyogeCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c0Rldi0+Zm9udC5zY2FsZTsKICAgICBwaHlzRGV2LT5mb250LnRtLnRtTWF4Q2hhcldpZHRoID0gYWZtLT5DaGFyV2lkdGhzWzc3XSAqIC8qIE0gKi8KQEAgLTEyNCwxMCArMTI4LDE0IEBACiAKICAgICBwaHlzRGV2LT5mb250LnNldCA9IEZBTFNFOwogCi0gICAgVFJBQ0UocHNkcnYsICJTZWxlY3RlZCBQUyBmb250ICclcycgc2l6ZSAlZCB3ZWlnaHQgJWRcbiIsIAorICAgIFRSQUNFKHBzZHJ2LCAiU2VsZWN0ZWQgUFMgZm9udCAnJXMnIHNpemUgJWQgd2VpZ2h0ICVkLlxuIiwgCiAJICBwaHlzRGV2LT5mb250LmFmbS0+Rm9udE5hbWUsIHBoeXNEZXYtPmZvbnQuc2l6ZSwKIAkgIHBoeXNEZXYtPmZvbnQudG0udG1XZWlnaHQgKTsKLSAgICAKKyAgICBUUkFDRShwc2RydiwgIkggPSAlZCBBcyA9ICVkIERlcyA9ICVkIElMID0gJWQgRUwgPSAlZFxuIiwKKwkgIHBoeXNEZXYtPmZvbnQudG0udG1IZWlnaHQsIHBoeXNEZXYtPmZvbnQudG0udG1Bc2NlbnQsCisJICBwaHlzRGV2LT5mb250LnRtLnRtRGVzY2VudCwgcGh5c0Rldi0+Zm9udC50bS50bUludGVybmFsTGVhZGluZywKKwkgIHBoeXNEZXYtPmZvbnQudG0udG1FeHRlcm5hbExlYWRpbmcpOworCiAgICAgcmV0dXJuIHByZXZmb250OwogfQogCkBAIC0xNTYsMTAgKzE2NCwxMiBAQAogICAgIHNpemUtPmN5ID0gWURTVE9MUyhkYywgcGh5c0Rldi0+Zm9udC50bS50bUhlaWdodCk7CiAgICAgd2lkdGggPSAwLjA7CiAKLSAgICBmb3IoaSA9IDA7IGkgPCBjb3VudCAmJiBzdHJbaV07IGkrKykKKyAgICBmb3IoaSA9IDA7IGkgPCBjb3VudCAmJiBzdHJbaV07IGkrKykgewogICAgICAgICB3aWR0aCArPSBwaHlzRGV2LT5mb250LmFmbS0+Q2hhcldpZHRoc1sgKFVJTlQzMilzdHJbaV0gXTsKLSAgICAKKwlUUkFDRShwc2RydiwgIldpZHRoIGFmdGVyICVkdGggY2hhciAnJWMnID0gJWZcbiIsIGksIHN0cltpXSwgd2lkdGgpOworICAgIH0KICAgICB3aWR0aCAqPSBwaHlzRGV2LT5mb250LnNjYWxlOworICAgIFRSQUNFKHBzZHJ2LCAiV2lkdGggYWZ0ZXIgc2NhbGUgKCVmKSBpcyAlZlxuIiwgcGh5c0Rldi0+Zm9udC5zY2FsZSwgd2lkdGgpOwogICAgIHNpemUtPmN4ID0gWERTVE9MUyhkYywgd2lkdGgpOwogCiAgICAgcmV0dXJuIFRSVUU7CkBAIC0xODksMTIgKzE5OSwxMyBAQAogICAgICAgICAgICAgICBFTlVNTE9HRk9OVEVYMTYgKnBMRiwgSU5UMTYgc2l6ZSkKIAogeworICAgIGZsb2F0IHNjYWxlID0gc2l6ZSAvIChwYWZtLT5GdWxsQXNjZW5kZXIgLSBwYWZtLT5EZXNjZW5kZXIpOwogICAgIG1lbXNldCggcExGLCAwLCBzaXplb2YoKnBMRikgKTsKICAgICBtZW1zZXQoIHBUTSwgMCwgc2l6ZW9mKCpwVE0pICk7CiAKICNkZWZpbmUgcGxmICgoTFBMT0dGT05UMTYpcExGKQogICAgIHBsZi0+bGZIZWlnaHQgICAgPSBwVE0tPnRtSGVpZ2h0ICAgICAgID0gc2l6ZTsKLSAgICBwbGYtPmxmV2lkdGggICAgID0gcFRNLT50bUF2ZUNoYXJXaWR0aCA9IHNpemUgKiAwLjc7CisgICAgcGxmLT5sZldpZHRoICAgICA9IHBUTS0+dG1BdmVDaGFyV2lkdGggPSBwYWZtLT5DaGFyV2lkdGhzWzEyMF0gKiBzY2FsZTsKICAgICBwbGYtPmxmV2VpZ2h0ICAgID0gcFRNLT50bVdlaWdodCAgICAgICA9IHBhZm0tPldlaWdodDsKICAgICBwbGYtPmxmSXRhbGljICAgID0gcFRNLT50bUl0YWxpYyAgICAgICA9IHBhZm0tPkl0YWxpY0FuZ2xlICE9IDAuMDsKICAgICBwbGYtPmxmVW5kZXJsaW5lID0gcFRNLT50bVVuZGVybGluZWQgICA9IDA7CkBAIC0yMTAsMTAgKzIyMSwxMCBAQAogICAgIGxzdHJjcHluMzJBKCBwbGYtPmxmRmFjZU5hbWUsIHBhZm0tPkZhbWlseU5hbWUsIExGX0ZBQ0VTSVpFICk7CiAjdW5kZWYgcGxmCiAKLSAgICBwVE0tPnRtQXNjZW50ID0gcFRNLT50bUhlaWdodCAqIDAuMjsKLSAgICBwVE0tPnRtRGVzY2VudCA9IHBUTS0+dG1IZWlnaHQgLSBwVE0tPnRtQXNjZW50OwotICAgIHBUTS0+dG1JbnRlcm5hbExlYWRpbmcgPSBwVE0tPnRtSGVpZ2h0ICogMC4yOwotICAgIHBUTS0+dG1NYXhDaGFyV2lkdGggPSBwVE0tPnRtSGVpZ2h0ICogMC43OworICAgIHBUTS0+dG1Bc2NlbnQgPSBwYWZtLT5GdWxsQXNjZW5kZXIgKiBzY2FsZTsKKyAgICBwVE0tPnRtRGVzY2VudCA9IC1wYWZtLT5EZXNjZW5kZXIgKiBzY2FsZTsKKyAgICBwVE0tPnRtSW50ZXJuYWxMZWFkaW5nID0gKHBhZm0tPkZ1bGxBc2NlbmRlciAtIHBhZm0tPkFzY2VuZGVyKSAqIHNjYWxlOworICAgIHBUTS0+dG1NYXhDaGFyV2lkdGggPSBwYWZtLT5DaGFyV2lkdGhzWzc3XSAqIHNjYWxlOwogICAgIHBUTS0+dG1EaWdpdGl6ZWRBc3BlY3RYID0gZGMtPncuZGV2Q2Fwcy0+bG9nUGl4ZWxzWTsKICAgICBwVE0tPnRtRGlnaXRpemVkQXNwZWN0WSA9IGRjLT53LmRldkNhcHMtPmxvZ1BpeGVsc1g7CiAKQEAgLTIzNCwyMSArMjQ1LDIzIEBACiAgICAgRU5VTUxPR0ZPTlRFWDE2CWxmOwogICAgIE5FV1RFWFRNRVRSSUMxNgl0bTsKICAgICBCT09MMzIJICAJYiwgYlJldCA9IDA7Ci0gICAgQUZNCQkJKmFmbTsKLSAgICBGb250RmFtaWx5CQkqZmFtaWx5OworICAgIEFGTUxJU1RFTlRSWQkqYWZtbGU7CisgICAgRk9OVEZBTUlMWQkJKmZhbWlseTsKKyAgICBQU0RSVl9QREVWSUNFCSpwaHlzRGV2ID0gKFBTRFJWX1BERVZJQ0UgKilkYy0+cGh5c0RldjsKIAogICAgIGlmKCBwbGYtPmxmRmFjZU5hbWVbMF0gKSB7CiAgICAgICAgIFRSQUNFKHBzZHJ2LCAibGZGYWNlTmFtZSA9ICclcydcbiIsIHBsZi0+bGZGYWNlTmFtZSk7Ci0gICAgICAgIGZvcihmYW1pbHkgPSBQU0RSVl9BRk1Gb250TGlzdDsgZmFtaWx5OyBmYW1pbHkgPSBmYW1pbHktPm5leHQpIHsKKyAgICAgICAgZm9yKGZhbWlseSA9IHBoeXNEZXYtPnBpLT5Gb250czsgZmFtaWx5OyBmYW1pbHkgPSBmYW1pbHktPm5leHQpIHsKICAgICAgICAgICAgIGlmKCFsc3RybmNtcDMyQShwbGYtPmxmRmFjZU5hbWUsIGZhbWlseS0+RmFtaWx5TmFtZSwgCiAJCQlzdHJsZW4oZmFtaWx5LT5GYW1pbHlOYW1lKSkpCiAJICAgICAgICBicmVhazsKIAl9CiAJaWYoZmFtaWx5KSB7Ci0JICAgIGZvcihhZm0gPSBmYW1pbHktPmFmbTsgYWZtOyBhZm0gPSBhZm0tPm5leHQpIHsKLQkgICAgICAgIFRSQUNFKHBzZHJ2LCAiR290ICclcydcbiIsIGFmbS0+Rm9udE5hbWUpOworCSAgICBmb3IoYWZtbGUgPSBmYW1pbHktPmFmbWxpc3Q7IGFmbWxlOyBhZm1sZSA9IGFmbWxlLT5uZXh0KSB7CisJICAgICAgICBUUkFDRShwc2RydiwgIkdvdCAnJXMnXG4iLCBhZm1sZS0+YWZtLT5Gb250TmFtZSk7CiAJCWlmKCAoYiA9ICgqcHJvYykoIChMUEVOVU1MT0dGT05UMTYpJmxmLCAmdG0sIAotCQkJUFNEUlZfR2V0Rm9udE1ldHJpYyggZGMsIGFmbSwgJnRtLCAmbGYsIDIwMCApLCBscCApKSApCisJCQlQU0RSVl9HZXRGb250TWV0cmljKCBkYywgYWZtbGUtPmFmbSwgJnRtLCAmbGYsIDIwMCApLAorCQkJCSAgbHAgKSkgKQogCQkgICAgIGJSZXQgPSBiOwogCQllbHNlIGJyZWFrOwogCSAgICB9CkBAIC0yNTYsMTEgKzI2OSwxMiBAQAogICAgIH0gZWxzZSB7CiAKICAgICAgICAgVFJBQ0UocHNkcnYsICJsZkZhY2VOYW1lID0gTlVMTFxuIik7Ci0gICAgICAgIGZvcihmYW1pbHkgPSBQU0RSVl9BRk1Gb250TGlzdDsgZmFtaWx5OyBmYW1pbHkgPSBmYW1pbHktPm5leHQpIHsKLQkgICAgYWZtID0gZmFtaWx5LT5hZm07Ci0JICAgIFRSQUNFKHBzZHJ2LCAiR290ICclcydcbiIsIGFmbS0+Rm9udE5hbWUpOworICAgICAgICBmb3IoZmFtaWx5ID0gcGh5c0Rldi0+cGktPkZvbnRzOyBmYW1pbHk7IGZhbWlseSA9IGZhbWlseS0+bmV4dCkgeworCSAgICBhZm1sZSA9IGZhbWlseS0+YWZtbGlzdDsKKwkgICAgVFJBQ0UocHNkcnYsICJHb3QgJyVzJ1xuIiwgYWZtbGUtPmFmbS0+Rm9udE5hbWUpOwogCSAgICBpZiggKGIgPSAoKnByb2MpKCAoTFBFTlVNTE9HRk9OVDE2KSZsZiwgJnRtLCAKLQkJICAgUFNEUlZfR2V0Rm9udE1ldHJpYyggZGMsIGFmbSwgJnRtLCAmbGYsIDIwMCApLCBscCApKSApCisJCSAgIFBTRFJWX0dldEZvbnRNZXRyaWMoIGRjLCBhZm1sZS0+YWZtLCAmdG0sICZsZiwgMjAwICksIAorCQkJICAgICAgbHAgKSkgKQogCSAgICAgICAgYlJldCA9IGI7CiAJICAgIGVsc2UgYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvcHNkcnYvZ3JhcGhpY3MuYyBiL2dyYXBoaWNzL3BzZHJ2L2dyYXBoaWNzLmMKaW5kZXggZWJjNGMyZS4uOWIwZTAyZCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvcHNkcnYvZ3JhcGhpY3MuYworKysgYi9ncmFwaGljcy9wc2Rydi9ncmFwaGljcy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqCVBvc3RzY3JpcHQgZHJpdmVyIGdyYXBoaWNzIGZ1bmN0aW9ucworICoJUG9zdFNjcmlwdCBkcml2ZXIgZ3JhcGhpY3MgZnVuY3Rpb25zCiAgKgogICoJQ29weXJpZ2h0IDE5OTggIEh1dyBEIE0gRGF2aWVzCiAgKgpAQCAtNzEsMyArNzEsNDEgQEAKICAgICAKICAgICByZXR1cm4gVFJVRTsKIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBQU0RSVl9Qb2x5bGluZQorICovCitCT09MMzIgUFNEUlZfUG9seWxpbmUoIERDICpkYywgY29uc3QgTFBQT0lOVDMyIHB0LCBJTlQzMiBjb3VudCApCit7CisgICAgSU5UMzIgaTsKKyAgICBUUkFDRShwc2RydiwgImNvdW50ID0gJWRcbiIsIGNvdW50KTsKKyAgICAKKyAgICBQU0RSVl9Xcml0ZU1vdmVUbyhkYywgWExQVE9EUChkYywgcHRbMF0ueCksIFlMUFRPRFAoZGMsIHB0WzBdLnkpKTsKKyAgICBmb3IoaSA9IDE7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICBQU0RSVl9Xcml0ZUxpbmVUbyhkYywgWExQVE9EUChkYywgcHRbaV0ueCksIFlMUFRPRFAoZGMsIHB0W2ldLnkpKTsKKyAgICBQU0RSVl9Xcml0ZVN0cm9rZShkYyk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgUFNEUlZfUG9seWdvbgorICovCitCT09MMzIgUFNEUlZfUG9seWdvbiggREMgKmRjLCBMUFBPSU5UMzIgcHQsIElOVDMyIGNvdW50ICkKK3sKKyAgICBJTlQzMiBpOworICAgIFRSQUNFKHBzZHJ2LCAiY291bnQgPSAlZFxuIiwgY291bnQpOworICAgIEZJWE1FKHBzZHJ2LCAiSGFjayFcbiIpOworICAgIFBTRFJWX1dyaXRlTW92ZVRvKGRjLCBYTFBUT0RQKGRjLCBwdFswXS54KSwgWUxQVE9EUChkYywgcHRbMF0ueSkpOworICAgIGZvcihpID0gMTsgaSA8IGNvdW50OyBpKyspCisgICAgICAgIFBTRFJWX1dyaXRlTGluZVRvKGRjLCBYTFBUT0RQKGRjLCBwdFtpXS54KSwgWUxQVE9EUChkYywgcHRbaV0ueSkpOworCisgICAgaWYocHRbMF0ueCAhPSBwdFtjb3VudC0xXS54IHx8IHB0WzBdLnkgIT0gcHRbY291bnQtMV0ueSkKKyAgICAgICAgUFNEUlZfV3JpdGVMaW5lVG8oZGMsIFhMUFRPRFAoZGMsIHB0WzBdLngpLCBZTFBUT0RQKGRjLCBwdFswXS55KSk7CisKKyAgICBQU0RSVl9Xcml0ZVN0cm9rZShkYyk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvcHNkcnYvaW5pdC5jIGIvZ3JhcGhpY3MvcHNkcnYvaW5pdC5jCmluZGV4IGU2OGY2NGMuLjMxOTUyMDAgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3BzZHJ2L2luaXQuYworKysgYi9ncmFwaGljcy9wc2Rydi9pbml0LmMKQEAgLTEsMTUgKzEsMTggQEAKIC8qCi0gKglQb3N0c2NyaXB0IGRyaXZlciBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKKyAqCVBvc3RTY3JpcHQgZHJpdmVyIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucwogICoKICAqCUNvcHlyaWdodCAxOTk4IEh1dyBEIE0gRGF2aWVzCiAgKgogICovCiAKLSNpbmNsdWRlICJ3aW5kb3dzLmgiCi0jaW5jbHVkZSAiZ2RpLmgiCi0jaW5jbHVkZSAicHNkcnYuaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgImhlYXAuaCIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8Z2RpLmg+CisjaW5jbHVkZSA8cHNkcnYuaD4KKyNpbmNsdWRlIDxkZWJ1Zy5oPgorI2luY2x1ZGUgPGhlYXAuaD4KKyNpbmNsdWRlIDx3aW5yZWcuaD4KKyNpbmNsdWRlIDxwcmludC5oPgorI2luY2x1ZGUgPHdpbmVycm9yLmg+CiAKIHN0YXRpYyBCT09MMzIgUFNEUlZfQ3JlYXRlREMoIERDICpkYywgTFBDU1RSIGRyaXZlciwgTFBDU1RSIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgb3V0cHV0LCBjb25zdCBERVZNT0RFMTYqIGluaXREYXRhICk7CkBAIC00Niw5ICs0OSw5IEBACiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFBpZSAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBQb2x5UG9seWdvbiAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBQb2x5UG9seWxpbmUgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwUG9seWdvbiAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBQb2x5bGluZSAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBQb2x5QmV6aWVyICovCisgICAgUFNEUlZfUG9seWdvbiwgICAgICAgICAgICAgICAgICAgLyogcFBvbHlnb24gKi8KKyAgICBQU0RSVl9Qb2x5bGluZSwgICAgICAgICAgICAgICAgICAvKiBwUG9seWxpbmUgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwUG9seUJlemllciAqLwkJICAgICAKICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwUmVhbGl6ZVBhbGV0dGUgKi8KICAgICBQU0RSVl9SZWN0YW5nbGUsICAgICAgICAgICAgICAgICAvKiBwUmVjdGFuZ2xlICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFJlc3RvcmVEQyAqLwpAQCAtODgsMTAgKzkxLDEwIEBACiBzdGF0aWMgRGV2aWNlQ2FwcyBQU0RSVl9EZXZDYXBzID0gewogLyogdmVyc2lvbiAqLwkJMCwgCiAvKiB0ZWNobm9sb2d5ICovCURUX1JBU1BSSU5URVIsCi0vKiBob3J6U2l6ZSAqLwkJMjAwLAotLyogdmVydFNpemUgKi8JCTI4OCwKLS8qIGhvcnpSZXMgKi8JCTQ3MzMsCi0vKiB2ZXJ0UmVzICovCQk2ODA4LCAKKy8qIGhvcnpTaXplICovCQkyMTAsCisvKiB2ZXJ0U2l6ZSAqLwkJMjk3LAorLyogaG9yelJlcyAqLwkJNDk2MSwKKy8qIHZlcnRSZXMgKi8JCTcwMTYsIAogLyogYml0c1BpeGVsICovCQkxLAogLyogcGxhbmVzICovCQkxLAogLyogbnVtQnJ1c2hlcyAqLwktMSwKQEAgLTEwOCw3ICsxMTEsNyBAQAogLyogcG9seWdvYWxuQ2FwcyAqLwlQQ19QT0xZR09OIHwgUENfUkVDVEFOR0xFIHwgUENfV0lORFBPTFlHT04gfAogCQkJUENfU0NBTkxJTkUgfCBQQ19XSURFIHwgUENfU1RZTEVEIHwgUENfV0lERVNUWUxFRCB8CiAJCQlQQ19JTlRFUklPUlMsCi0vKiB0ZXh0Q2FwcyAqLwkJMCwgLyogcHNkcnYgMHg1OWY3ICovCisvKiB0ZXh0Q2FwcyAqLwkJVENfQ1JfQU5ZLCAvKiBwc2RydiAweDU5ZjcgKi8KIC8qIGNsaXBDYXBzICovCQlDUF9SRUNUQU5HTEUsCiAvKiByYXN0ZXJDYXBzICovCVJDX0JJVEJMVCB8IFJDX0JBTkRJTkcgfCBSQ19TQ0FMSU5HIHwgUkNfQklUTUFQNjQgfAogCQkJUkNfRElfQklUTUFQIHwgUkNfRElCVE9ERVYgfCBSQ19CSUdGT05UIHwKQEAgLTEyNCw2ICsxMjcsNDggQEAKIC8qIHBhbGV0dGUgc2l6ZSAqLwkwLAogLyogLi5ldGMgKi8JCTAsIDAgfTsKIAorc3RhdGljIFBTRFJWX0RFVk1PREUxNiBEZWZhdWx0RGV2bW9kZSA9IAoreworICB7IC8qIGRtUHVibGljICovCisvKiBkbURldmljZU5hbWUgKi8JIldpbmUgUG9zdFNjcmlwdCBEcml2ZXIiLAorLyogZG1TcGVjVmVyc2lvbiAqLwkweDMwYSwKKy8qIGRtRHJpdmVyVmVyc2lvbiAqLwkweDAwMSwKKy8qIGRtU2l6ZSAqLwkJc2l6ZW9mKERFVk1PREUxNiksCisvKiBkbURyaXZlckV4dHJhICovCTAsCisvKiBkbUZpZWxkcyAqLwkJRE1fT1JJRU5UQVRJT04gfCBETV9QQVBFUlNJWkUgfCBETV9QQVBFUkxFTkdUSCB8CisJCQlETV9QQVBFUldJRFRIIHwgRE1fU0NBTEUgfCBETV9DT1BJRVMgfCAKKwkJCURNX0RFRkFVTFRTT1VSQ0UgfCBETV9DT0xPUiB8IERNX0RVUExFWCB8IAorCQkJRE1fWVJFU09MVVRJT04gfCBETV9UVE9QVElPTiwKKy8qIGRtT3JpZW50YXRpb24gKi8JRE1PUklFTlRfUE9SVFJBSVQsCisvKiBkbVBhcGVyU2l6ZSAqLwlETVBBUEVSX0E0LAorLyogZG1QYXBlckxlbmd0aCAqLwkyOTY5LAorLyogZG1QYXBlcldpZHRoICovICAgICAgMjEwMSwKKy8qIGRtU2NhbGUgKi8JCTEwMCwgLyogPz8gKi8KKy8qIGRtQ29waWVzICovCQkxLAorLyogZG1EZWZhdWx0U291cmNlICovCURNQklOX0FVVE8sCisvKiBkbVByaW50UXVhbGl0eSAqLwkwLAorLyogZG1Db2xvciAqLwkJRE1DT0xPUl9NT05PQ0hST01FLAorLyogZG1EdXBsZXggKi8JCTAsCisvKiBkbVlSZXNvbHV0aW9uICovCTAsCisvKiBkbVRUT3B0aW9uICovCURNVFRfU1VCREVWLAorLyogZG1Db2xsYXRlICovCQkwLAorLyogZG1Gb3JtTmFtZSAqLwkiIiwKKy8qIGRtVW51c2VkUGFkZGluZyAqLyAgIDAsCisvKiBkbUJpdHNQZXJQZWwgKi8JMCwKKy8qIGRtUGVsc1dpZHRoICovCTAsCisvKiBkbVBlbHNIZWlnaHQgKi8JMCwKKy8qIGRtRGlzcGxheUZsYWdzICovCTAsCisvKiBkbURpc3BsYXlGcmVxdWVuY3kgKi8gMAorICB9LAorICB7IC8qIGRtRG9jUHJpdmF0ZSAqLworICB9LAorICB7IC8qIGRtRHJ2UHJpdmF0ZSAqLworLyogcHBkZmlsZW5hbWUgKi8JImRlZmF1bHQucHBkIgorICB9Cit9OworCitIQU5ETEUzMiBQU0RSVl9IZWFwID0gMDsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJICAgICBQU0RSVl9Jbml0CiAgKgpAQCAtMTMyLDEyICsxNzcsMTIgQEAKICAqLwogQk9PTDMyIFBTRFJWX0luaXQodm9pZCkKIHsKLSAgVFJBQ0UocHNkcnYsICJcbiIpOwotICBQU0RSVl9HZXRGb250TWV0cmljcygpOwotICByZXR1cm4gRFJJVkVSX1JlZ2lzdGVyRHJpdmVyKCAiV0lORVBTIiwgJlBTRFJWX0Z1bmNzICk7CisgICAgVFJBQ0UocHNkcnYsICJcbiIpOworICAgIFBTRFJWX0hlYXAgPSBIZWFwQ3JlYXRlKDAsIDB4MTAwMDAsIDApOworICAgIFBTRFJWX0dldEZvbnRNZXRyaWNzKCk7CisgICAgcmV0dXJuIERSSVZFUl9SZWdpc3RlckRyaXZlciggIldJTkVQUyIsICZQU0RSVl9GdW5jcyApOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgICAgIFBTRFJWX0NyZWF0ZURDCiAgKi8KQEAgLTE0NSwyNCArMTkwLDY5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIG91dHB1dCwgY29uc3QgREVWTU9ERTE2KiBpbml0RGF0YSApCiB7CiAgICAgUFNEUlZfUERFVklDRSAqcGh5c0RldjsKKyAgICBQUklOVEVSSU5GTyAqcGkgPSBQU0RSVl9GaW5kUHJpbnRlckluZm8oZGV2aWNlKTsKKyAgICBEZXZpY2VDYXBzICpkZXZDYXBzOwogCiAgICAgVFJBQ0UocHNkcnYsICIoJXMgJXMgJXMgJXApXG4iLCBkcml2ZXIsIGRldmljZSwgb3V0cHV0LCBpbml0RGF0YSk7CiAKLSAgICBpZighUFNEUlZfQUZNRm9udExpc3QpIHsKKyAgICBpZighcGktPkZvbnRzKSB7CiAgICAgICAgIE1TRygiVG8gdXNlIFdJTkVQUyB5b3UgbmVlZCB0byBpbnN0YWxsIHNvbWUgQUZNIGZpbGVzLlxuIik7CiAJcmV0dXJuIEZBTFNFOwogICAgIH0KIAotICAgIGRjLT53LmRldkNhcHMgPSAmUFNEUlZfRGV2Q2FwczsKLSAgICBkYy0+dy5oVmlzUmduID0gQ3JlYXRlUmVjdFJnbjMyKDAsIDAsIGRjLT53LmRldkNhcHMtPmhvcnpSZXMsCi0gICAgCQkJICAgIGRjLT53LmRldkNhcHMtPnZlcnRSZXMpOwotICAgIAotICAgIHBoeXNEZXYgPSAoUFNEUlZfUERFVklDRSAqKUhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwKKyAgICBwaHlzRGV2ID0gKFBTRFJWX1BERVZJQ0UgKilIZWFwQWxsb2MoIFBTRFJWX0hlYXAsIEhFQVBfWkVST19NRU1PUlksCiAJCQkJCSAgICAgICAgICAgICBzaXplb2YoKnBoeXNEZXYpICk7CiAgICAgaWYgKCFwaHlzRGV2KSByZXR1cm4gRkFMU0U7CiAgICAgZGMtPnBoeXNEZXYgPSBwaHlzRGV2OwotICAgIHBoeXNEZXYtPmpvYi5vdXRwdXQgPSBIRUFQX3N0cmR1cEEoIEdldFByb2Nlc3NIZWFwKCksIDAsIG91dHB1dCApOwotICAgIGlmICghcGh5c0Rldi0+am9iLm91dHB1dCkgcmV0dXJuIEZBTFNFOworCisgICAgcGh5c0Rldi0+cGkgPSBwaTsKKworICAgIHBoeXNEZXYtPkRldm1vZGUgPSAoUFNEUlZfREVWTU9ERTE2ICopSGVhcEFsbG9jKCBQU0RSVl9IZWFwLCAwLAorCQkJCQkJICAgICBzaXplb2YoUFNEUlZfREVWTU9ERTE2KSApOworICAgIGlmKCFwaHlzRGV2LT5EZXZtb2RlKSB7CisgICAgICAgIEhlYXBGcmVlKCBQU0RSVl9IZWFwLCAwLCBwaHlzRGV2ICk7CisJcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICAKKyAgICBtZW1jcHkoIHBoeXNEZXYtPkRldm1vZGUsIHBpLT5EZXZtb2RlLCBzaXplb2YoUFNEUlZfREVWTU9ERTE2KSApOworCisgICAgaWYoaW5pdERhdGEpIHsKKyAgICAgICAgUFNEUlZfTWVyZ2VEZXZtb2RlcyhwaHlzRGV2LT5EZXZtb2RlLCAoUFNEUlZfREVWTU9ERTE2ICopaW5pdERhdGEsIHBpKTsKKyAgICB9CisKKyAgICAKKyAgICBkZXZDYXBzID0gSGVhcEFsbG9jKCBQU0RSVl9IZWFwLCAwLCBzaXplb2YoUFNEUlZfRGV2Q2FwcykgKTsKKyAgICBtZW1jcHkoZGV2Q2FwcywgJlBTRFJWX0RldkNhcHMsIHNpemVvZihQU0RSVl9EZXZDYXBzKSk7CisKKyAgICBpZihwaHlzRGV2LT5EZXZtb2RlLT5kbVB1YmxpYy5kbU9yaWVudGF0aW9uID09IERNT1JJRU5UX1BPUlRSQUlUKSB7CisgICAgICAgIGRldkNhcHMtPmhvcnpTaXplID0gcGh5c0Rldi0+RGV2bW9kZS0+ZG1QdWJsaWMuZG1QYXBlcldpZHRoOworCWRldkNhcHMtPnZlcnRTaXplID0gcGh5c0Rldi0+RGV2bW9kZS0+ZG1QdWJsaWMuZG1QYXBlckxlbmd0aDsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXZDYXBzLT5ob3J6U2l6ZSA9IHBoeXNEZXYtPkRldm1vZGUtPmRtUHVibGljLmRtUGFwZXJMZW5ndGg7CisJZGV2Q2Fwcy0+dmVydFNpemUgPSBwaHlzRGV2LT5EZXZtb2RlLT5kbVB1YmxpYy5kbVBhcGVyV2lkdGg7CisgICAgfQorCisgICAgZGV2Q2Fwcy0+aG9yelJlcyA9IHBoeXNEZXYtPnBpLT5wcGQtPkRlZmF1bHRSZXNvbHV0aW9uICogCisgICAgICBkZXZDYXBzLT5ob3J6U2l6ZSAvIDI1LjQ7CisgICAgZGV2Q2Fwcy0+dmVydFJlcyA9IHBoeXNEZXYtPnBpLT5wcGQtPkRlZmF1bHRSZXNvbHV0aW9uICogCisgICAgICBkZXZDYXBzLT52ZXJ0U2l6ZSAvIDI1LjQ7CisKKyAgICAvKiBBcmUgYXNwZWN0W1hZXSBhbmQgbG9nUGl4ZWxzW1hZXSBjb3JyZWN0PyAqLworICAgIC8qIE5lZWQgdG8gaGFuZGxlIGRpZmZlcmVudCByZXMgaW4geCBhbmQgeSA9PiBmaXggcHBkICovCisgICAgZGV2Q2Fwcy0+YXNwZWN0WCA9IGRldkNhcHMtPmxvZ1BpeGVsc1ggPSAKKwkJCQlwaHlzRGV2LT5waS0+cHBkLT5EZWZhdWx0UmVzb2x1dGlvbjsKKyAgICBkZXZDYXBzLT5hc3BlY3RZID0gZGV2Q2Fwcy0+bG9nUGl4ZWxzWSA9IAorCQkJCXBoeXNEZXYtPnBpLT5wcGQtPkRlZmF1bHRSZXNvbHV0aW9uOworICAgIGRldkNhcHMtPmFzcGVjdFhZID0gKGludCloeXBvdCggKGRvdWJsZSlkZXZDYXBzLT5hc3BlY3RYLCAKKwkJCQkgICAgKGRvdWJsZSlkZXZDYXBzLT5hc3BlY3RZICk7CisgICAgLyogZXRjICovCisKKyAgICBkYy0+dy5kZXZDYXBzID0gZGV2Q2FwczsKKworICAgIGRjLT53LmhWaXNSZ24gPSBDcmVhdGVSZWN0UmduMzIoMCwgMCwgZGMtPncuZGV2Q2Fwcy0+aG9yelJlcywKKyAgICAJCQkgICAgZGMtPncuZGV2Q2Fwcy0+dmVydFJlcyk7CisgICAgCisgICAgcGh5c0Rldi0+am9iLm91dHB1dCA9IEhFQVBfc3RyZHVwQSggUFNEUlZfSGVhcCwgMCwgb3V0cHV0ICk7CiAgICAgcGh5c0Rldi0+am9iLmhKb2IgPSAwOwogICAgIHJldHVybiBUUlVFOwogfQpAQCAtMTc0LDExICsyNjQsNzEgQEAKIHN0YXRpYyBCT09MMzIgUFNEUlZfRGVsZXRlREMoIERDICpkYyApCiB7CiAgICAgUFNEUlZfUERFVklDRSAqcGh5c0RldiA9IChQU0RSVl9QREVWSUNFICopZGMtPnBoeXNEZXY7Ci0KKyAgICAKICAgICBUUkFDRShwc2RydiwgIlxuIik7Ci0gICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHBoeXNEZXYtPmpvYi5vdXRwdXQgKTsKLSAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcGh5c0RldiApOworCisgICAgSGVhcEZyZWUoIFBTRFJWX0hlYXAsIDAsIHBoeXNEZXYtPkRldm1vZGUgKTsKKyAgICBIZWFwRnJlZSggUFNEUlZfSGVhcCwgMCwgcGh5c0Rldi0+am9iLm91dHB1dCApOworICAgIEhlYXBGcmVlKCBQU0RSVl9IZWFwLCAwLCAodm9pZCAqKWRjLT53LmRldkNhcHMgKTsKKyAgICBIZWFwRnJlZSggUFNEUlZfSGVhcCwgMCwgcGh5c0RldiApOwogICAgIGRjLT5waHlzRGV2ID0gTlVMTDsKKwogICAgIHJldHVybiBUUlVFOwogfQogCisKKwkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlQU0RSVl9GaW5kUHJpbnRlckluZm8KKyAqLworUFJJTlRFUklORk8gKlBTRFJWX0ZpbmRQcmludGVySW5mbyhMUENTVFIgbmFtZSkgCit7CisgICAgc3RhdGljIFBSSU5URVJJTkZPICpQU0RSVl9QcmludGVyTGlzdDsKKyAgICBEV09SRCB0eXBlID0gUkVHX0JJTkFSWSwgbmVlZGVkLCByZXM7CisgICAgUFJJTlRFUklORk8gKnBpID0gUFNEUlZfUHJpbnRlckxpc3QsICoqbGFzdCA9ICZQU0RSVl9QcmludGVyTGlzdDsKKyAgICBGT05UTkFNRSAqZm9udDsKKyAgICBBRk0gKmFmbTsKKworICAgIFRSQUNFKHBzZHJ2LCAiJyVzJ1xuIiwgbmFtZSk7CisgICAgCisgICAgZm9yKCA7IHBpOyBsYXN0ID0gJnBpLT5uZXh0LCBwaSA9IHBpLT5uZXh0KSB7CisgICAgICAgIGlmKCFzdHJjbXAocGktPkZyaWVuZGx5TmFtZSwgbmFtZSkpCisJICAgIHJldHVybiBwaTsKKyAgICB9CisKKyAgICBwaSA9ICpsYXN0ID0gSGVhcEFsbG9jKCBQU0RSVl9IZWFwLCAwLCBzaXplb2YoKnBpKSApOworICAgIHBpLT5GcmllbmRseU5hbWUgPSBIRUFQX3N0cmR1cEEoIFBTRFJWX0hlYXAsIDAsIG5hbWUgKTsKKyAgICByZXMgPSBEcnZHZXRQcmludGVyRGF0YSgoTFBTVFIpbmFtZSwgKExQU1RSKUlOVF9QRF9ERUZBVUxUX0RFVk1PREUsICZ0eXBlLAorCQkJICAgIE5VTEwsIDAsICZuZWVkZWQgKTsKKworICAgIGlmKHJlcyA9PSBFUlJPUl9JTlZBTElEX1BSSU5URVJfTkFNRSkgeworICAgICAgICBwaS0+RGV2bW9kZSA9IEhlYXBBbGxvYyggUFNEUlZfSGVhcCwgMCwgc2l6ZW9mKERlZmF1bHREZXZtb2RlKSApOworCW1lbWNweShwaS0+RGV2bW9kZSwgJkRlZmF1bHREZXZtb2RlLCBzaXplb2YoRGVmYXVsdERldm1vZGUpICk7CisJRHJ2U2V0UHJpbnRlckRhdGEoKExQU1RSKW5hbWUsIChMUFNUUilJTlRfUERfREVGQVVMVF9ERVZNT0RFLAorCQkgUkVHX0JJTkFSWSwgKExQQllURSkmRGVmYXVsdERldm1vZGUsIHNpemVvZihEZWZhdWx0RGV2bW9kZSkgKTsKKworCS8qIG5lZWQgdG8gZG8gc29tZXRoaW5nIGhlcmUgQWRkUHJpbnRlcj8/ICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgcGktPkRldm1vZGUgPSBIZWFwQWxsb2MoIFBTRFJWX0hlYXAsIDAsIG5lZWRlZCApOworCURydkdldFByaW50ZXJEYXRhKChMUFNUUiluYW1lLCAoTFBTVFIpSU5UX1BEX0RFRkFVTFRfREVWTU9ERSwgJnR5cGUsCisJCQkgIChMUEJZVEUpcGktPkRldm1vZGUsIG5lZWRlZCwgJm5lZWRlZCk7CisgICAgfQorCisgICAgcGktPnBwZCA9IFBTRFJWX1BhcnNlUFBEKHBpLT5EZXZtb2RlLT5kbURydlByaXZhdGUucHBkRmlsZU5hbWUpOworICAgIHBpLT5uZXh0ID0gTlVMTDsKKyAgICBwaS0+Rm9udHMgPSBOVUxMOworCisgICAgZm9yKGZvbnQgPSBwaS0+cHBkLT5JbnN0YWxsZWRGb250czsgZm9udDsgZm9udCA9IGZvbnQtPm5leHQpIHsKKyAgICAgICAgYWZtID0gUFNEUlZfRmluZEFGTWluTGlzdChQU0RSVl9BRk1Gb250TGlzdCwgZm9udC0+TmFtZSk7CisJaWYoIWFmbSkgeworCSAgICBNU0coCisJICJDb3VsZG4ndCBmaW5kIEFGTSBmaWxlIGZvciBpbnN0YWxsZWQgcHJpbnRlciBmb250ICclcycgLSBpZ25vcmluZ1xuIiwKKwkgZm9udC0+TmFtZSk7CisJfSBlbHNlIHsKKwkgICAgUFNEUlZfQWRkQUZNdG9MaXN0KCZwaS0+Rm9udHMsIGFmbSk7CisJfQorICAgIH0KKworICAgIHJldHVybiBwaTsKK30KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3BzZHJ2L29iamVjdHMuYyBiL2dyYXBoaWNzL3BzZHJ2L29iamVjdHMuYwppbmRleCA2ZDdkZTgyLi5iOGQ4ZDQ3IDEwMDY0NAotLS0gYS9ncmFwaGljcy9wc2Rydi9vYmplY3RzLmMKKysrIGIvZ3JhcGhpY3MvcHNkcnYvb2JqZWN0cy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqCVBvc3RzY3JpcHQgZHJpdmVyIG9iamVjdCBoYW5kbGluZworICoJUG9zdFNjcmlwdCBkcml2ZXIgb2JqZWN0IGhhbmRsaW5nCiAgKgogICoJQ29weXJpZ2h0IDE5OTggIEh1dyBEIE0gRGF2aWVzCiAgKgpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvcHNkcnYvcHBkLmMgYi9ncmFwaGljcy9wc2Rydi9wcGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzY0ZDcyCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvcHNkcnYvcHBkLmMKQEAgLTAsMCArMSw2NTYgQEAKKy8qCVBvc3RTY3JpcHQgUHJpbnRlciBEZXNjcmlwdGlvbiAoUFBEKSBmaWxlIHBhcnNlcgorICoKKyAqCVNlZSAgaHR0cDovL3d3dy5hZG9iZS5jb20vc3VwcG9ydHNlcnZpY2UvZGV2cmVsYXRpb25zL1BERlMvVE4vNTAwMy5QUERfU3BlY192NC4zLnBkZgorICoKKyAqCUNvcHlyaWdodCAxOTk4ICBIdXcgRCBNIERhdmllcworICovCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8d2lubnQuaD4gLyogSEVBUF9aRVJPX01FTU9SWSAqLworI2luY2x1ZGUgPGhlYXAuaD4KKyNpbmNsdWRlIDxkZWJ1Zy5oPgorI2luY2x1ZGUgPHBzZHJ2Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxwcmludC5oPgorCit0eXBlZGVmIHN0cnVjdCB7CitjaGFyCSprZXk7CitjaGFyCSpvcHRpb247CitjaGFyCSpvcHR0cmFuczsKK2NoYXIJKnZhbHVlOworY2hhcgkqdmFsdHJhbnM7Cit9IFBQRFR1cGxlOworCisKKy8qIG1hcCBvZiBwYWdlIG5hbWVzIGluIHBwZCBmaWxlIHRvIFdpbmRvd3MgcGFwZXIgY29uc3RhbnRzICovCisKK3N0YXRpYyBzdHJ1Y3QgeworICBjaGFyICpQU05hbWU7CisgIFdPUkQgV2luUGFnZTsKK30gUGFnZVRyYW5zW10gPSB7CisgIHsiQTQiLAlETVBBUEVSX0E0fSwKKyAgeyJMZXR0ZXIiLAlETVBBUEVSX0xFVFRFUn0sCisgIHsiTGVnYWwiLAlETVBBUEVSX0xFR0FMfSwKKyAgeyJFeGVjdXRpdmUiLAlETVBBUEVSX0VYRUNVVElWRX0sCisgIHsiQ29tbTEwIiwJRE1QQVBFUl9FTlZfMTB9LAorICB7Ik1vbmFyY2giLAlETVBBUEVSX0VOVl9NT05BUkNIfSwKKyAgeyJETCIsCURNUEFQRVJfRU5WX0RMfSwKKyAgeyJDNSIsCURNUEFQRVJfRU5WX0M1fSwKKyAgeyJCNSIsCURNUEFQRVJfRU5WX0I1fSwKKyAge05VTEwsCTB9Cit9OworCisvKiB0aGUgc2FtZSBmb3IgYmluIG5hbWVzICovCisKK3N0YXRpYyBzdHJ1Y3QgeworICBjaGFyICpQU05hbWU7CisgIFdPUkQgV2luQmluOworfSBCaW5UcmFuc1tdID0geworICB7Ikxvd2VyIiwJCURNQklOX0xPV0VSfSwKKyAgeyJVcHBlciIsCQlETUJJTl9VUFBFUn0sCisgIHsiRW52ZWxvcGUiLAkJRE1CSU5fRU5WRUxPUEV9LAorICB7IkxhcmdlQ2FwYWNpdHkiLAlETUJJTl9MQVJHRUNBUEFDSVRZfSwKKyAge05VTEwsCQkwfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJCVBTRFJWX1BQRERlY29kZUhleAorICoKKyAqIENvcGllcyBzdHIgaW50byBhIG5ld2x5IGFsbG9jYXRlZCBzdHJpbmcgZnJvbSB0aGUgcHJvY2VzcyBoZWFwIHN1YnNpdHV0aW5nCisgKiBoZXggc3RyaW5ncyBlbmNsb3NlZCBpbiAnPCcgYW5kICc+JyBmb3IgdGhlaXIgYnl0ZSBjb2Rlcy4KKyAqCisgKi8KK3N0YXRpYyBjaGFyICpQU0RSVl9QUEREZWNvZGVIZXgoY2hhciAqc3RyKQoreworICAgIGNoYXIgKmJ1ZiwgKmluLCAqb3V0OworICAgIEJPT0wzMiBpbmhleCA9IEZBTFNFOworCisgICAgYnVmID0gSGVhcEFsbG9jKFBTRFJWX0hlYXAsIDAsIHN0cmxlbihzdHIpICsgMSk7CisgICAgaWYoIWJ1ZikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBmb3IoaW4gPSBzdHIsIG91dCA9IGJ1ZjsgKmluOyBpbisrKSB7CisgICAgICAgIGlmKCFpbmhleCkgeworCSAgICBpZigqaW4gIT0gJzwnKQorCSAgICAgICAgKm91dCsrID0gKmluOworCSAgICBlbHNlCisJICAgICAgICBpbmhleCA9IFRSVUU7CisJfSBlbHNlIHsKKwkgICAgaWYoKmluID09ICc+JykgeworCSAgICAgICAgaW5oZXggPSBGQUxTRTsKKwkJY29udGludWU7CisJICAgIH0KKwkgICAgZWxzZSBpZihpc3NwYWNlKCppbikpCisJICAgICAgICBjb250aW51ZTsKKwkgICAgZWxzZSB7CisJICAgICAgICBpbnQgaTsKKwkgICAgICAgIGlmKCFpc3hkaWdpdCgqaW4pIHx8ICFpc3hkaWdpdCgqKGluICsgMSkpKSB7CisJCSAgICBFUlIocHNkcnYsICJJbnZhbGlkIGhleCBjaGFyIGluIGhleCBzdHJpbmdcbiIpOworCQkgICAgSGVhcEZyZWUoUFNEUlZfSGVhcCwgMCwgYnVmKTsKKwkJICAgIHJldHVybiBOVUxMOworCQl9CisJCSpvdXQgPSAwOworCQlmb3IoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJICAgIGlmKGlzZGlnaXQoKihpbiArIGkpKSkKKwkJICAgICAgICAqb3V0IHw9ICgqKGluICsgaSkgLSAnMCcpIDw8ICgoMS1pKSAqIDQpOworCQkgICAgZWxzZQorCQkgICAgICAgICpvdXQgfD0gKHRvdXBwZXIoKihpbiArIGkpKSAtICdBJyArIDEwKSA8PCAoKDEtaSkgKiA0KTsKKwkJfQorCQlvdXQrKzsKKwkJaW4rKzsKKwkgICAgfQorCX0KKyAgICB9CisgICAgKm91dCA9ICdcMCc7CisgICAgcmV0dXJuIGJ1ZjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkJUFNEUlZfUFBER2V0VHJhbnNWYWx1ZQorICoKKyAqLworc3RhdGljIEJPT0wzMiBQU0RSVl9QUERHZXRUcmFuc1ZhbHVlKGNoYXIgKnN0YXJ0LCBQUERUdXBsZSAqdHVwbGUpCit7CisgICAgY2hhciAqYnVmLCAqZW5kOworCisgICAgZW5kID0gc3RycGJyayhzdGFydCwgIlxyXG4iKTsKKyAgICBpZihlbmQgPT0gc3RhcnQpIHJldHVybiBGQUxTRTsKKyAgICBpZighZW5kKSBlbmQgPSBzdGFydCArIHN0cmxlbihzdGFydCk7CisgICAgYnVmID0gSGVhcEFsbG9jKCBQU0RSVl9IZWFwLCAwLCBlbmQgLSBzdGFydCArIDEgKTsKKyAgICBtZW1jcHkoYnVmLCBzdGFydCwgZW5kIC0gc3RhcnQpOworICAgICooYnVmICsgKGVuZCAtIHN0YXJ0KSkgPSAnXDAnOworICAgIHR1cGxlLT52YWx0cmFucyA9IFBTRFJWX1BQRERlY29kZUhleChidWYpOworICAgIEhlYXBGcmVlKCBQU0RSVl9IZWFwLCAwLCBidWYgKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkJUFNEUlZfUFBER2V0SW52b2NhdGlvblZhbHVlCisgKgorICogUGFzc2VkIHN0cmluZyB0aGF0IHNob3VsZCBiZSBzdXJyb3VuZGVkIGJ5IGAiJ3MsIHJldHVybiBzdHJpbmcgYWxsb2NlZAorICogZnJvbSBwcm9jZXNzIGhlYXAuCisgKi8KK3N0YXRpYyBCT09MMzIgUFNEUlZfUFBER2V0SW52b2NhdGlvblZhbHVlKEZJTEUgKmZwLCBjaGFyICpwb3MsIFBQRFR1cGxlICp0dXBsZSkKK3sKKyAgICBjaGFyICpzdGFydCwgKmVuZCwgKmJ1ZjsKKyAgICBjaGFyIGxpbmVbMjU3XTsKKyAgICBpbnQgbGVuOworCisgICAgc3RhcnQgPSBwb3MgKyAxOworICAgIGJ1ZiA9IEhlYXBBbGxvYyggUFNEUlZfSGVhcCwgMCwgc3RybGVuKHN0YXJ0KSArIDEgKTsKKyAgICBsZW4gPSAwOworICAgIGRvIHsKKyAgICAgICAgZW5kID0gc3RyY2hyKHN0YXJ0LCAnIicpOworCWlmKGVuZCkgeworCSAgICBidWYgPSBIZWFwUmVBbGxvYyggUFNEUlZfSGVhcCwgMCwgYnVmLCAKKwkJCSAgICAgICBsZW4gKyAoZW5kIC0gc3RhcnQpICsgMSApOworCSAgICBtZW1jcHkoYnVmICsgbGVuLCBzdGFydCwgZW5kIC0gc3RhcnQpOworCSAgICAqKGJ1ZiArIGxlbiArIChlbmQgLSBzdGFydCkpID0gJ1wwJzsKKwkgICAgdHVwbGUtPnZhbHVlID0gYnVmOworCSAgICBzdGFydCA9IHN0cmNocihlbmQsICcvJyk7CisJICAgIGlmKHN0YXJ0KQorCSAgICAgICAgcmV0dXJuIFBTRFJWX1BQREdldFRyYW5zVmFsdWUoc3RhcnQgKyAxLCB0dXBsZSk7CisJICAgIHJldHVybiBUUlVFOworCX0gZWxzZSB7CisJICAgIGludCBzbCA9IHN0cmxlbihzdGFydCk7CisJICAgIGJ1ZiA9IEhlYXBSZUFsbG9jKCBQU0RSVl9IZWFwLCAwLCBidWYsIGxlbiArIHNsICsgMSApOworCSAgICBzdHJjcHkoYnVmICsgbGVuLCBzdGFydCk7CisJICAgIGxlbiArPSBzbDsKKwl9CisgICAgfSB3aGlsZSggZmdldHMoKHN0YXJ0ID0gbGluZSksIHNpemVvZihsaW5lKSwgZnApICk7CisKKyAgICB0dXBsZS0+dmFsdWUgPSBOVUxMOworICAgIEhlYXBGcmVlKCBQU0RSVl9IZWFwLCAwLCBidWYgKTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJCVBTRFJWX1BQREdldFF1b3RlZFZhbHVlCisgKgorICogUGFzc2VkIHN0cmluZyB0aGF0IHNob3VsZCBiZSBzdXJyb3VuZGVkIGJ5IGAiJ3MuIEV4cGFuZCA8eHg+IGFzIGhleAorICogcmV0dXJuIHN0cmluZyBhbGxvY2VkIGZyb20gcHJvY2VzcyBoZWFwLgorICovCitzdGF0aWMgQk9PTDMyIFBTRFJWX1BQREdldFF1b3RlZFZhbHVlKEZJTEUgKmZwLCBjaGFyICpwb3MsIFBQRFR1cGxlICp0dXBsZSkKK3sKKyAgICBjaGFyICpidWY7CisKKyAgICBpZighUFNEUlZfUFBER2V0SW52b2NhdGlvblZhbHVlKGZwLCBwb3MsIHR1cGxlKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGJ1ZiA9IFBTRFJWX1BQRERlY29kZUhleCh0dXBsZS0+dmFsdWUpOworICAgIEhlYXBGcmVlKFBTRFJWX0hlYXAsIDAsIHR1cGxlLT52YWx1ZSk7CisgICAgdHVwbGUtPnZhbHVlID0gYnVmOworICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCQlQU0RSVl9QUERHZXRTdHJpbmdWYWx1ZQorICoKKyAqIEp1c3Qgc3RyaXAgbGVhZGluZyB3aGl0ZSBzcGFjZS4KKyAqLworc3RhdGljIEJPT0wzMiBQU0RSVl9QUERHZXRTdHJpbmdWYWx1ZShjaGFyICpzdHIsIFBQRFR1cGxlICp0dXBsZSkKK3sKKyAgICBjaGFyICpzdGFydCA9IHN0ciwgKmVuZDsKKworICAgIHdoaWxlKCpzdGFydCAhPSAnXDAnICYmIGlzc3BhY2UoKnN0YXJ0KSkKKyAgICAgICAgc3RhcnQrKzsKKworICAgIGVuZCA9IHN0cnBicmsoc3RhcnQsICIvXHJcbiIpOworICAgIGlmKCFlbmQpIGVuZCA9IHN0YXJ0ICsgc3RybGVuKHN0YXJ0KTsKKyAgICB0dXBsZS0+dmFsdWUgPSBIZWFwQWxsb2MoIFBTRFJWX0hlYXAsIDAsIChlbmQgLSBzdGFydCkgKyAxICk7CisgICAgbWVtY3B5KHR1cGxlLT52YWx1ZSwgc3RhcnQsIGVuZCAtIHN0YXJ0KTsKKyAgICAqKHR1cGxlLT52YWx1ZSArIChlbmQgLSBzdGFydCkpID0gJ1wwJzsKKyAgICBpZigqZW5kID09ICcvJykKKyAgICAgICAgUFNEUlZfUFBER2V0VHJhbnNWYWx1ZShlbmQgKyAxLCB0dXBsZSk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJCVBTRFJWX1BQRFN5bWJvbFZhbHVlCisgKgorICogTm90IGltcGxlbWVudGVkIHlldC4KKyAqLworc3RhdGljIEJPT0wzMiBQU0RSVl9QUERHZXRTeW1ib2xWYWx1ZShjaGFyICpwb3MsIFBQRFR1cGxlICp0dXBsZSkKK3sKKyAgICBGSVhNRShwc2RydiwgIlN0dWJcbiIpOworICAgIHJldHVybiBGQUxTRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJCVBTRFJWX1BQREdldE5leHRUdXBsZQorICoKKyAqIEdldHMgdGhlIG5leHQgS2V5d29yZCBPcHRpb24gVmFsdWUgdHVwbGUgZnJvbSB0aGUgZmlsZS4gQWxsb2NzIHNwYWNlIG9mZgorICogdGhlIHByb2Nlc3MgaGVhcCB3aGljaCBzaG91bGQgYmUgZnJlZSgpZWQgYnkgdGhlIGNhbGxlciBpZiBub3QgbmVlZGVkLgorICovCitzdGF0aWMgQk9PTDMyIFBTRFJWX1BQREdldE5leHRUdXBsZShGSUxFICpmcCwgUFBEVHVwbGUgKnR1cGxlKQoreworICAgIGNoYXIgbGluZVsyNTddLCAqb3B0ID0gTlVMTCwgKmNwLCAqdHJhbnM7CisgICAgQk9PTDMyIGdvdG9wdGlvbiA9IFRSVUU7CisKKyAgICBtZW1zZXQodHVwbGUsIDAsIHNpemVvZigqdHVwbGUpKTsKKworICAgIGRvIHsKKyAgICAgICAgaWYoIWZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCWlmKGxpbmVbMF0gPT0gJyonICYmIGxpbmVbMV0gIT0gJyUnICYmIHN0cm5jbXAobGluZSwgIipFbmQiLCA0KSkKKwkgICAgYnJlYWs7CisgICAgfSB3aGlsZSgxKTsKKworICAgIGlmKGxpbmVbc3RybGVuKGxpbmUpLTFdICE9ICdcbicpIHsKKyAgICAgICAgRVJSKHBzZHJ2LCAiTGluZSB0b28gbG9uZy5cbiIpOworCXJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBmb3IoY3AgPSBsaW5lOyAhaXNzcGFjZSgqY3ApOyBjcCsrKQorICAgICAgICA7CisKKyAgICBpZigqKGNwLTEpID09ICc6JykgeworICAgICAgICBjcC0tOworICAgICAgICBnb3RvcHRpb24gPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgICBvcHQgPSBjcDsKKyAgICB9CisKKyAgICB0dXBsZS0+a2V5ID0gSGVhcEFsbG9jKCBQU0RSVl9IZWFwLCAwLCBjcCAtIGxpbmUgKyAxICk7CisgICAgaWYoIXR1cGxlLT5rZXkpIHJldHVybiBGQUxTRTsKKworICAgIG1lbWNweSh0dXBsZS0+a2V5LCBsaW5lLCBjcCAtIGxpbmUpOworICAgIHR1cGxlLT5rZXlbY3AgLSBsaW5lXSA9ICdcMCc7CisKKyAgICBpZihnb3RvcHRpb24pIHsKKyAgICAgICAgd2hpbGUoaXNzcGFjZSgqb3B0KSkKKwkgICAgb3B0Kys7CisgICAgICAgIGNwID0gc3RycGJyayhvcHQsICI6LyIpOworCWlmKCFjcCkgeworCSAgICBFUlIocHNkcnYsICJFcnJvciBpbiBsaW5lICclcyc/XG4iLCBsaW5lKTsKKwkgICAgcmV0dXJuIEZBTFNFOworCX0KKwl0dXBsZS0+b3B0aW9uID0gSGVhcEFsbG9jKCBQU0RSVl9IZWFwLCAwLCBjcCAtIG9wdCArIDEgKTsKKwlpZighdHVwbGUtPm9wdGlvbikgcmV0dXJuIEZBTFNFOworCW1lbWNweSh0dXBsZS0+b3B0aW9uLCBvcHQsIGNwIC0gb3B0KTsKKwl0dXBsZS0+b3B0aW9uW2NwIC0gb3B0XSA9ICdcMCc7CisJaWYoKmNwID09ICcvJykgeworCSAgICBjaGFyICpidWY7CisJICAgIHRyYW5zID0gY3AgKyAxOworCSAgICBjcCA9IHN0cmNocih0cmFucywgJzonKTsKKwkgICAgaWYoIWNwKSB7CisJICAgICAgICBFUlIocHNkcnYsICJFcnJvciBpbiBsaW5lICclcyc/XG4iLCBsaW5lKTsKKwkJcmV0dXJuIEZBTFNFOworCSAgICB9CisJICAgIGJ1ZiA9IEhlYXBBbGxvYyggUFNEUlZfSGVhcCwgMCwgY3AgLSB0cmFucyArIDEgKTsKKwkgICAgaWYoIWJ1ZikgcmV0dXJuIEZBTFNFOworCSAgICBtZW1jcHkoYnVmLCB0cmFucywgY3AgLSB0cmFucyk7CisJICAgIGJ1ZltjcCAtIHRyYW5zXSA9ICdcMCc7CisJICAgIHR1cGxlLT5vcHR0cmFucyA9IFBTRFJWX1BQRERlY29kZUhleChidWYpOworCSAgICBIZWFwRnJlZSggUFNEUlZfSGVhcCwgMCwgYnVmICk7CisJfQorICAgIH0KKyAgICB3aGlsZSghaXNzcGFjZSgqY3ApKQorICAgICAgICBjcCsrOworCisgICAgd2hpbGUoaXNzcGFjZSgqY3ApKQorICAgICAgICBjcCsrOworCisgICAgc3dpdGNoKCpjcCkgeworICAgIGNhc2UgJyInOgorICAgICAgICBpZiggKCFnb3RvcHRpb24gJiYgc3RybmNtcCh0dXBsZS0+a2V5LCAiKj8iLCAyKSApIHx8CisJICAgICAhc3RybmNtcCh0dXBsZS0+a2V5LCAiKkpDTCIsIDQpKQorCSAgICBQU0RSVl9QUERHZXRRdW90ZWRWYWx1ZShmcCwgY3AsIHR1cGxlKTsKKyAgICAgICAgZWxzZQorCSAgICBQU0RSVl9QUERHZXRJbnZvY2F0aW9uVmFsdWUoZnAsIGNwLCB0dXBsZSk7CisJYnJlYWs7CisKKyAgICBjYXNlICdeJzoKKyAgICAgICAgUFNEUlZfUFBER2V0U3ltYm9sVmFsdWUoY3AsIHR1cGxlKTsKKwlicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIFBTRFJWX1BQREdldFN0cmluZ1ZhbHVlKGNwLCB0dXBsZSk7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJCVBTRFJWX1BQREdldFBhZ2VTaXplSW5mbworICoKKyAqIFNlYXJjaGVzIHBwZCBQYWdlU2l6ZSBsaXN0IHRvIHJldHVybiBlbnRyeSBtYXRjaGluZyBuYW1lIG9yIGNyZWF0ZXMgbmV3CisgKiBlbnRyeSB3aGljaCBpcyBhcHBlbmRlZCB0byB0aGUgbGlzdCBpZiBuYW1lIGlzIG5vdCBmb3VuZC4KKyAqCisgKi8KK1BBR0VTSVpFICpQU0RSVl9QUERHZXRQYWdlU2l6ZUluZm8oUFBEICpwcGQsIGNoYXIgKm5hbWUpCit7CisgICAgUEFHRVNJWkUgKnBhZ2UgPSBwcGQtPlBhZ2VTaXplcywgKmxhc3RwYWdlOworICAgIAorICAgIGlmKCFwYWdlKSB7CisgICAgICAgcGFnZSA9IHBwZC0+UGFnZVNpemVzID0gSGVhcEFsbG9jKCBQU0RSVl9IZWFwLAorCQkJCQkgICAgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKCpwYWdlKSApOworICAgICAgIHJldHVybiBwYWdlOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciggOyBwYWdlOyBwYWdlID0gcGFnZS0+bmV4dCkgeworCSAgICBpZighc3RyY21wKHBhZ2UtPk5hbWUsIG5hbWUpKQorCSAgICAgICAgIHJldHVybiBwYWdlOworCSAgICBsYXN0cGFnZSA9IHBhZ2U7CisJfQorCisJbGFzdHBhZ2UtPm5leHQgPSBIZWFwQWxsb2MoIFBTRFJWX0hlYXAsCisJCQkJCSAgIEhFQVBfWkVST19NRU1PUlksIHNpemVvZigqcGFnZSkgKTsKKwlyZXR1cm4gbGFzdHBhZ2UtPm5leHQ7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCQlQU0RSVl9QUERHZXRXb3JkCisgKgorICogUmV0dXJucyBwdHIgYWxsb2NlZCBmcm9tIGhlYXAgdG8gZmlyc3Qgd29yZCBpbiBzdHIuIFN0cmlwcyBsZWFkaW5nIHNwYWNlcy4KKyAqIFB1dHMgcHRyIHRvIG5leHQgd29yZCBpbiBuZXh0CisgKi8KK3N0YXRpYyBjaGFyICpQU0RSVl9QUERHZXRXb3JkKGNoYXIgKnN0ciwgY2hhciAqKm5leHQpCit7CisgICAgY2hhciAqc3RhcnQsICplbmQsICpyZXQ7CisKKyAgICBzdGFydCA9IHN0cjsKKyAgICB3aGlsZShzdGFydCAmJiAqc3RhcnQgJiYgaXNzcGFjZSgqc3RhcnQpKQorICAgICAgICBzdGFydCsrOworICAgIGlmKCFzdGFydCB8fCAhKnN0YXJ0KSByZXR1cm4gRkFMU0U7CisKKyAgICBlbmQgPSBzdGFydDsKKyAgICB3aGlsZSgqZW5kICYmICFpc3NwYWNlKCplbmQpKQorICAgICAgICBlbmQrKzsKKworICAgIHJldCA9IEhlYXBBbGxvYyggUFNEUlZfSGVhcCwgMCwgZW5kIC0gc3RhcnQgKyAxICk7CisgICAgbWVtY3B5KHJldCwgc3RhcnQsIGVuZCAtIHN0YXJ0ICk7CisgICAgKihyZXQgKyAoZW5kIC0gc3RhcnQpKSA9ICdcMCc7CisKKyAgICB3aGlsZSgqZW5kICYmIGlzc3BhY2UoKmVuZCkpCisgICAgICAgIGVuZCsrOworICAgIGlmKCplbmQpCisgICAgICAgICpuZXh0ID0gZW5kOworICAgIGVsc2UKKyAgICAgICAgKm5leHQgPSBOVUxMOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJCVBTRFJWX1BhcnNlUFBECisgKgorICoKKyAqLworUFBEICpQU0RSVl9QYXJzZVBQRChjaGFyICpmbmFtZSkKK3sKKyAgICBGSUxFICpmcDsKKyAgICBQUEQgKnBwZDsKKyAgICBQUERUdXBsZSB0dXBsZTsKKworICAgIFRSQUNFKHBzZHJ2LCAiJXNcbiIsIGZuYW1lKTsKKworICAgIGlmKChmcCA9IGZvcGVuKGZuYW1lLCAiciIpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHBwZCA9IEhlYXBBbGxvYyggUFNEUlZfSGVhcCwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKCpwcGQpKTsKKyAgICBpZighcHBkKSB7CisgICAgICAgIEVSUihwc2RydiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBwZFxuIik7CisJZmNsb3NlKGZwKTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAKKyAgICB3aGlsZSggUFNEUlZfUFBER2V0TmV4dFR1cGxlKGZwLCAmdHVwbGUpKSB7CisKKwlpZighc3RyY21wKCIqTmlja05hbWUiLCB0dXBsZS5rZXkpKSB7CisJICAgIHBwZC0+Tmlja05hbWUgPSB0dXBsZS52YWx1ZTsKKwkgICAgdHVwbGUudmFsdWUgPSBOVUxMOworCSAgICBUUkFDRShwc2RydiwgIk5pY2tOYW1lID0gJyVzJ1xuIiwgcHBkLT5OaWNrTmFtZSk7CisJfQorCisJZWxzZSBpZighc3RyY21wKCIqTGFuZ3VhZ2VMZXZlbCIsIHR1cGxlLmtleSkpIHsKKwkgICAgc3NjYW5mKHR1cGxlLnZhbHVlLCAiJWQiLCAmKHBwZC0+TGFuZ3VhZ2VMZXZlbCkpOworCSAgICBUUkFDRShwc2RydiwgIkxhbmd1YWdlTGV2ZWwgPSAlZFxuIiwgcHBkLT5MYW5ndWFnZUxldmVsKTsKKwl9CisKKwllbHNlIGlmKCFzdHJjbXAoIipDb2xvckRldmljZSIsIHR1cGxlLmtleSkpIHsKKwkgICAgaWYoIXN0cmNhc2VjbXAodHVwbGUudmFsdWUsICJ0cnVlIikpCisJICAgICAgICBwcGQtPkNvbG9yRGV2aWNlID0gVFJVRTsKKwkgICAgVFJBQ0UocHNkcnYsICJDb2xvckRldmljZSA9ICVkXG4iLCAoaW50KXBwZC0+Q29sb3JEZXZpY2UpOworCX0KKworCWVsc2UgaWYoIXN0cmNtcCgiKkRlZmF1bHRSZXNvbHV0aW9uIiwgdHVwbGUua2V5KSkgeworCSAgICBzc2NhbmYodHVwbGUudmFsdWUsICIlZCIsICYocHBkLT5EZWZhdWx0UmVzb2x1dGlvbikpOworCSAgICBUUkFDRShwc2RydiwgIkRlZmF1bHRSZXNvbHV0aW9uID0gJWRcbiIsIHBwZC0+RGVmYXVsdFJlc29sdXRpb24pOworCX0KKworCWVsc2UgaWYoIXN0cmNtcCgiKkZvbnQiLCB0dXBsZS5rZXkpKSB7CisJICAgIEZPTlROQU1FICpmbjsKKworCSAgICBmb3IoZm4gPSBwcGQtPkluc3RhbGxlZEZvbnRzOyBmbiAmJiBmbi0+bmV4dDsgZm4gPSBmbi0+bmV4dCkKKwkgICAgICAgIDsKKwkgICAgaWYoIWZuKSB7CisJICAgICAgICBwcGQtPkluc3RhbGxlZEZvbnRzID0gSGVhcEFsbG9jKFBTRFJWX0hlYXAsCisJCQkJCSAgICAgICBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2YoKmZuKSk7CisJCWZuID0gcHBkLT5JbnN0YWxsZWRGb250czsKKwkgICAgfSBlbHNlIHsKKwkgICAgICAgZm4tPm5leHQgPSBIZWFwQWxsb2MoUFNEUlZfSGVhcCwKKwkJCQkJICAgICAgIEhFQVBfWkVST19NRU1PUlksIHNpemVvZigqZm4pKTsKKwkgICAgICAgZm4gPSBmbi0+bmV4dDsKKwkgICAgfQorCSAgICBmbi0+TmFtZSA9IHR1cGxlLm9wdGlvbjsKKwkgICAgdHVwbGUub3B0aW9uID0gTlVMTDsKKwl9CisKKwllbHNlIGlmKCFzdHJjbXAoIipEZWZhdWx0Rm9udCIsIHR1cGxlLmtleSkpIHsKKwkgICAgcHBkLT5EZWZhdWx0Rm9udCA9IHR1cGxlLnZhbHVlOworCSAgICB0dXBsZS52YWx1ZSA9IE5VTEw7CisJfQorCisJZWxzZSBpZighc3RyY21wKCIqSkNMQmVnaW4iLCB0dXBsZS5rZXkpKSB7CisJICAgIHBwZC0+SkNMQmVnaW4gPSB0dXBsZS52YWx1ZTsKKwkgICAgdHVwbGUudmFsdWUgPSBOVUxMOworCX0KKworCWVsc2UgaWYoIXN0cmNtcCgiKkpDTFRvUFNJbnRlcnByZXRlciIsIHR1cGxlLmtleSkpIHsKKwkgICAgcHBkLT5KQ0xUb1BTSW50ZXJwcmV0ZXIgPSB0dXBsZS52YWx1ZTsKKwkgICAgdHVwbGUudmFsdWUgPSBOVUxMOworCX0KKworCWVsc2UgaWYoIXN0cmNtcCgiKkpDTEVuZCIsIHR1cGxlLmtleSkpIHsKKwkgICAgcHBkLT5KQ0xFbmQgPSB0dXBsZS52YWx1ZTsKKwkgICAgdHVwbGUudmFsdWUgPSBOVUxMOworCX0KKworCWVsc2UgaWYoIXN0cmNtcCgiKlBhZ2VTaXplIiwgdHVwbGUua2V5KSkgeworCSAgICBQQUdFU0laRSAqcGFnZTsKKwkgICAgcGFnZSA9IFBTRFJWX1BQREdldFBhZ2VTaXplSW5mbyhwcGQsIHR1cGxlLm9wdGlvbik7CisKKwkgICAgaWYoIXBhZ2UtPk5hbWUpIHsKKwkgICAgICAgIGludCBpOworCisJICAgICAgICBwYWdlLT5OYW1lID0gdHVwbGUub3B0aW9uOworCQl0dXBsZS5vcHRpb24gPSBOVUxMOworCQkKKwkJZm9yKGkgPSAwOyBQYWdlVHJhbnNbaV0uUFNOYW1lOyBpKyspIHsKKwkJICAgIGlmKCFzdHJjbXAoUGFnZVRyYW5zW2ldLlBTTmFtZSwgcGFnZS0+TmFtZSkpIHsgLyogY2FzZSA/ICovCisJCSAgICAgICAgcGFnZS0+V2luUGFnZSA9IFBhZ2VUcmFuc1tpXS5XaW5QYWdlOworCQkJYnJlYWs7CisJCSAgICB9CisJCX0KKwkJaWYoIXBhZ2UtPldpblBhZ2UpCisJCSAgICBGSVhNRShwc2RydiwgIkNhbid0IGZpbmQgV2luZG93cyBwYWdlIHR5cGUgZm9yICclcydcbiIsCisJCQkgIHBhZ2UtPk5hbWUpOworCSAgICB9CisJICAgIGlmKCFwYWdlLT5GdWxsTmFtZSkgeworCQlwYWdlLT5GdWxsTmFtZSA9IHR1cGxlLm9wdHRyYW5zOworCQl0dXBsZS5vcHR0cmFucyA9IE5VTEw7CisJICAgIH0KKwkgICAgaWYoIXBhZ2UtPkludm9jYXRpb25TdHJpbmcpIHsKKwkJcGFnZS0+SW52b2NhdGlvblN0cmluZyA9IHR1cGxlLnZhbHVlOworCSAgICAgICAgdHVwbGUudmFsdWUgPSBOVUxMOworCSAgICB9CisJfQorCisJZWxzZSBpZighc3RyY21wKCIqSW1hZ2VhYmxlQXJlYSIsIHR1cGxlLmtleSkpIHsKKwkgICAgUEFHRVNJWkUgKnBhZ2U7CisJICAgIHBhZ2UgPSBQU0RSVl9QUERHZXRQYWdlU2l6ZUluZm8ocHBkLCB0dXBsZS5vcHRpb24pOworCSAgICAKKwkgICAgaWYoIXBhZ2UtPk5hbWUpIHsKKwkgICAgICAgIHBhZ2UtPk5hbWUgPSB0dXBsZS5vcHRpb247CisJCXR1cGxlLm9wdGlvbiA9IE5VTEw7CisJICAgIH0KKwkgICAgaWYoIXBhZ2UtPkZ1bGxOYW1lKSB7CisJCXBhZ2UtPkZ1bGxOYW1lID0gdHVwbGUub3B0dHJhbnM7CisJCXR1cGxlLm9wdHRyYW5zID0gTlVMTDsKKwkgICAgfQorCisjZGVmaW5lIFBJQSBwYWdlLT5JbWFnZWFibGVBcmVhCisJICAgIGlmKCFQSUEpIHsKKyAJICAgICAgICBQSUEgPSBIZWFwQWxsb2MoIFBTRFJWX0hlYXAsIDAsIHNpemVvZigqUElBKSApOworCQlzc2NhbmYodHVwbGUudmFsdWUsICIlZiVmJWYlZiIsICZQSUEtPmxseCwgJlBJQS0+bGx5LAorCQkJCQkJJlBJQS0+dXJ4LCAmUElBLT51cnkpOworCSAgICB9CisjdW5kZWYgUElBCisJfQorCisKKwllbHNlIGlmKCFzdHJjbXAoIipQYXBlckRpbWVuc2lvbiIsIHR1cGxlLmtleSkpIHsKKwkgICAgUEFHRVNJWkUgKnBhZ2U7CisJICAgIHBhZ2UgPSBQU0RSVl9QUERHZXRQYWdlU2l6ZUluZm8ocHBkLCB0dXBsZS5vcHRpb24pOworCSAgICAKKwkgICAgaWYoIXBhZ2UtPk5hbWUpIHsKKwkgICAgICAgIHBhZ2UtPk5hbWUgPSB0dXBsZS5vcHRpb247CisJCXR1cGxlLm9wdGlvbiA9IE5VTEw7CisJICAgIH0KKwkgICAgaWYoIXBhZ2UtPkZ1bGxOYW1lKSB7CisJCXBhZ2UtPkZ1bGxOYW1lID0gdHVwbGUub3B0dHJhbnM7CisJCXR1cGxlLm9wdHRyYW5zID0gTlVMTDsKKwkgICAgfQorCisjZGVmaW5lIFBEIHBhZ2UtPlBhcGVyRGltZW5zaW9uCisJICAgIGlmKCFQRCkgeworIAkgICAgICAgIFBEID0gSGVhcEFsbG9jKCBQU0RSVl9IZWFwLCAwLCBzaXplb2YoKlBEKSApOworCQlzc2NhbmYodHVwbGUudmFsdWUsICIlZiVmIiwgJlBELT54LCAmUEQtPnkpOworCSAgICB9CisjdW5kZWYgUEQKKwl9CisKKwllbHNlIGlmKCFzdHJjbXAoIipMYW5kc2NhcGVPcmllbnRhdGlvbiIsIHR1cGxlLmtleSkpIHsKKwkgICAgaWYoIXN0cmNtcCh0dXBsZS52YWx1ZSwgIlBsdXM5MCIpKQorCSAgICAgICAgcHBkLT5MYW5kc2NhcGVPcmllbnRhdGlvbiA9IDkwOworCSAgICBlbHNlIGlmKCFzdHJjbXAodHVwbGUudmFsdWUsICJNaW51czkwIikpCisJICAgICAgICBwcGQtPkxhbmRzY2FwZU9yaWVudGF0aW9uID0gMjcwOworCisJICAgIC8qIGFueXRoaW5nIGVsc2UsIG5hbWVseSAnYW55JywgbGVhdmVzIHZhbHVlIGF0IDAgKi8KKworCSAgICBUUkFDRShwc2RydiwgIkxhbmRzY2FwZU9yaWVudGF0aW9uID0gJWRcbiIsIAorCQkgIHBwZC0+TGFuZHNjYXBlT3JpZW50YXRpb24pOworCX0KKwkKKwllbHNlIGlmKCFzdHJjbXAoIipVSUNvbnN0cmFpbnRzIiwgdHVwbGUua2V5KSkgeworCSAgICBjaGFyICpzdGFydDsKKwkgICAgQ09OU1RSQUlOVCAqY29uLCAqKmluc2VydCA9ICZwcGQtPkNvbnN0cmFpbnRzOworCisJICAgIHdoaWxlKCppbnNlcnQpCisJICAgICAgICBpbnNlcnQgPSAmKCgqaW5zZXJ0KS0+bmV4dCk7CisJICAgIAorCSAgICBjb24gPSAqaW5zZXJ0ID0gSGVhcEFsbG9jKCBQU0RSVl9IZWFwLCBIRUFQX1pFUk9fTUVNT1JZLAorCQkJCSAgICAgICBzaXplb2YoKmNvbikgKTsKKworCSAgICBzdGFydCA9IHR1cGxlLnZhbHVlOworCSAgICAKKwkgICAgY29uLT5GZWF0dXJlMSA9IFBTRFJWX1BQREdldFdvcmQoc3RhcnQsICZzdGFydCk7CisJICAgIGNvbi0+VmFsdWUxID0gUFNEUlZfUFBER2V0V29yZChzdGFydCwgJnN0YXJ0KTsKKwkgICAgY29uLT5GZWF0dXJlMiA9IFBTRFJWX1BQREdldFdvcmQoc3RhcnQsICZzdGFydCk7CisJICAgIGNvbi0+VmFsdWUyID0gUFNEUlZfUFBER2V0V29yZChzdGFydCwgJnN0YXJ0KTsKKwl9CisJICAgIAorCWVsc2UgaWYoIXN0cmNtcCgiKklucHV0U2xvdCIsIHR1cGxlLmtleSkpIHsKKwkgICAgSU5QVVRTTE9UICpzbG90LCAqKmluc2VydCA9ICZwcGQtPklucHV0U2xvdHM7CisJICAgIGludCBpOworCisJICAgIHdoaWxlKCppbnNlcnQpCisJICAgICAgICBpbnNlcnQgPSAmKCgqaW5zZXJ0KS0+bmV4dCk7CisKKwkgICAgc2xvdCA9ICppbnNlcnQgPSBIZWFwQWxsb2MoIFBTRFJWX0hlYXAsIEhFQVBfWkVST19NRU1PUlksCisJCQkJICAgIHNpemVvZigqc2xvdCkgKTsKKworCSAgICBzbG90LT5OYW1lID0gdHVwbGUub3B0aW9uOworCSAgICB0dXBsZS5vcHRpb24gPSBOVUxMOworCSAgICBpZih0dXBsZS5vcHR0cmFucykgeworCSAgICAgICAgc2xvdC0+RnVsbE5hbWUgPSB0dXBsZS5vcHR0cmFuczsKKwkJdHVwbGUub3B0dHJhbnMgPSBOVUxMOworCSAgICB9CisJICAgIGlmKHR1cGxlLnZhbHVlKSB7CisJICAgICAgICBzbG90LT5JbnZvY2F0aW9uU3RyaW5nID0gdHVwbGUudmFsdWU7CisJCXR1cGxlLnZhbHVlID0gTlVMTDsKKwkgICAgfQorCisJICAgIAorCSAgICBmb3IoaSA9IDA7IEJpblRyYW5zW2ldLlBTTmFtZTsgaSsrKSB7CisJICAgICAgICBpZighc3RyY21wKEJpblRyYW5zW2ldLlBTTmFtZSwgc2xvdC0+TmFtZSkpIHsgLyogY2FzZSA/ICovCisJCSAgICBzbG90LT5XaW5CaW4gPSBCaW5UcmFuc1tpXS5XaW5CaW47CisJCSAgICBicmVhazsKKwkJfQorCSAgICB9CisJICAgIGlmKCFzbG90LT5XaW5CaW4pCisJICAgICAgICBGSVhNRShwc2RydiwgIkNhbid0IGZpbmQgV2luZG93cyBiaW4gdHlwZSBmb3IgJyVzJ1xuIiwKKwkJCSAgc2xvdC0+TmFtZSk7CisKKwl9ICAgCisKKwlpZih0dXBsZS5rZXkpIEhlYXBGcmVlKFBTRFJWX0hlYXAsIDAsIHR1cGxlLmtleSk7CisJaWYodHVwbGUub3B0aW9uKSBIZWFwRnJlZShQU0RSVl9IZWFwLCAwLCB0dXBsZS5vcHRpb24pOworCWlmKHR1cGxlLnZhbHVlKSBIZWFwRnJlZShQU0RSVl9IZWFwLCAwLCB0dXBsZS52YWx1ZSk7CisJaWYodHVwbGUub3B0dHJhbnMpIEhlYXBGcmVlKFBTRFJWX0hlYXAsIDAsIHR1cGxlLm9wdHRyYW5zKTsKKwlpZih0dXBsZS52YWx0cmFucykgSGVhcEZyZWUoUFNEUlZfSGVhcCwgMCwgdHVwbGUudmFsdHJhbnMpOyAgICAKKwkKKyAgICB9CisKKworICAgIHsKKyAgICAgICAgRk9OVE5BTUUgKmZuOworCVBBR0VTSVpFICpwYWdlOworCUNPTlNUUkFJTlQgKmNvbjsKKwlJTlBVVFNMT1QgKnNsb3Q7CisKKwlmb3IoZm4gPSBwcGQtPkluc3RhbGxlZEZvbnRzOyBmbjsgZm4gPSBmbi0+bmV4dCkKKwkgICAgVFJBQ0UocHNkcnYsICInJXMnXG4iLCBmbi0+TmFtZSk7CisJCisJZm9yKHBhZ2UgPSBwcGQtPlBhZ2VTaXplczsgcGFnZTsgcGFnZSA9IHBhZ2UtPm5leHQpIHsKKwkgICAgVFJBQ0UocHNkcnYsICInJXMnIGFrYSAnJXMnICglZCkgaW52b2tlZCBieSAnJXMnXG4iLCBwYWdlLT5OYW1lLAorCSAgICAgIHBhZ2UtPkZ1bGxOYW1lLCBwYWdlLT5XaW5QYWdlLCBwYWdlLT5JbnZvY2F0aW9uU3RyaW5nKTsKKwkgICAgaWYocGFnZS0+SW1hZ2VhYmxlQXJlYSkKKwkgICAgICAgIFRSQUNFKHBzZHJ2LCAiQXJlYSA9ICUuMmYsJS4yZiAtICUuMmYsICUuMmZcbiIsIAorCQkgICAgICBwYWdlLT5JbWFnZWFibGVBcmVhLT5sbHgsIHBhZ2UtPkltYWdlYWJsZUFyZWEtPmxseSwKKwkJICAgICAgcGFnZS0+SW1hZ2VhYmxlQXJlYS0+dXJ4LCBwYWdlLT5JbWFnZWFibGVBcmVhLT51cnkpOworCSAgICBpZihwYWdlLT5QYXBlckRpbWVuc2lvbikKKwkgICAgICAgIFRSQUNFKHBzZHJ2LCAiRGltZW5zaW9uID0gJS4yZiB4ICUuMmZcbiIsIAorCQkgICAgICBwYWdlLT5QYXBlckRpbWVuc2lvbi0+eCwgcGFnZS0+UGFwZXJEaW1lbnNpb24tPnkpOworCX0KKworCWZvcihjb24gPSBwcGQtPkNvbnN0cmFpbnRzOyBjb247IGNvbiA9IGNvbi0+bmV4dCkKKwkgICAgVFJBQ0UocHNkcnYsICIlcyAlcyAlcyAlc1xuIiwgY29uLT5GZWF0dXJlMSwgY29uLT5WYWx1ZTEsCisJCSAgY29uLT5GZWF0dXJlMiwgY29uLT5WYWx1ZTIpOworCisJZm9yKHNsb3QgPSBwcGQtPklucHV0U2xvdHM7IHNsb3Q7IHNsb3QgPSBzbG90LT5uZXh0KQorCSAgICBUUkFDRShwc2RydiwgIlNsb3QgJyVzJyBOYW1lICclcycgKCVkKSBJbnZvY2F0aW9uICclcydcbiIsCisJCSAgc2xvdC0+TmFtZSwgc2xvdC0+RnVsbE5hbWUsIHNsb3QtPldpbkJpbiwgCisJCSAgc2xvdC0+SW52b2NhdGlvblN0cmluZyk7CisgICAgfQorCisgICAgcmV0dXJuIHBwZDsKK30KKwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvcHNkcnYvcHMuYyBiL2dyYXBoaWNzL3BzZHJ2L3BzLmMKaW5kZXggYzU0NGQxNy4uMDg5M2VlNiAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvcHNkcnYvcHMuYworKysgYi9ncmFwaGljcy9wc2Rydi9wcy5jCkBAIC0xLDIwICsxLDIxIEBACiAvKgotICoJUG9zdHNjcmlwdCBvdXRwdXQgZnVuY3Rpb25zCisgKglQb3N0U2NyaXB0IG91dHB1dCBmdW5jdGlvbnMKICAqCiAgKglDb3B5cmlnaHQgMTk5OCAgSHV3IEQgTSBEYXZpZXMKICAqCiAgKi8KIAotI2luY2x1ZGUgIndpbmRvd3MuaCIKLSNpbmNsdWRlICJwc2Rydi5oIgotI2luY2x1ZGUgInByaW50LmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8cHNkcnYuaD4KKyNpbmNsdWRlIDxwcmludC5oPgorI2luY2x1ZGUgPGRlYnVnLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KIAotY2hhciBwc2hlYWRlcltdID0gLyogdGl0bGUgKi8KK2NoYXIgcHNoZWFkZXJbXSA9IC8qIHRpdGxlIGxseCBsbHkgdXJ4IHVyeSAqLwogIiUlIVBTLUFkb2JlLTMuMCAobm90IHF1aXRlKVxuIgotIiUlJSVDcmVhdG9yOiBXaW5lIFBvc3RzY3JpcHQgRHJpdmVyXG4iCisiJSUlJUNyZWF0b3I6IFdpbmUgUG9zdFNjcmlwdCBEcml2ZXJcbiIKICIlJSUlVGl0bGU6ICVzXG4iCi0iJSUlJUJvdW5kaW5nQm94OiAwIDAgNTk1IDg0MlxuIgorIiUlJSVCb3VuZGluZ0JveDogJWQgJWQgJWQgJWRcbiIKICIlJSUlUGFnZXM6IChhdGVuZClcbiIKICIlJSUlRW5kQ29tbWVudHNcbiIKICIlJSUlQmVnaW5Qcm9sb2dcbiIKQEAgLTI3LDkgKzI4LDIxIEBACiAiZW5kXG4iCiAiZGVmaW5lZm9udCBwb3BcbiIKICJ9IGJpbmQgZGVmXG4iCi0iJSUlJUVuZFByb2xvZ1xuIgotIiUlJSVCZWdpblNldHVwXG4iCi0iJSUlJUVuZFNldHVwXG4iOworIiUlJSVFbmRQcm9sb2dcbiI7CisKK2NoYXIgcHNiZWdpbnNldHVwW10gPQorIiUlQmVnaW5TZXR1cFxuIjsKKworY2hhciBwc2VuZHNldHVwW10gPQorIiUlRW5kU2V0dXBcbiI7CisKK2NoYXIgcHNiZWdpbmZlYXR1cmVbXSA9IC8qIGZlYXR1cmUsIHZhbHVlICovCisibWFyayB7XG4iCisiJSUlJUJlZ2luRmVhdHVyZTogJXMgJXNcbiI7CisKK2NoYXIgcHNlbmRmZWF0dXJlW10gPQorIlxuJSVFbmRGZWF0dXJlXG4iCisifSBzdG9wcGVkIGNsZWFydG9tYXJrXG4iOwogCiBjaGFyIHBzbmV3cGFnZVtdID0gLyogbmFtZSwgbnVtYmVyICovCiAiJSUlJVBhZ2U6ICVzICVkXG4iCkBAIC03Myw3ICs4Niw3IEBACiAKIGNoYXIgcHNzZXRmb250W10gPSAvKiBmb250bmFtZSwgeHNjYWxlLCB5c2NhbGUsIGFzY2VudCwgZXNjYXBlbWVudCAqLwogIi8lcyBmaW5kZm9udFxuIgotIlslZCAwIDAgJWQgMCAlZF1cbiIKKyJbJWQgMCAwICVkIDAgMF1cbiIKICIlZCAxMCBkaXYgbWF0cml4IHJvdGF0ZVxuIgogIm1hdHJpeCBjb25jYXRtYXRyaXhcbiIKICJtYWtlZm9udCBzZXRmb250XG4iOwpAQCAtOTYsMTMgKzEwOSwzNSBAQAogfQogCiAKK0lOVDMyIFBTRFJWX1dyaXRlRmVhdHVyZShIQU5ETEUxNiBoSm9iLCBjaGFyICpmZWF0dXJlLCBjaGFyICp2YWx1ZSwKKwkJCSBjaGFyICppbnZvY2F0aW9uKQoreworCisgICAgY2hhciAqYnVmID0gKGNoYXIgKilIZWFwQWxsb2MoIFBTRFJWX0hlYXAsIDAsIHNpemVvZihwc2hlYWRlcikgKworCQkJICAgICBzdHJsZW4oZmVhdHVyZSkgKyBzdHJsZW4odmFsdWUpKTsKKworCisgICAgd3NwcmludGYzMkEoYnVmLCBwc2JlZ2luZmVhdHVyZSwgZmVhdHVyZSwgdmFsdWUpOworICAgIFdyaXRlU3Bvb2woIGhKb2IsIGJ1Ziwgc3RybGVuKGJ1ZikgKTsKKworICAgIFdyaXRlU3Bvb2woIGhKb2IsIGludm9jYXRpb24sIHN0cmxlbihpbnZvY2F0aW9uKSApOworCisgICAgV3JpdGVTcG9vbCggaEpvYiwgcHNlbmRmZWF0dXJlLCBzdHJsZW4ocHNlbmRmZWF0dXJlKSApOworICAgIAorICAgIEhlYXBGcmVlKCBQU0RSVl9IZWFwLCAwLCBidWYgKTsKKyAgICByZXR1cm4gMTsKK30KKworCisKIElOVDMyIFBTRFJWX1dyaXRlSGVhZGVyKCBEQyAqZGMsIGNoYXIgKnRpdGxlLCBpbnQgbGVuICkKIHsKICAgICBQU0RSVl9QREVWSUNFICpwaHlzRGV2ID0gKFBTRFJWX1BERVZJQ0UgKilkYy0+cGh5c0RldjsKICAgICBjaGFyICpidWYsICp0aXRsZWJ1ZjsKKyAgICBJTlBVVFNMT1QgKnNsb3Q7CisgICAgUEFHRVNJWkUgKnBhZ2U7CiAKLQotICAgIHRpdGxlYnVmID0gKGNoYXIgKilIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIGxlbisxICk7CisgICAgdGl0bGVidWYgPSAoY2hhciAqKUhlYXBBbGxvYyggUFNEUlZfSGVhcCwgMCwgbGVuKzEgKTsKICAgICBpZighdGl0bGVidWYpIHsKICAgICAgICAgV0FSTihwc2RydiwgIkhlYXBBbGxvYyBmYWlsZWRcbiIpOwogICAgICAgICByZXR1cm4gMDsKQEAgLTExMCwyNCArMTQ1LDU0IEBACiAgICAgbWVtY3B5KHRpdGxlYnVmLCB0aXRsZSwgbGVuKTsKICAgICB0aXRsZWJ1ZltsZW5dID0gJ1wwJzsKIAotICAgIGJ1ZiA9IChjaGFyICopSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YocHNoZWFkZXIpICsgbGVuKTsKKyAgICBidWYgPSAoY2hhciAqKUhlYXBBbGxvYyggUFNEUlZfSGVhcCwgMCwgc2l6ZW9mKHBzaGVhZGVyKSArIGxlbiArIDIwKTsKICAgICBpZighYnVmKSB7CiAgICAgICAgIFdBUk4ocHNkcnYsICJIZWFwQWxsb2MgZmFpbGVkXG4iKTsKLQlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdGl0bGVidWYgKTsKKwlIZWFwRnJlZSggUFNEUlZfSGVhcCwgMCwgdGl0bGVidWYgKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgd3NwcmludGYzMkEoYnVmLCBwc2hlYWRlciwgdGl0bGUpOworICAgIHdzcHJpbnRmMzJBKGJ1ZiwgcHNoZWFkZXIsIHRpdGxlLCAwLCAwLCAKKwkJKGludCkgKGRjLT53LmRldkNhcHMtPmhvcnpTaXplICogNzIuMCAvIDI1LjQpLAorCQkoaW50KSAoZGMtPncuZGV2Q2Fwcy0+dmVydFNpemUgKiA3Mi4wIC8gMjUuNCkgKTsKIAogICAgIGlmKCBXcml0ZVNwb29sKCBwaHlzRGV2LT5qb2IuaEpvYiwgYnVmLCBzdHJsZW4oYnVmKSApICE9IAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihidWYpICkgewogICAgICAgICBXQVJOKHBzZHJ2LCAiV3JpdGVTcG9vbCBlcnJvclxuIik7Ci0JSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHRpdGxlYnVmICk7Ci0JSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1ZiApOworCUhlYXBGcmVlKCBQU0RSVl9IZWFwLCAwLCB0aXRsZWJ1ZiApOworCUhlYXBGcmVlKCBQU0RSVl9IZWFwLCAwLCBidWYgKTsKIAlyZXR1cm4gMDsKICAgICB9Ci0gICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHRpdGxlYnVmICk7Ci0gICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1ZiApOworICAgIEhlYXBGcmVlKCBQU0RSVl9IZWFwLCAwLCB0aXRsZWJ1ZiApOworICAgIEhlYXBGcmVlKCBQU0RSVl9IZWFwLCAwLCBidWYgKTsKKworCisgICAgV3JpdGVTcG9vbCggcGh5c0Rldi0+am9iLmhKb2IsIHBzYmVnaW5zZXR1cCwgc3RybGVuKHBzYmVnaW5zZXR1cCkgKTsKKworICAgIGZvcihzbG90ID0gcGh5c0Rldi0+cGktPnBwZC0+SW5wdXRTbG90czsgc2xvdDsgc2xvdCA9IHNsb3QtPm5leHQpIHsKKyAgICAgICAgaWYoc2xvdC0+V2luQmluID09IHBoeXNEZXYtPkRldm1vZGUtPmRtUHVibGljLmRtRGVmYXVsdFNvdXJjZSkgeworCSAgICBpZihzbG90LT5JbnZvY2F0aW9uU3RyaW5nKSB7CisJICAgICAgICBQU0RSVl9Xcml0ZUZlYXR1cmUocGh5c0Rldi0+am9iLmhKb2IsICIqSW5wdXRTbG90Iiwgc2xvdC0+TmFtZSwKKwkJCSAgICAgc2xvdC0+SW52b2NhdGlvblN0cmluZyk7CisJCWJyZWFrOworCSAgICB9CisJfQorICAgIH0KKworICAgIGZvcihwYWdlID0gcGh5c0Rldi0+cGktPnBwZC0+UGFnZVNpemVzOyBwYWdlOyBwYWdlID0gcGFnZS0+bmV4dCkgeworICAgICAgICBpZihwYWdlLT5XaW5QYWdlID09IHBoeXNEZXYtPkRldm1vZGUtPmRtUHVibGljLmRtUGFwZXJTaXplKSB7CisJICAgIGlmKHBhZ2UtPkludm9jYXRpb25TdHJpbmcpIHsKKwkgICAgICAgIFBTRFJWX1dyaXRlRmVhdHVyZShwaHlzRGV2LT5qb2IuaEpvYiwgIipQYWdlU2l6ZSIsIHBhZ2UtPk5hbWUsCisJCQkgICAgIHBhZ2UtPkludm9jYXRpb25TdHJpbmcpOworCQlicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisKKworICAgIFdyaXRlU3Bvb2woIHBoeXNEZXYtPmpvYi5oSm9iLCBwc2VuZHNldHVwLCBzdHJsZW4ocHNlbmRzZXR1cCkgKTsKKworCiAgICAgcmV0dXJuIDE7CiB9CiAKQEAgLTEzNyw3ICsyMDIsNyBAQAogICAgIFBTRFJWX1BERVZJQ0UgKnBoeXNEZXYgPSAoUFNEUlZfUERFVklDRSAqKWRjLT5waHlzRGV2OwogICAgIGNoYXIgKmJ1ZjsKIAotICAgIGJ1ZiA9IChjaGFyICopSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YocHNmb290ZXIpICsgMTAwICk7CisgICAgYnVmID0gKGNoYXIgKilIZWFwQWxsb2MoIFBTRFJWX0hlYXAsIDAsIHNpemVvZihwc2Zvb3RlcikgKyAxMDAgKTsKICAgICBpZighYnVmKSB7CiAgICAgICAgIFdBUk4ocHNkcnYsICJIZWFwQWxsb2MgZmFpbGVkXG4iKTsKICAgICAgICAgcmV0dXJuIDA7CkBAIC0xNDgsMTAgKzIxMywxMCBAQAogICAgIGlmKCBXcml0ZVNwb29sKCBwaHlzRGV2LT5qb2IuaEpvYiwgYnVmLCBzdHJsZW4oYnVmKSApICE9IAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihidWYpICkgewogICAgICAgICBXQVJOKHBzZHJ2LCAiV3JpdGVTcG9vbCBlcnJvclxuIik7Ci0JSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1ZiApOworCUhlYXBGcmVlKCBQU0RSVl9IZWFwLCAwLCBidWYgKTsKIAlyZXR1cm4gMDsKICAgICB9Ci0gICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1ZiApOworICAgIEhlYXBGcmVlKCBQU0RSVl9IZWFwLCAwLCBidWYgKTsKICAgICByZXR1cm4gMTsKIH0KIApAQCAtMTgwLDcgKzI0NSw3IEBACiAgICAgCiAgICAgd3NwcmludGYzMkEobmFtZSwgIiVkIiwgcGh5c0Rldi0+am9iLlBhZ2VObyk7CiAKLSAgICBidWYgPSAoY2hhciAqKUhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKHBzbmV3cGFnZSkgKyAxMDAgKTsKKyAgICBidWYgPSAoY2hhciAqKUhlYXBBbGxvYyggUFNEUlZfSGVhcCwgMCwgc2l6ZW9mKHBzbmV3cGFnZSkgKyAxMDAgKTsKICAgICBpZighYnVmKSB7CiAgICAgICAgIFdBUk4ocHNkcnYsICJIZWFwQWxsb2MgZmFpbGVkXG4iKTsKICAgICAgICAgcmV0dXJuIDA7CkBAIC0xOTAsMTAgKzI1NSwxMCBAQAogICAgIGlmKCBXcml0ZVNwb29sKCBwaHlzRGV2LT5qb2IuaEpvYiwgYnVmLCBzdHJsZW4oYnVmKSApICE9IAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihidWYpICkgewogICAgICAgICBXQVJOKHBzZHJ2LCAiV3JpdGVTcG9vbCBlcnJvclxuIik7Ci0JSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1ZiApOworCUhlYXBGcmVlKCBQU0RSVl9IZWFwLCAwLCBidWYgKTsKIAlyZXR1cm4gMDsKICAgICB9Ci0gICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1ZiApOworICAgIEhlYXBGcmVlKCBQU0RSVl9IZWFwLCAwLCBidWYgKTsKICAgICByZXR1cm4gMTsKIH0KIApAQCAtMjM4LDcgKzMwMyw3IEBACiAgICAgUFNEUlZfUERFVklDRSAqcGh5c0RldiA9IChQU0RSVl9QREVWSUNFICopZGMtPnBoeXNEZXY7CiAgICAgY2hhciAqYnVmLCAqbmV3YnVmOwogCi0gICAgYnVmID0gKGNoYXIgKilIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsCisgICAgYnVmID0gKGNoYXIgKilIZWFwQWxsb2MoIFBTRFJWX0hlYXAsIDAsCiAJICAgICBzaXplb2YocHNzZXRmb250KSArIHN0cmxlbihwaHlzRGV2LT5mb250LmFmbS0+Rm9udE5hbWUpICsgNDApOwogCiAgICAgaWYoIWJ1ZikgewpAQCAtMjQ2LDIzICszMTEsMjMgQEAKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAotICAgIG5ld2J1ZiA9IChjaGFyICopSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLAorICAgIG5ld2J1ZiA9IChjaGFyICopSGVhcEFsbG9jKCBQU0RSVl9IZWFwLCAwLAogCSAgICAgIHN0cmxlbihwaHlzRGV2LT5mb250LmFmbS0+Rm9udE5hbWUpICsgc2l6ZW9mKGVuY29kaW5nZXh0KSk7CiAKICAgICBpZighbmV3YnVmKSB7CiAgICAgICAgIFdBUk4ocHNkcnYsICJIZWFwQWxsb2MgZmFpbGVkXG4iKTsKLQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBidWYpOworCUhlYXBGcmVlKFBTRFJWX0hlYXAsIDAsIGJ1Zik7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKICAgICB3c3ByaW50ZjMyQShuZXdidWYsICIlcyVzIiwgcGh5c0Rldi0+Zm9udC5hZm0tPkZvbnROYW1lLCBlbmNvZGluZ2V4dCk7CiAKICAgICB3c3ByaW50ZjMyQShidWYsIHBzc2V0Zm9udCwgbmV3YnVmLCAKLQkJcGh5c0Rldi0+Zm9udC50bS50bUhlaWdodCwgLXBoeXNEZXYtPmZvbnQudG0udG1IZWlnaHQsCi0JCXBoeXNEZXYtPmZvbnQudG0udG1Bc2NlbnQsIC1waHlzRGV2LT5mb250LmVzY2FwZW1lbnQpOworCQlwaHlzRGV2LT5mb250LnNpemUsIC1waHlzRGV2LT5mb250LnNpemUsCisJICAgICAgICAtcGh5c0Rldi0+Zm9udC5lc2NhcGVtZW50KTsKIAogICAgIFBTRFJWX1dyaXRlU3Bvb2woZGMsIGJ1Ziwgc3RybGVuKGJ1ZikpOwotICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1Zik7CisgICAgSGVhcEZyZWUoUFNEUlZfSGVhcCwgMCwgYnVmKTsKICAgICByZXR1cm4gVFJVRTsKIH0gICAgCiAKQEAgLTI3MSw3ICszMzYsNyBAQAogICAgIFBTRFJWX1BERVZJQ0UgKnBoeXNEZXYgPSAoUFNEUlZfUERFVklDRSAqKWRjLT5waHlzRGV2OwogICAgIGNoYXIgKmJ1ZiwgKm5ld2J1ZjsKICAKLSAgICBidWYgPSAoY2hhciAqKUhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwKKyAgICBidWYgPSAoY2hhciAqKUhlYXBBbGxvYyggUFNEUlZfSGVhcCwgMCwKIAkgICAgIHNpemVvZihwc3JlZW5jb2RlZm9udCkgKyAyICogc3RybGVuKHBoeXNEZXYtPmZvbnQuYWZtLT5Gb250TmFtZSkgCiAJCQkgICAgICsgc2l6ZW9mKGVuY29kaW5nZXh0KSk7CiAKQEAgLTI4MCwxMiArMzQ1LDEyIEBACiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKLSAgICBuZXdidWYgPSAoY2hhciAqKUhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwKKyAgICBuZXdidWYgPSAoY2hhciAqKUhlYXBBbGxvYyggUFNEUlZfSGVhcCwgMCwKIAkgICAgICBzdHJsZW4ocGh5c0Rldi0+Zm9udC5hZm0tPkZvbnROYW1lKSArIHNpemVvZihlbmNvZGluZ2V4dCkpOwogCiAgICAgaWYoIW5ld2J1ZikgewogICAgICAgICBXQVJOKHBzZHJ2LCAiSGVhcEFsbG9jIGZhaWxlZFxuIik7Ci0JSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgYnVmKTsKKwlIZWFwRnJlZShQU0RSVl9IZWFwLCAwLCBidWYpOwogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCkBAIC0yOTQsMjYgKzM1OSw0NSBAQAogCiAgICAgUFNEUlZfV3JpdGVTcG9vbChkYywgYnVmLCBzdHJsZW4oYnVmKSk7CiAKLSAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBuZXdidWYpOwotICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1Zik7CisgICAgSGVhcEZyZWUoUFNEUlZfSGVhcCwgMCwgbmV3YnVmKTsKKyAgICBIZWFwRnJlZShQU0RSVl9IZWFwLCAwLCBidWYpOwogICAgIHJldHVybiBUUlVFOwogfSAgICAKIAogQk9PTDMyIFBTRFJWX1dyaXRlU2hvdyhEQyAqZGMsIGNoYXIgKnN0ciwgSU5UMzIgY291bnQpCiB7Ci0gICAgY2hhciAqYnVmOworICAgIGNoYXIgKmJ1ZiwgKmJ1ZjE7CisgICAgSU5UMzIgYnVmbGVuID0gY291bnQgKyAxMCwgaSwgZG9uZTsKIAotICAgIGJ1ZiA9IChjaGFyICopSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YocHNzaG93KSArIGNvdW50KTsKLQotICAgIGlmKCFidWYpIHsKLSAgICAgICAgV0FSTihwc2RydiwgIkhlYXBBbGxvYyBmYWlsZWRcbiIpOwotICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgYnVmID0gKGNoYXIgKilIZWFwQWxsb2MoIFBTRFJWX0hlYXAsIDAsIGJ1ZmxlbiApOworICAgIAorICAgIGZvcihpID0gZG9uZSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIGlmKCFpc3ByaW50KHN0cltpXSkpIHsKKwkgICAgaWYoZG9uZSArIDQgPj0gYnVmbGVuKQorCSAgICAgICAgYnVmID0gSGVhcFJlQWxsb2MoIFBTRFJWX0hlYXAsIDAsIGJ1ZiwgYnVmbGVuICs9IDEwICk7CisJICAgIHNwcmludGYoYnVmICsgZG9uZSwgIlxcJTAzbyIsIChpbnQpKHVuc2lnbmVkIGNoYXIpc3RyW2ldICk7CisJICAgIGRvbmUgKz0gNDsKKwl9IGVsc2UgaWYoc3RyW2ldID09ICdcXCcgfHwgc3RyW2ldID09ICcoJyB8fCBzdHJbaV0gPT0gJyknICkgeworCSAgICBpZihkb25lICsgMiA+PSBidWZsZW4pCisJICAgICAgICBidWYgPSBIZWFwUmVBbGxvYyggUFNEUlZfSGVhcCwgMCwgYnVmLCBidWZsZW4gKz0gMTAgKTsKKwkgICAgYnVmW2RvbmUrK10gPSAnXFwnOworCSAgICBidWZbZG9uZSsrXSA9IHN0cltpXTsKKwl9IGVsc2UgeworCSAgICBpZihkb25lICsgMSA+PSBidWZsZW4pCisJICAgICAgICBidWYgPSBIZWFwUmVBbGxvYyggUFNEUlZfSGVhcCwgMCwgYnVmLCBidWZsZW4gKz0gMTAgKTsKKwkgICAgYnVmW2RvbmUrK10gPSBzdHJbaV07CisJfQogICAgIH0KKyAgICBidWZbZG9uZV0gPSAnXDAnOwogCi0gICAgd3NwcmludGYzMkEoYnVmLCBwc3Nob3csIHN0cik7CisgICAgYnVmMSA9IChjaGFyICopSGVhcEFsbG9jKCBQU0RSVl9IZWFwLCAwLCBzaXplb2YocHNzaG93KSArIGRvbmUpOwogCi0gICAgUFNEUlZfV3JpdGVTcG9vbChkYywgYnVmLCBzdHJsZW4oYnVmKSk7Ci0gICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgYnVmKTsKKyAgICB3c3ByaW50ZjMyQShidWYxLCBwc3Nob3csIGJ1Zik7CisKKyAgICBQU0RSVl9Xcml0ZVNwb29sKGRjLCBidWYxLCBzdHJsZW4oYnVmMSkpOworICAgIEhlYXBGcmVlKFBTRFJWX0hlYXAsIDAsIGJ1Zik7CisgICAgSGVhcEZyZWUoUFNEUlZfSGVhcCwgMCwgYnVmMSk7CisKICAgICByZXR1cm4gVFJVRTsKIH0gICAgCiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3BzZHJ2L3RleHQuYyBiL2dyYXBoaWNzL3BzZHJ2L3RleHQuYwppbmRleCBmODg2Yjc1Li5hODIwN2I3IDEwMDY0NAotLS0gYS9ncmFwaGljcy9wc2Rydi90ZXh0LmMKKysrIGIvZ3JhcGhpY3MvcHNkcnYvdGV4dC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqCVBvc3RzY3JpcHQgZHJpdmVyIHRleHQgZnVuY3Rpb25zCisgKglQb3N0U2NyaXB0IGRyaXZlciB0ZXh0IGZ1bmN0aW9ucwogICoKICAqCUNvcHlyaWdodCAxOTk4ICBIdXcgRCBNIERhdmllcwogICoKQEAgLTI0LDcgKzI0LDcgQEAKICAgICBUUkFDRShwc2RydiwgIih4PSVkLCB5PSVkLCBmbGFncz0weCUwOHgsIHN0cj0nJXMnLCBjb3VudD0lZClcbiIsIHgsIHksCiAJICBmbGFncywgc3RyLCBjb3VudCk7CiAKLSAgICBzdHJidWYgPSAoY2hhciAqKUhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgY291bnQgKyAxKTsKKyAgICBzdHJidWYgPSAoY2hhciAqKUhlYXBBbGxvYyggUFNEUlZfSGVhcCwgMCwgY291bnQgKyAxKTsKICAgICBpZighc3RyYnVmKSB7CiAgICAgICAgIFdBUk4ocHNkcnYsICJIZWFwQWxsb2MgZmFpbGVkXG4iKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwpAQCAtNjEsMTQgKzYxLDE0IEBACiAKICAgICBzd2l0Y2goZGMtPncudGV4dEFsaWduICYgKFRBX1RPUCB8IFRBX0JBU0VMSU5FIHwgVEFfQk9UVE9NKSApIHsKICAgICBjYXNlIFRBX1RPUDoKKyAgICAgICAgeSArPSBwaHlzRGV2LT5mb250LnRtLnRtQXNjZW50OwogCWJyZWFrOwogCiAgICAgY2FzZSBUQV9CQVNFTElORToKLQl5IC09IHBoeXNEZXYtPmZvbnQudG0udG1Bc2NlbnQ7CiAJYnJlYWs7CiAKICAgICBjYXNlIFRBX0JPVFRPTToKLSAgICAgICAgeSAtPSBzei5jeTsKKyAgICAgICAgeSAtPSBwaHlzRGV2LT5mb250LnRtLnRtRGVzY2VudDsKIAlicmVhazsKICAgICB9CiAKQEAgLTgwLDYgKzgwLDYgQEAKICAgICBQU0RSVl9Xcml0ZU1vdmVUbyhkYywgeCwgeSk7CiAgICAgUFNEUlZfV3JpdGVTaG93KGRjLCBzdHJidWYsIHN0cmxlbihzdHJidWYpKTsKIAotICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHN0cmJ1Zik7CisgICAgSGVhcEZyZWUoUFNEUlZfSGVhcCwgMCwgc3RyYnVmKTsKICAgICByZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbjE2ZHJ2L2luaXQuYyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L2luaXQuYwppbmRleCBlMGY5Njk5Li4wNTNhMmYzIDEwMDY0NAotLS0gYS9ncmFwaGljcy93aW4xNmRydi9pbml0LmMKKysrIGIvZ3JhcGhpY3Mvd2luMTZkcnYvaW5pdC5jCkBAIC02MTMsNyArNjEzLDggQEAKIAkgICAgbWVtc2V0KHBQcmludEpvYiwgMCwgc2l6ZW9mKFBSSU5USk9CKSk7CiAKIAkgICAgcFByaW50Sm9iLT5wc3pPdXRwdXQgPSBzdHJkdXAobHBPdXRwdXQpOwotCSAgICBwUHJpbnRKb2ItPnBzelRpdGxlID0gc3RyZHVwKGxwVGl0bGUpOworCSAgICBpZihscFRpdGxlKQorCSAgICAgICAgcFByaW50Sm9iLT5wc3pUaXRsZSA9IHN0cmR1cChscFRpdGxlKTsKIAkgICAgcFByaW50Sm9iLT5oREMgPSBoREM7CiAJICAgIHBQcmludEpvYi0+ZmQgPSBmZDsKIAkgICAgcFByaW50Sm9iLT5uSW5kZXggPSAwOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L3hmb250LmMgYi9ncmFwaGljcy94MTFkcnYveGZvbnQuYwppbmRleCA3MTIwNjg5Li4yN2M1MDA5IDEwMDY0NAotLS0gYS9ncmFwaGljcy94MTFkcnYveGZvbnQuYworKysgYi9ncmFwaGljcy94MTFkcnYveGZvbnQuYwpAQCAtMTY1LDcgKzE2NSw3IEBACiAjdW5kZWYgcHRyCiAgICBpID0gMDsKICNkZWZpbmUgcHRyICgoQ0hBUiopcGxmKQotICAgZG8geyBmb250W2krK10gPSB0b2xvd2VyKCpwdHIpOyB9IHdoaWxlICgqcHRyKyspOworICAgZG8geyBmb250W2krK10gPSB0b2xvd2VyKCpwdHIrKyk7IH0gd2hpbGUgKCggaSA8IExGX0ZBQ0VTSVpFKSAmJiAoKnB0cikgJiYgKCpwdHIhPScgJykpOwogICAgZm9yKCBwdHIgPSBmb250LCBpID4+PSAxOyBpID4gMDsgaS0tICkgCiAjdW5kZWYgcHRyCiAjZGVmaW5lIHB0ciAoKFVJTlQxNiopcGxmKQpAQCAtMjI0MCw2ICsyMjQwLDcgQEAKICAgICB9CiAgICAgZWxzZQogCWZvciggOyBwZnIgOyBwZnIgPSBwZnItPm5leHQgKQorICAgICAgICAgIGlmKHBmci0+ZmkpCiAJICAgIGlmKCAoYiA9ICgqcHJvYykoIChMUEVOVU1MT0dGT05UMTYpJmxmLCAmdG0sIAogCQkgICAgICAgWEZPTlRfR2V0Rm9udE1ldHJpYyggcGZyLT5maSwgJmxmLCAmdG0gKSwgbHAgKSkgKQogCQkgYlJldCA9IGI7CmRpZmYgLS1naXQgYS9pZjE2MzIva2VybmVsLnNwZWMgYi9pZjE2MzIva2VybmVsLnNwZWMKaW5kZXggOTE4ZjEyOS4uNTJiY2Q5YSAxMDA2NDQKLS0tIGEvaWYxNjMyL2tlcm5lbC5zcGVjCisrKyBiL2lmMTYzMi9rZXJuZWwuc3BlYwpAQCAtNDQsNyArNDQsNyBAQAogNDIgIHJldHVybiBEaXNhYmxlRG9zIDAgMAogNDUgIHBhc2NhbDE2IExvYWRNb2R1bGUoc3RyIHB0cikgTG9hZE1vZHVsZTE2CiA0NiAgcGFzY2FsMTYgRnJlZU1vZHVsZSh3b3JkKSBGcmVlTW9kdWxlMTYKLTQ3ICBwYXNjYWwxNiBHZXRNb2R1bGVIYW5kbGUoc2Vnc3RyKSBXSU4xNl9HZXRNb2R1bGVIYW5kbGUKKzQ3ICBwYXNjYWwgICBHZXRNb2R1bGVIYW5kbGUoc2Vnc3RyKSBXSU4xNl9HZXRNb2R1bGVIYW5kbGUKIDQ4ICBwYXNjYWwxNiBHZXRNb2R1bGVVc2FnZSh3b3JkKSBHZXRNb2R1bGVVc2FnZQogNDkgIHBhc2NhbDE2IEdldE1vZHVsZUZpbGVOYW1lKHdvcmQgcHRyIHNfd29yZCkgR2V0TW9kdWxlRmlsZU5hbWUxNgogNTAgIHBhc2NhbCBHZXRQcm9jQWRkcmVzcyh3b3JkIHNlZ3N0cikgR2V0UHJvY0FkZHJlc3MxNgpAQCAtMzA5LDcgKzMwOSw3IEBACiA0NDUgc3R1YiBLRVJORUxfNDQ1CiA0NDYgc3R1YiBLRVJORUxfNDQ2CiA0NDcgc3R1YiBLRVJORUxfNDQ3Ci00NDkgcGFzY2FsIEtFUk5FTF80NDkoKSBLRVJORUxfNDQ5Cis0NDkgcGFzY2FsIEdldHBXaW4xNkxvY2soKSBHZXRwV2luMTZMb2NrMTYKIDQ1MCBwYXNjYWwxNiBLRVJORUxfNDUwKCkgc3R1Yl9LRVJORUxfNDUwCiA0NTIgc3R1YiBLRVJORUxfNDUyCiA0NTMgc3R1YiBLRVJORUxfNDUzCmRpZmYgLS1naXQgYS9pZjE2MzIvbXN2aWRlby5zcGVjIGIvaWYxNjMyL21zdmlkZW8uc3BlYwppbmRleCBmM2I2ZTFhLi45YzMwZjVmIDEwMDY0NAotLS0gYS9pZjE2MzIvbXN2aWRlby5zcGVjCisrKyBiL2lmMTYzMi9tc3ZpZGVvLnNwZWMKQEAgLTEsNyArMSw3IEBACiBuYW1lIG1zdmlkZW8KIHR5cGUgd2luMTYKIAotMiBzdHViIFZJREVPRk9SV0lORE9XU1ZFUlNJT04KKzIgcGFzY2FsIFZpZGVvRm9yV2luZG93c1ZlcnNpb24oKSBWaWRlb0ZvcldpbmRvd3NWZXJzaW9uCiAyMCBzdHViIFZJREVPR0VUTlVNREVWUwogMjEgc3R1YiBWSURFT0dFVEVSUk9SVEVYVAogMjIgc3R1YiBWSURFT0NBUERSSVZFUkRFU0NBTkRWRVIKZGlmZiAtLWdpdCBhL2lmMTYzMi9yZWxheS5jIGIvaWYxNjMyL3JlbGF5LmMKaW5kZXggY2M5MDRlMy4uY2E5ZjZiYiAxMDA2NDQKLS0tIGEvaWYxNjMyL3JlbGF5LmMKKysrIGIvaWYxNjMyL3JlbGF5LmMKQEAgLTI3MCwxMCArMjcwLDEwIEBACiAJfQogICAgICAgICBEUFJJTlRGKCIpIHNzOnNwPSUwNHg6JTA0eFxuIiwgU0VMRUNUT1JPRih0aGRiLT5jdXJfc3RhY2spLAogICAgICAgICAgICAgICAgIE9GRlNFVE9GKHRoZGItPmN1cl9zdGFjaykgKTsKLSAgICAgICAgRFBSSU5URigiICAgICBBWD0lMDR4IEJYPSUwNHggQ1g9JTA0eCBEWD0lMDR4IFNJPSUwNHggREk9JTA0eCBCUD0lMDR4IEVTPSUwNHhcbiIsCisgICAgICAgIERQUklOVEYoIiAgICAgQVg9JTA0eCBCWD0lMDR4IENYPSUwNHggRFg9JTA0eCBTST0lMDR4IERJPSUwNHggQlA9JTA0eCBFUz0lMDR4IEZTPSUwNHhcbiIsCiAgICAgICAgICAgICAgICAgQVhfcmVnKGNvbnRleHQpLCBCWF9yZWcoY29udGV4dCksIENYX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICAgICBEWF9yZWcoY29udGV4dCksIFNJX3JlZyhjb250ZXh0KSwgRElfcmVnKGNvbnRleHQpLAotICAgICAgICAgICAgICAgIEJQX3JlZyhjb250ZXh0KSwgKFdPUkQpRVNfcmVnKGNvbnRleHQpICk7CisgICAgICAgICAgICAgICAgQlBfcmVnKGNvbnRleHQpLCAoV09SRClFU19yZWcoY29udGV4dCksIChXT1JEKUZTX3JlZyhjb250ZXh0KSApOwogICAgIH0KICAgICBlbHNlCiAgICAgewpAQCAtMjkxLDYgKzI5MSwyMSBAQAogfQogCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFJFTEFZX0RlYnVnQ2FsbFRvMTZSZXQKKyAqLwordm9pZCBSRUxBWV9EZWJ1Z0NhbGxUbzE2UmV0KCBpbnQgcmV0X3ZhbCApCit7CisgICAgVEhEQiAqdGhkYjsKKworICAgIGlmICghVFJBQ0VfT04ocmVsYXkpKSByZXR1cm47CisgICAgdGhkYiA9IFRIUkVBRF9DdXJyZW50KCk7CisKKyAgICBEUFJJTlRGKCJDYWxsVG8xNigpIHNzOnNwPSUwNHg6JTA0eCByZXR2YWw9MHglMDh4XG4iLCAKKyAgICAgICAgICAgIFNFTEVDVE9ST0YodGhkYi0+Y3VyX3N0YWNrKSwgT0ZGU0VUT0YodGhkYi0+Y3VyX3N0YWNrKSwgcmV0X3ZhbCk7Cit9CisKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCSAgICAgQ2F0Y2ggICAgKEtFUk5FTC41NSkKICAqCmRpZmYgLS1naXQgYS9pZjE2MzIvdGh1bmsuYyBiL2lmMTYzMi90aHVuay5jCmluZGV4IDAxNzk0YWIuLjgzZjVkODcgMTAwNjQ0Ci0tLSBhL2lmMTYzMi90aHVuay5jCisrKyBiL2lmMTYzMi90aHVuay5jCkBAIC0yNTAsNyArMjUwLDggQEAKICAgICBUSERCICp0aGRiID0gVEhSRUFEX0N1cnJlbnQoKTsKIAogICAgIC8qIFdpbmRvdyBwcm9jZWR1cmVzIHdhbnQgYXggPSBoSW5zdGFuY2UsIGRzID0gZXMgPSBzcyAqLwotCisgICAgCisgICAgbWVtc2V0KCZjb250ZXh0LCAnXDAnLCBzaXplb2YoY29udGV4dCkpOwogICAgIERTX3JlZygmY29udGV4dCkgID0gU0VMRUNUT1JPRih0aGRiLT5jdXJfc3RhY2spOwogICAgIEVTX3JlZygmY29udGV4dCkgID0gRFNfcmVnKCZjb250ZXh0KTsKICAgICBFQVhfcmVnKCZjb250ZXh0KSA9IHduZFB0ciA/IHduZFB0ci0+aEluc3RhbmNlIDogRFNfcmVnKCZjb250ZXh0KTsKQEAgLTg5Miw4ICs4OTMsNiBAQAogICAgICAgICAgICAgQ1NfcmVnKGNvbnRleHQpID0gc3RhY2tbM107CiAgICAgICAgICAgICBTUF9yZWcoY29udGV4dCkgKz0gdGQtPmFwaURCW3RhcmdldE5yXS5uckFyZ0J5dGVzICsgNDsKIAotICAgICAgICAgICAgLyogV2luOTUgYWxsb3dzIGRlbGF5ZWQgbG9hZGluZyBvZiB0aGUgMzItYml0IERMTC4KLSAgICAgICAgICAgICAgIFdlIGRvbid0IGRvIHRoYXQgYXQgdGhlIG1vbWVudC4gKi8KICAgICAgICAgICAgIEVSUih0aHVuaywgIlByb2Nlc3MgJTA4bHggZGlkIG5vdCBUaHVua0Nvbm5lY3QzMiAlcyB0byAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgKERXT1JEKVBST0NFU1NfQ3VycmVudCgpLCB0ZC0+cHN6RGxsMzIsIHRkLT5wc3pEbGwxNik7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2lmMTYzMi93aW5lcHMuc3BlYyBiL2lmMTYzMi93aW5lcHMuc3BlYwppbmRleCBhMDJhY2EyLi40ZWRlMTc0IDEwMDY0NAotLS0gYS9pZjE2MzIvd2luZXBzLnNwZWMKKysrIGIvaWYxNjMyL3dpbmVwcy5zcGVjCkBAIC00LDQgKzQsNCBAQAogMTMgcGFzY2FsMTYgRGV2aWNlTW9kZSh3b3JkIHdvcmQgc3RyIHN0cikgUFNEUlZfRGV2aWNlTW9kZTE2CiA5MCBwYXNjYWwxNiBFeHREZXZpY2VNb2RlKHdvcmQgd29yZCBwdHIgc3RyIHN0ciBwdHIgc3RyIHdvcmQpIFBTRFJWX0V4dERldmljZU1vZGUxNgogOTEgcGFzY2FsIERldmljZUNhcGFiaWxpdGllcyhzdHIgc3RyIHdvcmQgcHRyIHB0cikgUFNEUlZfRGV2aWNlQ2FwYWJpbGl0aWVzMTYKLQorOTMgcGFzY2FsMTYgQWR2YW5jZWRTZXR1cERpYWxvZyh3b3JkIHdvcmQgcHRyIHB0cikgUFNEUlZfQWR2YW5jZWRTZXR1cERpYWxvZzE2CmRpZmYgLS1naXQgYS9pbmNsdWRlL2J1aWx0aW4zMi5oIGIvaW5jbHVkZS9idWlsdGluMzIuaAppbmRleCAwNWNmMTA2Li4zOTg4NDZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2J1aWx0aW4zMi5oCisrKyBiL2luY2x1ZGUvYnVpbHRpbjMyLmgKQEAgLTIwLDYgKzIwLDcgQEAKICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCAqb3JkaW5hbHM7ICAgICAvKiBQb2ludGVyIHRvIG9yZGluYWxzIHRhYmxlICovCiAgICAgY29uc3QgdW5zaWduZWQgY2hhciAgKmFyZ3M7ICAgICAgICAgLyogUG9pbnRlciB0byBhcmd1bWVudCBsZW5ndGhzICovCiAgICAgY29uc3QgdW5zaWduZWQgaW50ICAgKmFyZ3R5cGVzOyAgICAgLyogUG9pbnRlciB0byBhcmd1bWVudCB0eXBlcyBiaXRtYXNrICovCisgICAgY29uc3QgRU5UUllQT0lOVDMyICAgIGRsbGVudHJ5cG9pbnQ7LyogUG9pbnRlciB0byBMaWJNYWluIGZ1bmN0aW9uICovCiB9IEJVSUxUSU4zMl9ERVNDUklQVE9SOwogCiBleHRlcm4gRU5UUllQT0lOVDMyIEJVSUxUSU4zMl9HZXRFbnRyeVBvaW50KCBjaGFyICpidWZmZXIsIHZvaWQgKnJlbGF5LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb21tY3RybC5oIGIvaW5jbHVkZS9jb21tY3RybC5oCmluZGV4IGQ0ZTc2NWMuLjA0ZjI5ZmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29tbWN0cmwuaAorKysgYi9pbmNsdWRlL2NvbW1jdHJsLmgKQEAgLTYsNiArNiw3IEBACiAjZGVmaW5lIF9fV0lORV9DT01NQ1RSTF9ICiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAiaW1hZ2VsaXN0LmgiCiAKIEJPT0wzMiBXSU5BUEkgU2hvd0hpZGVNZW51Q3RsIChIV05EMzIsIFVJTlQzMiwgTFBJTlQzMik7CiBWT0lEIFdJTkFQSSBHZXRFZmZlY3RpdmVDbGllbnRSZWN0IChIV05EMzIsIExQUkVDVDMyLCBMUElOVDMyKTsKQEAgLTkyLDYgKzkzLDEzIEBACiAjZGVmaW5lIE9EVF9UQUIgICAgICAgICAxMDEKICNkZWZpbmUgT0RUX0xJU1RWSUVXICAgIDEwMgogCisvKiBjb21tb24gbm90aWZpY2F0aW9uIHN0cnVjdHVyZXMgKi8KK3R5cGVkZWYgc3RydWN0IHRhZ05NVE9PTFRJUFNDUkVBVEVECit7CisgICAgTk1IRFIgIGhkcjsKKyAgICBIV05EMzIgaHduZFRvb2xUaXBzOworfSBOTVRPT0xUSVBTQ1JFQVRFRCwgKkxQTk1UT09MVElQU0NSRUFURUQ7CisKIAogLyogU3RhdHVzV2luZG93ICovCiAKQEAgLTExOCwxMiArMTI2LDE5IEBACiAjZGVmaW5lIFNCX0dFVFJFQ1QgICAgICAgICAgICAoV01fVVNFUisxMCkKICNkZWZpbmUgU0JfSVNTSU1QTEUgICAgICAgICAgIChXTV9VU0VSKzE0KQogI2RlZmluZSBTQl9TRVRJQ09OICAgICAgICAgICAgKFdNX1VTRVIrMTUpCisjZGVmaW5lIFNCX1NFVFRJUFRFWFQzMkEgICAgICAoV01fVVNFUisxNikKKyNkZWZpbmUgU0JfU0VUVElQVEVYVDMyVyAgICAgIChXTV9VU0VSKzE3KQorI2RlZmluZSBTQl9TRVRUSVBURVhUIFdJTkVMSUJfTkFNRV9BVyhTQl9TRVRUSVBURVhUKQorI2RlZmluZSBTQl9HRVRUSVBURVhUMzJBICAgICAgKFdNX1VTRVIrMTgpCisjZGVmaW5lIFNCX0dFVFRJUFRFWFQzMlcgICAgICAoV01fVVNFUisxOSkKKyNkZWZpbmUgU0JfR0VUVElQVEVYVCBXSU5FTElCX05BTUVfQVcoU0JfR0VUVElQVEVYVCkKICNkZWZpbmUgU0JfR0VUSUNPTiAgICAgICAgICAgIChXTV9VU0VSKzIwKQogI2RlZmluZSBTQl9TRVRCS0NPTE9SICAgICAgICAgQ0NNX1NFVEJLQ09MT1IgICAvKiBsUGFyYW0gPSBia0NvbG9yICovCiAKICNkZWZpbmUgU0JUX05PQk9SREVSUyAgICAgICAgIDB4MDEwMAogI2RlZmluZSBTQlRfUE9QT1VUICAgICAgICAgICAgMHgwMjAwCiAjZGVmaW5lIFNCVF9SVExSRUFESU5HICAgICAgICAweDA0MDAgIC8qIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgU0JUX1RPT0xUSVBTICAgICAgICAgIDB4MDgwMAogI2RlZmluZSBTQlRfT1dORVJEUkFXICAgICAgICAgMHgxMDAwCiAKICNkZWZpbmUgU0JBUlNfU0laRUdSSVAgICAgICAgIDB4MDEwMApAQCAtMTMyLDcgKzE0NywxNCBAQAogI2RlZmluZSBTQk5fTEFTVCAgICAgICAgICAgICAgKDBVLTg5OVUpCiAjZGVmaW5lIFNCTl9TSU1QTEVNT0RFQ0hBTkdFICAoU0JOX0ZJUlNULTApCiAKLXZvaWQgV0lOQVBJIE1lbnVIZWxwIChVSU5UMzIsIFdQQVJBTTMyLCBMUEFSQU0sIEhNRU5VMzIsCisKK0hXTkQzMiBXSU5BUEkgQ3JlYXRlU3RhdHVzV2luZG93MzJBIChJTlQzMiwgTFBDU1RSLCBIV05EMzIsIFVJTlQzMik7CitIV05EMzIgV0lOQVBJIENyZWF0ZVN0YXR1c1dpbmRvdzMyVyAoSU5UMzIsIExQQ1dTVFIsIEhXTkQzMiwgVUlOVDMyKTsKKyNkZWZpbmUgICAgQ3JlYXRlU3RhdHVzV2luZG93IFdJTkVMSUJfTkFNRV9BVyhDcmVhdGVTdGF0dXNXaW5kb3cpCitWT0lEIFdJTkFQSSBEcmF3U3RhdHVzVGV4dDMyQSAoSERDMzIsIExQUkVDVDMyLCBMUENTVFIsIFVJTlQzMik7CitWT0lEIFdJTkFQSSBEcmF3U3RhdHVzVGV4dDMyVyAoSERDMzIsIExQUkVDVDMyLCBMUENXU1RSLCBVSU5UMzIpOworI2RlZmluZSAgICBEcmF3U3RhdHVzVGV4dCBXSU5FTElCX05BTUVfQVcoRHJhd1N0YXR1c1RleHQpCitWT0lEIFdJTkFQSSBNZW51SGVscCAoVUlOVDMyLCBXUEFSQU0zMiwgTFBBUkFNLCBITUVOVTMyLAogICAgICAgICAgICAgICAgICAgICAgIEhJTlNUQU5DRTMyLCBIV05EMzIsIExQVUlOVDMyKTsKIAogCkBAIC0xNDUsOCArMTY3LDggQEAKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnVURBQ0NFTAogewotICBVSU5UMzIgblNlYzsKLSAgVUlOVDMyIG5JbmM7CisgICAgVUlOVDMyIG5TZWM7CisgICAgVUlOVDMyIG5JbmM7CiB9IFVEQUNDRUw7CiAKICNkZWZpbmUgVURfTUFYVkFMICAgICAgICAgIDB4N2ZmZgpAQCAtMTc3LDEzICsxOTksMTUgQEAKICNkZWZpbmUgVURNX1NFVFJBTkdFMzIgICAgIChXTV9VU0VSKzExMSkKICNkZWZpbmUgVURNX0dFVFJBTkdFMzIgICAgIChXTV9VU0VSKzExMikKIAorSFdORDMyIFdJTkFQSSBDcmVhdGVVcERvd25Db250cm9sIChEV09SRCwgSU5UMzIsIElOVDMyLCBJTlQzMiwgSU5UMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXTkQzMiwgSU5UMzIsIEhJTlNUQU5DRTMyLCBIV05EMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyLCBJTlQzMiwgSU5UMzIpOwogCiAvKiBQcm9ncmVzcyBCYXIgKi8KIAogI2RlZmluZSBQUk9HUkVTU19DTEFTUzMyQSAgICJtc2N0bHNfcHJvZ3Jlc3MzMiIKICNkZWZpbmUgUFJPR1JFU1NfQ0xBU1MzMlcgIEwibXNjdGxzX3Byb2dyZXNzMzIiCiAjZGVmaW5lIFBST0dSRVNTX0NMQVNTMTYgICAgIm1zY3Rsc19wcm9ncmVzcyIKLQogI2RlZmluZSBQUk9HUkVTU19DTEFTUyAgICAgIFdJTkVMSUJfTkFNRV9BVyhQUk9HUkVTU19DTEFTUykKIAogI2RlZmluZSBQQk1fU0VUUkFOR0UgICAgICAgIChXTV9VU0VSKzEpCkBAIC0yMDYsMjcgKzIzMCwxNCBAQAogICBJTlQzMiBpSGlnaDsKIH0gUEJSQU5HRSwgKlBQQlJBTkdFOwogCi0gCi0vKiBGdW5jdGlvbnMgcHJvdG90eXBlcyAqLwotCi1IV05EMzIgICAgIFdJTkFQSSBDcmVhdGVTdGF0dXNXaW5kb3czMkEoSU5UMzIsTFBDU1RSLEhXTkQzMixVSU5UMzIpOwotSFdORDMyICAgICBXSU5BUEkgQ3JlYXRlU3RhdHVzV2luZG93MzJXKElOVDMyLExQQ1dTVFIsSFdORDMyLFVJTlQzMik7Ci0jZGVmaW5lICAgIENyZWF0ZVN0YXR1c1dpbmRvdyBXSU5FTElCX05BTUVfQVcoQ3JlYXRlU3RhdHVzV2luZG93KQotSFdORDMyICAgICBXSU5BUEkgQ3JlYXRlVXBEb3duQ29udHJvbChEV09SRCxJTlQzMixJTlQzMixJTlQzMixJTlQzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFdORDMyLElOVDMyLEhJTlNUQU5DRTMyLEhXTkQzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIsSU5UMzIsSU5UMzIpOwotVk9JRCAgICAgICBXSU5BUEkgRHJhd1N0YXR1c1RleHQzMkEoSERDMzIsTFBSRUNUMzIsTFBDU1RSLFVJTlQzMik7Ci1WT0lEICAgICAgIFdJTkFQSSBEcmF3U3RhdHVzVGV4dDMyVyhIREMzMixMUFJFQ1QzMixMUENXU1RSLFVJTlQzMik7Ci0jZGVmaW5lICAgIERyYXdTdGF0dXNUZXh0IFdJTkVMSUJfTkFNRV9BVyhEcmF3U3RhdHVzVGV4dCkKLQogCiAvKiBJbWFnZUxpc3QgKi8KLQorLyoKICNpZiBkZWZpbmVkKF9fV0lORV9fKSAmJiBkZWZpbmVkKF9fV0lORV9JTUFHRUxJU1RfQykKICNlbHNlCiBzdHJ1Y3QgX0lNQUdFTElTVDsKIHR5cGVkZWYgc3RydWN0IF9JTUFHRUxJU1QgKkhJTUFHRUxJU1Q7Ci0jZW5kaWYgIC8qIF9fV0lORV9fICovCisjZW5kaWYqLyAgLyogX19XSU5FX18gKi8KIAogI2RlZmluZSBDTFJfTk9ORSAgICAgICAgIDB4RkZGRkZGRkYKICNkZWZpbmUgQ0xSX0RFRkFVTFQgICAgICAweEZGMDAwMDAwCkBAIC01NDUsNyArNTU2LDI0IEBACiAjZGVmaW5lIFRCU1RZTEVfRkxBVCAgICAgICAgICAgIDB4MDgwMCAKICNkZWZpbmUgVEJTVFlMRV9MSVNUICAgICAgICAgICAgMHgxMDAwIAogI2RlZmluZSBUQlNUWUxFX0NVU1RPTUVSQVNFICAgICAweDIwMDAgCisKKyNkZWZpbmUgVEJJRl9JTUFHRSAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBUQklGX1RFWFQgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFRCSUZfU1RBVEUgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgVEJJRl9TVFlMRSAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBUQklGX0xQQVJBTSAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIFRCSUZfQ09NTUFORCAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgVEJJRl9TSVpFICAgICAgICAgICAgICAgMHgwMDAwMDA0MAogIAorI2RlZmluZSBUQk5fRklSU1QgICAgICAgICAgICAgICAoMFUtNzAwVSkKKyNkZWZpbmUgVEJOX0xBU1QgICAgICAgICAgICAgICAgKDBVLTcyMFUpCisjZGVmaW5lIFRCTl9HRVRCVVRUT05JTkZPMzJBICAgIChUQk5fRklSU1QtMCkKKyNkZWZpbmUgVEJOX0dFVEJVVFRPTklORk8zMlcgICAgKFRCTl9GSVJTVC0yMCkKKworI2RlZmluZSBUQk5fR0VUSU5GT1RJUDMyQSAgICAgICAoVEJOX0ZJUlNULTE4KQorI2RlZmluZSBUQk5fR0VUSU5GT1RJUDMyVyAgICAgICAoVEJOX0ZJUlNULTE5KQorCisKICNkZWZpbmUgVEJfRU5BQkxFQlVUVE9OICAgICAgICAgIChXTV9VU0VSKzEpCiAjZGVmaW5lIFRCX0NIRUNLQlVUVE9OICAgICAgICAgICAoV01fVVNFUisyKQogI2RlZmluZSBUQl9QUkVTU0JVVFRPTiAgICAgICAgICAgKFdNX1VTRVIrMykKQEAgLTYxMiw2ICs2NDAsMTIgQEAKICNkZWZpbmUgVEJfU0VUTUFYVEVYVFJPV1MgICAgICAgIChXTV9VU0VSKzYwKQogI2RlZmluZSBUQl9HRVRURVhUUk9XUyAgICAgICAgICAgKFdNX1VTRVIrNjEpCiAjZGVmaW5lIFRCX0dFVE9CSkVDVCAgICAgICAgICAgICAoV01fVVNFUis2MikKKyNkZWZpbmUgVEJfR0VUQlVUVE9OSU5GTzMyVyAgICAgIChXTV9VU0VSKzYzKQorI2RlZmluZSBUQl9HRVRCVVRUT05JTkZPMzJBICAgICAgKFdNX1VTRVIrNjUpCisjZGVmaW5lIFRCX0dFVEJVVFRPTklORk8gV0lORUxJQl9OQU1FX0FXKFRCX0dFVEJVVFRPTklORk8pCisjZGVmaW5lIFRCX1NFVEJVVFRPTklORk8zMlcgICAgICAoV01fVVNFUis2NCkKKyNkZWZpbmUgVEJfU0VUQlVUVE9OSU5GTzMyQSAgICAgIChXTV9VU0VSKzY2KQorI2RlZmluZSBUQl9TRVRCVVRUT05JTkZPIFdJTkVMSUJfTkFNRV9BVyhUQl9TRVRCVVRUT05JTkZPKQogI2RlZmluZSBUQl9TRVREUkFXVEVYVEZMQUdTICAgICAgKFdNX1VTRVIrNzApCiAjZGVmaW5lIFRCX0dFVEhPVElURU0gICAgICAgICAgICAoV01fVVNFUis3MSkKICNkZWZpbmUgVEJfU0VUSE9USVRFTSAgICAgICAgICAgIChXTV9VU0VSKzcyKQpAQCAtNjkyLDYgKzcyNiw1OCBAQAogI2RlZmluZSBUQlNBVkVQQVJBTVMgICBXSU5FTElCX05BTUVBVyhUQlNBVkVQQVJBTVMpCiAjZGVmaW5lIExQVEJTQVZFUEFSQU1TIFdJTkVMSUJfTkFNRUFXKExQVEJTQVZFUEFSQU1TKQogCit0eXBlZGVmIHN0cnVjdAoreworICAgIFVJTlQzMiBjYlNpemU7CisgICAgRFdPUkQgIGR3TWFzazsKKyAgICBJTlQzMiAgaWRDb21tYW5kOworICAgIElOVDMyICBpSW1hZ2U7CisgICAgQllURSAgIGZzU3RhdGU7CisgICAgQllURSAgIGZzU3R5bGU7CisgICAgV09SRCAgIGN4OworICAgIERXT1JEICBsUGFyYW07CisgICAgTFBTVFIgIHBzelRleHQ7CisgICAgSU5UMzIgIGNjaFRleHQ7Cit9IFRCQlVUVE9OSU5GTzMyQSwgKkxQVEJCVVRUT05JTkZPMzJBOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIFVJTlQzMiBjYlNpemU7CisgICAgRFdPUkQgIGR3TWFzazsKKyAgICBJTlQzMiAgaWRDb21tYW5kOworICAgIElOVDMyICBpSW1hZ2U7CisgICAgQllURSAgIGZzU3RhdGU7CisgICAgQllURSAgIGZzU3R5bGU7CisgICAgV09SRCAgIGN4OworICAgIERXT1JEICBsUGFyYW07CisgICAgTFBXU1RSIHBzelRleHQ7CisgICAgSU5UMzIgIGNjaFRleHQ7Cit9IFRCQlVUVE9OSU5GTzMyVywgKkxQVEJCVVRUT05JTkZPMzJXOworCisjZGVmaW5lIFRCQlVUVE9OSU5GTyAgIFdJTkVMSUJfTkFNRUFXKFRCQlVUVE9OSU5GTykKKyNkZWZpbmUgTFBUQkJVVFRPTklORk8gV0lORUxJQl9OQU1FQVcoTFBUQkJVVFRPTklORk8pCisKK3R5cGVkZWYgc3RydWN0IHRhZ05NVEJHRVRJTkZPVElQQQoreworICAgIE5NSERSICBoZHI7CisgICAgTFBTVFIgIHBzelRleHQ7CisgICAgSU5UMzIgIGNjaFRleHRNYXg7CisgICAgSU5UMzIgIGlJdGVtOworICAgIExQQVJBTSBsUGFyYW07Cit9IE5NVEJHRVRJTkZPVElQMzJBLCAqTFBOTVRCR0VUSU5GT1RJUDMyQTsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnTk1UQkdFVElORk9USVBXCit7CisgICAgTk1IRFIgIGhkcjsKKyAgICBMUFdTVFIgcHN6VGV4dDsKKyAgICBJTlQzMiAgY2NoVGV4dE1heDsKKyAgICBJTlQzMiAgaUl0ZW07CisgICAgTFBBUkFNIGxQYXJhbTsKK30gTk1UQkdFVElORk9USVAzMlcsICpMUE5NVEJHRVRJTkZPVElQMzJXOworCisjZGVmaW5lIE5NVEJHRVRJTkZPVElQICAgV0lORUxJQl9OQU1FQVcoTk1UQkdFVElORk9GVElQKQorI2RlZmluZSBMUE5NVEJHRVRJTkZPVElQIFdJTkVMSUJfTkFNRUFXKExQTk1UQkdFVElORk9USVApCisKIAogSFdORDMyIFdJTkFQSQogQ3JlYXRlVG9vbGJhcihIV05EMzIsIERXT1JELCBVSU5UMzIsIElOVDMyLCBISU5TVEFOQ0UzMiwKQEAgLTc4NiwxMiArODcyLDEyIEBACiAKICNkZWZpbmUgVFROX0ZJUlNUICAgICAgICAgICAgICAgKDBVLTUyMFUpCiAjZGVmaW5lIFRUTl9MQVNUICAgICAgICAgICAgICAgICgwVS01NDlVKQotI2RlZmluZSBUVE5fR0VURElTUElORk9BICAgICAgICAoVFROX0ZJUlNULTApCi0jZGVmaW5lIFRUTl9HRVRESVNQSU5GT1cgICAgICAgIChUVE5fRklSU1QtMTApCisjZGVmaW5lIFRUTl9HRVRESVNQSU5GTzMyQSAgICAgIChUVE5fRklSU1QtMCkKKyNkZWZpbmUgVFROX0dFVERJU1BJTkZPMzJXICAgICAgKFRUTl9GSVJTVC0xMCkKKyNkZWZpbmUgVFROX0dFVERJU1BJTkZPIFdJTkVMSUJfTkFNRV9BVyhUVE5fR0VURElTUElORk8pCiAjZGVmaW5lIFRUTl9TSE9XICAgICAgICAgICAgICAgIChUVE5fRklSU1QtMSkKICNkZWZpbmUgVFROX1BPUCAgICAgICAgICAgICAgICAgKFRUTl9GSVJTVC0yKQogCi0KIHR5cGVkZWYgc3RydWN0IHRhZ1RPT0xJTkZPQSB7CiAgICAgVUlOVDMyIGNiU2l6ZTsKICAgICBVSU5UMzIgdUZsYWdzOwpAQCAtODAxLDcgKzg4Nyw3IEBACiAgICAgSElOU1RBTkNFMzIgaGluc3Q7CiAgICAgTFBTVFIgbHBzelRleHQ7CiAgICAgTFBBUkFNIGxQYXJhbTsKLX0gVFRUT09MSU5GT0EsICpQVE9PTElORk9BLCAqTFBUVFRPT0xJTkZPQTsKK30gVFRUT09MSU5GTzMyQSwgKlBUT09MSU5GTzMyQSwgKkxQVFRUT09MSU5GTzMyQTsKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnVE9PTElORk9XIHsKICAgICBVSU5UMzIgY2JTaXplOwpAQCAtODEyLDIxICs4OTgsMjggQEAKICAgICBISU5TVEFOQ0UzMiBoaW5zdDsKICAgICBMUFdTVFIgbHBzelRleHQ7CiAgICAgTFBBUkFNIGxQYXJhbTsKLX0gVFRUT09MSU5GT1csICpQVE9PTElORk9XLCAqTFBUVFRPT0xJTkZPVzsKK30gVFRUT09MSU5GTzMyVywgKlBUT09MSU5GTzMyVywgKkxQVFRUT09MSU5GTzMyVzsKKworI2RlZmluZSBUVFRPT0xJTkZPIFdJTkVMSUJfTkFNRV9BVyhUVFRPT0xJTkZPKQorI2RlZmluZSBQVE9PTElORk8gV0lORUxJQl9OQU1FX0FXKFBUT09MSU5GTykKKyNkZWZpbmUgTFBUVFRPT0xJTkZPIFdJTkVMSUJfTkFNRV9BVyhMUFRUVE9PTElORk8pCiAKIHR5cGVkZWYgc3RydWN0IF9UVF9ISVRURVNUSU5GT0EKIHsKLSAgICBIV05EMzIgICAgICBod25kOwotICAgIFBPSU5UMzIgICAgIHB0OwotICAgIFRUVE9PTElORk9BIHRpOwotfSBUVEhJVFRFU1RJTkZPQSwgKkxQVFRISVRURVNUSU5GT0E7CisgICAgSFdORDMyICAgICAgICBod25kOworICAgIFBPSU5UMzIgICAgICAgcHQ7CisgICAgVFRUT09MSU5GTzMyQSB0aTsKK30gVFRISVRURVNUSU5GTzMyQSwgKkxQVFRISVRURVNUSU5GTzMyQTsKIAogdHlwZWRlZiBzdHJ1Y3QgX1RUX0hJVFRFU1RJTkZPVwogewotICAgIEhXTkQzMiAgICAgIGh3bmQ7Ci0gICAgUE9JTlQzMiAgICAgcHQ7Ci0gICAgVFRUT09MSU5GT1cgdGk7Ci19IFRUSElUVEVTVElORk9XLCAqTFBUVEhJVFRFU1RJTkZPVzsKKyAgICBIV05EMzIgICAgICAgIGh3bmQ7CisgICAgUE9JTlQzMiAgICAgICBwdDsKKyAgICBUVFRPT0xJTkZPMzJXIHRpOworfSBUVEhJVFRFU1RJTkZPMzJXLCAqTFBUVEhJVFRFU1RJTkZPMzJXOworCisjZGVmaW5lIFRUSElUVEVTVElORk8gV0lORUxJQl9OQU1FX0FXKFRUSElUVEVTVElORk8pCisjZGVmaW5lIExQVFRISVRURVNUSU5GTyBXSU5FTElCX05BTUVfQVcoTFBUVEhJVFRFU1RJTkZPKQogCiB0eXBlZGVmIHN0cnVjdCB0YWdOTVRURElTUElORk9BCiB7CkBAIC04MzYsNyArOTI5LDcgQEAKICAgICBISU5TVEFOQ0UzMiBoaW5zdDsKICAgICBVSU5UMzIgICAgICB1RmxhZ3M7CiAgICAgTFBBUkFNICAgICAgbFBhcmFtOwotfSBOTVRURElTUElORk9BLCAqTFBOTVRURElTUElORk9BOworfSBOTVRURElTUElORk8zMkEsICpMUE5NVFRESVNQSU5GTzMyQTsKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnTk1UVERJU1BJTkZPVwogewpAQCAtODQ2LDggKzkzOSwxMCBAQAogICAgIEhJTlNUQU5DRTMyIGhpbnN0OwogICAgIFVJTlQzMiAgICAgIHVGbGFnczsKICAgICBMUEFSQU0gICAgICBsUGFyYW07Ci19IE5NVFRESVNQSU5GT1csICpMUE5NVFRESVNQSU5GT1c7Cit9IE5NVFRESVNQSU5GTzMyVywgKkxQTk1UVERJU1BJTkZPMzJXOwogCisjZGVmaW5lIE5NVFRESVNQSU5GTyBXSU5FTElCX05BTUVfQVcoTk1UVERJU1BJTkZPKQorI2RlZmluZSBMUE5NVFRESVNQSU5GTyBXSU5FTElCX05BTUVfQVcoTFBOTVRURElTUElORk8pCiAKIAogLyogUmViYXIgY29udHJvbCAqLwpAQCAtODc5LDEzICs5NzQsNDEgQEAKICNkZWZpbmUgVEJTX05PVEhVTUIgICAgICAgICAgICAgMHgwMDgwCiAjZGVmaW5lIFRCU19UT09MVElQUyAgICAgICAgICAgIDB4MDEwMAogCisjZGVmaW5lIFRCVFNfVE9QICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVEJUU19MRUZUICAgICAgICAgICAgICAgMQorI2RlZmluZSBUQlRTX0JPVFRPTSAgICAgICAgICAgICAyCisjZGVmaW5lIFRCVFNfUklHSFQgICAgICAgICAgICAgIDMKKworI2RlZmluZSBUQl9MSU5FVVAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFRCX0xJTkVET1dOICAgICAgICAgICAgIDEKKyNkZWZpbmUgVEJfUEFHRVVQICAgICAgICAgICAgICAgMgorI2RlZmluZSBUQl9QQUdFRE9XTiAgICAgICAgICAgICAzCisjZGVmaW5lIFRCX1RIVU1CUE9TSVRJT04gICAgICAgIDQKKyNkZWZpbmUgVEJfVEhVTUJUUkFDSyAgICAgICAgICAgNQorI2RlZmluZSBUQl9UT1AgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFRCX0JPVFRPTSAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgVEJfRU5EVFJBQ0sgICAgICAgICAgICAgOAorCisjZGVmaW5lIFRCQ0RfVElDUyAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBUQkNEX1RIVU1CICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgVEJDRF9DSEFOTkVMICAgICAgICAgICAgMHgwMDAzCisKICNkZWZpbmUgVEJNX0dFVFBPUyAgICAgICAgICAgICAgKFdNX1VTRVIpCiAjZGVmaW5lIFRCTV9HRVRSQU5HRU1JTiAgICAgICAgIChXTV9VU0VSKzEpCiAjZGVmaW5lIFRCTV9HRVRSQU5HRU1BWCAgICAgICAgIChXTV9VU0VSKzIpCiAjZGVmaW5lIFRCTV9HRVRUSUMgICAgICAgICAgICAgIChXTV9VU0VSKzMpCiAjZGVmaW5lIFRCTV9TRVRUSUMgICAgICAgICAgICAgIChXTV9VU0VSKzQpCiAjZGVmaW5lIFRCTV9TRVRQT1MgICAgICAgICAgICAgIChXTV9VU0VSKzUpCi0KKyNkZWZpbmUgVEJNX1NFVFJBTkdFICAgICAgICAgICAgKFdNX1VTRVIrNikKKyNkZWZpbmUgVEJNX1NFVFJBTkdFTUlOICAgICAgICAgKFdNX1VTRVIrNykKKyNkZWZpbmUgVEJNX1NFVFJBTkdFTUFYICAgICAgICAgKFdNX1VTRVIrOCkKKyNkZWZpbmUgVEJNX0NMRUFSVElDUyAgICAgICAgICAgKFdNX1VTRVIrOSkKKyNkZWZpbmUgVEJNX1NFVFNFTCAgICAgICAgICAgICAgKFdNX1VTRVIrMTApCisjZGVmaW5lIFRCTV9TRVRTRUxTVEFSVCAgICAgICAgIChXTV9VU0VSKzExKQorI2RlZmluZSBUQk1fU0VUU0VMRU5EICAgICAgICAgICAoV01fVVNFUisxMikKKyNkZWZpbmUgVEJNX0dFVFBUSUNTICAgICAgICAgICAgKFdNX1VTRVIrMTQpCisjZGVmaW5lIFRCTV9HRVRUSUNQT1MgICAgICAgICAgIChXTV9VU0VSKzE1KQorI2RlZmluZSBUQk1fR0VUTlVNVElDUyAgICAgICAgICAoV01fVVNFUisxNikKICNkZWZpbmUgVEJNX0dFVFNFTFNUQVJUICAgICAgICAgKFdNX1VTRVIrMTcpCiAjZGVmaW5lIFRCTV9HRVRTRUxFTkQgICAgICAgICAgIChXTV9VU0VSKzE4KQogI2RlZmluZSBUQk1fQ0xFQVJTRUwgICAgICAgICAgICAoV01fVVNFUisxOSkKQEAgLTg5OCw2ICsxMDIxLDEzIEBACiAjZGVmaW5lIFRCTV9HRVRDSEFOTkVMUkVDVCAgICAgIChXTV9VU0VSKzI2KQogI2RlZmluZSBUQk1fU0VUVEhVTUJMRU5HVEggICAgICAoV01fVVNFUisyNykKICNkZWZpbmUgVEJNX0dFVFRIVU1CTEVOR1RIICAgICAgKFdNX1VTRVIrMjgpCisjZGVmaW5lIFRCTV9TRVRUT09MVElQUyAgICAgICAgIChXTV9VU0VSKzI5KQorI2RlZmluZSBUQk1fR0VUVE9PTFRJUFMgICAgICAgICAoV01fVVNFUiszMCkKKyNkZWZpbmUgVEJNX1NFVFRJUFNJREUgICAgICAgICAgKFdNX1VTRVIrMzEpCisjZGVmaW5lIFRCTV9TRVRCVUREWSAgICAgICAgICAgIChXTV9VU0VSKzMyKQorI2RlZmluZSBUQk1fR0VUQlVERFkgICAgICAgICAgICAoV01fVVNFUiszMykKKyNkZWZpbmUgVEJNX1NFVFVOSUNPREVGT1JNQVQgICAgQ0NNX1NFVFVOSUNPREVGT1JNQVQKKyNkZWZpbmUgVEJNX0dFVFVOSUNPREVGT1JNQVQgICAgQ0NNX0dFVFVOSUNPREVGT1JNQVQKIAogCiAvKiBQYWdlciBjb250cm9sICovCkBAIC05NDksMTEgKzEwNzksMzYgQEAKIAogI2RlZmluZSBUVl9GSVJTVCAgICAgICAgICAgICAgICAweDExMDAKIAotCisjZGVmaW5lIFRWTV9JTlNFUlRJVEVNQSAgICAgICAgIChUVl9GSVJTVCswKQorI2RlZmluZSBUVk1fSU5TRVJUSVRFTVcgICAgICAgICAoVFZfRklSU1QrNTApCisjZGVmaW5lIFRWTV9ERUxFVEVJVEVNICAgICAgICAgIChUVl9GSVJTVCsxKQorI2RlZmluZSBUVk1fRVhQQU5EICAgICAgICAgICAgICAoVFZfRklSU1QrMikKKyNkZWZpbmUgVFZNX0dFVElURU1SRUNUICAgICAgICAgKFRWX0ZJUlNUKzQpCisjZGVmaW5lIFRWTV9HRVRDT1VOVCAgICAgICAgICAgIChUVl9GSVJTVCs1KQorI2RlZmluZSBUVk1fR0VUSU5ERU5UICAgICAgICAgICAoVFZfRklSU1QrNikKKyNkZWZpbmUgVFZNX1NFVElOREVOVCAgICAgICAgICAgKFRWX0ZJUlNUKzcpCiAjZGVmaW5lIFRWTV9HRVRJTUFHRUxJU1QgICAgICAgIChUVl9GSVJTVCs4KQogI2RlZmluZSBUVk1fU0VUSU1BR0VMSVNUICAgICAgICAoVFZfRklSU1QrOSkKLQotCisjZGVmaW5lIFRWTV9HRVRORVhUSVRFTSAgICAgICAgIChUVl9GSVJTVCsxMCkKKyNkZWZpbmUgVFZNX1NFTEVDVElURU0gICAgICAgICAgKFRWX0ZJUlNUKzExKQorI2RlZmluZSBUVk1fR0VUSVRFTUEgICAgICAgICAgICAoVFZfRklSU1QrMTIpCisjZGVmaW5lIFRWTV9HRVRJVEVNVyAgICAgICAgICAgIChUVl9GSVJTVCs2MikKKyNkZWZpbmUgVFZNX1NFVElURU1BICAgICAgICAgICAgKFRWX0ZJUlNUKzEzKQorI2RlZmluZSBUVk1fU0VUSVRFTVcgICAgICAgICAgICAoVFZfRklSU1QrNjMpCisjZGVmaW5lIFRWTV9FRElUTEFCRUxBICAgICAgICAgIChUVl9GSVJTVCsxNCkKKyNkZWZpbmUgVFZNX0VESVRMQUJFTFcgICAgICAgICAgKFRWX0ZJUlNUKzY1KQorI2RlZmluZSBUVk1fR0VURURJVENPTlRST0wgICAgICAoVFZfRklSU1QrMTUpCisjZGVmaW5lIFRWTV9HRVRWSVNJQkxFQ09VTlQgICAgIChUVl9GSVJTVCsxNikKKyNkZWZpbmUgVFZNX0hJVFRFU1QgICAgICAgICAgICAgKFRWX0ZJUlNUKzE3KQorI2RlZmluZSBUVk1fQ1JFQVRFRFJBR0lNQUdFICAgICAoVFZfRklSU1QrMTgpCisjZGVmaW5lIFRWTV9TT1JUQ0hJTERSRU4gICAgICAgIChUVl9GSVJTVCsxOSkKKyNkZWZpbmUgVFZNX0VOU1VSRVZJU0lCTEUgICAgICAgKFRWX0ZJUlNUKzIwKQorI2RlZmluZSBUVk1fU09SVENISUxEUkVOQ0IgICAgICAoVFZfRklSU1QrMjEpCisjZGVmaW5lIFRWTV9FTkRFRElUTEFCRUxOT1cgICAgIChUVl9GSVJTVCsyMikKKyNkZWZpbmUgVFZNX0dFVElTRUFSQ0hTVFJJTkdBICAgKFRWX0ZJUlNUKzIzKQorI2RlZmluZSBUVk1fR0VUSVNFQVJDSFNUUklOR1cgICAoVFZfRklSU1QrNjQpCisjZGVmaW5lIFRWTV9TRVRUT09MVElQUyAgICAgICAgIChUVl9GSVJTVCsyNCkKKyNkZWZpbmUgVFZNX0dFVFRPT0xUSVBTICAgICAgICAgKFRWX0ZJUlNUKzI1KQogCiAvKiBMaXN0dmlldyBjb250cm9sICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlnLmguaW4gYi9pbmNsdWRlL2NvbmZpZy5oLmluCmluZGV4IDMwZmUyYTMuLjczZmMzMDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlnLmguaW4KKysrIGIvaW5jbHVkZS9jb25maWcuaC5pbgpAQCAtNzIsNiArNzIsOSBAQAogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtZW1tb3ZlIGZ1bmN0aW9uLiAgKi8KICN1bmRlZiBIQVZFX01FTU1PVkUKIAorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZW5kbXNnIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX1NFTkRNU0cKKwogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzaWdhbHRzdGFjayBmdW5jdGlvbi4gICovCiAjdW5kZWYgSEFWRV9TSUdBTFRTVEFDSwogCkBAIC0xNTMsNSArMTU2LDggQEAKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgaTM4NiBsaWJyYXJ5ICgtbGkzODYpLiAgKi8KICN1bmRlZiBIQVZFX0xJQkkzODYKIAorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzb2NrZXQgbGlicmFyeSAoLWxzb2NrZXQpLiAgKi8KKyN1bmRlZiBIQVZFX0xJQlNPQ0tFVAorCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHcgbGlicmFyeSAoLWx3KS4gICovCiAjdW5kZWYgSEFWRV9MSUJXCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RlYnVnLmggYi9pbmNsdWRlL2RlYnVnLmgKaW5kZXggYjIxZDM4NC4uOTA1NmE1YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kZWJ1Zy5oCisrKyBiL2luY2x1ZGUvZGVidWcuaApAQCAtODEsNjIgKzgxLDY0IEBACiAjZGVmaW5lIGRiY2hfbW9kdWxlIDczCiAjZGVmaW5lIGRiY2hfbXByIDc0CiAjZGVmaW5lIGRiY2hfbXNnIDc1Ci0jZGVmaW5lIGRiY2hfbm9uY2xpZW50IDc2Ci0jZGVmaW5lIGRiY2hfbnRkbGwgNzcKLSNkZWZpbmUgZGJjaF9vbGUgNzgKLSNkZWZpbmUgZGJjaF9wYWdlciA3OQotI2RlZmluZSBkYmNoX3BhbGV0dGUgODAKLSNkZWZpbmUgZGJjaF9wcmludCA4MQotI2RlZmluZSBkYmNoX3Byb2Nlc3MgODIKLSNkZWZpbmUgZGJjaF9wcm9maWxlIDgzCi0jZGVmaW5lIGRiY2hfcHJvZ3Jlc3MgODQKLSNkZWZpbmUgZGJjaF9wcm9wIDg1Ci0jZGVmaW5lIGRiY2hfcHNkcnYgODYKLSNkZWZpbmUgZGJjaF9yZWJhciA4NwotI2RlZmluZSBkYmNoX3JlZyA4OAotI2RlZmluZSBkYmNoX3JlZ2lvbiA4OQotI2RlZmluZSBkYmNoX3JlbGF5IDkwCi0jZGVmaW5lIGRiY2hfcmVzb3VyY2UgOTEKLSNkZWZpbmUgZGJjaF9zIDkyCi0jZGVmaW5lIGRiY2hfc2Nyb2xsIDkzCi0jZGVmaW5lIGRiY2hfc2VjdXJpdHkgOTQKLSNkZWZpbmUgZGJjaF9zZWdtZW50IDk1Ci0jZGVmaW5lIGRiY2hfc2VsZWN0b3IgOTYKLSNkZWZpbmUgZGJjaF9zZW0gOTcKLSNkZWZpbmUgZGJjaF9zZW5kbXNnIDk4Ci0jZGVmaW5lIGRiY2hfc2hlbGwgOTkKLSNkZWZpbmUgZGJjaF9zaG0gMTAwCi0jZGVmaW5lIGRiY2hfc25vb3AgMTAxCi0jZGVmaW5lIGRiY2hfc291bmQgMTAyCi0jZGVmaW5lIGRiY2hfc3RhdGljIDEwMwotI2RlZmluZSBkYmNoX3N0cmVzcyAxMDQKLSNkZWZpbmUgZGJjaF9zdHJpbmcgMTA1Ci0jZGVmaW5lIGRiY2hfc3lzY29sb3IgMTA2Ci0jZGVmaW5lIGRiY2hfc3lzdGVtIDEwNwotI2RlZmluZSBkYmNoX3Rhc2sgMTA4Ci0jZGVmaW5lIGRiY2hfdGV4dCAxMDkKLSNkZWZpbmUgZGJjaF90aHJlYWQgMTEwCi0jZGVmaW5lIGRiY2hfdGh1bmsgMTExCi0jZGVmaW5lIGRiY2hfdGltZXIgMTEyCi0jZGVmaW5lIGRiY2hfdG9vbGJhciAxMTMKLSNkZWZpbmUgZGJjaF90b29saGVscCAxMTQKLSNkZWZpbmUgZGJjaF90b29sdGlwcyAxMTUKLSNkZWZpbmUgZGJjaF90cmFja2JhciAxMTYKLSNkZWZpbmUgZGJjaF90cmVldmlldyAxMTcKLSNkZWZpbmUgZGJjaF90d2VhayAxMTgKLSNkZWZpbmUgZGJjaF91aXRvb2xzIDExOQotI2RlZmluZSBkYmNoX3VwZG93biAxMjAKLSNkZWZpbmUgZGJjaF92ZXIgMTIxCi0jZGVmaW5lIGRiY2hfdmlydHVhbCAxMjIKLSNkZWZpbmUgZGJjaF92eGQgMTIzCi0jZGVmaW5lIGRiY2hfd2luIDEyNAotI2RlZmluZSBkYmNoX3dpbjE2ZHJ2IDEyNQotI2RlZmluZSBkYmNoX3dpbjMyIDEyNgotI2RlZmluZSBkYmNoX3dpbmcgMTI3Ci0jZGVmaW5lIGRiY2hfd2luc29jayAxMjgKLSNkZWZpbmUgZGJjaF93bmV0IDEyOQotI2RlZmluZSBkYmNoX3gxMSAxMzAKLSNkZWZpbmUgZGJjaF94MTFkcnYgMTMxCisjZGVmaW5lIGRiY2hfbXN2aWRlbyA3NgorI2RlZmluZSBkYmNoX25vbmNsaWVudCA3NworI2RlZmluZSBkYmNoX250ZGxsIDc4CisjZGVmaW5lIGRiY2hfb2xlIDc5CisjZGVmaW5lIGRiY2hfcGFnZXIgODAKKyNkZWZpbmUgZGJjaF9wYWxldHRlIDgxCisjZGVmaW5lIGRiY2hfcHJpbnQgODIKKyNkZWZpbmUgZGJjaF9wcm9jZXNzIDgzCisjZGVmaW5lIGRiY2hfcHJvZmlsZSA4NAorI2RlZmluZSBkYmNoX3Byb2dyZXNzIDg1CisjZGVmaW5lIGRiY2hfcHJvcCA4NgorI2RlZmluZSBkYmNoX3BzZHJ2IDg3CisjZGVmaW5lIGRiY2hfcmViYXIgODgKKyNkZWZpbmUgZGJjaF9yZWcgODkKKyNkZWZpbmUgZGJjaF9yZWdpb24gOTAKKyNkZWZpbmUgZGJjaF9yZWxheSA5MQorI2RlZmluZSBkYmNoX3Jlc291cmNlIDkyCisjZGVmaW5lIGRiY2hfcyA5MworI2RlZmluZSBkYmNoX3Njcm9sbCA5NAorI2RlZmluZSBkYmNoX3NlY3VyaXR5IDk1CisjZGVmaW5lIGRiY2hfc2VnbWVudCA5NgorI2RlZmluZSBkYmNoX3NlbGVjdG9yIDk3CisjZGVmaW5lIGRiY2hfc2VtIDk4CisjZGVmaW5lIGRiY2hfc2VuZG1zZyA5OQorI2RlZmluZSBkYmNoX3NoZWxsIDEwMAorI2RlZmluZSBkYmNoX3NobSAxMDEKKyNkZWZpbmUgZGJjaF9zbm9vcCAxMDIKKyNkZWZpbmUgZGJjaF9zb3VuZCAxMDMKKyNkZWZpbmUgZGJjaF9zdGF0aWMgMTA0CisjZGVmaW5lIGRiY2hfc3RhdHVzYmFyIDEwNQorI2RlZmluZSBkYmNoX3N0cmVzcyAxMDYKKyNkZWZpbmUgZGJjaF9zdHJpbmcgMTA3CisjZGVmaW5lIGRiY2hfc3lzY29sb3IgMTA4CisjZGVmaW5lIGRiY2hfc3lzdGVtIDEwOQorI2RlZmluZSBkYmNoX3Rhc2sgMTEwCisjZGVmaW5lIGRiY2hfdGV4dCAxMTEKKyNkZWZpbmUgZGJjaF90aHJlYWQgMTEyCisjZGVmaW5lIGRiY2hfdGh1bmsgMTEzCisjZGVmaW5lIGRiY2hfdGltZXIgMTE0CisjZGVmaW5lIGRiY2hfdG9vbGJhciAxMTUKKyNkZWZpbmUgZGJjaF90b29saGVscCAxMTYKKyNkZWZpbmUgZGJjaF90b29sdGlwcyAxMTcKKyNkZWZpbmUgZGJjaF90cmFja2JhciAxMTgKKyNkZWZpbmUgZGJjaF90cmVldmlldyAxMTkKKyNkZWZpbmUgZGJjaF90d2VhayAxMjAKKyNkZWZpbmUgZGJjaF91aXRvb2xzIDEyMQorI2RlZmluZSBkYmNoX3VwZG93biAxMjIKKyNkZWZpbmUgZGJjaF92ZXIgMTIzCisjZGVmaW5lIGRiY2hfdmlydHVhbCAxMjQKKyNkZWZpbmUgZGJjaF92eGQgMTI1CisjZGVmaW5lIGRiY2hfd2luIDEyNgorI2RlZmluZSBkYmNoX3dpbjE2ZHJ2IDEyNworI2RlZmluZSBkYmNoX3dpbjMyIDEyOAorI2RlZmluZSBkYmNoX3dpbmcgMTI5CisjZGVmaW5lIGRiY2hfd2luc29jayAxMzAKKyNkZWZpbmUgZGJjaF93bmV0IDEzMQorI2RlZmluZSBkYmNoX3gxMSAxMzIKKyNkZWZpbmUgZGJjaF94MTFkcnYgMTMzCiAvKiBEZWZpbml0aW9ucyBmb3IgY2xhc3NlcyBpZGVudGlmaWVycyAqLwogI2RlZmluZSBkYmNsX2ZpeG1lIDAKICNkZWZpbmUgZGJjbF9lcnIgMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kZWJ1Z2RlZnMuaCBiL2luY2x1ZGUvZGVidWdkZWZzLmgKaW5kZXggM2E4YmIzMC4uMTQ0NTBkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kZWJ1Z2RlZnMuaAorKysgYi9pbmNsdWRlL2RlYnVnZGVmcy5oCkBAIC00LDcgKzQsNyBAQAogI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKICNlbmRpZgogCi0jZGVmaW5lIERFQlVHX0NIQU5ORUxfQ09VTlQgMTMyCisjZGVmaW5lIERFQlVHX0NIQU5ORUxfQ09VTlQgMTM0CiAjaWZkZWYgREVCVUdfUlVOVElNRQogc2hvcnQgZGVidWdfbXNnX2VuYWJsZWRbXVtERUJVR19DTEFTU19DT1VOVF0gPSB7CiB7MSwgMSwgMCwgMH0sCkBAIC0xMzksNiArMTM5LDggQEAKIHsxLCAxLCAwLCAwfSwKIHsxLCAxLCAwLCAwfSwKIHsxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKK3sxLCAxLCAwLCAwfSwKIH07CiBjb25zdCBjaGFyKiBkZWJ1Z19jaF9uYW1lW10gPSB7CiAiMSIsCkBAIC0yMTcsNiArMjE5LDcgQEAKICJtb2R1bGUiLAogIm1wciIsCiAibXNnIiwKKyJtc3ZpZGVvIiwKICJub25jbGllbnQiLAogIm50ZGxsIiwKICJvbGUiLApAQCAtMjQ1LDYgKzI0OCw3IEBACiAic25vb3AiLAogInNvdW5kIiwKICJzdGF0aWMiLAorInN0YXR1c2JhciIsCiAic3RyZXNzIiwKICJzdHJpbmciLAogInN5c2NvbG9yIiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZG9zZXhlLmggYi9pbmNsdWRlL2Rvc2V4ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2Y2Q0NzgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2Rvc2V4ZS5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBET1MgRVhFIGxvYWRlcgorICoKKyAqIENvcHlyaWdodCAxOTk4IE92ZSBL5XZlbgorICovCisKKyNpZmRlZiBsaW51eAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL2lwYy5oPgorI2luY2x1ZGUgPHN5cy9zaG0uaD4KKyNpbmNsdWRlIDxzeXMvdm04Ni5oPgorI2luY2x1ZGUgIndpbnR5cGVzLmgiCisKK3R5cGVkZWYgc3RydWN0IF9ET1NUQVNLIHsKKyBMUFZPSUQgaW1nOworIHVuc2lnbmVkIGltZ19vZnM7CisgSE1PRFVMRTE2IGhNb2R1bGU7Cisgc3RydWN0IHZtODZwbHVzX3N0cnVjdCBWTTg2OworIGludCBmbiwgc3RhdGU7CisjaWZkZWYgTVpfVVNFU1lTVgorIC8qIFNZU1YgSVBDIGlzIG5vdCBxdWl0ZSBzdXBwb3J0ZWQgeWV0Li4uICovCisga2V5X3Qgc2htX2tleTsKKyBpbnQgc2htX2lkOworI2Vsc2UKKyBjaGFyIG1tX25hbWVbMTI4XTsKKyBpbnQgbW1fZmQ7CisjZW5kaWYKKyBpbnQgcmVhZF9waXBlLHdyaXRlX3BpcGU7CisgcGlkX3QgdGFzazsKK30gRE9TVEFTSywgKkxQRE9TVEFTSzsKKworZXh0ZXJuIEhJTlNUQU5DRTE2IE1aX0xvYWRNb2R1bGUoIExQQ1NUUiBuYW1lLCBMUENTVFIgY21kbGluZSwgTFBDU1RSIGVudiwgVUlOVDE2IHNob3dfY21kICk7CitleHRlcm4gaW50IE1aX1J1bk1vZHVsZSggTFBET1NUQVNLIGxwRG9zVGFzayApOworZXh0ZXJuIHZvaWQgTVpfS2lsbE1vZHVsZSggTFBET1NUQVNLIGxwRG9zVGFzayApOworZXh0ZXJuIGludCBET1NWTV9Qcm9jZXNzKCBMUERPU1RBU0sgbHBEb3NUYXNrICk7CisKKyNlbmRpZiAvKiBsaW51eCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9pbnRlcmZhY2VzLmggYi9pbmNsdWRlL2ludGVyZmFjZXMuaAppbmRleCBkYTQyZjE1Li4zMmM4NDM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2ludGVyZmFjZXMuaAorKysgYi9pbmNsdWRlL2ludGVyZmFjZXMuaApAQCAtNDYsNiArNDYsNyBAQAogCVNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKSAoVEhJUykgUFVSRTsKIAlTVERNRVRIT0RfKFVMT05HLFJlbGVhc2UpIChUSElTKSBQVVJFOwogCVNURE1FVEhPRChDcmVhdGVJbnN0YW5jZSkgKFRISVNfIExQVU5LTk9XTiBwVW5rT3V0ZXIsIFJFRklJRCByaWlkLCBMUFZPSUQgRkFSKiBwcHZPYmplY3QpIFBVUkU7CisgICAgU1RETUVUSE9EKExvY2tTZXJ2ZXIpIChUSElTKSBQVVJFOwogfSAqTFBDTEFTU0ZBQ1RPUllfVlRBQkxFLElDbGFzc0ZhY3RvcnlfVlRhYmxlOwogCiBzdHJ1Y3QgSUNsYXNzRmFjdG9yeSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21pc2NlbXUuaCBiL2luY2x1ZGUvbWlzY2VtdS5oCmluZGV4IDQ2ZjIzMmQuLjVmNGM3NjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWlzY2VtdS5oCisrKyBiL2luY2x1ZGUvbWlzY2VtdS5oCkBAIC0xNCwxMSArMTQsMTMgQEAKIGV4dGVybiBIQU5ETEUxNiBET1NNRU1fQmlvc1NlZzsKIGV4dGVybiBEV09SRCBET1NNRU1fQ29sbGF0ZVRhYmxlOwogCi1leHRlcm4gQk9PTDMyIERPU01FTV9Jbml0KHZvaWQpOworZXh0ZXJuIEJPT0wzMiBET1NNRU1fSW5pdChITU9EVUxFMTYgaE1vZHVsZSk7CiBleHRlcm4gdm9pZCAgIERPU01FTV9UaWNrKHZvaWQpOwogZXh0ZXJuIFdPUkQgICBET1NNRU1fQWxsb2NTZWxlY3RvcihXT1JEKTsKLWV4dGVybiBMUFZPSUQgRE9TTUVNX0dldEJsb2NrKFVJTlQzMiBzaXplLCBVSU5UMTYqIHApOwotZXh0ZXJuIEJPT0wzMiBET1NNRU1fRnJlZUJsb2NrKHZvaWQqIHB0cik7CitleHRlcm4gTFBWT0lEIERPU01FTV9HZXRCbG9jayhITU9EVUxFMTYgaE1vZHVsZSwgVUlOVDMyIHNpemUsIFVJTlQxNiogcCk7CitleHRlcm4gQk9PTDMyIERPU01FTV9GcmVlQmxvY2soSE1PRFVMRTE2IGhNb2R1bGUsIHZvaWQqIHB0cik7CitleHRlcm4gTFBWT0lEIERPU01FTV9SZXNpemVCbG9jayhITU9EVUxFMTYgaE1vZHVsZSwgdm9pZCogcHRyLCBVSU5UMzIgc2l6ZSwgVUlOVDE2KiBwKTsKK2V4dGVybiBVSU5UMzIgRE9TTUVNX0F2YWlsYWJsZShITU9EVUxFMTYgaE1vZHVsZSk7CiBleHRlcm4gTFBWT0lEIERPU01FTV9NYXBSZWFsVG9MaW5lYXIoRFdPUkQpOyAvKiByZWFsLW1vZGUgdG8gbGluZWFyICovCiBleHRlcm4gTFBWT0lEIERPU01FTV9NYXBEb3NUb0xpbmVhcihVSU5UMzIpOyAvKiBsaW5lYXIgRE9TIHRvIFdpbmUgKi8KIGV4dGVybiBVSU5UMzIgRE9TTUVNX01hcExpbmVhclRvRG9zKExQVk9JRCk7IC8qIGxpbmVhciBXaW5lIHRvIERPUyAqLwpAQCAtNDYsNiArNDgsMTAgQEAKIC8qIG1pc2MvYXNwaS5jICovCiBleHRlcm4gdm9pZCBBU1BJX0RPU19IYW5kbGVJbnQoQ09OVEVYVCAqY29udGV4dCk7CiAKKyNkZWZpbmUgQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsc2VnLG9mZikgXAorICAgIChJU1Y4Nihjb250ZXh0KSA/ICh2b2lkKikoVjg2QkFTRShjb250ZXh0KSsoKHNlZyk8PDQpK29mZikgXAorICAgICAgICAgICAgICAgICAgICA6IFBUUl9TRUdfT0ZGX1RPX0xJTihzZWcsb2ZmKSkKKwogI2RlZmluZSBJTlRfQkFSRihjb250ZXh0LG51bSkgXAogICAgIGZwcmludGYoIHN0ZGVyciwgImludCV4OiB1bmtub3duL25vdCBpbXBsZW1lbnRlZCBwYXJhbWV0ZXJzOlxuIiBcCiAgICAgICAgICAgICAgICAgICAgICAiaW50JXg6IEFYICUwNHgsIEJYICUwNHgsIENYICUwNHgsIERYICUwNHgsICIgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tbXN5c3RlbS5oIGIvaW5jbHVkZS9tbXN5c3RlbS5oCmluZGV4IDUwMmZiMzYuLmEwZDQ2YzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbW1zeXN0ZW0uaAorKysgYi9pbmNsdWRlL21tc3lzdGVtLmgKQEAgLTE0NCw4ICsxNDQsMTMgQEAKICNkZWZpbmUgQ0FMTEJBQ0tfV0lORE9XICAgICAweDAwMDEwMDAwbCAgICAvKiBkd0NhbGxiYWNrIGlzIGEgSFdORCAqLwogI2RlZmluZSBDQUxMQkFDS19UQVNLICAgICAgIDB4MDAwMjAwMDBsICAgIC8qIGR3Q2FsbGJhY2sgaXMgYSBIVEFTSyAqLwogI2RlZmluZSBDQUxMQkFDS19GVU5DVElPTiAgIDB4MDAwMzAwMDBsICAgIC8qIGR3Q2FsbGJhY2sgaXMgYSBGQVJQUk9DICovCisjZGVmaW5lIENBTExCQUNLX0ZVTkMzMiAgICAgMHgwMDA3MDAwMGwgICAgLyogKHVnbHkgaGFjaykgMzItYml0IEZBUlBST0MgKi8KKyNkZWZpbmUgQ0FMTEJBQ0szMkNPTlYoeCkgICAoKCgoeCkmQ0FMTEJBQ0tfVFlQRU1BU0spPT1DQUxMQkFDS19GVU5DVElPTikgPyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpJn5DQUxMQkFDS19UWVBFTUFTSyl8Q0FMTEJBQ0tfRlVOQzMyKSA6ICh4KSkKIAotdHlwZWRlZiB2b2lkIChDQUxMQkFDSyAqTFBEUlZDQUxMQkFDSykgKEhEUlZSMTYgaCwgVUlOVDE2IHVNZXNzYWdlLCBEV09SRCBkd1VzZXIsIERXT1JEIGR3MSwgRFdPUkQgZHcyKTsKK3R5cGVkZWYgdm9pZCAoQ0FMTEJBQ0sgKkxQRFJWQ0FMTEJBQ0sxNikgKEhEUlZSMTYgaCwgVUlOVDE2IHVNZXNzYWdlLCBEV09SRCBkd1VzZXIsIERXT1JEIGR3MSwgRFdPUkQgZHcyKTsKK3R5cGVkZWYgdm9pZCAoQ0FMTEJBQ0sgKkxQRFJWQ0FMTEJBQ0szMikgKEhEUlZSMzIgaCwgVUlOVDMyIHVNZXNzYWdlLCBEV09SRCBkd1VzZXIsIERXT1JEIGR3MSwgRFdPUkQgZHcyKTsKK0RFQ0xfV0lORUxJQl9UWVBFKExQRFJWQ0FMTEJBQ0spCiAKICNkZWZpbmUgTU1fTUlDUk9TT0ZUICAgICAgICAgICAgMSAgICAgICAvKiBNaWNyb3NvZnQgQ29ycC4gKi8KIApAQCAtMTk2LDcgKzIwMSw5IEBACiAKIHR5cGVkZWYgSFdBVkVJTjE2ICpMUEhXQVZFSU4xNjsKIHR5cGVkZWYgSFdBVkVPVVQxNiAqTFBIV0FWRU9VVDE2OwotdHlwZWRlZiBMUERSVkNBTExCQUNLIExQV0FWRUNBTExCQUNLOwordHlwZWRlZiBMUERSVkNBTExCQUNLMTYgTFBXQVZFQ0FMTEJBQ0sxNjsKK3R5cGVkZWYgTFBEUlZDQUxMQkFDSzMyIExQV0FWRUNBTExCQUNLMzI7CitERUNMX1dJTkVMSUJfVFlQRShMUFdBVkVDQUxMQkFDSykKIHR5cGVkZWYgSE1JWEVSMTYgKkxQSE1JWEVSMTY7CiB0eXBlZGVmIEhNSVhFUjMyICpMUEhNSVhFUjMyOwogCkBAIC00NjQsNyArNDcxLDkgQEAKIAogdHlwZWRlZiBITUlESUlOMTYgICpMUEhNSURJSU4xNjsKIHR5cGVkZWYgSE1JRElPVVQxNiAgKkxQSE1JRElPVVQxNjsKLXR5cGVkZWYgTFBEUlZDQUxMQkFDSyBMUE1JRElDQUxMQkFDSzsKK3R5cGVkZWYgTFBEUlZDQUxMQkFDSzE2IExQTUlESUNBTExCQUNLMTY7Cit0eXBlZGVmIExQRFJWQ0FMTEJBQ0szMiBMUE1JRElDQUxMQkFDSzMyOworREVDTF9XSU5FTElCX1RZUEUoTFBNSURJQ0FMTEJBQ0spCiAjZGVmaW5lIE1JRElQQVRDSFNJWkUgICAxMjgKIHR5cGVkZWYgV09SRCBQQVRDSEFSUkFZW01JRElQQVRDSFNJWkVdOwogdHlwZWRlZiBXT1JEICpMUFBBVENIQVJSQVk7CkBAIC0yNzg4LDYgKzI3OTcsNyBAQAogI2RlZmluZSBEQ0JfV0lORE9XCQkweDAwMDEJCQkvKiBkd0NhbGxiYWNrIGlzIGEgSFdORCAqLwogI2RlZmluZSBEQ0JfVEFTSwkJMHgwMDAyCQkJLyogZHdDYWxsYmFjayBpcyBhIEhUQVNLICovCiAjZGVmaW5lIERDQl9GVU5DVElPTgkweDAwMDMJCQkvKiBkd0NhbGxiYWNrIGlzIGEgRkFSUFJPQyAqLworI2RlZmluZSBEQ0JfRlVOQzMyCTB4MDAwNwkJCS8qICh1Z2x5IGhhY2spIDMyLWJpdCBGQVJQUk9DICovCiAjZGVmaW5lIERDQl9UWVBFTUFTSwkweDAwMDcKICNkZWZpbmUgRENCX05PU1dJVENICTB4MDAwOAkJCS8qIGRvbid0IHN3aXRjaCBzdGFja3MgZm9yIGNhbGxiYWNrICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbW9kdWxlLmggYi9pbmNsdWRlL21vZHVsZS5oCmluZGV4IDdhZGQyOTQuLjQ4NWQ3ODQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbW9kdWxlLmgKKysrIGIvaW5jbHVkZS9tb2R1bGUuaApAQCAtMTAsNiArMTAsOCBAQAogI2luY2x1ZGUgIndpbnR5cGVzLmgiCiAjaW5jbHVkZSAicGVfaW1hZ2UuaCIKIAorc3RydWN0IF9ET1NUQVNLOworCiAgIC8qIEluLW1lbW9yeSBtb2R1bGUgc3RydWN0dXJlLiBTZWUgJ1dpbmRvd3MgSW50ZXJuYWxzJyBwLiAyMTkgKi8KIHR5cGVkZWYgc3RydWN0IF9ORV9NT0RVTEUKIHsKQEAgLTQ5LDYgKzUxLDcgQEAKICAgICBITU9EVUxFMzIgIG1vZHVsZTMyOyAgICAgIC8qIDQwIFBFIG1vZHVsZSBoYW5kbGUgZm9yIFdpbjMyIG1vZHVsZXMgKi8KICAgICBITU9EVUxFMTYgIHNlbGY7ICAgICAgICAgIC8qIDQ0IEhhbmRsZSBmb3IgdGhpcyBtb2R1bGUgKi8KICAgICBXT1JEICAgIHNlbGZfbG9hZGluZ19zZWw7IC8qIDQ2IFNlbGVjdG9yIHVzZWQgZm9yIHNlbGYtbG9hZGluZyBhcHBzLiAqLworICAgIHN0cnVjdCBfRE9TVEFTSyAqbHBEb3NUYXNrOwogfSBORV9NT0RVTEU7CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vbGUyLmggYi9pbmNsdWRlL29sZTIuaAppbmRleCBlODA0NTRkLi5lZTg3NjI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL29sZTIuaAorKysgYi9pbmNsdWRlL29sZTIuaApAQCAtMTcsNCArMTcsMTMgQEAKICNkZWZpbmUgcm1tICAgICAgICAgICAgIDIzCiAjZGVmaW5lIHJ1cCAgICAgICAgICAgIDYzOQogCisvKiBGSVhNRSBzaG91bGQgYmUgaW4gb2xlaWRsLmgqLwordHlwZWRlZiBzdHJ1Y3QgIHRhZ09sZU1lbnVHcm91cFdpZHRocworeyBMT05HIHdpZHRoWyA2IF07Cit9IE9MRU1FTlVHUk9VUFdJRFRIUzMyOworCit0eXBlZGVmIHN0cnVjdCB0YWdPbGVNZW51R3JvdXBXaWR0aHMgKkxQT0xFTUVOVUdST1VQV0lEVEhTMzI7CisKK3R5cGVkZWYgSEdMT0JBTDMyIEhPTEVNRU5VMzI7CisKICNlbmRpZiAgLyogX19XSU5FX09MRTJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vbGVhdXRvLmggYi9pbmNsdWRlL29sZWF1dG8uaAppbmRleCA2MWQ0MmM2Li40YjY3NWU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL29sZWF1dG8uaAorKysgYi9pbmNsdWRlL29sZWF1dG8uaApAQCAtMSwxNCArMSwxNCBAQAogI2lmbmRlZiBfX1dJTkVfT0xFQVVUT19ICiAjZGVmaW5lIF9fV0lORV9PTEVBVVRPX0gKIAotQlNUUjE2IFN5c0FsbG9jU3RyaW5nMTYoTFBPTEVTVFIxNik7Ci1CU1RSMzIgU3lzQWxsb2NTdHJpbmczMihMUE9MRVNUUjMyKTsKK0JTVFIxNiBXSU5BUEkgU3lzQWxsb2NTdHJpbmcxNihMUE9MRVNUUjE2KTsKK0JTVFIzMiBXSU5BUEkgU3lzQWxsb2NTdHJpbmczMihMUE9MRVNUUjMyKTsKICNkZWZpbmUgU3lzQWxsb2NTdHJpbmcgV0lORUxJQl9OQU1FKFN5c0FsbG9jU3RyaW5nKQotSU5UMTYgU3lzUmVBbGxvY1N0cmluZzE2KExQQlNUUjE2LExQT0xFU1RSMTYpOwotSU5UMzIgU3lzUmVBbGxvY1N0cmluZzMyKExQQlNUUjMyLExQT0xFU1RSMzIpOworSU5UMTYgV0lOQVBJIFN5c1JlQWxsb2NTdHJpbmcxNihMUEJTVFIxNixMUE9MRVNUUjE2KTsKK0lOVDMyIFdJTkFQSSBTeXNSZUFsbG9jU3RyaW5nMzIoTFBCU1RSMzIsTFBPTEVTVFIzMik7CiAjZGVmaW5lIFN5c1JlQWxsb2NTdHJpbmcgV0lORUxJQl9OQU1FKFN5c1JlQWxsb2NTdHJpbmcpCi1WT0lEIFN5c0ZyZWVTdHJpbmcxNihCU1RSMTYpOwotVk9JRCBTeXNGcmVlU3RyaW5nMzIoQlNUUjMyKTsKK1ZPSUQgV0lOQVBJIFN5c0ZyZWVTdHJpbmcxNihCU1RSMTYpOworVk9JRCBXSU5BUEkgU3lzRnJlZVN0cmluZzMyKEJTVFIzMik7CiAjZGVmaW5lIFN5c0ZyZWVTdHJpbmcgV0lORUxJQl9OQU1FKFN5c0ZyZWVTdHJpbmcpCiAKIHR5cGVkZWYgY2hhciBPTEVDSEFSOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcmludC5oIGIvaW5jbHVkZS9wcmludC5oCmluZGV4IGZhNjRhNDkuLjkyZDQzZTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJpbnQuaAorKysgYi9pbmNsdWRlL3ByaW50LmgKQEAgLTI1LDYgKzI1LDExIEBACiAjZGVmaW5lIFBSSU5URVJfQVRUUklCVVRFX1dPUktfT0ZGTElORSAgIDB4MDAwMDA0MDAKICNkZWZpbmUgUFJJTlRFUl9BVFRSSUJVVEVfRU5BQkxFX0JJREkgICAgMHgwMDAwMDgwMAogCisKK0RXT1JEIFdJTkFQSSBEcnZHZXRQcmludGVyRGF0YShMUFNUUiBscFByaW50ZXIsIExQU1RSIGxwUHJvZmlsZSwKKwkgIExQRFdPUkQgbHBUeXBlLCBMUEJZVEUgbHBQcmludGVyRGF0YSwgaW50IGNiRGF0YSwgTFBEV09SRCBscE5lZWRlZCk7CitEV09SRCBXSU5BUEkgRHJ2U2V0UHJpbnRlckRhdGEoTFBTVFIgbHBQcmludGVyLCBMUFNUUiBscFByb2ZpbGUsCisgICAgICAgICAgRFdPUkQgbHBUeXBlLCBMUEJZVEUgbHBQcmludGVyRGF0YSwgRFdPUkQgZHdTaXplKTsKIEhBTkRMRTE2IFdJTkFQSSBPcGVuSm9iKExQU1RSIGxwT3V0cHV0LCBMUFNUUiBscFRpdGxlLCBIREMxNiBoREMpOwogaW50IFdJTkFQSSBDbG9zZUpvYihIQU5ETEUxNiBoSm9iKTsKIGludCBXSU5BUEkgV3JpdGVTcG9vbChIQU5ETEUxNiBoSm9iLCBMUFNUUiBscERhdGEsIFdPUkQgY2NoKTsKQEAgLTM1LDMgKzQwLDQgQEAKIGludCBXSU5BUEkgV3JpdGVEaWFsb2coSEFORExFMTYgaEpvYiwgTFBTVFIgbHBNc2csIFdPUkQgY2NoTXNnKTsKIAogI2VuZGlmICAvKiBfX1dJTkVfUFJJTlRfSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Byb2Nlc3MuaCBiL2luY2x1ZGUvcHJvY2Vzcy5oCmluZGV4IGE1YWJjMDUuLjhmODIyOTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcHJvY2Vzcy5oCisrKyBiL2luY2x1ZGUvcHJvY2Vzcy5oCkBAIC0xNCwxMiArMTQsMTQgQEAKICNpbmNsdWRlICJrMzJvYmouaCIKIAogc3RydWN0IF9ORV9NT0RVTEU7CitzdHJ1Y3QgX1RIUkVBRF9FTlRSWTsKIAogLyogUHJvY2VzcyBoYW5kbGUgZW50cnkgKi8KIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgRFdPUkQgICAgYWNjZXNzOyAgLyogQWNjZXNzIGZsYWdzICovCiAgICAgSzMyT0JKICAqcHRyOyAgICAgLyogT2JqZWN0IHB0ciAqLworICAgIGludCAgICAgIHNlcnZlcjsgIC8qIFNlcnZlciBoYW5kbGUgKEZJWE1FOiB0bXAgaGFjaykgKi8KIH0gSEFORExFX0VOVFJZOwogCiAvKiBQcm9jZXNzIGhhbmRsZSB0YWJsZSAqLwpAQCAtNzgsNyArODAsNyBAQAogICAgIEhBTkRMRV9UQUJMRSAgICAqaGFuZGxlX3RhYmxlOyAgICAgLyogNDQgSGFuZGxlIHRhYmxlICovCiAgICAgc3RydWN0IF9QREIzMiAgICpwYXJlbnQ7ICAgICAgICAgICAvKiA0OCBQYXJlbnQgcHJvY2VzcyAqLwogICAgIFdJTkVfTU9EUkVGICAgICAqbW9kcmVmX2xpc3Q7ICAgICAgLyogNGMgTU9EUkVGIGxpc3QgKi8KLSAgICB2b2lkICAgICAgICAgICAgKnRocmVhZF9saXN0OyAgICAgIC8qIDUwIExpc3Qgb2YgdGhyZWFkcyAqLworICAgIHN0cnVjdCBfVEhSRUFEX0VOVFJZICp0aHJlYWRfbGlzdDsgLyogNTAgTGlzdCBvZiB0aHJlYWRzICovCiAgICAgdm9pZCAgICAgICAgICAgICpkZWJ1Z2dlZV9DQjsgICAgICAvKiA1NCBEZWJ1Z2dlZSBjb250ZXh0IGJsb2NrICovCiAgICAgdm9pZCAgICAgICAgICAgICpsb2NhbF9oZWFwX2ZyZWU7ICAvKiA1OCBIZWFkIG9mIGxvY2FsIGhlYXAgZnJlZSBsaXN0ICovCiAgICAgRFdPUkQgICAgICAgICAgICB1bmtub3duNDsgICAgICAgICAvKiA1YyBVbmtub3duICovCkBAIC0xMjUsOSArMTI3LDEwIEBACiAvKiBzY2hlZHVsZXIvaGFuZGxlLmMgKi8KIGV4dGVybiBCT09MMzIgSEFORExFX0NyZWF0ZVRhYmxlKCBQREIzMiAqcGRiLCBCT09MMzIgaW5oZXJpdCApOwogZXh0ZXJuIEhBTkRMRTMyIEhBTkRMRV9BbGxvYyggUERCMzIgKnBkYiwgSzMyT0JKICpwdHIsIERXT1JEIGFjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBpbmhlcml0ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgaW5oZXJpdCwgaW50IHNlcnZlcl9oYW5kbGUgKTsKIGV4dGVybiBLMzJPQkogKkhBTkRMRV9HZXRPYmpQdHIoIFBEQjMyICpwZGIsIEhBTkRMRTMyIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEszMk9CSl9UWVBFIHR5cGUsIERXT1JEIGFjY2VzcyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzMyT0JKX1RZUEUgdHlwZSwgRFdPUkQgYWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZXJ2ZXJfaGFuZGxlICk7CiBleHRlcm4gQk9PTDMyIEhBTkRMRV9TZXRPYmpQdHIoIFBEQjMyICpwZGIsIEhBTkRMRTMyIGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzMyT0JKICpwdHIsIERXT1JEIGFjY2VzcyApOwogZXh0ZXJuIHZvaWQgSEFORExFX0Nsb3NlQWxsKCBQREIzMiAqcGRiLCBLMzJPQkogKnB0ciApOwpAQCAtMTM1LDEwICsxMzgsMTMgQEAKIC8qIHNjaGVkdWxlci9wcm9jZXNzLmMgKi8KIGV4dGVybiBCT09MMzIgUFJPQ0VTU19Jbml0KCB2b2lkICk7CiBleHRlcm4gUERCMzIgKlBST0NFU1NfQ3VycmVudCh2b2lkKTsKLWV4dGVybiBQREIzMiAqUFJPQ0VTU19HZXRQdHIoIEhBTkRMRTMyIGhhbmRsZSwgRFdPUkQgYWNjZXNzICk7CitleHRlcm4gUERCMzIgKlBST0NFU1NfR2V0UHRyKCBIQU5ETEUzMiBoYW5kbGUsIERXT1JEIGFjY2VzcywgaW50ICpzZXJ2ZXJfaGFuZGxlICk7CiBleHRlcm4gUERCMzIgKlBST0NFU1NfSWRUb1BEQiggRFdPUkQgaWQgKTsKIGV4dGVybiBQREIzMiAqUFJPQ0VTU19DcmVhdGUoIHN0cnVjdCBfTkVfTU9EVUxFICpwTW9kdWxlLCBMUENTVFIgY21kX2xpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgZW52LCBISU5TVEFOQ0UxNiBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBISU5TVEFOQ0UxNiBoUHJldkluc3RhbmNlLCBVSU5UMzIgY21kU2hvdyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSElOU1RBTkNFMTYgaFByZXZJbnN0YW5jZSwgVUlOVDMyIGNtZFNob3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTX0lORk9STUFUSU9OICppbmZvICk7CitleHRlcm4gdm9pZCBQUk9DRVNTX1N1c3BlbmRPdGhlclRocmVhZHModm9pZCk7CitleHRlcm4gdm9pZCBQUk9DRVNTX1Jlc3VtZU90aGVyVGhyZWFkcyh2b2lkKTsKIAogI2VuZGlmICAvKiBfX1dJTkVfUFJPQ0VTU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BzZHJ2LmggYi9pbmNsdWRlL3BzZHJ2LmgKaW5kZXggMGM0Nzg5NS4uMTcxZTA4NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wc2Rydi5oCisrKyBiL2luY2x1ZGUvcHNkcnYuaApAQCAtMSw1ICsxLDYgQEAKKwogLyoKLSAqCVBvc3RzY3JpcHQgZHJpdmVyIGRlZmluaXRpb25zCisgKglQb3N0U2NyaXB0IGRyaXZlciBkZWZpbml0aW9ucwogICoKICAqCUNvcHlyaWdodCAxOTk4ICBIdXcgRCBNIERhdmllcwogICovCkBAIC0zOSwxOSArNDAsMTI2IEBACiAgICAgZmxvYXQJCVhIZWlnaHQ7CiAgICAgZmxvYXQJCUFzY2VuZGVyOwogICAgIGZsb2F0CQlEZXNjZW5kZXI7CisgICAgZmxvYXQJCUZ1bGxBc2NlbmRlcjsJCS8qIEFzY2VudCBvZiBBcmluZyBjaGFyYWN0ZXIgKi8KICAgICBmbG9hdAkJQ2hhcldpZHRoc1syNTZdOwogICAgIGludAkJCU51bW9mTWV0cmljczsKICAgICBBRk1NRVRSSUNTCQkqTWV0cmljczsKLSAgICBzdHJ1Y3QgX3RhZ0FGTQkqbmV4dDsKIH0gQUZNOyAvKiBDaGFyV2lkdGhzIGlzIGEgc2hvcnRjdXQgdG8gdGhlIFdYIHZhbHVlcyBvZiBudW1iZXJlZCBnbHlwaHMgKi8KIAotdHlwZWRlZiBzdHJ1Y3QgX3RhZ0ZvbnRGYW1pbHkgewotICAgIGNoYXIJCQkqRmFtaWx5TmFtZTsgLyogZmFtaWx5IG5hbWUgKi8KLSAgICBBRk0JCQkJKmFmbTsJICAgICAvKiBsaXN0IG9mIGFmbXMgZm9yIHRoaXMgZmFtaWx5ICovCi0gICAgc3RydWN0IF90YWdGb250RmFtaWx5CSpuZXh0OyAgICAgICAvKiBuZXh0IGZhbWlseSAqLwotfSBGb250RmFtaWx5OworLyogTm90ZSBubyAnbmV4dCcgaW4gQUZNLiBVc2UgQUZNTElTVEVOVFJZIGFzIGEgY29udGFpbmVyLiBUaGlzIGFsbG93IG1vcmUgdGhhbgorICAgb25lIGxpc3QgdG8gZXhpc3Qgd2l0aG91dCBoYXZpbmcgdG8gcmVhbGxvY2F0ZSB0aGUgZW50aXJlIEFGTSBzdHJ1Y3R1cmUuIFdlCisgICBrZWVwIGEgZ2xvYmFsIGxpc3Qgb2YgYWxsIGFmbXMgKFBTRFJWX0FGTUZvbnRMaXN0KSBwbHVzIGEgbGlzdCBvZiBhdmFpbGFibGUKKyAgIGZvbnRzIGZvciBlYWNoIERDIChkYy0+cGh5c0Rldi0+Rm9udHMpICovCiAKLWV4dGVybiBGb250RmFtaWx5ICpQU0RSVl9BRk1Gb250TGlzdDsKK3R5cGVkZWYgc3RydWN0IF90YWdBRk1MSVNURU5UUlkgeworICAgIEFGTQkJCQkqYWZtOworICAgIHN0cnVjdCBfdGFnQUZNTElTVEVOVFJZCSpuZXh0OworfSBBRk1MSVNURU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IF90YWdGT05URkFNSUxZIHsKKyAgICBjaGFyCQkJKkZhbWlseU5hbWU7IC8qIGZhbWlseSBuYW1lICovCisgICAgQUZNTElTVEVOVFJZCQkqYWZtbGlzdDsgICAgLyogbGlzdCBvZiBhZm1zIGZvciB0aGlzIGZhbWlseSAqLworICAgIHN0cnVjdCBfdGFnRk9OVEZBTUlMWQkqbmV4dDsgICAgICAgLyogbmV4dCBmYW1pbHkgKi8KK30gRk9OVEZBTUlMWTsKKworZXh0ZXJuIEZPTlRGQU1JTFkgKlBTRFJWX0FGTUZvbnRMaXN0OworCit0eXBlZGVmIHN0cnVjdCBfdGFnRk9OVE5BTUUgeworICAgIGNoYXIJCSpOYW1lOworICAgIHN0cnVjdCBfdGFnRk9OVE5BTUUgKm5leHQ7Cit9IEZPTlROQU1FOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxvYXQJbGx4LCBsbHksIHVyeCwgdXJ5OworfSBJTUFHRUFCTEVBUkVBOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxvYXQJeCwgeTsKK30gUEFQRVJESU1FTlNJT047CisKK3R5cGVkZWYgc3RydWN0IF90YWdQQUdFU0laRSB7CisgICAgY2hhcgkJKk5hbWU7CisgICAgY2hhcgkJKkZ1bGxOYW1lOworICAgIGNoYXIJCSpJbnZvY2F0aW9uU3RyaW5nOworICAgIElNQUdFQUJMRUFSRUEJKkltYWdlYWJsZUFyZWE7CisgICAgUEFQRVJESU1FTlNJT04JKlBhcGVyRGltZW5zaW9uOworICAgIFdPUkQJCVdpblBhZ2U7IC8qZWcgRE1QQVBFUl9BNC4gRG9lc24ndCByZWFsbHkgYmVsb25nIGhlcmUgKi8KKyAgICBzdHJ1Y3QgX3RhZ1BBR0VTSVpFICpuZXh0OworfSBQQUdFU0laRTsKKworCit0eXBlZGVmIHN0cnVjdCBfdGFnT1BUSU9ORU5UUlkgeworICAgIGNoYXIJCQkqTmFtZTsJCS8qIGVnICJUcnVlIiAqLworICAgIGNoYXIJCQkqRnVsbE5hbWU7CS8qIGVnICJJbnN0YWxsZWQiICovCisgICAgY2hhcgkJCSpJbnZvY2F0aW9uU3RyaW5nOyAvKiBPZnRlbiBOVUxMICovCisgICAgc3RydWN0IF90YWdPUFRJT05FTlRSWQkqbmV4dDsKK30gT1BUSU9ORU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IF90YWdPUFRJT04geyAvKiBUcmVhdCBib29sIGFzIGEgc3BlY2lhbCBjYXNlIG9mIHBpY2tvbmUgKi8KKyAgICBjaGFyCQkJKk9wdGlvbk5hbWU7CS8qIGVnICIqT3B0aW9uMSIgKi8KKyAgICBjaGFyCQkJKkZ1bGxOYW1lOwkvKiBlZyAiRW52ZWxvcGUgRmVlZGVyIiAqLworICAgIGNoYXIJCQkqRGVmYXVsdE9wdGlvbjsgLyogZWcgIkZhbHNlIiAqLworICAgIE9QVElPTkVOVFJZCQkJKk9wdGlvbnM7CisgICAgc3RydWN0IF90YWdPUFRJT04JCSpuZXh0OworfSBPUFRJT047CisKK3R5cGVkZWYgc3RydWN0IF90YWdDT05TVFJBSU5UIHsKKyAgICBjaGFyCQkJKkZlYXR1cmUxOworICAgIGNoYXIJCQkqVmFsdWUxOworICAgIGNoYXIJCQkqRmVhdHVyZTI7CisgICAgY2hhcgkJCSpWYWx1ZTI7CisgICAgc3RydWN0IF90YWdDT05TVFJBSU5UCSpuZXh0OworfSBDT05TVFJBSU5UOworCit0eXBlZGVmIHN0cnVjdCBfdGFnSU5QVVRTTE9UIHsKKyAgICBjaGFyCQkJKk5hbWU7CisgICAgY2hhcgkJCSpGdWxsTmFtZTsKKyAgICBjaGFyCQkJKkludm9jYXRpb25TdHJpbmc7CisgICAgV09SRAkJCVdpbkJpbjsgLyogZWcgRE1CSU5fTE9XRVIgKi8KKyAgICBzdHJ1Y3QgX3RhZ0lOUFVUU0xPVAkqbmV4dDsKK30gSU5QVVRTTE9UOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2hhcgkJKk5pY2tOYW1lOworICAgIGludAkJCUxhbmd1YWdlTGV2ZWw7CisgICAgQk9PTDMyCQlDb2xvckRldmljZTsKKyAgICBpbnQJCQlEZWZhdWx0UmVzb2x1dGlvbjsKKyAgICBpbnQJCQlMYW5kc2NhcGVPcmllbnRhdGlvbjsKKyAgICBjaGFyCQkqSkNMQmVnaW47CisgICAgY2hhcgkJKkpDTFRvUFNJbnRlcnByZXRlcjsKKyAgICBjaGFyCQkqSkNMRW5kOworICAgIGNoYXIJCSpEZWZhdWx0Rm9udDsKKyAgICBGT05UTkFNRQkJKkluc3RhbGxlZEZvbnRzOyAvKiBwdHIgdG8gYSBsaXN0IG9mIEZvbnROYW1lcyAqLworICAgIFBBR0VTSVpFCQkqUGFnZVNpemVzOworICAgIE9QVElPTgkJKkluc3RhbGxlZE9wdGlvbnM7CisgICAgQ09OU1RSQUlOVAkJKkNvbnN0cmFpbnRzOworICAgIElOUFVUU0xPVAkJKklucHV0U2xvdHM7Cit9IFBQRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIERFVk1PREUxNgkJCWRtUHVibGljOworICAgIHN0cnVjdCBfdGFnZG9jcHJpdmF0ZSB7CisgICAgfQkJCQlkbURvY1ByaXZhdGU7CisgICAgc3RydWN0IF90YWdkcnZwcml2YXRlIHsKKyAgICAgIGNoYXIJcHBkRmlsZU5hbWVbMTAwXTsgLyogSGFjayAqLworICAgICAgVUlOVDMyCW51bUluc3RhbGxlZE9wdGlvbnM7IC8qIE9wdGlvbnMgYXQgZW5kIG9mIHN0cnVjdCAqLworICAgIH0JCQkJZG1EcnZQcml2YXRlOworCisvKiBOb3cgY29tZXM6CisKK251bUluc3RhbGxlZE9wdGlvbnMgb2YgT1BUSU9OcworCisqLworCit9IFBTRFJWX0RFVk1PREUxNjsKKwordHlwZWRlZiBzdHJ1Y3QgX3RhZ1BJIHsKKyAgICBjaGFyCQkqRnJpZW5kbHlOYW1lOworICAgIFBQRAkJCSpwcGQ7CisgICAgUFNEUlZfREVWTU9ERTE2CSpEZXZtb2RlOworICAgIEZPTlRGQU1JTFkJCSpGb250czsKKyAgICBzdHJ1Y3QgX3RhZ1BJCSpuZXh0OworfSBQUklOVEVSSU5GTzsKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIEFGTQkJCSphZm07CkBAIC03NCwxMCArMTgyLDIwIEBACiB7CiAgICAgUFNGT05UCQlmb250OwkJLyogQ3VycmVudCBQUyBmb250ICovCiAgICAgSk9CCQkJam9iOworICAgIFBTRFJWX0RFVk1PREUxNgkqRGV2bW9kZTsKKyAgICBQUklOVEVSSU5GTwkJKnBpOwogfSBQU0RSVl9QREVWSUNFOwogCitleHRlcm4gSEFORExFMzIgUFNEUlZfSGVhcDsKIAorZXh0ZXJuIHZvaWQgUFNEUlZfTWVyZ2VEZXZtb2RlcyhQU0RSVl9ERVZNT0RFMTYgKmRtMSwgUFNEUlZfREVWTU9ERTE2ICpkbTIsCisJCQkgUFJJTlRFUklORk8gKnBpKTsKIGV4dGVybiBCT09MMzIgUFNEUlZfR2V0Rm9udE1ldHJpY3Modm9pZCk7CitleHRlcm4gUFBEICpQU0RSVl9QYXJzZVBQRChjaGFyICpmbmFtZSk7CitleHRlcm4gUFJJTlRFUklORk8gKlBTRFJWX0ZpbmRQcmludGVySW5mbyhMUENTVFIgbmFtZSk7CitleHRlcm4gQUZNICpQU0RSVl9GaW5kQUZNaW5MaXN0KEZPTlRGQU1JTFkgKmhlYWQsIGNoYXIgKm5hbWUpOworZXh0ZXJuIHZvaWQgUFNEUlZfQWRkQUZNdG9MaXN0KEZPTlRGQU1JTFkgKipoZWFkLCBBRk0gKmFmbSk7CitleHRlcm4gdm9pZCBQU0RSVl9GcmVlQUZNTGlzdCggRk9OVEZBTUlMWSAqaGVhZCApOwogCiBleHRlcm4gQk9PTDMyIFBTRFJWX0luaXQodm9pZCk7CiBleHRlcm4gSEZPTlQxNiBQU0RSVl9GT05UX1NlbGVjdE9iamVjdCggREMgKmRjLCBIRk9OVDE2IGhmb250LCBGT05UT0JKICpmb250KTsKQEAgLTExNSw2ICsyMzMsOCBAQAogZXh0ZXJuIEJPT0wzMiBQU0RSVl9HZXRUZXh0TWV0cmljcyggREMgKmRjLCBURVhUTUVUUklDMzJBICptZXRyaWNzICk7CiBleHRlcm4gQk9PTDMyIFBTRFJWX0xpbmVUbyggREMgKmRjLCBJTlQzMiB4LCBJTlQzMiB5ICk7CiBleHRlcm4gQk9PTDMyIFBTRFJWX01vdmVUb0V4KCBEQyAqZGMsIElOVDMyIHgsIElOVDMyIHksIExQUE9JTlQzMiBwdCApOworZXh0ZXJuIEJPT0wzMiBQU0RSVl9Qb2x5bGluZSggREMgKmRjLCBjb25zdCBMUFBPSU5UMzIgcHQsIElOVDMyIGNvdW50ICk7CitleHRlcm4gQk9PTDMyIFBTRFJWX1BvbHlnb24oIERDICpkYywgTFBQT0lOVDMyIHB0LCBJTlQzMiBjb3VudCApOwogZXh0ZXJuIEhHRElPQkozMiBQU0RSVl9TZWxlY3RPYmplY3QoIERDICpkYywgSEdESU9CSjMyIGhhbmRsZSApOwogCiBleHRlcm4gQk9PTDMyIFBTRFJWX1JlY3RhbmdsZShEQyAqZGMsIElOVDMyIGxlZnQsIElOVDMyIHRvcCwgSU5UMzIgcmlnaHQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NlcnZlci5oIGIvaW5jbHVkZS9zZXJ2ZXIuaAppbmRleCBkNjUwMWYxLi4wYjgwZTQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3NlcnZlci5oCisrKyBiL2luY2x1ZGUvc2VydmVyLmgKQEAgLTI3LDQ3ICsyNywxMTUgQEAKICAgICBpbnQgZmQ7ICAgIC8qIGZkIHRvIHBhc3MgKi8KIH07CiAKLS8qIHJlcXVlc3QgZnJvbSBjbGllbnQgdG8gc2VydmVyICovCiAKLWVudW0gcmVxdWVzdAotewotICAgIFJFUV9USU1FT1VULCAgICAgICAgIC8qIGludGVybmFsIHRpbWVvdXQgbXNnICovCi0gICAgUkVRX0tJTExfVEhSRUFELCAgICAgLyogaW50ZXJuYWwga2lsbCB0aHJlYWQgbXNnICovCi0gICAgUkVRX05FV19USFJFQUQsICAgICAgLyogY3JlYXRlIGEgbmV3IHRocmVhZCAoY2FsbGVkIGZyb20gdGhlIGNyZWF0b3IpICovCi0gICAgUkVRX0lOSVRfVEhSRUFELCAgICAgLyogaW5pdCBhIG5ldyB0aHJlYWQgKGNhbGxlZCBieSBpdHNlbGYpICovCi0gICAgUkVRX05CX1JFUVVFU1RTCi19OworLyogUmVxdWVzdCBzdHJ1Y3R1cmVzICovCiAKLS8qIHJlcXVlc3Qgc3RydWN0dXJlcyAqLworLyogZm9sbG93aW5nIGFyZSB0aGUgZGVmaW5pdGlvbnMgb2YgYWxsIHRoZSBjbGllbnQ8LT5zZXJ2ZXIgICovCisvKiBjb21tdW5pY2F0aW9uIGZvcm1hdDsgcmVxdWVzdHMgYXJlIGZyb20gY2xpZW50IHRvIHNlcnZlciwgKi8KKy8qIHJlcGxpZXMgYXJlIGZyb20gc2VydmVyIHRvIGNsaWVudC4gQWxsIHJlcXVlc3RzIG11c3QgaGF2ZSAqLworLyogYSBjb3JyZXNwb25kaW5nIHN0cnVjdHVyZTsgdGhlIHJlcGxpZXMgY2FuIGJlIGVtcHR5IGluICAgICovCisvKiB3aGljaCBjYXNlIGl0IGlzbid0IG5lY2Vzc2FyeSB0byBkZWZpbmUgYSBzdHJ1Y3R1cmUuICAgICAgKi8KIAorCisvKiBDcmVhdGUgYSBuZXcgdGhyZWFkIGZyb20gdGhlIGNvbnRleHQgb2YgdGhlIHBhcmVudCAqLwogc3RydWN0IG5ld190aHJlYWRfcmVxdWVzdAogewotICAgIHZvaWQgKnBpZDsgIC8qIHByb2Nlc3MgaWQgZm9yIHRoZSBuZXcgdGhyZWFkIChvciAwIGlmIG5vbmUgeWV0KSAqLworICAgIHZvaWQqICAgICAgICBwaWQ7ICAgICAgICAgIC8qIHByb2Nlc3MgaWQgZm9yIHRoZSBuZXcgdGhyZWFkIChvciAwIGlmIG5vbmUgeWV0KSAqLwogfTsKLQogc3RydWN0IG5ld190aHJlYWRfcmVwbHkKIHsKLSAgICB2b2lkICp0aWQ7ICAvKiB0aHJlYWQgaWQgKi8KLSAgICB2b2lkICpwaWQ7ICAvKiBwcm9jZXNzIGlkIChjcmVhdGVkIGlmIG5lY2Vzc2FyeSkgKi8KKyAgICB2b2lkKiAgICAgICAgdGlkOyAgICAgICAgICAvKiB0aHJlYWQgaWQgKi8KKyAgICBpbnQgICAgICAgICAgdGhhbmRsZTsgICAgICAvKiB0aHJlYWQgaGFuZGxlIChpbiB0aGUgY3VycmVudCBwcm9jZXNzKSAqLworICAgIHZvaWQqICAgICAgICBwaWQ7ICAgICAgICAgIC8qIHByb2Nlc3MgaWQgKGNyZWF0ZWQgaWYgbmVjZXNzYXJ5KSAqLworICAgIGludCAgICAgICAgICBwaGFuZGxlOyAgICAgIC8qIHByb2Nlc3MgaGFuZGxlIChpbiB0aGUgY3VycmVudCBwcm9jZXNzKSAqLwogfTsKIAorCisvKiBJbml0aWFsaXplIGEgdGhyZWFkOyBjYWxsZWQgZnJvbSB0aGUgY2hpbGQgYWZ0ZXIgZm9yaygpL2Nsb25lKCkgKi8KIHN0cnVjdCBpbml0X3RocmVhZF9yZXF1ZXN0CiB7Ci0gICAgaW50ICBwaWQ7Ci0vKiAgICBjaGFyIG5hbWVbLi4uXTsqLworICAgIGludCAgICAgICAgICB1bml4X3BpZDsgICAgIC8qIFVuaXggcGlkIG9mIG5ldyB0aHJlYWQgKi8KIH07CiAKLS8qIHNlcnZlci1zaWRlIGZ1bmN0aW9ucyAqLwogCi1leHRlcm4gdm9pZCBzZXJ2ZXJfbWFpbl9sb29wKCBpbnQgZmQgKTsKKy8qIFRlcm1pbmF0ZSBhIHByb2Nlc3MgKi8KK3N0cnVjdCB0ZXJtaW5hdGVfcHJvY2Vzc19yZXF1ZXN0Cit7CisgICAgaW50ICAgICAgICAgIGhhbmRsZTsgICAgICAgLyogcHJvY2VzcyBoYW5kbGUgdG8gdGVybWluYXRlICovCisgICAgaW50ICAgICAgICAgIGV4aXRfY29kZTsgICAgLyogcHJvY2VzcyBleGl0IGNvZGUgKi8KK307CisKKworLyogVGVybWluYXRlIGEgdGhyZWFkICovCitzdHJ1Y3QgdGVybWluYXRlX3RocmVhZF9yZXF1ZXN0Cit7CisgICAgaW50ICAgICAgICAgIGhhbmRsZTsgICAgICAgLyogdGhyZWFkIGhhbmRsZSB0byB0ZXJtaW5hdGUgKi8KKyAgICBpbnQgICAgICAgICAgZXhpdF9jb2RlOyAgICAvKiB0aHJlYWQgZXhpdCBjb2RlICovCit9OworCisKKy8qIFJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgcHJvY2VzcyAqLworc3RydWN0IGdldF9wcm9jZXNzX2luZm9fcmVxdWVzdAoreworICAgIGludCAgICAgICAgICBoYW5kbGU7ICAgICAgIC8qIHByb2Nlc3MgaGFuZGxlICovCit9Oworc3RydWN0IGdldF9wcm9jZXNzX2luZm9fcmVwbHkKK3sKKyAgICB2b2lkKiAgICAgICAgcGlkOyAgICAgICAgICAvKiBzZXJ2ZXIgcHJvY2VzcyBpZCAqLworICAgIGludCAgICAgICAgICBleGl0X2NvZGU7ICAgIC8qIHByb2Nlc3MgZXhpdCBjb2RlICovCit9OworCisKKy8qIENsb3NlIGEgaGFuZGxlIGZvciB0aGUgY3VycmVudCBwcm9jZXNzICovCitzdHJ1Y3QgY2xvc2VfaGFuZGxlX3JlcXVlc3QKK3sKKyAgICBpbnQgICAgICAgICAgaGFuZGxlOyAgICAgICAvKiBoYW5kbGUgdG8gY2xvc2UgKi8KK307CisKKworLyogRHVwbGljYXRlIGEgaGFuZGxlICovCitzdHJ1Y3QgZHVwX2hhbmRsZV9yZXF1ZXN0Cit7CisgICAgaW50ICAgICAgICAgIHNyY19wcm9jZXNzOyAgLyogc3JjIHByb2Nlc3MgaGFuZGxlICovCisgICAgaW50ICAgICAgICAgIHNyY19oYW5kbGU7ICAgLyogc3JjIGhhbmRsZSB0byBkdXBsaWNhdGUgKi8KKyAgICBpbnQgICAgICAgICAgZHN0X3Byb2Nlc3M7ICAvKiBkc3QgcHJvY2VzcyBoYW5kbGUgKi8KKyAgICBpbnQgICAgICAgICAgZHN0X2hhbmRsZTsgICAvKiBoYW5kbGUgdG8gZHVwbGljYXRlIHRvIChvciAtMSBmb3IgYW55KSAqLworICAgIHVuc2lnbmVkIGludCBhY2Nlc3M7ICAgICAgIC8qIHdhbnRlZCBhY2Nlc3MgcmlnaHRzICovCisgICAgaW50ICAgICAgICAgIGluaGVyaXQ7ICAgICAgLyogaW5oZXJpdCBmbGFnICovCisgICAgaW50ICAgICAgICAgIG9wdGlvbnM7ICAgICAgLyogZHVwbGljYXRlIG9wdGlvbnMgKHNlZSBiZWxvdykgKi8KK307CitzdHJ1Y3QgZHVwX2hhbmRsZV9yZXBseQoreworICAgIGludCAgICAgICAgICBoYW5kbGU7ICAgICAgIC8qIGR1cGxpY2F0ZWQgaGFuZGxlIGluIGRzdCBwcm9jZXNzICovCit9OworCisKKy8qIE9wZW4gYSBoYW5kbGUgdG8gYSBwcm9jZXNzICovCitzdHJ1Y3Qgb3Blbl9wcm9jZXNzX3JlcXVlc3QKK3sKKyAgICB2b2lkKiAgICAgICAgcGlkOyAgICAgICAgICAvKiBwcm9jZXNzIGlkIHRvIG9wZW4gKi8KKyAgICB1bnNpZ25lZCBpbnQgYWNjZXNzOyAgICAgICAvKiB3YW50ZWQgYWNjZXNzIHJpZ2h0cyAqLworICAgIGludCAgICAgICAgICBpbmhlcml0OyAgICAgIC8qIGluaGVyaXQgZmxhZyAqLworfTsKK3N0cnVjdCBvcGVuX3Byb2Nlc3NfcmVwbHkKK3sKKyAgICBpbnQgICAgICAgICAgaGFuZGxlOyAgICAgICAvKiBoYW5kbGUgdG8gdGhlIHByb2Nlc3MgKi8KK307CiAKIAogLyogY2xpZW50LXNpZGUgZnVuY3Rpb25zICovCiAKICNpZm5kZWYgX19XSU5FX1NFUlZFUl9fCiBzdHJ1Y3QgX1RIREI7Ci1leHRlcm4gaW50IENMSUVOVF9OZXdUaHJlYWQoIHN0cnVjdCBfVEhEQiAqdGhkYiApOworZXh0ZXJuIGludCBDTElFTlRfTmV3VGhyZWFkKCBzdHJ1Y3QgX1RIREIgKnRoZGIsIGludCAqdGhhbmRsZSwgaW50ICpwaGFuZGxlICk7CiBleHRlcm4gaW50IENMSUVOVF9Jbml0VGhyZWFkKHZvaWQpOworZXh0ZXJuIGludCBDTElFTlRfVGVybWluYXRlUHJvY2VzcyggaW50IGhhbmRsZSwgaW50IGV4aXRfY29kZSApOworZXh0ZXJuIGludCBDTElFTlRfVGVybWluYXRlVGhyZWFkKCBpbnQgaGFuZGxlLCBpbnQgZXhpdF9jb2RlICk7CitleHRlcm4gaW50IENMSUVOVF9DbG9zZUhhbmRsZSggaW50IGhhbmRsZSApOworZXh0ZXJuIGludCBDTElFTlRfRHVwbGljYXRlSGFuZGxlKCBpbnQgc3JjX3Byb2Nlc3MsIGludCBzcmNfaGFuZGxlLCBpbnQgZHN0X3Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RfaGFuZGxlLCBEV09SRCBhY2Nlc3MsIEJPT0wzMiBpbmhlcml0LCBEV09SRCBvcHRpb25zICk7CitleHRlcm4gaW50IENMSUVOVF9HZXRQcm9jZXNzSW5mbyggaW50IGhhbmRsZSwgc3RydWN0IGdldF9wcm9jZXNzX2luZm9fcmVwbHkgKnJlcGx5ICk7CitleHRlcm4gaW50IENMSUVOVF9PcGVuUHJvY2Vzcyggdm9pZCAqcGlkLCBEV09SRCBhY2Nlc3MsIEJPT0wzMiBpbmhlcml0ICk7CiAjZW5kaWYgIC8qIF9fV0lORV9TRVJWRVJfXyAqLwogCiAjZW5kaWYgIC8qIF9fV0lORV9TRVJWRVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zZXJ2ZXIvb2JqZWN0LmggYi9pbmNsdWRlL3NlcnZlci9vYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjZkY2QzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zZXJ2ZXIvb2JqZWN0LmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIFdpbmUgc2VydmVyIG9iamVjdHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggQWxleGFuZHJlIEp1bGxpYXJkCisgKi8KKworI2lmbmRlZiBfX1dJTkVfU0VSVkVSX09CSkVDVF9ICisjZGVmaW5lIF9fV0lORV9TRVJWRVJfT0JKRUNUX0gKKworI2lmbmRlZiBfX1dJTkVfU0VSVkVSX18KKyNlcnJvciBUaGlzIGZpbGUgY2FuIG9ubHkgYmUgdXNlZCBpbiB0aGUgV2luZSBzZXJ2ZXIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlICJzZXJ2ZXIvcmVxdWVzdC5oIgorCisvKiBrZXJuZWwgb2JqZWN0cyAqLworCitzdHJ1Y3Qgb2JqZWN0Oworc3RydWN0IG9iamVjdF9uYW1lOworCitzdHJ1Y3Qgb2JqZWN0X29wcworeworICAgIHZvaWQgKCpkdW1wKShzdHJ1Y3Qgb2JqZWN0ICosaW50KTsgICAvKiBkdW1wIHRoZSBvYmplY3QgKGZvciBkZWJ1Z2dpbmcpICovCisgICAgdm9pZCAoKmRlc3Ryb3kpKHN0cnVjdCBvYmplY3QgKik7ICAgIC8qIGRlc3Ryb3kgb24gcmVmY291bnQgPT0gMCAqLworfTsKKworc3RydWN0IG9iamVjdAoreworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgcmVmY291bnQ7CisgICAgY29uc3Qgc3RydWN0IG9iamVjdF9vcHMgICpvcHM7CisgICAgc3RydWN0IG9iamVjdF9uYW1lICAgICAgICpuYW1lOworfTsKKworZXh0ZXJuIHZvaWQgaW5pdF9vYmplY3QoIHN0cnVjdCBvYmplY3QgKm9iaiwgY29uc3Qgc3RydWN0IG9iamVjdF9vcHMgKm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lICk7CisvKiBncmFiL3JlbGVhc2Vfb2JqZWN0IGNhbiB0YWtlIGFueSBwb2ludGVyLCBidXQgeW91IGJldHRlciBtYWtlIHN1cmUgKi8KKy8qIHRoYXQgdGhlIHRoaW5nIHBvaW50ZWQgdG8gc3RhcnRzIHdpdGggYSBzdHJ1Y3Qgb2JqZWN0Li4uICovCitleHRlcm4gc3RydWN0IG9iamVjdCAqZ3JhYl9vYmplY3QoIHZvaWQgKm9iaiApOworZXh0ZXJuIHZvaWQgcmVsZWFzZV9vYmplY3QoIHZvaWQgKm9iaiApOworCisvKiByZXF1ZXN0IGhhbmRsZXJzICovCisKK3N0cnVjdCBpb3ZlYzsKK3N0cnVjdCB0aHJlYWQ7CisKK2V4dGVybiB2b2lkIGNhbGxfcmVxX2hhbmRsZXIoIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgZW51bSByZXF1ZXN0IHJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCBsZW4sIGludCBmZCApOworZXh0ZXJuIHZvaWQgY2FsbF90aW1lb3V0X2hhbmRsZXIoIHN0cnVjdCB0aHJlYWQgKnRocmVhZCApOworZXh0ZXJuIHZvaWQgY2FsbF9raWxsX2hhbmRsZXIoIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgaW50IGV4aXRfY29kZSApOworCitleHRlcm4gdm9pZCB0cmFjZV9yZXF1ZXN0KCBlbnVtIHJlcXVlc3QgcmVxLCB2b2lkICpkYXRhLCBpbnQgbGVuLCBpbnQgZmQgKTsKK2V4dGVybiB2b2lkIHRyYWNlX3RpbWVvdXQodm9pZCk7CitleHRlcm4gdm9pZCB0cmFjZV9raWxsKCBpbnQgZXhpdF9jb2RlICk7CitleHRlcm4gdm9pZCB0cmFjZV9yZXBseSggc3RydWN0IHRocmVhZCAqdGhyZWFkLCBpbnQgdHlwZSwgaW50IHBhc3NfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlvdmVjICp2ZWMsIGludCB2ZWNsZW4gKTsKKworLyogc29ja2V0IGZ1bmN0aW9ucyAqLworCitleHRlcm4gaW50IGFkZF9jbGllbnQoIGludCBjbGllbnRfZmQsIHN0cnVjdCB0aHJlYWQgKnNlbGYgKTsKK2V4dGVybiB2b2lkIHJlbW92ZV9jbGllbnQoIGludCBjbGllbnRfZmQsIGludCBleGl0X2NvZGUgKTsKK2V4dGVybiBpbnQgZ2V0X2luaXRpYWxfY2xpZW50X2ZkKHZvaWQpOworZXh0ZXJuIHZvaWQgc2V0X3RpbWVvdXQoIGludCBjbGllbnRfZmQsIHN0cnVjdCB0aW1ldmFsICp3aGVuICk7CitleHRlcm4gaW50IHNlbmRfcmVwbHlfdiggaW50IGNsaWVudF9mZCwgaW50IHR5cGUsIGludCBwYXNzX2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpb3ZlYyAqdmVjLCBpbnQgdmVjbGVuICk7CisKKy8qIHByb2Nlc3MgZnVuY3Rpb25zICovCisKK3N0cnVjdCBwcm9jZXNzOworCitleHRlcm4gc3RydWN0IHByb2Nlc3MgKmNyZWF0ZV9wcm9jZXNzKHZvaWQpOworZXh0ZXJuIHN0cnVjdCBwcm9jZXNzICpnZXRfcHJvY2Vzc19mcm9tX2lkKCB2b2lkICppZCApOworZXh0ZXJuIHN0cnVjdCBwcm9jZXNzICpnZXRfcHJvY2Vzc19mcm9tX2hhbmRsZSggaW50IGhhbmRsZSwgdW5zaWduZWQgaW50IGFjY2VzcyApOworZXh0ZXJuIHZvaWQgYWRkX3Byb2Nlc3NfdGhyZWFkKCBzdHJ1Y3QgcHJvY2VzcyAqcHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRocmVhZCAqdGhyZWFkICk7CitleHRlcm4gdm9pZCByZW1vdmVfcHJvY2Vzc190aHJlYWQoIHN0cnVjdCBwcm9jZXNzICpwcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgKTsKK2V4dGVybiB2b2lkIGtpbGxfcHJvY2Vzcyggc3RydWN0IHByb2Nlc3MgKnByb2Nlc3MsIGludCBleGl0X2NvZGUgKTsKK2V4dGVybiB2b2lkIGdldF9wcm9jZXNzX2luZm8oIHN0cnVjdCBwcm9jZXNzICpwcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdldF9wcm9jZXNzX2luZm9fcmVwbHkgKnJlcGx5ICk7CisKKy8qIGhhbmRsZSBmdW5jdGlvbnMgKi8KKworLyogYWxsb2NfaGFuZGxlIHRha2VzIGEgdm9pZCAqb2JqIGZvciBjb252ZW5pZW5jZSwgYnV0IHlvdSBiZXR0ZXIgbWFrZSBzdXJlICovCisvKiB0aGF0IHRoZSB0aGluZyBwb2ludGVkIHRvIHN0YXJ0cyB3aXRoIGEgc3RydWN0IG9iamVjdC4uLiAqLworZXh0ZXJuIGludCBhbGxvY19oYW5kbGUoIHN0cnVjdCBwcm9jZXNzICpwcm9jZXNzLCB2b2lkICpvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGFjY2VzcywgaW50IGluaGVyaXQgKTsKK2V4dGVybiBpbnQgY2xvc2VfaGFuZGxlKCBzdHJ1Y3QgcHJvY2VzcyAqcHJvY2VzcywgaW50IGhhbmRsZSApOworZXh0ZXJuIGludCBzZXRfaGFuZGxlX2luZm8oIHN0cnVjdCBwcm9jZXNzICpwcm9jZXNzLCBpbnQgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrLCBpbnQgZmxhZ3MgKTsKK2V4dGVybiBzdHJ1Y3Qgb2JqZWN0ICpnZXRfaGFuZGxlX29iaiggc3RydWN0IHByb2Nlc3MgKnByb2Nlc3MsIGludCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBhY2Nlc3MsIGNvbnN0IHN0cnVjdCBvYmplY3Rfb3BzICpvcHMgKTsKK2V4dGVybiBpbnQgZHVwbGljYXRlX2hhbmRsZSggc3RydWN0IHByb2Nlc3MgKnNyYywgaW50IHNyY19oYW5kbGUsIHN0cnVjdCBwcm9jZXNzICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RfaGFuZGxlLCB1bnNpZ25lZCBpbnQgYWNjZXNzLCBpbnQgaW5oZXJpdCwgaW50IG9wdGlvbnMgKTsKKworZXh0ZXJuIGludCBkZWJ1Z19sZXZlbDsKKworI2VuZGlmICAvKiBfX1dJTkVfU0VSVkVSX09CSkVDVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NlcnZlci9yZXF1ZXN0LmggYi9pbmNsdWRlL3NlcnZlci9yZXF1ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc0YjczMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc2VydmVyL3JlcXVlc3QuaApAQCAtMCwwICsxLDQ4IEBACisvKiBGaWxlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRvb2xzL21ha2VfcmVxdWVzdHM7IERPIE5PVCBFRElUISEgKi8KKworI2lmbmRlZiBfX1dJTkVfU0VSVkVSX1JFUVVFU1RfSAorI2RlZmluZSBfX1dJTkVfU0VSVkVSX1JFUVVFU1RfSAorCitlbnVtIHJlcXVlc3QKK3sKKyAgICBSRVFfTkVXX1RIUkVBRCwKKyAgICBSRVFfSU5JVF9USFJFQUQsCisgICAgUkVRX1RFUk1JTkFURV9QUk9DRVNTLAorICAgIFJFUV9URVJNSU5BVEVfVEhSRUFELAorICAgIFJFUV9HRVRfUFJPQ0VTU19JTkZPLAorICAgIFJFUV9DTE9TRV9IQU5ETEUsCisgICAgUkVRX0RVUF9IQU5ETEUsCisgICAgUkVRX09QRU5fUFJPQ0VTUywKKyAgICBSRVFfTkJfUkVRVUVTVFMKK307CisKKyNpZmRlZiBXQU5UX1JFUVVFU1RfSEFORExFUlMKKworI2RlZmluZSBERUNMX0hBTkRMRVIobmFtZSkgXAorICAgIHN0YXRpYyB2b2lkIHJlcV8jI25hbWUoIHN0cnVjdCBuYW1lIyNfcmVxdWVzdCAqcmVxLCB2b2lkICpkYXRhLCBpbnQgbGVuLCBpbnQgZmQgKQorCitERUNMX0hBTkRMRVIobmV3X3RocmVhZCk7CitERUNMX0hBTkRMRVIoaW5pdF90aHJlYWQpOworREVDTF9IQU5ETEVSKHRlcm1pbmF0ZV9wcm9jZXNzKTsKK0RFQ0xfSEFORExFUih0ZXJtaW5hdGVfdGhyZWFkKTsKK0RFQ0xfSEFORExFUihnZXRfcHJvY2Vzc19pbmZvKTsKK0RFQ0xfSEFORExFUihjbG9zZV9oYW5kbGUpOworREVDTF9IQU5ETEVSKGR1cF9oYW5kbGUpOworREVDTF9IQU5ETEVSKG9wZW5fcHJvY2Vzcyk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGFuZGxlciB7CisgICAgdm9pZCAgICAgICAoKmhhbmRsZXIpKCk7CisgICAgdW5zaWduZWQgaW50IG1pbl9zaXplOworfSByZXFfaGFuZGxlcnNbUkVRX05CX1JFUVVFU1RTXSA9IHsKKyAgICB7ICh2b2lkKCopKCkpcmVxX25ld190aHJlYWQsIHNpemVvZihzdHJ1Y3QgbmV3X3RocmVhZF9yZXF1ZXN0KSB9LAorICAgIHsgKHZvaWQoKikoKSlyZXFfaW5pdF90aHJlYWQsIHNpemVvZihzdHJ1Y3QgaW5pdF90aHJlYWRfcmVxdWVzdCkgfSwKKyAgICB7ICh2b2lkKCopKCkpcmVxX3Rlcm1pbmF0ZV9wcm9jZXNzLCBzaXplb2Yoc3RydWN0IHRlcm1pbmF0ZV9wcm9jZXNzX3JlcXVlc3QpIH0sCisgICAgeyAodm9pZCgqKSgpKXJlcV90ZXJtaW5hdGVfdGhyZWFkLCBzaXplb2Yoc3RydWN0IHRlcm1pbmF0ZV90aHJlYWRfcmVxdWVzdCkgfSwKKyAgICB7ICh2b2lkKCopKCkpcmVxX2dldF9wcm9jZXNzX2luZm8sIHNpemVvZihzdHJ1Y3QgZ2V0X3Byb2Nlc3NfaW5mb19yZXF1ZXN0KSB9LAorICAgIHsgKHZvaWQoKikoKSlyZXFfY2xvc2VfaGFuZGxlLCBzaXplb2Yoc3RydWN0IGNsb3NlX2hhbmRsZV9yZXF1ZXN0KSB9LAorICAgIHsgKHZvaWQoKikoKSlyZXFfZHVwX2hhbmRsZSwgc2l6ZW9mKHN0cnVjdCBkdXBfaGFuZGxlX3JlcXVlc3QpIH0sCisgICAgeyAodm9pZCgqKSgpKXJlcV9vcGVuX3Byb2Nlc3MsIHNpemVvZihzdHJ1Y3Qgb3Blbl9wcm9jZXNzX3JlcXVlc3QpIH0sCit9OworI2VuZGlmICAvKiBXQU5UX1JFUVVFU1RfSEFORExFUlMgKi8KKworI2VuZGlmICAvKiBfX1dJTkVfU0VSVkVSX1JFUVVFU1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zZXJ2ZXIvdGhyZWFkLmggYi9pbmNsdWRlL3NlcnZlci90aHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWRiZmRmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zZXJ2ZXIvdGhyZWFkLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIFdpbmUgc2VydmVyIHRocmVhZHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggQWxleGFuZHJlIEp1bGxpYXJkCisgKi8KKworI2lmbmRlZiBfX1dJTkVfU0VSVkVSX1RIUkVBRF9ICisjZGVmaW5lIF9fV0lORV9TRVJWRVJfVEhSRUFEX0gKKworI2lmbmRlZiBfX1dJTkVfU0VSVkVSX18KKyNlcnJvciBUaGlzIGZpbGUgY2FuIG9ubHkgYmUgdXNlZCBpbiB0aGUgV2luZSBzZXJ2ZXIKKyNlbmRpZgorCisjaW5jbHVkZSAic2VydmVyL29iamVjdC5oIgorCisvKiB0aHJlYWQgc3RydWN0dXJlICovCisKK3N0cnVjdCBwcm9jZXNzOworCitzdHJ1Y3QgdGhyZWFkCit7CisgICAgc3RydWN0IG9iamVjdCAgIG9iajsgICAgICAgLyogb2JqZWN0IGhlYWRlciAqLworICAgIHN0cnVjdCB0aHJlYWQgICpuZXh0OyAgICAgIC8qIHN5c3RlbS13aWRlIHRocmVhZCBsaXN0ICovCisgICAgc3RydWN0IHRocmVhZCAgKnByZXY7CisgICAgc3RydWN0IHRocmVhZCAgKnByb2NfbmV4dDsgLyogcGVyLXByb2Nlc3MgdGhyZWFkIGxpc3QgKi8KKyAgICBzdHJ1Y3QgdGhyZWFkICAqcHJvY19wcmV2OworICAgIHN0cnVjdCBwcm9jZXNzICpwcm9jZXNzOworICAgIGludCAgICAgICAgICAgICBlcnJvcjsgICAgIC8qIGN1cnJlbnQgZXJyb3IgY29kZSAqLworICAgIGludCAgICAgICAgICAgICBleGl0X2NvZGU7IC8qIHRocmVhZCBleGl0IGNvZGUgKi8KKyAgICBpbnQgICAgICAgICAgICAgY2xpZW50X2ZkOyAvKiBjbGllbnQgZmQgZm9yIHNvY2tldCBjb21tdW5pY2F0aW9ucyAqLworICAgIGludCAgICAgICAgICAgICB1bml4X3BpZDsgIC8qIFVuaXggcGlkIG9mIGNsaWVudCAqLworICAgIGVudW0gcmVxdWVzdCAgICBsYXN0X3JlcTsgIC8qIGxhc3QgcmVxdWVzdCByZWNlaXZlZCAoZm9yIGRlYnVnZ2luZykgKi8KKyAgICBjaGFyICAgICAgICAgICAqbmFtZTsKK307CisKK2V4dGVybiBzdHJ1Y3QgdGhyZWFkICpjdXJyZW50OworCisvKiB0aHJlYWQgZnVuY3Rpb25zICovCisKK2V4dGVybiBzdHJ1Y3QgdGhyZWFkICpjcmVhdGVfdGhyZWFkKCBpbnQgZmQsIHZvaWQgKnBpZCwgaW50ICp0aHJlYWRfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcHJvY2Vzc19oYW5kbGUgKTsKK2V4dGVybiBzdHJ1Y3QgdGhyZWFkICpnZXRfdGhyZWFkX2Zyb21faWQoIHZvaWQgKmlkICk7CitleHRlcm4gc3RydWN0IHRocmVhZCAqZ2V0X3RocmVhZF9mcm9tX2hhbmRsZSggaW50IGhhbmRsZSwgdW5zaWduZWQgaW50IGFjY2VzcyApOworZXh0ZXJuIGludCBzZW5kX3JlcGx5KCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsIGludCBwYXNzX2ZkLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiwgLi4uIC8qIGFyZ18xLCBsZW5fMSwgLi4uLCBhcmdfbiwgbGVuX24gKi8gKTsKK2V4dGVybiB2b2lkIGtpbGxfdGhyZWFkKCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsIGludCBleGl0X2NvZGUgKTsKK2V4dGVybiB2b2lkIHRocmVhZF9raWxsZWQoIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgaW50IGV4aXRfY29kZSApOworCisjZGVmaW5lIFNFVF9FUlJPUihlcnIpICAoY3VycmVudC0+ZXJyb3IgPSAoZXJyKSkKKyNkZWZpbmUgQ0xFQVJfRVJST1IoKSAgIChjdXJyZW50LT5lcnJvciA9IDApCisKKyNlbmRpZiAgLyogX19XSU5FX1NFUlZFUl9USFJFQURfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zaGVsbC5oIGIvaW5jbHVkZS9zaGVsbC5oCmluZGV4IDI3YmI3OTUuLmNkYTY0MWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2hlbGwuaAorKysgYi9pbmNsdWRlL3NoZWxsLmgKQEAgLTI1LDYgKzI1LDM3IEBACiAjZGVmaW5lIFNIRUxMX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSIDdMCiAjZGVmaW5lIFNIRUxMX0VSUk9SX0FDQ0VTU19ERU5JRUQgICAgIDhMCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY29tbW9uIHNoZWxsIGZpbGUgc3RydWN0dXJlcworKi8KKyNkZWZpbmUgRk9fTU9WRSAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEZPX0NPUFkgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBGT19ERUxFVEUgICAgICAgICAweDAwMDMKKyNkZWZpbmUgRk9fUkVOQU1FICAgICAgICAgMHgwMDA0CisKKyNkZWZpbmUgRk9GX01VTFRJREVTVEZJTEVTICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEZPRl9DT05GSVJNTU9VU0UgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBGT0ZfU0lMRU5UICAgICAgICAgICAgICAgICAweDAwMDQgIAorI2RlZmluZSBGT0ZfUkVOQU1FT05DT0xMSVNJT04gICAgICAweDAwMDgKKyNkZWZpbmUgRk9GX05PQ09ORklSTUFUSU9OICAgICAgICAgMHgwMDEwICAKKyNkZWZpbmUgRk9GX1dBTlRNQVBQSU5HSEFORExFICAgICAgMHgwMDIwICAKKyNkZWZpbmUgRk9GX0FMTE9XVU5ETyAgICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIEZPRl9GSUxFU09OTFkgICAgICAgICAgICAgIDB4MDA4MCAgCisjZGVmaW5lIEZPRl9TSU1QTEVQUk9HUkVTUyAgICAgICAgIDB4MDEwMCAgCisjZGVmaW5lIEZPRl9OT0NPTkZJUk1NS0RJUiAgICAgICAgIDB4MDIwMCAgCisjZGVmaW5lIEZPRl9OT0VSUk9SVUkgICAgICAgICAgICAgIDB4MDQwMCAgCisKK3R5cGVkZWYgV09SRCBGSUxFT1BfRkxBR1M7CisKKyNkZWZpbmUgUE9fREVMRVRFICAgICAgIDB4MDAxMyAgCisjZGVmaW5lIFBPX1JFTkFNRSAgICAgICAweDAwMTQgIAorI2RlZmluZSBQT19QT1JUQ0hBTkdFICAgMHgwMDIwICAKKwordHlwZWRlZiBXT1JEIFBSSU5URVJPUF9GTEFHUzsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBEUk9QRklMRVNUUlVDVAorKi8KIHR5cGVkZWYgc3RydWN0IHsgCSAgIC8qIHN0cnVjdHVyZSBmb3IgZHJvcHBlZCBmaWxlcyAqLyAKIAlXT1JECQl3U2l6ZTsKIAlQT0lOVDE2CQlwdE1vdXNlUG9zOyAgIApAQCAtMzIsNiArNjMsOSBAQAogCS8qIG1lbW9yeSBibG9jayB3aXRoIGZpbGVuYW1lcyBmb2xsb3dzICovICAgICAKIH0gRFJPUEZJTEVTVFJVQ1QsICpMUERST1BGSUxFU1RSVUNUOyAKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBOT1RJRllJQ09OREFUQQorKi8KIHR5cGVkZWYgc3RydWN0IF9OT1RJRllJQ09OREFUQSB7CiAJRFdPUkQgY2JTaXplOwogCUhXTkQzMiBoV25kOwpAQCAtNDIsNiArNzYsMjkgQEAKIAlDSEFSIHN6VGlwWzY0XTsKIH0gTk9USUZZSUNPTkRBVEEsICpQTk9USUZZSUNPTkRBVEE7CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNISVRFTUlELCBJVEVNSURMSVNULCBQSURMIEFQSQorKi8KK3R5cGVkZWYgc3RydWN0IAoreyBXT1JECQljYjsJLyogbnIgb2YgYnl0ZXMgaW4gdGhpcyBpdGVtICovCisgIEJZVEUJCWFiSURbMV07LyogZmlyc3QgYnl0ZSBpbiB0aGlzIGl0ZW0gKi8KK30gU0hJVEVNSUQsKkxQU0hJVEVNSUQ7CisKK3R5cGVkZWYgc3RydWN0IAoreyBTSElURU1JRCBta2lkOyAvKiBmaXJzdCBpdGVtaWQgaW4gbGlzdCAqLworfSBJVEVNSURMSVNULCpMUElURU1JRExJU1QsKkxQQ0lURU1JRExJU1Q7CisKK0xQSVRFTUlETElTVCBXSU5BUEkgSUxDbG9uZSAoTFBDSVRFTUlETElTVCBwaWRsKTsKK0xQSVRFTUlETElTVCBXSU5BUEkgSUxDb21iaW5lKExQQ0lURU1JRExJU1QgaWlsMSxMUENJVEVNSURMSVNUIGlpbDIpOworRFdPUkQgV0lOQVBJIElMR2V0U2l6ZShMUElURU1JRExJU1QgcGlkbCk7CisKK0RXT1JEIFdJTkFQSSBTSEdldFBhdGhGcm9tSURMaXN0MzJBIChMUENJVEVNSURMSVNUIHBpZGwsTFBTVFIgcHN6UGF0aCk7CitEV09SRCBXSU5BUEkgU0hHZXRQYXRoRnJvbUlETGlzdDMyVyAoTFBDSVRFTUlETElTVCBwaWRsLExQV1NUUiBwc3pQYXRoKTsKKyNkZWZpbmUgIFNIR2V0UGF0aEZyb21JRExpc3QgV0lORUxJQl9OQU1FX0FXKFNIR2V0UGF0aEZyb21JRExpc3QpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNIRklMRUlORk8gQVBJCisqLwogdHlwZWRlZiBzdHJ1Y3QgdGFnU0hGSUxFSU5GTzMyQSB7CiAJSElDT04zMgloSWNvbjsJCQkvKiBpY29uICovCiAJaW50CWlJY29uOwkJCS8qIGljb24gaW5kZXggKi8KQEAgLTYwLDYgKzExNyw0NSBAQAogCiBERUNMX1dJTkVMSUJfVFlQRV9BVyhTSEZJTEVJTkZPKQogCitEV09SRCAgICBXSU5BUEkgU0hHZXRGaWxlSW5mbzMyQShMUENTVFIsRFdPUkQsU0hGSUxFSU5GTzMyQSosVUlOVDMyLFVJTlQzMik7CitEV09SRCAgICBXSU5BUEkgU0hHZXRGaWxlSW5mbzMyVyhMUENXU1RSLERXT1JELFNIRklMRUlORk8zMlcqLFVJTlQzMixVSU5UMzIpOworI2RlZmluZSAgU0hHZXRGaWxlSW5mbyBXSU5FTElCX05BTUVfQVcoU0hHZXRGaWxlSW5mbykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU0hGSUxFT1BTVFJVQ1QgQVBJCisqLwordHlwZWRlZiBzdHJ1Y3QgX1NIRklMRU9QU1RSVUNUQQoreyBIV05EMzIgICAgICAgICAgaHduZDsKKyAgVUlOVDMyICAgICAgICAgIHdGdW5jOworICBMUENTVFIgICAgICAgICAgcEZyb207CisgIExQQ1NUUiAgICAgICAgICBwVG87CisgIEZJTEVPUF9GTEFHUyAgICBmRmxhZ3M7CisgIEJPT0wzMiAgICAgICAgICBmQW55T3BlcmF0aW9uc0Fib3J0ZWQ7CisgIExQVk9JRCAgICAgICAgICBoTmFtZU1hcHBpbmdzOworICBMUENTVFIgICAgICAgICAgbHBzelByb2dyZXNzVGl0bGU7Cit9IFNIRklMRU9QU1RSVUNUMzJBLCAqTFBTSEZJTEVPUFNUUlVDVDMyQTsKKwordHlwZWRlZiBzdHJ1Y3QgX1NIRklMRU9QU1RSVUNUVworeyBIV05EMzIgICAgICAgICAgaHduZDsKKyAgVUlOVDMyICAgICAgICAgIHdGdW5jOworICBMUENXU1RSICAgICAgICAgcEZyb207CisgIExQQ1dTVFIgICAgICAgICBwVG87CisgIEZJTEVPUF9GTEFHUyAgICBmRmxhZ3M7CisgIEJPT0wzMiAgICAgICAgICBmQW55T3BlcmF0aW9uc0Fib3J0ZWQ7CisgIExQVk9JRCAgICAgICAgICBoTmFtZU1hcHBpbmdzOworICBMUENXU1RSICAgICAgICAgbHBzelByb2dyZXNzVGl0bGU7Cit9IFNIRklMRU9QU1RSVUNUMzJXLCAqTFBTSEZJTEVPUFNUUlVDVDMyVzsKKwordHlwZWRlZiBTSEZJTEVPUFNUUlVDVDMyQSBTSEZJTEVPUFNUUlVDVDMyOwordHlwZWRlZiBMUFNIRklMRU9QU1RSVUNUMzJBIExQU0hGSUxFT1BTVFJVQ1QzMjsKKworREVDTF9XSU5FTElCX1RZUEVfQVcoU0hGSUxFT1BTVFJVQ1QpCisKK0RXT1JEIFdJTkFQSSBTSEZpbGVPcGVyYXRpb24zMihMUFNIRklMRU9QU1RSVUNUMzIgbHBGaWxlT3ApOworCisvKioqKioqKioqKioqKioqKgorKiBBUFBCQVJEQVRBIAorKi8KIHR5cGVkZWYgc3RydWN0IF9BcHBCYXJEYXRhIHsKIAlEV09SRAljYlNpemU7CiAJSFdORDMyCWhXbmQ7CkBAIC04NCw5ICsxODAsMzMgQEAKICNkZWZpbmUgU0hHRklfU0hFTExJQ09OU0laRSAgICAgMHgwMDAwMDAwMDQgICAgIC8qIGdldCBzaGVsbCBzaXplIGljb24gKi8KICNkZWZpbmUgU0hHRklfUElETCAgICAgICAgICAgICAgMHgwMDAwMDAwMDggICAgIC8qIHBzelBhdGggaXMgYSBwaWRsICovCiAjZGVmaW5lIFNIR0ZJX1VTRUZJTEVBVFRSSUJVVEVTIDB4MDAwMDAwMDEwICAgICAvKiB1c2UgcGFzc2VkIGR3RmlsZUF0dHJpYnV0ZSAqLwotRFdPUkQgICAgV0lOQVBJIFNIR2V0RmlsZUluZm8zMkEoTFBDU1RSLERXT1JELFNIRklMRUlORk8zMkEqLFVJTlQzMixVSU5UMzIpOwotRFdPUkQgICAgV0lOQVBJIFNIR2V0RmlsZUluZm8zMlcoTFBDV1NUUixEV09SRCxTSEZJTEVJTkZPMzJXKixVSU5UMzIsVUlOVDMyKTsKLSNkZWZpbmUgIFNIR2V0RmlsZUluZm8gV0lORUxJQl9OQU1FX0FXKFNIR2V0RmlsZUluZm8pCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNIQ2hhbmdlTm90aWZ5UmVnaXN0ZXIgQVBJCisqLwordHlwZWRlZiBzdHJ1Y3QKK3sgTFBJVEVNSURMSVNUIHBpZGw7CisgIERXT1JEIHVua25vd247Cit9IElEU1RSVUNUOworRFdPUkQgV0lOQVBJIFNIQ2hhbmdlTm90aWZ5UmVnaXN0ZXIoSFdORDMyIGh3bmQsTE9ORyBldmVudHMxLExPTkcgZXZlbnRzMixEV09SRCBtc2csaW50IGNvdW50LElEU1RSVUNUICppZGxpc3QpOworRFdPUkQgV0lOQVBJIFNIQ2hhbmdlTm90aWZ5RGVyZWdpc3RlcihMT05HIHgxLExPTkcgeDIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTSEFkZFRvUmVjZW50RG9jcyBBUEkKKyovCisjZGVmaW5lIFNIQVJEX1BJREwgICAgICAweDAwMDAwMDAxTAorI2RlZmluZSBTSEFSRF9QQVRIICAgICAgMHgwMDAwMDAwMkwKKworRFdPUkQgV0lOQVBJIFNIQWRkVG9SZWNlbnREb2NzKFVJTlQzMiB1RmxhZ3MsIExQQ1ZPSUQgcHYpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgb3RoZXIgZnVuY3Rpb25zCisqLworTFBWT0lEIFdJTkFQSSBTSEFsbG9jKERXT1JEIGxlbik7CitEV09SRCBXSU5BUEkgU0hGcmVlKExQVk9JRCB4KTsKK0xQU1RSIFdJTkFQSSBQYXRoQWRkQmFja3NsYXNoKExQU1RSIHBhdGgpOwkKK0xQU1RSIFdJTkFQSSBQYXRoQ29tYmluZShMUFNUUiB0YXJnZXQsTFBTVFIgeDEsTFBTVFIgeDIpOworTFBTVFIgV0lOQVBJIFBhdGhSZW1vdmVCbGFua3MoTFBTVFIgc3RyKTsKIAogI2RlZmluZSBTRV9FUlJfU0hBUkUgICAgICAgICAgICAyNgogI2RlZmluZSBTRV9FUlJfQVNTT0NJTkNPTVBMRVRFICAyNwpAQCAtMTEzLDQgKzIzMywxMCBAQAogI2RlZmluZQlDU0lETF9GT05UUwkJMHgwMDE0CiAjZGVmaW5lCUNTSURMX1RFTVBMQVRFUwkJMHgwMDE1CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBnbG9iYWwgU0hFTEwzMi5ETEwgdmFyaWFibGVzCisqLworZXh0ZXJuIEhJTlNUQU5DRTMyIHNoZWxsMzJfaEluc3RhbmNlOworZXh0ZXJuIFVJTlQzMiAgICAgIHNoZWxsMzJfRGxsUmVmQ291bnQ7CisKICNlbmRpZiAgLyogX19XSU5FX1NIRUxMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2hsb2JqLmggYi9pbmNsdWRlL3NobG9iai5oCmluZGV4IDRhZWQ0NDEuLjM1MGZlNTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2hsb2JqLmgKKysrIGIvaW5jbHVkZS9zaGxvYmouaApAQCAtNSw2ICs1LDggQEAKICNpbmNsdWRlICJvbGUuaCIKICNpbmNsdWRlICJvbGUyLmgiCiAjaW5jbHVkZSAiY29tcG9iai5oIgorI2luY2x1ZGUgInN0b3JhZ2UuaCIKKyNpbmNsdWRlICJjb21tY3RybC5oIgogCiAjZGVmaW5lIFNURE1FVEhPRCh4Zm4pIEhSRVNVTFQgKENBTExCQUNLICpmbiMjeGZuKQogI2RlZmluZSBTVERNRVRIT0RfKHR5cGUseGZuKSB0eXBlIChDQUxMQkFDSyAqZm4jI3hmbikKQEAgLTEyLDg4ICsxNCw0MSBAQAogI2RlZmluZSBGQVIKICNkZWZpbmUgVEhJU18gVEhJUywKIAotLyogY29tbW9uIHNoZWxsIGZpbGUgc3RydWN0dXJlcyovCi0jZGVmaW5lIEZPX01PVkUgICAgICAgICAgIDB4MDAwMQotI2RlZmluZSBGT19DT1BZICAgICAgICAgICAweDAwMDIKLSNkZWZpbmUgRk9fREVMRVRFICAgICAgICAgMHgwMDAzCi0jZGVmaW5lIEZPX1JFTkFNRSAgICAgICAgIDB4MDAwNAogCi0jZGVmaW5lIEZPRl9NVUxUSURFU1RGSUxFUyAgICAgICAgIDB4MDAwMQotI2RlZmluZSBGT0ZfQ09ORklSTU1PVVNFICAgICAgICAgICAweDAwMDIKLSNkZWZpbmUgRk9GX1NJTEVOVCAgICAgICAgICAgICAgICAgMHgwMDA0ICAKLSNkZWZpbmUgRk9GX1JFTkFNRU9OQ09MTElTSU9OICAgICAgMHgwMDA4Ci0jZGVmaW5lIEZPRl9OT0NPTkZJUk1BVElPTiAgICAgICAgIDB4MDAxMCAgCi0jZGVmaW5lIEZPRl9XQU5UTUFQUElOR0hBTkRMRSAgICAgIDB4MDAyMCAgCi0jZGVmaW5lIEZPRl9BTExPV1VORE8gICAgICAgICAgICAgIDB4MDA0MAotI2RlZmluZSBGT0ZfRklMRVNPTkxZICAgICAgICAgICAgICAweDAwODAgIAotI2RlZmluZSBGT0ZfU0lNUExFUFJPR1JFU1MgICAgICAgICAweDAxMDAgIAotI2RlZmluZSBGT0ZfTk9DT05GSVJNTUtESVIgICAgICAgICAweDAyMDAgIAotI2RlZmluZSBGT0ZfTk9FUlJPUlVJICAgICAgICAgICAgICAweDA0MDAgIAotdHlwZWRlZiBXT1JEIEZJTEVPUF9GTEFHUzsKIAotI2RlZmluZSBQT19ERUxFVEUgICAgICAgMHgwMDEzICAKLSNkZWZpbmUgUE9fUkVOQU1FICAgICAgIDB4MDAxNCAgCi0jZGVmaW5lIFBPX1BPUlRDSEFOR0UgICAweDAwMjAgIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIERsbEdldENsYXNzT2JqZWN0CisqLworRFdPUkQgV0lOQVBJIFNIRUxMMzJfRGxsR2V0Q2xhc3NPYmplY3QoTFBDTFNJRCxSRUZJSUQsTFBWT0lEKik7CiAKLXR5cGVkZWYgV09SRCBQUklOVEVST1BfRkxBR1M7Ci0KLXR5cGVkZWYgc3RydWN0IF9TSEZJTEVPUFNUUlVDVEEKLXsgSFdORDMyICAgICAgICAgIGh3bmQ7Ci0gIFVJTlQzMiAgICAgICAgICB3RnVuYzsKLSAgTFBDU1RSICAgICAgICAgIHBGcm9tOwotICBMUENTVFIgICAgICAgICAgcFRvOwotICBGSUxFT1BfRkxBR1MgICAgZkZsYWdzOwotICBCT09MMzIgICAgICAgICAgZkFueU9wZXJhdGlvbnNBYm9ydGVkOwotICBMUFZPSUQgICAgICAgICAgaE5hbWVNYXBwaW5nczsKLSAgTFBDU1RSICAgICAgICAgIGxwc3pQcm9ncmVzc1RpdGxlOwotfSBTSEZJTEVPUFNUUlVDVDMyQSwgRkFSICpMUFNIRklMRU9QU1RSVUNUMzJBOwotCi10eXBlZGVmIHN0cnVjdCBfU0hGSUxFT1BTVFJVQ1RXCi17IEhXTkQzMiAgICAgICAgICBod25kOwotICBVSU5UMzIgICAgICAgICAgd0Z1bmM7Ci0gIExQQ1dTVFIgICAgICAgICBwRnJvbTsKLSAgTFBDV1NUUiAgICAgICAgIHBUbzsKLSAgRklMRU9QX0ZMQUdTICAgIGZGbGFnczsKLSAgQk9PTDMyICAgICAgICAgIGZBbnlPcGVyYXRpb25zQWJvcnRlZDsKLSAgTFBWT0lEICAgICAgICAgIGhOYW1lTWFwcGluZ3M7Ci0gIExQQ1dTVFIgICAgICAgICBscHN6UHJvZ3Jlc3NUaXRsZTsKLX0gU0hGSUxFT1BTVFJVQ1QzMlcsIEZBUiAqTFBTSEZJTEVPUFNUUlVDVDMyVzsKLQotdHlwZWRlZiBTSEZJTEVPUFNUUlVDVDMyQSBTSEZJTEVPUFNUUlVDVDMyOwotdHlwZWRlZiBMUFNIRklMRU9QU1RSVUNUMzJBIExQU0hGSUxFT1BTVFJVQ1QzMjsKLQotLypjb21tb24gSURMaXN0IHN0cnVjdHVyZXMqLwotdHlwZWRlZiBzdHJ1Y3QgewotCVdPUkQJCWNiOwkvKiBuciBvZiBieXRlcyBpbiB0aGlzIGl0ZW0gKi8KLQlCWVRFCQlhYklEWzFdOy8qIGZpcnN0IGJ5dGUgaW4gdGhpcyBpdGVtICovCi19IFNISVRFTUlELCpMUFNISVRFTUlEOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JU0hJVEVNSUQJbWtpZDsgLyogZmlyc3QgaXRlbWlkIGluIGxpc3QgKi8KLX0gSVRFTUlETElTVCwqTFBJVEVNSURMSVNULCpMUENJVEVNSURMSVNUOwotCi0vKiBmb3IgU0hDaGFuZ2VOb3RpZnlSZWdpc3RlciovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICBMUElURU1JRExJU1QgcGlkbDsKLSAgIERXT1JEIHVua25vd247Ci19IElEU1RSVUNUOwotCi0vKiBmb3IgU0hBZGRUb1JlY2VudERvY3MqLwotI2RlZmluZSBTSEFSRF9QSURMICAgICAgMHgwMDAwMDAwMUwKLSNkZWZpbmUgU0hBUkRfUEFUSCAgICAgIDB4MDAwMDAwMDJMCiAKIHR5cGVkZWYgTFBWT0lECUxQQkM7IC8qICpJQmluZEN0eCByZWFsbHkgKi8KIAotLyoKLSAqIHNoZWxsMzIgY2xhc3NpZHMKLSAqLworLyogZm9yZXdhcmQgZGVjbGFyYXRpb24gb2YgdGhlIG9iamVjdHMqLwordHlwZWRlZiBzdHJ1Y3QgSUVudW1JRExpc3QgSUVudW1JRExpc3QsKkxQRU5VTUlETElTVDsKK3R5cGVkZWYgc3RydWN0IHRhZ1NIRUxMRk9MREVSICpMUFNIRUxMRk9MREVSLElTaGVsbEZvbGRlcjsKK3R5cGVkZWYgc3RydWN0IHRhZ1NIRUxMVklFVyAqTFBTSEVMTFZJRVcsSVNoZWxsVmlldzsKK3R5cGVkZWYgc3RydWN0IHRhZ1NIRUxMQlJPV1NFUiAqTFBTSEVMTEJST1dTRVIsSVNoZWxsQnJvd3NlcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIFNIRUxMIElECisqLworLyogc2hlbGwzMiBjbGFzc2lkcyAqLwogREVGSU5FX1NITEdVSUQoQ0xTSURfU2hlbGxEZXNrdG9wLCAgICAgIDB4MDAwMjE0MDBMLCAwLCAwKTsKIERFRklORV9TSExHVUlEKENMU0lEX1NoZWxsTGluaywgICAgICAgICAweDAwMDIxNDAxTCwgMCwgMCk7CisvKiBzaGVsbDMyIGZvcm1hdGlkcyAqLworREVGSU5FX1NITEdVSUQoRk1USURfSW50c2hjdXQsICAgICAgICAgIDB4MDAwMjE0QTBMLCAwLCAwKTsKK0RFRklORV9TSExHVUlEKEZNVElEX0ludGVybmV0U2l0ZSwgICAgICAweDAwMDIxNEExTCwgMCwgMCk7CisvKiBjb21tYW5kIGdyb3VwIGlkcyAqLworREVGSU5FX1NITEdVSUQoQ0dJRF9FeHBsb3JlciwgICAgICAgICAgIDB4MDAwMjE0RDBMLCAwLCAwKTsKK0RFRklORV9TSExHVUlEKENHSURfU2hlbGxEb2NWaWV3LCAgICAgICAweDAwMDIxNEQxTCwgMCwgMCk7CiAKLS8qCi0gKiBzaGVsbDMyIEludGVyZmFjZSBpZHMKLSAqLworIC8qIHNoZWxsMzIgSW50ZXJmYWNlIGlkcyAqLworREVGSU5FX1NITEdVSUQoSUlEX0lOZXdTaG9ydGN1dEhvb2tBLCAgIDB4MDAwMjE0RTFMLCAwLCAwKTsKK0RFRklORV9TSExHVUlEKElJRF9JU2hlbGxCcm93c2VyLCAgICAgICAweDAwMDIxNEUyTCwgMCwgMCk7CitERUZJTkVfU0hMR1VJRChJSURfSVNoZWxsVmlldywgICAgICAgICAgMHgwMDAyMTRFM0wsIDAsIDApOwogREVGSU5FX1NITEdVSUQoSUlEX0lDb250ZXh0TWVudSwgICAgICAgIDB4MDAwMjE0RTRMLCAwLCAwKTsKK0RFRklORV9TSExHVUlEKElJRF9JU2hlbGxJY29uLCAgICAgICAgICAweDAwMDIxNEU1TCwgMCwgMCk7CiBERUZJTkVfU0hMR1VJRChJSURfSVNoZWxsRm9sZGVyLCAgICAgICAgMHgwMDAyMTRFNkwsIDAsIDApOwogREVGSU5FX1NITEdVSUQoSUlEX0lTaGVsbEV4dEluaXQsICAgICAgIDB4MDAwMjE0RThMLCAwLCAwKTsKIERFRklORV9TSExHVUlEKElJRF9JU2hlbGxQcm9wU2hlZXRFeHQsICAweDAwMDIxNEU5TCwgMCwgMCk7CkBAIC0xMDEsMTIgKzU2LDI1IEBACiBERUZJTkVfU0hMR1VJRChJSURfSVNoZWxsTGluaywgICAgICAgICAgMHgwMDAyMTRFRUwsIDAsIDApOwogREVGSU5FX1NITEdVSUQoSUlEX0lTaGVsbENvcHlIb29rLCAgICAgIDB4MDAwMjE0RUZMLCAwLCAwKTsKIERFRklORV9TSExHVUlEKElJRF9JRmlsZVZpZXdlciwgICAgICAgICAweDAwMDIxNEYwTCwgMCwgMCk7CitERUZJTkVfU0hMR1VJRChJSURfSUNvbW1EbGdCcm93c2VyLCAgICAgMHgwMDAyMTRGMUwsIDAsIDApOwogREVGSU5FX1NITEdVSUQoSUlEX0lFbnVtSURMaXN0LCAgICAgICAgIDB4MDAwMjE0RjJMLCAwLCAwKTsKIERFRklORV9TSExHVUlEKElJRF9JRmlsZVZpZXdlclNpdGUsICAgICAweDAwMDIxNEYzTCwgMCwgMCk7CitERUZJTkVfU0hMR1VJRChJSURfSUNvbnRleHRNZW51MiwgICAgICAgMHgwMDAyMTRGNEwsIDAsIDApOworREVGSU5FX1NITEdVSUQoSUlEX0lTaGVsbEV4ZWN1dGVIb29rQSwgIDB4MDAwMjE0RjVMLCAwLCAwKTsKK0RFRklORV9TSExHVUlEKElJRF9JUHJvcFNoZWV0UGFnZSwgICAgICAweDAwMDIxNEY2TCwgMCwgMCk7CitERUZJTkVfU0hMR1VJRChJSURfSU5ld1Nob3J0Y3V0SG9va1csICAgMHgwMDAyMTRGN0wsIDAsIDApOworREVGSU5FX1NITEdVSUQoSUlEX0lGaWxlVmlld2VyVywgICAgICAgIDB4MDAwMjE0RjhMLCAwLCAwKTsKK0RFRklORV9TSExHVUlEKElJRF9JU2hlbGxMaW5rVywgICAgICAgICAweDAwMDIxNEY5TCwgMCwgMCk7CitERUZJTkVfU0hMR1VJRChJSURfSUV4dHJhY3RJY29uVywgICAgICAgMHgwMDAyMTRGQUwsIDAsIDApOworREVGSU5FX1NITEdVSUQoSUlEX0lTaGVsbEV4ZWN1dGVIb29rVywgIDB4MDAwMjE0RkJMLCAwLCAwKTsKK0RFRklORV9TSExHVUlEKElJRF9JU2hlbGxDb3B5SG9va1csICAgICAweDAwMDIxNEZDTCwgMCwgMCk7CiAKLSNkZWZpbmUJU1RSUkVUX1dTVFIJMHgwMDAwCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgU1RSUkVUCisqLworI2RlZmluZQlTVFJSRVRfV1NUUgkgICAgMHgwMDAwCiAjZGVmaW5lCVNUUlJFVF9PRkZTRVQJMHgwMDAxCi0jZGVmaW5lCVNUUlJFVF9DU1RSCTB4MDAwMgorI2RlZmluZQlTVFJSRVRfQ1NUUgkgICAgMHgwMDAyCiAKIHR5cGVkZWYgc3RydWN0IF9TVFJSRVQKIHsgVUlOVDMyIHVUeXBlOwkJLyogU1RSUkVUX3h4eCAqLwpAQCAtMTI2LDE4ICs5NCwxOCBAQAogdHlwZWRlZiBlbnVtIHRhZ1BJRExUWVBFCiB7IFBUX0RFU0tUT1AgPSAweDAwMDAwMDAwLAogICBQVF9NWUNPTVAgPSAgMHgwMDAwMDAwMSwKLQlQVF9DT05UUk9MID0gMHgwMDAwMDAwMiwKLQlQVF9SRUNZQ0xFUiA9MHgwMDAwMDAwNCwKKyAgUFRfQ09OVFJPTCA9IDB4MDAwMDAwMDIsCisgIFBUX1JFQ1lDTEVSID0weDAwMDAwMDA0LAogICBQVF9EUklWRSA9ICAgMHgwMDAwMDAwOCwKICAgUFRfRk9MREVSID0gIDB4MDAwMDAwMTAsCi0JUFRfVkFMVUUgPSAgIDB4MDAwMDAwMjAsCisgIFBUX1ZBTFVFID0gICAweDAwMDAwMDIwLAogICBQVF9URVhUID0gUFRfRk9MREVSIHwgUFRfVkFMVUUKIH0gUElETFRZUEU7CiAKIHR5cGVkZWYgc3RydWN0IHRhZ1BJRExEQVRBCiB7IFBJRExUWVBFIHR5cGU7CiAgIENIQVIgICAgc3pUZXh0WzFdOwotfVBJRExEQVRBLCBGQVIgKkxQUElETERBVEE7Cit9IFBJRExEQVRBLCBGQVIgKkxQUElETERBVEE7CiAKIHR5cGVkZWYgc3RydWN0IHBpZGxtZ3IgcGlkbG1nciwqTFBQSURMTUdSOwogdHlwZWRlZiBzdHJ1Y3QgUGlkbE1ncl9WVGFibGUKQEAgLTE0NiwxMyArMTE0LDExIEBACiAgICBTVERNRVRIT0RfKExQSVRFTUlETElTVCwgQ3JlYXRlRHJpdmUpIChUSElTXyBMUENTVFIpOwogICAgU1RETUVUSE9EXyhMUElURU1JRExJU1QsIENyZWF0ZUZvbGRlcikgKFRISVNfIExQQ1NUUik7CiAgICBTVERNRVRIT0RfKExQSVRFTUlETElTVCwgQ3JlYXRlVmFsdWUpIChUSElTXyBMUENTVFIpOwotICAgU1RETUVUSE9EXyh2b2lkLCBEZWxldGUpIChUSElTXyBMUElURU1JRExJU1QpOworLyogICBTVERNRVRIT0RfKHZvaWQsIERlbGV0ZSkgKFRISVNfIExQSVRFTUlETElTVCk7Ki8KICAgIFNURE1FVEhPRF8oTFBJVEVNSURMSVNULCBHZXROZXh0SXRlbSkgKFRISVNfIExQQ0lURU1JRExJU1QpOwotICAgU1RETUVUSE9EXyhMUElURU1JRExJU1QsIENvcHkpIChUSElTXyBMUENJVEVNSURMSVNUKTsKLSAgIFNURE1FVEhPRF8oVUlOVDE2LCBHZXRTaXplKSAoVEhJU18gTFBDSVRFTUlETElTVCk7CiAgICBTVERNRVRIT0RfKEJPT0wzMiwgR2V0RGVza3RvcCkgKFRISVNfIExQQ0lURU1JRExJU1QsIExQU1RSKTsKICAgIFNURE1FVEhPRF8oQk9PTDMyLCBHZXREcml2ZSkgKFRISVNfIExQQ0lURU1JRExJU1QsIExQU1RSLCBVSU5UMTYpOwotCSBTVERNRVRIT0RfKExQSVRFTUlETElTVCwgR2V0TGFzdEl0ZW0pIChUSElTXyBMUENJVEVNSURMSVNUKTsKKyAgIFNURE1FVEhPRF8oTFBJVEVNSURMSVNULCBHZXRMYXN0SXRlbSkgKFRISVNfIExQQ0lURU1JRExJU1QpOwogICAgU1RETUVUSE9EXyhEV09SRCwgR2V0SXRlbVRleHQpIChUSElTXyBMUENJVEVNSURMSVNULCBMUFNUUiwgVUlOVDE2KTsKICAgIFNURE1FVEhPRF8oQk9PTDMyLCBJc0Rlc2t0b3ApIChUSElTXyBMUENJVEVNSURMSVNUKTsKICAgIFNURE1FVEhPRF8oQk9PTDMyLCBJc015Q29tcHV0ZXIpIChUSElTXyBMUENJVEVNSURMSVNUKTsKQEAgLTE2MiwxNSArMTI4LDkgQEAKICAgIFNURE1FVEhPRF8oQk9PTDMyLCBIYXNGb2xkZXJzKSAoVEhJU18gTFBTVFIsIExQQ0lURU1JRExJU1QpOwogICAgU1RETUVUSE9EXyhEV09SRCwgR2V0Rm9sZGVyVGV4dCkgKFRISVNfIExQQ0lURU1JRExJU1QsIExQU1RSLCBEV09SRCk7CiAgICBTVERNRVRIT0RfKERXT1JELCBHZXRWYWx1ZVRleHQpIChUSElTXyBMUENJVEVNSURMSVNULCBMUFNUUiwgRFdPUkQpOwotICAgCi0vKiAgIFNURE1FVEhPRF8oQk9PTDMyLCBHZXRWYWx1ZVR5cGUpIChUSElTXyBMUENJVEVNSURMSVNULCBMUERXT1JEKTsqLwogICAgU1RETUVUSE9EXyhCT09MMzIsIEdldFZhbHVlVHlwZSkgKFRISVNfIExQQ0lURU1JRExJU1QsIExQQ0lURU1JRExJU1QsIExQRFdPUkQpOwotICAgCi0vKiAgIFNURE1FVEhPRF8oRFdPUkQsIEdldERhdGFUZXh0KSAoVEhJU18gTFBDSVRFTUlETElTVCwgTFBTVFIsIERXT1JEKTsqLwogICAgU1RETUVUSE9EXyhEV09SRCwgR2V0RGF0YVRleHQpIChUSElTXyBMUENJVEVNSURMSVNULCBMUENJVEVNSURMSVNULCBMUFNUUiwgRFdPUkQpOwotICAgCiAgICBTVERNRVRIT0RfKERXT1JELCBHZXRQaWRsUGF0aCkgKFRISVNfIExQQ0lURU1JRExJU1QsIExQU1RSLCBEV09SRCk7Ci0gICBTVERNRVRIT0RfKExQSVRFTUlETElTVCwgQ29uY2F0ZW5hdGUpIChUSElTXyBMUENJVEVNSURMSVNULCBMUENJVEVNSURMSVNUKTsKICAgIFNURE1FVEhPRF8oTFBJVEVNSURMSVNULCBDcmVhdGUpIChUSElTXyBQSURMVFlQRSwgTFBWT0lELCBVSU5UMTYpOwogICAgU1RETUVUSE9EXyhEV09SRCwgR2V0RGF0YSkgKFRISVNfIFBJRExUWVBFLCBMUENJVEVNSURMSVNULCBMUFZPSUQsIFVJTlQxNik7CiAgICBTVERNRVRIT0RfKExQUElETERBVEEsIEdldERhdGFQb2ludGVyKSAoVEhJU18gTFBDSVRFTUlETElTVCk7CkBAIC0xNzksOCArMTM5LDkgQEAKIH0gKkxQUElETE1HUl9WVEFCTEUsUGlkbE1ncl9WVGFibGU7CiAKIHN0cnVjdCBwaWRsbWdyIAotewlMUFBJRExNR1JfVlRBQkxFCWxwdnRibDsKK3sgTFBQSURMTUdSX1ZUQUJMRQlscHZ0Ymw7CiB9OworCiAjaWZkZWYgX19XSU5FX18KIGV4dGVybiBMUFBJRExNR1IgUGlkbE1ncl9Db25zdHJ1Y3RvcigpOwogZXh0ZXJuIHZvaWQgUGlkbE1ncl9EZXN0cnVjdG9yKFRISVMpOwpAQCAtMTkyLDE2ICsxNTMsMTYgQEAKICAqIElFbnVtSURMaXN0IGludGVyZmFjZQogICovCiAjZGVmaW5lIFRISVMgTFBFTlVNSURMSVNUIHRoaXMKKwogdHlwZWRlZiBzdHJ1Y3QgdGFnRU5VTUxJU1QKIHsgc3RydWN0IHRhZ0VOVU1MSVNUCSpwTmV4dDsKICAgTFBJVEVNSURMSVNUIHBpZGw7CiB9IEVOVU1MSVNULCAqTFBFTlVNTElTVDsKIAotdHlwZWRlZiBzdHJ1Y3QgSUVudW1JRExpc3QgSUVudW1JRExpc3QsKkxQRU5VTUlETElTVDsKLXR5cGVkZWYgc3RydWN0IElFbnVtSURMaXN0X1ZUYWJsZSB7Ci0gICAgLyogKioqIElVbmtub3duIG1ldGhvZHMgKioqICovCit0eXBlZGVmIHN0cnVjdCBJRW51bUlETGlzdF9WVGFibGUgCit7ICAgIC8qICoqKiBJVW5rbm93biBtZXRob2RzICoqKiAqLwogICAgIFNURE1FVEhPRChRdWVyeUludGVyZmFjZSkgKFRISVNfIFJFRklJRCByaWlkLCBMUFZPSUQgKiBwcHZPYmopIFBVUkU7Ci0JCVNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKSAoVEhJUykgIFBVUkU7CisgICAgU1RETUVUSE9EXyhVTE9ORyxBZGRSZWYpIChUSElTKSAgUFVSRTsKICAgICBTVERNRVRIT0RfKFVMT05HLFJlbGVhc2UpIChUSElTKSBQVVJFOwogCiAgICAgLyogKioqIElFbnVtSURMaXN0IG1ldGhvZHMgKioqICovCkBAIC0yMTIsMjYgKzE3Myw3OSBAQAogICAgIFNURE1FVEhPRChSZXNldCkgKFRISVMpIFBVUkU7CiAgICAgU1RETUVUSE9EKENsb25lKSAoVEhJU18gSUVudW1JRExpc3QgKipwcGVudW0pIFBVUkU7CiAJCS8qICoqKiBwcml2YXRlIG1ldGhvZHMgKioqICovCi0JCVNURE1FVEhPRF8oQk9PTDMyLENyZWF0ZUVudW1MaXN0KShUSElTXyBMUENTVFIsIERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRF8oQk9PTDMyLENyZWF0ZUVudW1MaXN0KShUSElTXyBMUENTVFIsIERXT1JEKSBQVVJFOwogICAgIFNURE1FVEhPRF8oQk9PTDMyLEFkZFRvRW51bUxpc3QpKFRISVNfIExQSVRFTUlETElTVCkgUFVSRTsKICAgICBTVERNRVRIT0RfKEJPT0wzMixEZWxldGVMaXN0KShUSElTKSBQVVJFOwogCiAJCQogfSBJRW51bUlETGlzdF9WVGFibGUsKkxQRU5VTUlETElTVF9WVEFCTEU7CiAKLXN0cnVjdCBJRW51bUlETGlzdCB7Ci0JTFBFTlVNSURMSVNUX1ZUQUJMRQlscHZ0Ymw7Ci0JRFdPUkQJCQkgcmVmOwotCUxQUElETE1HUiAgbXBQaWRsTWdyOwotCUxQRU5VTUxJU1QgbXBGaXJzdDsKLQlMUEVOVU1MSVNUIG1wTGFzdDsKLQlMUEVOVU1MSVNUIG1wQ3VycmVudDsKLQorc3RydWN0IElFbnVtSURMaXN0Cit7IExQRU5VTUlETElTVF9WVEFCTEUJbHB2dGJsOworICBEV09SRAkJCSByZWY7CisgIExQUElETE1HUiAgbXBQaWRsTWdyOworICBMUEVOVU1MSVNUIG1wRmlyc3Q7CisgIExQRU5VTUxJU1QgbXBMYXN0OworICBMUEVOVU1MSVNUIG1wQ3VycmVudDsKIH07CiAKICN1bmRlZiBUSElTCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRk9MREVSU0VUVElOR1MKKy8vCisvLyAgRk9MREVSU0VUVElOR1MgaXMgYSBkYXRhIHN0cnVjdHVyZSB0aGF0IGV4cGxvcmVyIHBhc3NlcyBmcm9tIG9uZSBmb2xkZXIKKy8vIHZpZXcgdG8gYW5vdGhlciwgd2hlbiB0aGUgdXNlciBpcyBicm93c2luZy4gSXQgY2FsbHMgSVNWOjpHZXRDdXJyZW50SW5mbworLy8gbWVtYmVyIHRvIGdldCB0aGUgY3VycmVudCBzZXR0aW5ncyBhbmQgcGFzcyBpdCB0byBJU1Y6OkNyZWF0ZVZpZXdXaW5kb3cKKy8vIHRvIGFsbG93IHRoZSBuZXh0IGZvbGRlciB2aWV3ICJpbmhlcml0IiBpdC4gVGhlc2Ugc2V0dGluZ3MgYXNzdW1lcyBhCisvLyBwYXJ0aWN1bGFyIFVJICh3aGljaCB0aGUgc2hlbGwncyBmb2xkZXIgdmlldyBoYXMpLCBhbmQgc2hlbGwgZXh0ZW5zaW9ucworLy8gbWF5IG9yIG1heSBub3QgdXNlIHRob3NlIHNldHRpbmdzLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBMUEJZVEUgTFBWSUVXU0VUVElOR1M7CisKKy8vIE5CIEJpdGZpZWxkcy4KKy8vIEZXRl9ERVNLVE9QIGltcGxpZXMgRldGX1RSQU5TUEFSRU5UL05PQ0xJRU5URURHRS9OT1NDUk9MTAordHlwZWRlZiBlbnVtCit7IEZXRl9BVVRPQVJSQU5HRSA9ICAgICAgIDB4MDAwMSwKKyAgRldGX0FCQlJFVklBVEVETkFNRVMgPSAgMHgwMDAyLAorICBGV0ZfU05BUFRPR1JJRCA9ICAgICAgICAweDAwMDQsCisgIEZXRl9PV05FUkRBVEEgPSAgICAgICAgIDB4MDAwOCwKKyAgRldGX0JFU1RGSVRXSU5ET1cgPSAgICAgMHgwMDEwLAorICBGV0ZfREVTS1RPUCA9ICAgICAgICAgICAweDAwMjAsCisgIEZXRl9TSU5HTEVTRUwgPSAgICAgICAgIDB4MDA0MCwKKyAgRldGX05PU1VCRk9MREVSUyA9ICAgICAgMHgwMDgwLAorICBGV0ZfVFJBTlNQQVJFTlQgID0gICAgICAweDAxMDAsCisgIEZXRl9OT0NMSUVOVEVER0UgPSAgICAgIDB4MDIwMCwKKyAgRldGX05PU0NST0xMICAgICA9ICAgICAgMHgwNDAwLAorICBGV0ZfQUxJR05MRUZUICAgID0gICAgICAweDA4MDAsCisgIEZXRl9TSU5HTEVDTElDS0FDVElWQVRFPTB4ODAwMCAgLy8gVEVNUE9SQVJZIC0tIE5PIFVJIEZPUiBUSElTCit9IEZPTERFUkZMQUdTOworCit0eXBlZGVmIGVudW0KK3sgRlZNX0lDT04gPSAgICAgICAgICAgICAgMSwKKyAgRlZNX1NNQUxMSUNPTiA9ICAgICAgICAgMiwKKyAgRlZNX0xJU1QgPSAgICAgICAgICAgICAgMywKKyAgRlZNX0RFVEFJTFMgPSAgICAgICAgICAgNCwKK30gRk9MREVSVklFV01PREU7CisKK3R5cGVkZWYgc3RydWN0Cit7IFVJTlQzMiBWaWV3TW9kZTsgICAgICAgLy8gVmlldyBtb2RlIChGT0xERVJWSUVXTU9ERSB2YWx1ZXMpCisgIFVJTlQzMiBmRmxhZ3M7ICAgICAgICAgLy8gVmlldyBvcHRpb25zIChGT0xERVJGTEFHUyBiaXRzKQorfSBGT0xERVJTRVRUSU5HUywgKkxQRk9MREVSU0VUVElOR1M7CisKK3R5cGVkZWYgY29uc3QgRk9MREVSU0VUVElOR1MgKiBMUENGT0xERVJTRVRUSU5HUzsKKworLyogRklYTUU7IHRoZSBuZXh0IHR3byBsaW5lcyBhcmUgcHJvcGVyc2hlZXQgcmVsYXRlZCwgbW92ZSB0byBwcnNodC5oIHdoZW4gY3JlYXRlZCAqLworc3RydWN0IF9QU1A7Cit0eXBlZGVmIHN0cnVjdCBfUFNQIEZBUiogSFBST1BTSEVFVFBBR0U7CisKK3R5cGVkZWYgQk9PTDMyIChDQUxMQkFDSyBGQVIgKiBMUEZOQUREUFJPUFNIRUVUUEFHRSkoSFBST1BTSEVFVFBBR0UsIExQQVJBTSk7Cit0eXBlZGVmIEJPT0wzMiAoQ0FMTEJBQ0sgRkFSICogTFBGTkFERFBST1BTSEVFVFBBR0VTKShMUFZPSUQsIExQRk5BRERQUk9QU0hFRVRQQUdFLExQQVJBTSk7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRoZSBJU2hlbGxGb2xkZXIgaW50ZXJmYWNlIC4uLiB0aGUgYmFzaWMgaW50ZXJmYWNlIGZvciBhIGxvdCBvZiBzdHVmZgorICogSVNoZWxsRm9sZGVyIGludGVyZmFjZQogICovCiAKICNkZWZpbmUgVEhJUyBMUFNIRUxMRk9MREVSIHRoaXMKQEAgLTI3OSw1MCArMjkzLDE0NiBAQAogI2RlZmluZSBTRkdBT19WQUxJREFURSAgICAgICAgICAweDAxMDAwMDAwTCAgICAgLyogaW52YWxpZGF0ZSBjYWNoZWQgaW5mb3JtYXRpb24gKi8KICNkZWZpbmUgU0ZHQU9fUkVNT1ZBQkxFICAgICAgICAweDAyMDAwMDAwTCAgICAgIC8qIGlzIHRoaXMgcmVtb3ZlYWJsZSBtZWRpYT8gKi8KIAotCi10eXBlZGVmIHN0cnVjdCB0YWdTSEVMTEZPTERFUiAqTFBTSEVMTEZPTERFUixJU2hlbGxGb2xkZXI7CiB0eXBlZGVmIHN0cnVjdCBJU2hlbGxGb2xkZXJfVlRhYmxlIHsKICAgICAvKiAqKiogSVVua25vd24gbWV0aG9kcyAqKiogKi8KICAgICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpIChUSElTXyBSRUZJSUQgcmlpZCwgTFBWT0lEICogcHB2T2JqKSBQVVJFOwogICAgIFNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKSAoVEhJUykgIFBVUkU7CiAgICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKSAoVEhJUykgUFVSRTsKLSAgICAvKiAqKiogSVBlcnNpc3QgRm9sZGVyIG1ldGhvZHMgKioqICovCi0vKgkJU1RETUVUSE9EKEluaXRpYWxpemUpKFRISVNfIExQQ0lURU1JRExJU1QgcGlkbCkgUFVSRTsgKi8KKwogICAgIC8qICoqKiBJU2hlbGxGb2xkZXIgbWV0aG9kcyAqKiogKi8KLSAgICBTVERNRVRIT0QoUGFyc2VEaXNwbGF5TmFtZSkgKFRISVNfIEhXTkQzMiBod25kT3duZXIsCi0gICAgICAgIExQQkMgcGJjUmVzZXJ2ZWQsIExQT0xFU1RSMzIgbHBzekRpc3BsYXlOYW1lLAotICAgICAgICBVTE9ORyAqIHBjaEVhdGVuLCBMUElURU1JRExJU1QgKiBwcGlkbCwgVUxPTkcgKnBkd0F0dHJpYnV0ZXMpIFBVUkU7Ci0gICAgU1RETUVUSE9EKEVudW1PYmplY3RzKSAoIFRISVNfIEhXTkQzMiBod25kT3duZXIsIERXT1JEIGdyZkZsYWdzLCBMUEVOVU1JRExJU1QKLSogcHBlbnVtSURMaXN0KSBQVVJFOwotICAgIFNURE1FVEhPRChCaW5kVG9PYmplY3QpICAgICAoVEhJU18gTFBDSVRFTUlETElTVCBwaWRsLCBMUEJDIHBiY1Jlc2VydmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsIExQVk9JRCAqIHBwdk91dCkgUFVSRTsKLSAgICBTVERNRVRIT0QoQmluZFRvU3RvcmFnZSkgICAgKFRISVNfIExQQ0lURU1JRExJU1QgcGlkbCwgTFBCQyBwYmNSZXNlcnZlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLCBMUFZPSUQgKiBwcHZPYmopIFBVUkU7Ci0gICAgU1RETUVUSE9EKENvbXBhcmVJRHMpICAgICAgIChUSElTXyBMUEFSQU0gbFBhcmFtLCBMUENJVEVNSURMSVNUIHBpZGwxLCBMUENJVEVNSURMSVNUIHBpZGwyKSBQVVJFOwotICAgIFNURE1FVEhPRChDcmVhdGVWaWV3T2JqZWN0KSAoVEhJU18gSFdORDMyIGh3bmRPd25lciwgUkVGSUlEIHJpaWQsIExQVk9JRCAqIHBwdk91dCkgUFVSRTsKLSAgICBTVERNRVRIT0QoR2V0QXR0cmlidXRlc09mKSAgKFRISVNfIFVJTlQzMiBjaWRsLCBMUENJVEVNSURMSVNUICogYXBpZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyAqIHJnZkluT3V0KSBQVVJFOwotICAgIFNURE1FVEhPRChHZXRVSU9iamVjdE9mKSAgICAoVEhJU18gSFdORDMyIGh3bmRPd25lciwgVUlOVDMyIGNpZGwsIExQQ0lURU1JRExJU1QKLSogYXBpZGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmlpZCwgVUlOVDMyICogcHJnZkluT3V0LCBMUFZPSUQgKiBwcHZPdXQpIFBVUkU7Ci0gICAgU1RETUVUSE9EKEdldERpc3BsYXlOYW1lT2YpIChUSElTXyBMUENJVEVNSURMSVNUIHBpZGwsIERXT1JEIHVGbGFncywgTFBTVFJSRVQgbHBOYW1lKSBQVVJFOwotICAgIFNURE1FVEhPRChTZXROYW1lT2YpICAgICAgICAoVEhJU18gSFdORDMyIGh3bmRPd25lciwgTFBDSVRFTUlETElTVCBwaWRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDT0xFU1RSMzIgbHBzek5hbWUsIERXT1JEIHVGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQSVRFTUlETElTVCAqIHBwaWRsT3V0KSBQVVJFOworICAgIFNURE1FVEhPRChQYXJzZURpc3BsYXlOYW1lKSAoVEhJU18gSFdORDMyIGh3bmRPd25lcixMUEJDIHBiY1Jlc2VydmVkLCBMUE9MRVNUUjMyIGxwc3pEaXNwbGF5TmFtZSxVTE9ORyAqIHBjaEVhdGVuLCBMUElURU1JRExJU1QgKiBwcGlkbCwgVUxPTkcgKnBkd0F0dHJpYnV0ZXMpIFBVUkU7CisgICAgU1RETUVUSE9EKEVudW1PYmplY3RzKSggVEhJU18gSFdORDMyIGh3bmRPd25lciwgRFdPUkQgZ3JmRmxhZ3MsIExQRU5VTUlETElTVCAqIHBwZW51bUlETGlzdCkgUFVSRTsKKyAgICBTVERNRVRIT0QoQmluZFRvT2JqZWN0KShUSElTXyBMUENJVEVNSURMSVNUIHBpZGwsIExQQkMgcGJjUmVzZXJ2ZWQsUkVGSUlEIHJpaWQsIExQVk9JRCAqIHBwdk91dCkgUFVSRTsKKyAgICBTVERNRVRIT0QoQmluZFRvU3RvcmFnZSkoVEhJU18gTFBDSVRFTUlETElTVCBwaWRsLCBMUEJDIHBiY1Jlc2VydmVkLFJFRklJRCByaWlkLCBMUFZPSUQgKiBwcHZPYmopIFBVUkU7CisgICAgU1RETUVUSE9EKENvbXBhcmVJRHMpKFRISVNfIExQQVJBTSBsUGFyYW0sIExQQ0lURU1JRExJU1QgcGlkbDEsIExQQ0lURU1JRExJU1QgcGlkbDIpIFBVUkU7CisgICAgU1RETUVUSE9EKENyZWF0ZVZpZXdPYmplY3QpKFRISVNfIEhXTkQzMiBod25kT3duZXIsIFJFRklJRCByaWlkLCBMUFZPSUQgKiBwcHZPdXQpIFBVUkU7CisgICAgU1RETUVUSE9EKEdldEF0dHJpYnV0ZXNPZikoVEhJU18gVUlOVDMyIGNpZGwsIExQQ0lURU1JRExJU1QgKiBhcGlkbCxVTE9ORyAqIHJnZkluT3V0KSBQVVJFOworICAgIFNURE1FVEhPRChHZXRVSU9iamVjdE9mKShUSElTXyBIV05EMzIgaHduZE93bmVyLCBVSU5UMzIgY2lkbCwgTFBDSVRFTUlETElTVCAqIGFwaWRsLFJFRklJRCByaWlkLCBVSU5UMzIgKiBwcmdmSW5PdXQsIExQVk9JRCAqIHBwdk91dCkgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0RGlzcGxheU5hbWVPZikoVEhJU18gTFBDSVRFTUlETElTVCBwaWRsLCBEV09SRCB1RmxhZ3MsIExQU1RSUkVUIGxwTmFtZSkgUFVSRTsKKyAgICBTVERNRVRIT0QoU2V0TmFtZU9mKShUSElTXyBIV05EMzIgaHduZE93bmVyLCBMUENJVEVNSURMSVNUIHBpZGwsTFBDT0xFU1RSMzIgbHBzek5hbWUsIERXT1JEIHVGbGFncyxMUElURU1JRExJU1QgKiBwcGlkbE91dCkgUFVSRTsKIH0gKkxQU0hFTExGT0xERVJfVlRBQkxFLElTaGVsbEZvbGRlcl9WVGFibGU7CiAKIHN0cnVjdCB0YWdTSEVMTEZPTERFUiB7CiAJTFBTSEVMTEZPTERFUl9WVEFCTEUJbHB2dGJsOwogCURXT1JECQkJICAgcmVmOwogCUxQU1RSICAgICAgICBtbHBzekZvbGRlcjsKLSAgTFBQSURMTUdSCSAgIHBQaWRsTWdyOworICAgIExQUElETE1HUgkgICBwUGlkbE1ncjsKIAlMUElURU1JRExJU1QgbXBpZGw7CiAJTFBJVEVNSURMSVNUIG1waWRsTlNSb290OwogCUxQU0hFTExGT0xERVIgbXBTRlBhcmVudDsKIH07CisKIGV4dGVybiBMUFNIRUxMRk9MREVSIHBkZXNrdG9wZm9sZGVyOwogI3VuZGVmIFRISVMKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBJU2hlbGxCcm93c2VyIEludGVmYWNlCisqLworI2RlZmluZSBUSElTIExQU0hFTExCUk9XU0VSIHRoaXMKKwordHlwZWRlZiBzdHJ1Y3QgSVNoZWxsQnJvd3Nlcl9WVGFibGUgCit7ICAgIC8vICoqKiBJVW5rbm93biBtZXRob2RzICoqKgorICAgIFNURE1FVEhPRChRdWVyeUludGVyZmFjZSkgKFRISVNfIFJFRklJRCByaWlkLCBMUFZPSUQgKiBwcHZPYmopIFBVUkU7CisgICAgU1RETUVUSE9EXyhVTE9ORyxBZGRSZWYpIChUSElTKSAgUFVSRTsKKyAgICBTVERNRVRIT0RfKFVMT05HLFJlbGVhc2UpIChUSElTKSBQVVJFOworCisgICAgLy8gKioqIElPbGVXaW5kb3cgbWV0aG9kcyAqKioKKyAgICBTVERNRVRIT0QoR2V0V2luZG93KSAoVEhJU18gSFdORDMyICogbHBod25kKSBQVVJFOworICAgIFNURE1FVEhPRChDb250ZXh0U2Vuc2l0aXZlSGVscCkgKFRISVNfIEJPT0wzMiBmRW50ZXJNb2RlKSBQVVJFOworCisgICAgLy8gKioqIElTaGVsbEJyb3dzZXIgbWV0aG9kcyAqKiogKHNhbWUgYXMgSU9sZUluUGxhY2VGcmFtZSkKKyAgICBTVERNRVRIT0QoSW5zZXJ0TWVudXNTQikgKFRISVNfIEhNRU5VMzIgaG1lbnVTaGFyZWQsIExQT0xFTUVOVUdST1VQV0lEVEhTMzIgbHBNZW51V2lkdGhzKSBQVVJFOworICAgIFNURE1FVEhPRChTZXRNZW51U0IpIChUSElTXyBITUVOVTMyIGhtZW51U2hhcmVkLCBIT0xFTUVOVTMyIGhvbGVtZW51UmVzZXJ2ZWQsIEhXTkQzMiBod25kQWN0aXZlT2JqZWN0KSBQVVJFOworICAgIFNURE1FVEhPRChSZW1vdmVNZW51c1NCKSAoVEhJU18gSE1FTlUzMiBobWVudVNoYXJlZCkgUFVSRTsKKyAgICBTVERNRVRIT0QoU2V0U3RhdHVzVGV4dFNCKSAoVEhJU18gTFBDT0xFU1RSMzIgbHBzelN0YXR1c1RleHQpIFBVUkU7CisgICAgU1RETUVUSE9EKEVuYWJsZU1vZGVsZXNzU0IpIChUSElTXyBCT09MMzIgZkVuYWJsZSkgUFVSRTsKKyAgICBTVERNRVRIT0QoVHJhbnNsYXRlQWNjZWxlcmF0b3JTQikgKFRISVNfIExQTVNHMzIgbHBtc2csIFdPUkQgd0lEKSBQVVJFOworCisgICAgLy8gKioqIElTaGVsbEJyb3dzZXIgbWV0aG9kcyAqKioKKyAgICBTVERNRVRIT0QoQnJvd3NlT2JqZWN0KShUSElTXyBMUENJVEVNSURMSVNUIHBpZGwsIFVJTlQzMiB3RmxhZ3MpIFBVUkU7CisgICAgU1RETUVUSE9EKEdldFZpZXdTdGF0ZVN0cmVhbSkoVEhJU18gRFdPUkQgZ3JmTW9kZSwgTFBTVFJFQU0zMiAgKnBwU3RybSkgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0Q29udHJvbFdpbmRvdykoVEhJU18gVUlOVDMyIGlkLCBIV05EMzIgKiBscGh3bmQpIFBVUkU7CisgICAgU1RETUVUSE9EKFNlbmRDb250cm9sTXNnKShUSElTXyBVSU5UMzIgaWQsIFVJTlQzMiB1TXNnLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0sIExSRVNVTFQgKiBwcmV0KSBQVVJFOworICAgIFNURE1FVEhPRChRdWVyeUFjdGl2ZVNoZWxsVmlldykoVEhJU18gSVNoZWxsVmlldyAqKiBwcHNodikgUFVSRTsKKyAgICBTVERNRVRIT0QoT25WaWV3V2luZG93QWN0aXZlKShUSElTXyBJU2hlbGxWaWV3ICogcHBzaHYpIFBVUkU7CisgICAgU1RETUVUSE9EKFNldFRvb2xiYXJJdGVtcykoVEhJU18gTFBUQkJVVFRPTiBscEJ1dHRvbnMsIFVJTlQzMiBuQnV0dG9ucywgVUlOVDMyIHVGbGFncykgUFVSRTsKK30gKkxQU0hFTExCUk9XU0VSX1ZUQUJMRSxJU2hlbGxCcm93c2VyX1ZUYWJsZTs7CisKK3N0cnVjdCB0YWdTSEVMTEJST1dTRVIgCit7IExQU0hFTExCUk9XU0VSX1ZUQUJMRQlscHZ0Ymw7CisgIERXT1JECXJlZjsKK307CisKKyN1bmRlZiBUSElTCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSVNoZWxsVmlldyBJbnRlZmFjZQorKi8KKyNkZWZpbmUgVEhJUyBMUFNIRUxMVklFVyB0aGlzCisKKy8qIHNoZWxsdmlldyBzZWxlY3QgaXRlbSBmbGFncyovCisjZGVmaW5lIFNWU0lfREVTRUxFQ1QgICAweDAwMDAKKyNkZWZpbmUgU1ZTSV9TRUxFQ1QgICAgIDB4MDAwMQorI2RlZmluZSBTVlNJX0VESVQgICAgICAgMHgwMDAzICAvLyBpbmNsdWRlcyBzZWxlY3QKKyNkZWZpbmUgU1ZTSV9ERVNFTEVDVE9USEVSUyAweDAwMDQKKyNkZWZpbmUgU1ZTSV9FTlNVUkVWSVNJQkxFICAweDAwMDgKKyNkZWZpbmUgU1ZTSV9GT0NVU0VEICAgICAgICAweDAwMTAKKworLyogc2hlbGx2aWV3IGdldCBpdGVtIG9iamVjdCBmbGFncyAqLworI2RlZmluZSBTVkdJT19CQUNLR1JPVU5EICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgU1ZHSU9fU0VMRUNUSU9OICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFNWR0lPX0FMTFZJRVcgICAgICAgMHgwMDAwMDAwMgorCisvKiB1U3RhdGUgdmFsdWVzIGZvciBJU2hlbGxWaWV3OjpVSUFjdGl2YXRlICovCit0eXBlZGVmIGVudW0gCit7IFNWVUlBX0RFQUNUSVZBVEUgICAgICAgPSAwLAorICBTVlVJQV9BQ1RJVkFURV9OT0ZPQ1VTID0gMSwKKyAgU1ZVSUFfQUNUSVZBVEVfRk9DVVMgICA9IDIsCisgIFNWVUlBX0lOUExBQ0VBQ1RJVkFURSAgPSAzICAgICAgICAgIC8vIG5ldyBmbGFnIGZvciBJU2hlbGxWaWV3MgorfSBTVlVJQV9TVEFUVVM7CisKKworCit0eXBlZGVmIHN0cnVjdCBJU2hlbGxWaWV3X1ZUYWJsZQoreyAgIC8vICoqKiBJVW5rbm93biBtZXRob2RzICoqKgorICAgIFNURE1FVEhPRChRdWVyeUludGVyZmFjZSkgKFRISVNfIFJFRklJRCByaWlkLCBMUFZPSUQgKiBwcHZPYmopIFBVUkU7CisgICAgU1RETUVUSE9EXyhVTE9ORyxBZGRSZWYpIChUSElTKSAgUFVSRTsKKyAgICBTVERNRVRIT0RfKFVMT05HLFJlbGVhc2UpIChUSElTKSBQVVJFOworCisgICAgLy8gKioqIElPbGVXaW5kb3cgbWV0aG9kcyAqKioKKyAgICBTVERNRVRIT0QoR2V0V2luZG93KSAoVEhJU18gSFdORDMyICogbHBod25kKSBQVVJFOworICAgIFNURE1FVEhPRChDb250ZXh0U2Vuc2l0aXZlSGVscCkgKFRISVNfIEJPT0wzMiBmRW50ZXJNb2RlKSBQVVJFOworCisgICAgLy8gKioqIElTaGVsbFZpZXcgbWV0aG9kcyAqKioKKyAgICBTVERNRVRIT0QoVHJhbnNsYXRlQWNjZWxlcmF0b3IpIChUSElTXyBMUE1TRzMyIGxwbXNnKSBQVVJFOworICAgIFNURE1FVEhPRChFbmFibGVNb2RlbGVzcykgKFRISVNfIEJPT0wzMiBmRW5hYmxlKSBQVVJFOworICAgIFNURE1FVEhPRChVSUFjdGl2YXRlKSAoVEhJU18gVUlOVDMyIHVTdGF0ZSkgUFVSRTsKKyAgICBTVERNRVRIT0QoUmVmcmVzaCkgKFRISVMpIFBVUkU7CisgICAgU1RETUVUSE9EKENyZWF0ZVZpZXdXaW5kb3cpKFRISVNfIElTaGVsbFZpZXcgKmxwUHJldlZpZXcsTFBDRk9MREVSU0VUVElOR1MgbHBmcywgSVNoZWxsQnJvd3NlciAqIHBzYixSRUNUMzIgKiBwcmNWaWV3LCBIV05EMzIgICpwaFduZCkgUFVSRTsKKyAgICBTVERNRVRIT0QoRGVzdHJveVZpZXdXaW5kb3cpKFRISVMpIFBVUkU7CisgICAgU1RETUVUSE9EKEdldEN1cnJlbnRJbmZvKShUSElTXyBMUEZPTERFUlNFVFRJTkdTIGxwZnMpIFBVUkU7CisgICAgU1RETUVUSE9EKEFkZFByb3BlcnR5U2hlZXRQYWdlcykoVEhJU18gRFdPUkQgZHdSZXNlcnZlZCxMUEZOQUREUFJPUFNIRUVUUEFHRSBscGZuLCBMUEFSQU0gbHBhcmFtKSBQVVJFOworICAgIFNURE1FVEhPRChTYXZlVmlld1N0YXRlKShUSElTKSBQVVJFOworICAgIFNURE1FVEhPRChTZWxlY3RJdGVtKShUSElTXyBMUENJVEVNSURMSVNUIHBpZGxJdGVtLCBVSU5UMzIgdUZsYWdzKSBQVVJFOworICAgIFNURE1FVEhPRChHZXRJdGVtT2JqZWN0KShUSElTXyBVSU5UMzIgdUl0ZW0sIFJFRklJRCByaWlkLExQVk9JRCAqcHB2KSBQVVJFOworfSBJU2hlbGxWaWV3X1ZUYWJsZSwqTFBTSEVMTFZJRVdfVlRBQkxFOzsKKworc3RydWN0IHRhZ1NIRUxMVklFVyAKK3sgTFBTSEVMTFZJRVdfVlRBQkxFIGxwdnRibDsKKyAgRFdPUkQJCQkgICAgIHJlZjsKKyAgTFBJVEVNSURMSVNUICAgICAgIG1waWRsOworICBMUFNIRUxMRk9MREVSICAgICAgcFNGUGFyZW50OworICBMUFNIRUxMQlJPV1NFUiAgICAgcFNoZWxsQnJvd3NlcjsKKyAgSFdORDMyICAgICAgICAgICAgIGhXbmQ7CisgIEZPTERFUlNFVFRJTkdTICAgICBGb2xkZXJTZXR0aW5nczsKKyAgSFdORDMyICAgICAgICAgICAgIGhXbmRQYXJlbnQ7Cit9OworCit0eXBlZGVmIEdVSUQgU0hFTExWSUVXSUQ7CisjZGVmaW5lIFNWX0NMQVNTX05BTUUgICAoIlNoZWxsVmlld0NsYXNzIikKKworI3VuZGVmIFRISVMKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIElTaGVsbExpbmsgaW50ZXJmYWNlCiAgKi8KQEAgLTM4OSw4ICs0OTksMTAgQEAKICN1bmRlZiBUSElTCiAKICNpZmRlZiBfX1dJTkVfXworCiBleHRlcm4gTFBDTEFTU0ZBQ1RPUlkgSUNsYXNzRmFjdG9yeV9Db25zdHJ1Y3RvcigpOwogZXh0ZXJuIExQU0hFTExGT0xERVIgSVNoZWxsRm9sZGVyX0NvbnN0cnVjdG9yKExQU0hFTExGT0xERVIsTFBJVEVNSURMSVNUKTsKK2V4dGVybiBMUFNIRUxMVklFVyBJU2hlbGxWaWV3X0NvbnN0cnVjdG9yKCk7CiBleHRlcm4gTFBTSEVMTExJTksgSVNoZWxsTGlua19Db25zdHJ1Y3RvcigpOwogZXh0ZXJuIExQRU5VTUlETElTVCBJRW51bUlETGlzdF9Db25zdHJ1Y3RvcihMUENTVFIsRFdPUkQsSFJFU1VMVCopOwogI2VuZGlmCkBAIC00NTIsOCArNTY0LDYgQEAKICNkZWZpbmUgQkZGTV9TRVRTRUxFQ1RJT05XICAgICAgKFdNX1VTRVIrMTAzKQogI2RlZmluZSBCRkZNX1NFVFNUQVRVU1RFWFRXICAgICAoV01fVVNFUisxMDQpCiAKLQotCiAvKgogI2lmZGVmIFVOSUNPREUKICNkZWZpbmUgU0hCcm93c2VGb3JGb2xkZXIgICBTSEJyb3dzZUZvckZvbGRlclcKQEAgLTQ3MCwxMCArNTgwLDMwIEBACiAjZW5kaWYgCiAqLwogCitMUElURU1JRExJU1QgV0lOQVBJIFNIQnJvd3NlRm9yRm9sZGVyMzJBKExQQlJPV1NFSU5GTzMyQSBscGJpKTsKKy8qTFBJVEVNSURMSVNUIFdJTkFQSSBTSEJyb3dzZUZvckZvbGRlcjMyVyhMUEJST1dTRUlORk8zMlcgbHBiaSk7Ki8KKyNkZWZpbmUgIFNIQnJvd3NlRm9yRm9sZGVyIFdJTkVMSUJfTkFNRV9BVyhTSEJyb3dzZUZvckZvbGRlcikKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIHNobHZpZXcgc3RydWN0dXJlcwogICovCi10eXBlZGVmIEhSRVNVTFQoQ0FMTEJBQ0sgKlNIRUxMVklFV1BST0MpKERXT1JEIGR3VXNlclBhcmFtLExQU0hFTExGT0xERVIgcHNmLEhXTkQzMiBod25kLFVJTlQzMiB1TXNnLFVJTlQzMiB3UGFyYW0sTFBBUkFNIGxQYXJhbSk7CisvKgorKiBJU2hlbGxGb2xkZXJWaWV3Q2FsbGJhY2sgQ2FsbGJhY2sKKyogIFRoaXMgImNhbGxiYWNrIiBpcyBjYWxsZWQgYnkgdGhlIHNoZWxscyBkZWZhdWx0IElTaGVsbFZpZXcgaW1wbGVtZW50YXRpb24gKHRoYXQKKyogIHdlIGdvdCB1c2luZyBTSENyZWF0ZVNoZWxsVmlld0V4KCkpLCB0byBub3RpZnkgdXMgb2YgdGhlIHZhcmlvdXMgdGhpbmdzIHRoYXQKKyogIGFyZSBoYXBwZW5pbmcgdG8gdGhlIHNoZWxsdmlldyAoYW5kIGFzayBmb3IgdGhpbmdzIHRvbykuCisqCisqICBZb3UgZG9uJ3QgaGF2ZSB0byBzdXBwb3J0IGFueXRoaW5nIGhlcmUgLSBhbnl0aGluZyB5b3UgZG9uJ3Qgd2FudCB0byAKKyogIGhhbmRsZSwgdGhlIHNoZWxsIHdpbGwgZG8gaXRzZWxmIGlmIHlvdSBqdXN0IHJldHVybiBFX05PVElNUEwuIFRoaXMgcGFyYW1ldGVycworKiAgdGhhdCB0aGUgc2hlbGwgcGFzc2VzIHRvIHRoaXMgZnVuY3Rpb24gYXJlIGVudGlyZWx5IHVuZG9jdW1lbnRlZC4KKyoKKyogIEhPV0VWRVIsIGFzIHRoZSBjYWJ2aWV3IHNhbXBsZSBhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gdXNlZCB0aGlzIGNhbGxiYWNrLCB0aGUKKyogIHdyaXRlcnMgaW1wbGVtZW50ZWQgdGhlIGNhbGxiYWNrIG1lY2hhbmlzbSBvbiB0b3Agb2YgdGhlaXIgb3duIElTaGVsbFZpZXcuCisqICBMb29rIHRoZXJlIGZvciBzb21lIGNsdWVzIG9uIHdoYXQgdG8gZG8gaGVyZS4KKyovCisKK3R5cGVkZWYgSFJFU1VMVChDQUxMQkFDSyAqU0hFTExWSUVXUFJPQykoRFdPUkQgZHdVc2VyUGFyYW0sTFBTSEVMTEZPTERFUiBwc2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgSFdORDMyIGh3bmQsVUlOVDMyIHVNc2csVUlOVDMyIHdQYXJhbSxMUEFSQU0gbFBhcmFtKTsKIAogLyogTkYgdmFsaWQgdmFsdWVzIGZvciB0aGUgInZpZXdtb2RlIiBpdGVtIG9mIHRoZSBTSEVMTFRFTVBMQVRFKi8KICNkZWZpbmUgTkZfSU5IRVJJVFZJRVcgICAgMHgwMDAwCkBAIC00ODksMjIgKzYxOSw2IEBACiAgIERXT1JEICAgICAgICAgICB2aWV3bW9kZTsgIC8vIE5GXyogZW51bQogfSBTSEVMTFZJRVdEQVRBLCAqIExQU0hFTExWSUVXREFUQTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGZ1bmN0aW9ucwotICovCi0KLURXT1JEICBXSU5BUEkgSUxHZXRTaXplKExQSVRFTUlETElTVCBpaWwpOwotRFdPUkQgIFdJTkFQSSBTSEFkZFRvUmVjZW50RG9jcyhVSU5UMzIgdUZsYWdzLCBMUENWT0lEIHB2KTsKLUxQVk9JRCBXSU5BUEkgU0hBbGxvYyhEV09SRCBsZW4pOwotTFBJVEVNSURMSVNUIFdJTkFQSSBTSEJyb3dzZUZvckZvbGRlcjMyQShMUEJST1dTRUlORk8zMkEgbHBiaSk7Ci0vKkxQSVRFTUlETElTVCBXSU5BUEkgU0hCcm93c2VGb3JGb2xkZXIzMlcoTFBCUk9XU0VJTkZPMzJXIGxwYmkpOyovCi1EV09SRCAgV0lOQVBJIFNIQ2hhbmdlTm90aWZ5UmVnaXN0ZXIoSFdORDMyIGh3bmQsTE9ORyBldmVudHMxLExPTkcgZXZlbnRzMixEV09SRCBtc2csaW50IGNvdW50LElEU1RSVUNUICppZGxpc3QpOwotRFdPUkQgIFdJTkFQSSBTSEVMTDMyX0RsbEdldENsYXNzT2JqZWN0KExQQ0xTSUQsUkVGSUlELExQVk9JRCopOwotRFdPUkQgIFdJTkFQSSBTSEZpbGVPcGVyYXRpb24zMihMUFNIRklMRU9QU1RSVUNUMzIgbHBGaWxlT3ApOwotTFBTVFIgIFdJTkFQSSBQYXRoQWRkQmFja3NsYXNoKExQU1RSIHBhdGgpOwkKLUxQU1RSICBXSU5BUEkgUGF0aFJlbW92ZUJsYW5rcyhMUFNUUiBzdHIpOwotCi0KICN1bmRlZiBQVVJFCiAjdW5kZWYgRkFSCiAjdW5kZWYgVEhJUwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zdGFja2ZyYW1lLmggYi9pbmNsdWRlL3N0YWNrZnJhbWUuaAppbmRleCA3YTAxOTZhLi4yNGNhZDk4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3N0YWNrZnJhbWUuaAorKysgYi9pbmNsdWRlL3N0YWNrZnJhbWUuaApAQCAtMTgsMTMgKzE4LDEzIEBACiB0eXBlZGVmIHN0cnVjdCBfU1RBQ0szMkZSQU1FCiB7CiAgICAgU0VHUFRSICBmcmFtZTE2OyAgICAgICAgLyogMDAgMTYtYml0IGZyYW1lIGZyb20gbGFzdCBDYWxsRnJvbTE2KCkgKi8KLSAgICBEV09SRCAgIGVkaTsgICAgICAgICAgICAvKiAwNCBzYXZlZCByZWdpc3RlcnMgKi8KLSAgICBEV09SRCAgIGVzaTsgICAgICAgICAgICAvKiAwOCAqLwotICAgIERXT1JEICAgZWR4OyAgICAgICAgICAgIC8qIDBjICovCi0gICAgRFdPUkQgICBlY3g7ICAgICAgICAgICAgLyogMTAgKi8KLSAgICBEV09SRCAgIGVieDsgICAgICAgICAgICAvKiAxNCAqLwotICAgIERXT1JEICAgcmVzdG9yZV9hZGRyOyAgIC8qIDE4IHJldHVybiBhZGRyZXNzIGZvciByZXN0b3JpbmcgY29kZSBzZWxlY3RvciAqLwotICAgIERXT1JEICAgY29kZXNlbGVjdG9yOyAgIC8qIDFjIGNvZGUgc2VsZWN0b3IgdG8gcmVzdG9yZSAqLworICAgIERXT1JEICAgcmVzdG9yZV9hZGRyOyAgIC8qIDA0IHJldHVybiBhZGRyZXNzIGZvciByZXN0b3JpbmcgY29kZSBzZWxlY3RvciAqLworICAgIERXT1JEICAgY29kZXNlbGVjdG9yOyAgIC8qIDA4IGNvZGUgc2VsZWN0b3IgdG8gcmVzdG9yZSAqLworICAgIERXT1JEICAgZWRpOyAgICAgICAgICAgIC8qIDBjIHNhdmVkIHJlZ2lzdGVycyAqLworICAgIERXT1JEICAgZXNpOyAgICAgICAgICAgIC8qIDEwICovCisgICAgRFdPUkQgICBlZHg7ICAgICAgICAgICAgLyogMTQgKi8KKyAgICBEV09SRCAgIGVjeDsgICAgICAgICAgICAvKiAxOCAqLworICAgIERXT1JEICAgZWJ4OyAgICAgICAgICAgIC8qIDFjICovCiAgICAgRFdPUkQgICBlYnA7ICAgICAgICAgICAgLyogMjAgc2F2ZWQgMzItYml0IGZyYW1lIHBvaW50ZXIgKi8KICAgICBEV09SRCAgIHJldGFkZHI7ICAgICAgICAvKiAyNCBhY3R1YWwgcmV0dXJuIGFkZHJlc3MgKi8KICAgICBEV09SRCAgIGFyZ3NbMV07ICAgICAgICAvKiAyOCBhcmd1bWVudHMgdG8gMTYtYml0IGZ1bmN0aW9uICovCkBAIC0zNSwxNCArMzUsMTYgQEAKIHsKICAgICBTVEFDSzMyRlJBTUUgKmZyYW1lMzI7ICAgICAgICAvKiAwMCAzMi1iaXQgZnJhbWUgZnJvbSBsYXN0IENhbGxUbzE2KCkgKi8KICAgICBEV09SRCAgICAgICAgIGVicDsgICAgICAgICAgICAvKiAwNCBmdWxsIDMyLWJpdCBjb250ZW50IG9mIGVicCAqLwotICAgIFdPUkQgICAgICAgICAgZW50cnlfaXA7ICAgICAgIC8qIDA4IGlwIG9mIGVudHJ5IHBvaW50ICovCi0gICAgV09SRCAgICAgICAgICBkczsgICAgICAgICAgICAgLyogMGEgZHMgKi8KLSAgICBXT1JEICAgICAgICAgIGVudHJ5X2NzOyAgICAgICAvKiAwYyBjcyBvZiBlbnRyeSBwb2ludCAqLwotICAgIFdPUkQgICAgICAgICAgZXM7ICAgICAgICAgICAgIC8qIDBlIGVzICovCi0gICAgRFdPUkQgICAgICAgICBlbnRyeV9wb2ludDsgICAgLyogMTAgMzItYml0IGVudHJ5IHBvaW50IHRvIGNhbGwgKi8KLSAgICBXT1JEICAgICAgICAgIGJwOyAgICAgICAgICAgICAvKiAxNCAxNi1iaXQgYnAgKi8KLSAgICBXT1JEICAgICAgICAgIGlwOyAgICAgICAgICAgICAvKiAxNiByZXR1cm4gYWRkcmVzcyAqLwotICAgIFdPUkQgICAgICAgICAgY3M7ICAgICAgICAgICAgIC8qIDE4ICovCisgICAgV09SRCAgICAgICAgICBtdXRleF9jb3VudDsgICAgLyogMDggV2luMTZNdXRleCByZWN1cnNpb24gY291bnQgKi8KKyAgICBXT1JEICAgICAgICAgIGZzOyAgICAgICAgICAgICAvKiAwYSBmcyAqLworICAgIFdPUkQgICAgICAgICAgZW50cnlfaXA7ICAgICAgIC8qIDBjIGlwIG9mIGVudHJ5IHBvaW50ICovCisgICAgV09SRCAgICAgICAgICBkczsgICAgICAgICAgICAgLyogMGUgZHMgKi8KKyAgICBXT1JEICAgICAgICAgIGVudHJ5X2NzOyAgICAgICAvKiAxMCBjcyBvZiBlbnRyeSBwb2ludCAqLworICAgIFdPUkQgICAgICAgICAgZXM7ICAgICAgICAgICAgIC8qIDEyIGVzICovCisgICAgRFdPUkQgICAgICAgICBlbnRyeV9wb2ludDsgICAgLyogMTQgMzItYml0IGVudHJ5IHBvaW50IHRvIGNhbGwgKi8KKyAgICBXT1JEICAgICAgICAgIGJwOyAgICAgICAgICAgICAvKiAxOCAxNi1iaXQgYnAgKi8KKyAgICBXT1JEICAgICAgICAgIGlwOyAgICAgICAgICAgICAvKiAxYSByZXR1cm4gYWRkcmVzcyAqLworICAgIFdPUkQgICAgICAgICAgY3M7ICAgICAgICAgICAgIC8qIDFjICovCiB9IFNUQUNLMTZGUkFNRTsKIAogI3ByYWdtYSBwYWNrKDQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N0YXR1cy5oIGIvaW5jbHVkZS9zdGF0dXMuaAppbmRleCA3YmYyYjRjLi40NTMyM2Y0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3N0YXR1cy5oCisrKyBiL2luY2x1ZGUvc3RhdHVzLmgKQEAgLTI0LDYgKzI0LDcgQEAKICAgICBVSU5UMTYgICAgICAgICAgICAgIHRleHRIZWlnaHQ7CiAgICAgVUlOVDMyICAgICAgICAgICAgICBoZWlnaHQ7CiAgICAgQk9PTDMyICAgICAgICAgICAgICBzaW1wbGU7CisgICAgSFdORDMyICAgICAgICAgICAgICBod25kVG9vbFRpcDsKICAgICBIRk9OVDMyICAgICAgICAgICAgIGhGb250OwogICAgIEhGT05UMzIgICAgICAgICAgICAgaERlZmF1bHRGb250OwogICAgIENPTE9SUkVGICAgICAgICAgICAgY2xyQms7ICAvKiBiYWNrZ3JvdW5kIGNvbG9yICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N5c2xldmVsLmggYi9pbmNsdWRlL3N5c2xldmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhYzg0NgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc3lzbGV2ZWwuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogV2luMzIgJ3N5c2xldmVsJyByb3V0aW5lcworICoKKyAqIENvcHlyaWdodCAxOTk4IFVscmljaCBXZWlnYW5kCisgKi8KKworI2lmbmRlZiBfX1dJTkVfU1lTTEVWRUxfSAorI2RlZmluZSBfX1dJTkVfU1lTTEVWRUxfSAorCisjaW5jbHVkZSAid2ludHlwZXMuaCIKKyNpbmNsdWRlICJ3aW5iYXNlLmgiCisKK3ZvaWQgU1lTTEVWRUxfSW5pdCh2b2lkKTsKK1ZPSUQgU1lTTEVWRUxfRW50ZXJXaW4xNkxvY2soVk9JRCk7CitWT0lEIFNZU0xFVkVMX0xlYXZlV2luMTZMb2NrKFZPSUQpOworVk9JRCBTWVNMRVZFTF9SZWxlYXNlV2luMTZMb2NrKFZPSUQpOworVk9JRCBTWVNMRVZFTF9SZXN0b3JlV2luMTZMb2NrKFZPSUQpOworCitWT0lEIFdJTkFQSSBHZXRwV2luMTZMb2NrMzIoQ1JJVElDQUxfU0VDVElPTiAqKmxvY2spOworU0VHUFRSIFdJTkFQSSBHZXRwV2luMTZMb2NrMTYodm9pZCk7CisKK1ZPSUQgV0lOQVBJIF9FbnRlclN5c0xldmVsKENSSVRJQ0FMX1NFQ1RJT04gKmxvY2spOworVk9JRCBXSU5BUEkgX0xlYXZlU3lzTGV2ZWwoQ1JJVElDQUxfU0VDVElPTiAqbG9jayk7CisKK1ZPSUQgV0lOQVBJIFJlbGVhc2VUaHVua0xvY2soRFdPUkQgKm11dGV4X2NvdW50KTsKK1ZPSUQgV0lOQVBJIFJlc3RvcmVUaHVua0xvY2soRFdPUkQgbXV0ZXhfY291bnQpOworCisjZW5kaWYgIC8qIF9fV0lORV9TWVNMRVZFTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RocmVhZC5oIGIvaW5jbHVkZS90aHJlYWQuaAppbmRleCA4ZDgxZmQyLi5lMDMzYjI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3RocmVhZC5oCisrKyBiL2luY2x1ZGUvdGhyZWFkLmgKQEAgLTksNiArOSw3IEBACiAKICNpbmNsdWRlICJrMzJvYmouaCIKICNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAid2luYmFzZS5oIgogI2luY2x1ZGUgIndpbm50LmgiCiAjaW5jbHVkZSAic2VsZWN0b3JzLmgiICAvKiBmb3IgU0VUX0ZTICovCiAKQEAgLTQxLDYgKzQyLDcgQEAKICAgICBEV09SRCAgICAgICAgIGNvdW50OyAgICAgLyogQ291bnQgb2YgdmFsaWQgb2JqZWN0cyAqLwogICAgIERXT1JEICAgICAgICAgc2lnbmFsZWQ7ICAvKiBJbmRleCBvZiBzaWduYWxlZCBvYmplY3QgKG9yIFdBSVRfRkFJTEVEKSovCiAgICAgQk9PTDMyICAgICAgICB3YWl0X2FsbDsgIC8qIFdhaXQgZm9yIGFsbCBvYmplY3RzIGZsYWcgKi8KKyAgICBCT09MMzIgICAgICAgIHdhaXRfbXNnOyAgLyogV2FpdCBmb3IgbWVzc2FnZSBmbGFnICovCiAgICAgSzMyT0JKICAgICAgICpvYmpzW01BWElNVU1fV0FJVF9PQkpFQ1RTXTsgIC8qIE9iamVjdCBwb2ludGVycyAqLwogfSBXQUlUX1NUUlVDVDsKIApAQCAtNzAsNyArNzIsNyBAQAogICAgIERXT1JEICAgICAgICAgIGN1cl9zdGFjazsgICAgICAvKiAgODAgQ3VycmVudCBzdGFjayAod2FzOiB1bmtub3duKSAqLwogICAgIERXT1JEICAgICAgICAgIHVua25vd24zWzJdOyAgICAvKiAgODQgVW5rbm93biAqLwogICAgIFdPUkQgICAgICAgICAgIGN1cnJlbnRfc3M7ICAgICAvKiAgOGMgQW5vdGhlciAxNi1iaXQgc3RhY2sgc2VsZWN0b3IgKi8KLSAgICBXT1JEICAgICAgICAgICBzYXZlZF9mczsgICAgICAgLyogIDhlIFNhdmVkIDE2LWJpdCBGUyAod2FzOiBwYWQyKSAqLworICAgIFdPUkQgICAgICAgICAgIHBhZDI7ICAgICAgICAgICAvKiAgOGUgKi8KICAgICB2b2lkICAgICAgICAgICpzc190YWJsZTsgICAgICAgLyogIDkwIFBvaW50ZXIgdG8gaW5mbyBhYm91dCAxNi1iaXQgc3RhY2sgKi8KICAgICBXT1JEICAgICAgICAgICB0aHVua19zczsgICAgICAgLyogIDk0IFlldCBhbm90aGVyIDE2LWJpdCBzdGFjayBzZWxlY3RvciAqLwogICAgIFdPUkQgICAgICAgICAgIHBhZDM7ICAgICAgICAgICAvKiAgOTYgKi8KQEAgLTgyLDEyICs4NCwxMCBAQAogICAgIHZvaWQgICAgICAgICAgKmVudHJ5X3BvaW50OyAgICAvKiAxYzAgVGhyZWFkIGVudHJ5IHBvaW50ICh3YXM6IHVua25vd24pICovCiAgICAgdm9pZCAgICAgICAgICAqZW50cnlfYXJnOyAgICAgIC8qIDFjNCBFbnRyeSBwb2ludCBhcmcgKHdhczogdW5rbm93bikgKi8KICAgICBpbnQgICAgICAgICAgICB1bml4X3BpZDsgICAgICAgLyogMWM4IFVuaXggdGhyZWFkIHBpZCAod2FzOiB1bmtub3duKSAqLwotICAgIERXT1JEICAgICAgICAgIHVua25vd241WzZdOyAgICAvKiAxY2MgVW5rbm93biAqLwotICAgIEszMk9CSiAgICAgICAgKmNyaXRfc2VjdGlvbjsgICAvKiAxZTQgU29tZSBjcml0aWNhbCBzZWN0aW9uICovCi0gICAgSzMyT0JKICAgICAgICAqd2luMTZfbXV0ZXg7ICAgIC8qIDFlOCBQb2ludGVyIHRvIFdpbjE2IG11dGV4ICovCi0gICAgSzMyT0JKICAgICAgICAqd2luMzJfbXV0ZXg7ICAgIC8qIDFlYyBQb2ludGVyIHRvIEtFUk5FTDMyIG11dGV4ICovCi0gICAgSzMyT0JKICAgICAgICAqY3JpdF9zZWN0aW9uMjsgIC8qIDFmMCBBbm90aGVyIGNyaXRpY2FsIHNlY3Rpb24gKi8KLSAgICBLMzJPQkogICAgICAgICptdXRleF9saXN0OyAgICAgLyogMWY0IExpc3Qgb2Ygb3duZWQgbXV0ZXggKHdhczogdW5rbm93bikqLworICAgIEszMk9CSiAgICAgICAgKm11dGV4X2xpc3Q7ICAgICAvKiAxY2MgTGlzdCBvZiBvd25lZCBtdXRleCAod2FzOiB1bmtub3duKSovCisgICAgRFdPUkQgICAgICAgICAgdW5rbm93bjVbMl07ICAgIC8qIDFkMCBVbmtub3duICovCisgICAgRFdPUkQgICAgICAgICAgc3lzX2NvdW50WzRdOyAgIC8qIDFkOCBTeXNsZXZlbCBtdXRleCBlbnRyeSBjb3VudGVycyAqLworICAgIENSSVRJQ0FMX1NFQ1RJT04gKnN5c19tdXRleFs0XTsvKiAxZTggU3lzbGV2ZWwgbXV0ZXggcG9pbnRlcnMgKi8KICAgICBEV09SRCAgICAgICAgICB1bmtub3duNlsyXTsgICAgLyogMWY4IFVua25vd24gKi8KICAgICAvKiBUaGUgZm9sbG93aW5nIGFyZSBXaW5lLXNwZWNpZmljIGZpZWxkcyAqLwogICAgIENPTlRFWFQgICAgICAgIGNvbnRleHQ7ICAgICAgICAvKiAyMDAgVGhyZWFkIGNvbnRleHQgKi8KQEAgLTEyNSw5ICsxMjUsMTEgQEAKIC8qIHNjaGVkdWxlci90aHJlYWQuYyAqLwogZXh0ZXJuIFRIREIgKlRIUkVBRF9DcmVhdGUoIHN0cnVjdCBfUERCMzIgKnBkYiwgRFdPUkQgc3RhY2tfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgYWxsb2Nfc3RhY2sxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlcnZlcl90aGFuZGxlLCBpbnQgKnNlcnZlcl9waGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVEhSRUFEX1NUQVJUX1JPVVRJTkUgc3RhcnRfYWRkciwgTFBWT0lEIHBhcmFtICk7CiBleHRlcm4gVEhEQiAqVEhSRUFEX0N1cnJlbnQodm9pZCk7Ci1leHRlcm4gVEhEQiAqVEhSRUFEX0dldFB0ciggSEFORExFMzIgaGFuZGxlLCBEV09SRCBhY2Nlc3MgKTsKK2V4dGVybiB2b2lkIFRIUkVBRF9TdGFydCggVEhEQiAqdGhkYiApOworZXh0ZXJuIFRIREIgKlRIUkVBRF9HZXRQdHIoIEhBTkRMRTMyIGhhbmRsZSwgRFdPUkQgYWNjZXNzLCBpbnQgKnNlcnZlcl9oYW5kbGUgKTsKIGV4dGVybiB2b2lkIFRIUkVBRF9BZGRRdWV1ZSggVEhSRUFEX1FVRVVFICpxdWV1ZSwgVEhEQiAqdGhyZWFkICk7CiBleHRlcm4gdm9pZCBUSFJFQURfUmVtb3ZlUXVldWUoIFRIUkVBRF9RVUVVRSAqcXVldWUsIFRIREIgKnRocmVhZCApOwogZXh0ZXJuIERXT1JEIFRIUkVBRF9UbHNBbGxvYyggVEhEQiAqdGhyZWFkICk7CkBAIC0xNDIsNyArMTQ0LDEyIEBACiAvKiBzY2hlZHVsZXIvc3luY2hyby5jICovCiBleHRlcm4gdm9pZCBTWU5DX1dhaXRGb3JDb25kaXRpb24oIFdBSVRfU1RSVUNUICp3YWl0LCBEV09SRCB0aW1lb3V0ICk7CiBleHRlcm4gdm9pZCBTWU5DX1dha2VVcCggVEhSRUFEX1FVRVVFICpxdWV1ZSwgRFdPUkQgbWF4ICk7CitleHRlcm4gdm9pZCBTWU5DX01zZ1dha2VVcCggVEhEQiAqdGhkYiApOwogZXh0ZXJuIHZvaWQgU1lOQ19TZXR1cFNpZ25hbHModm9pZCk7CitleHRlcm4gRFdPUkQgU1lOQ19Eb1dhaXQoIERXT1JEIGNvdW50LCBjb25zdCBIQU5ETEUzMiAqaGFuZGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDMyIHdhaXRfYWxsLCBEV09SRCB0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgYWxlcnRhYmxlLCBCT09MMzIgd2FpdF9tc2cgKTsKKwogCiAvKiBzY2hlZHVsZXIvc3lzZGVwcy5jICovCiBleHRlcm4gaW50IFNZU0RFUFNfU3Bhd25UaHJlYWQoIFRIREIgKnRocmVhZCApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90b29sdGlwcy5oIGIvaW5jbHVkZS90b29sdGlwcy5oCmluZGV4IDk1ZTJhNmMuLmI0ODc1YzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdG9vbHRpcHMuaAorKysgYi9pbmNsdWRlL3Rvb2x0aXBzLmgKQEAgLTE4LDcgKzE4LDcgQEAKICAgICBMUFNUUiAgbHBzelRleHQ7CiAgICAgTFBBUkFNIGxQYXJhbTsKIAotCisgICAgV05EUFJPQzMyIGxwZm5PcmlnUHJvYzsKIH0gVFRUT09MX0lORk87IAogCiAKQEAgLTI2LDIxICsyNiwyMyBAQAogewogICAgIENIQVIgICAgICAgc3pUaXBUZXh0W0lORk9USVBTSVpFXTsKICAgICBCT09MMzIgICAgIGJBY3RpdmU7CisgICAgQk9PTDMyICAgICBiVHJhY2tBY3RpdmU7CiAgICAgVUlOVDMyICAgICB1TnVtVG9vbHM7CiAgICAgQ09MT1JSRUYgICBjbHJCazsKICAgICBDT0xPUlJFRiAgIGNsclRleHQ7CiAgICAgSEZPTlQzMiAgICBoRm9udDsKKyAgICBJTlQzMiAgICAgIHhUcmFja1BvczsKKyAgICBJTlQzMiAgICAgIHlUcmFja1BvczsKICAgICBJTlQzMiAgICAgIG5NYXhUaXBXaWR0aDsKICAgICBJTlQzMiAgICAgIG5Ub29sOwogICAgIElOVDMyICAgICAgbk9sZFRvb2w7CiAgICAgSU5UMzIgICAgICBuQ3VycmVudFRvb2w7Ci0KKyAgICBJTlQzMiAgICAgIG5UcmFja1Rvb2w7CiAgICAgSU5UMzIgICAgICBuQXV0b21hdGljVGltZTsKICAgICBJTlQzMiAgICAgIG5SZXNob3dUaW1lOwogICAgIElOVDMyICAgICAgbkF1dG9Qb3BUaW1lOwogICAgIElOVDMyICAgICAgbkluaXRpYWxUaW1lOwogICAgIFJFQ1QzMiAgICAgcmNNYXJnaW47Ci0KICAgICBUVFRPT0xfSU5GTyAqdG9vbHM7CiB9IFRPT0xUSVBTX0lORk87CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHdlYWsuaCBiL2luY2x1ZGUvdHdlYWsuaAppbmRleCAwMmFjODhhLi4zNDZmNmEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3R3ZWFrLmgKKysrIGIvaW5jbHVkZS90d2Vhay5oCkBAIC0xMywxNyArMTMsMTEgQEAKIAogaW50ICBUV0VBS19Jbml0KCk7CiBpbnQgIFRXRUFLX0NoZWNrQ29uZmlndXJhdGlvbigpOwotSU5UMzIgIFRXRUFLX1BhcnR5TWVzc2FnZUJveChMUENTVFIsIExQQ1NUUiwgRFdPUkQpOwogdm9pZCAgVFdFQUtfRHJhd1JlbGllZlJlY3Q5NShIREMzMiwgUkVDVDMyIGNvbnN0ICopOwogdm9pZCAgVFdFQUtfRHJhd1JldlJlbGllZlJlY3Q5NShIREMzMiwgUkVDVDMyIGNvbnN0ICopOwogdm9pZCAgVFdFQUtfRHJhd01lbnVTZXBhcmF0b3JIb3Jpejk1KEhEQzMyLCBVSU5UMzIsIFVJTlQzMiwgVUlOVDMyKTsKIHZvaWQgIFRXRUFLX0RyYXdNZW51U2VwYXJhdG9yVmVydDk1KEhEQzMyLCBVSU5UMzIsIFVJTlQzMiwgVUlOVDMyKTsKIGV4dGVybiBpbnQgIFRXRUFLX1dpbjk1TG9vazsKIGV4dGVybiBpbnQgIFRXRUFLX1dpbmVJbml0aWFsaXplZDsKLWV4dGVybiBIUEVOMzIgIFRXRUFLX1BlbkZGOTU7Ci1leHRlcm4gSFBFTjMyICBUV0VBS19QZW5FMDk1OwotZXh0ZXJuIEhQRU4zMiAgVFdFQUtfUGVuQzA5NTsKLWV4dGVybiBIUEVOMzIgIFRXRUFLX1BlbjgwOTU7Ci1leHRlcm4gSFBFTjMyICBUV0VBS19QZW4wMDk1OwogCiAjZW5kaWYgLyogX19XSU5FX1RXRUFLX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXNlci5oIGIvaW5jbHVkZS91c2VyLmgKaW5kZXggZDFmODkxYy4uMDBjZDlhZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91c2VyLmgKKysrIGIvaW5jbHVkZS91c2VyLmgKQEAgLTI5LDcgKzI5LDcgQEAKICNkZWZpbmUgVVNVRF9MT0NBTEhFQVAgICAgICAgICAweDAwMDQKICNkZWZpbmUgVVNVRF9GSVJTVENMQVNTICAgICAgICAweDAwMDUKIAotdm9pZCBVU0VSX1NpZ25hbFByb2MoSEFORExFMTYsIFVJTlQxNiwgVUlOVDE2LCBISU5TVEFOQ0UxNiwgSFFVRVVFMTYpOwordm9pZCBXSU5BUEkgVVNFUl9TaWduYWxQcm9jKEhBTkRMRTE2LCBVSU5UMTYsIFVJTlQxNiwgSElOU1RBTkNFMTYsIEhRVUVVRTE2KTsKIHZvaWQgVVNFUl9FeGl0V2luZG93cyh2b2lkKTsKIEhHTE9CQUwxNiBVU0VSX0NhbGxEZWZhdWx0UnNyY0hhbmRsZXIoIEhHTE9CQUwxNiBoTWVtT2JqLCBITU9EVUxFMTYgaE1vZHVsZSwKIAkJCQkgICAgICAgSFJTUkMxNiBoUnNyYyApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS92ZXIuaCBiL2luY2x1ZGUvdmVyLmgKaW5kZXggNWY1ZGQ5Ny4uOTM0MzNiOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS92ZXIuaAorKysgYi9pbmNsdWRlL3Zlci5oCkBAIC0xMDksNyArMTA5LDcgQEAKICNkZWZpbmUJVklGX09VVE9GTUVNT1JZCQkweDAwMDA4MDAwTAogI2RlZmluZQlWSUZfQ0FOTk9UUkVBRFNSQwkweDAwMDEwMDAwTAogI2RlZmluZQlWSUZfQ0FOTk9UUkVBRERTVAkweDAwMDIwMDAwTAotI2RlZmluZQlWSUZfQlVGVE9TTUFMTAkJMHgwMDA0MDAwMEwKKyNkZWZpbmUJVklGX0JVRkZUT09TTUFMTAkweDAwMDQwMDAwTAogCiB0eXBlZGVmIHN0cnVjdCB0YWdWU19GSVhFREZJTEVJTkZPIHsKIAlEV09SRCAgIGR3U2lnbmF0dXJlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS92ZXJzaW9uLmggYi9pbmNsdWRlL3ZlcnNpb24uaAppbmRleCAyZWVkYTg1Li4yMzExYzAxIDEwMDY0NAotLS0gYS9pbmNsdWRlL3ZlcnNpb24uaAorKysgYi9pbmNsdWRlL3ZlcnNpb24uaApAQCAtMSArMSBAQAotI2RlZmluZSBXSU5FX1JFTEVBU0VfSU5GTyAiV2luZSByZWxlYXNlIDk4MDcyNiIKKyNkZWZpbmUgV0lORV9SRUxFQVNFX0lORk8gIldpbmUgcmVsZWFzZSA5ODA4MDkiCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbmRvd3MuaCBiL2luY2x1ZGUvd2luZG93cy5oCmluZGV4IGE4YmVlOGEuLmE5NGM4MTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luZG93cy5oCisrKyBiL2luY2x1ZGUvd2luZG93cy5oCkBAIC01MjAzLDI1ICs1MjAzLDM4IEBACiAKIC8qIFByb2Nlc3Mgc3RhcnR1cCBpbmZvcm1hdGlvbi4KICAqLworCisvKiBTVEFSVFVQSU5GTy5kd0ZsYWdzICovCisjZGVmaW5lCVNUQVJURl9VU0VTSE9XV0lORE9XCTB4MDAwMDAwMDEKKyNkZWZpbmUJU1RBUlRGX1VTRVNJWkUJCTB4MDAwMDAwMDIKKyNkZWZpbmUJU1RBUlRGX1VTRVBPU0lUSU9OCTB4MDAwMDAwMDQKKyNkZWZpbmUJU1RBUlRGX1VTRUNPVU5UQ0hBUlMJMHgwMDAwMDAwOAorI2RlZmluZQlTVEFSVEZfVVNFRklMTEFUVFJJQlVURQkweDAwMDAwMDEwCisjZGVmaW5lCVNUQVJURl9SVU5GVUxMU0NSRUVOCTB4MDAwMDAwMjAKKyNkZWZpbmUJU1RBUlRGX0ZPUkNFT05GRUVEQkFDSwkweDAwMDAwMDQwCisjZGVmaW5lCVNUQVJURl9GT1JDRU9GRkZFRURCQUNLCTB4MDAwMDAwODAKKyNkZWZpbmUJU1RBUlRGX1VTRVNUREhBTkRMRVMJMHgwMDAwMDEwMAorI2RlZmluZQlTVEFSVEZfVVNFSE9US0VZCTB4MDAwMDAyMDAKKwogdHlwZWRlZiBzdHJ1Y3QgewotICAgICAgICBEV09SRCBjYjsKLSAgICAgICAgTFBTVFIgbHBSZXNlcnZlZDsKLSAgICAgICAgTFBTVFIgbHBEZXNrdG9wOwotICAgICAgICBMUFNUUiBscFRpdGxlOwotICAgICAgICBEV09SRCBkd1g7Ci0gICAgICAgIERXT1JEIGR3WTsKLSAgICAgICAgRFdPUkQgZHdYU2l6ZTsKLSAgICAgICAgRFdPUkQgZHdZU2l6ZTsKLSAgICAgICAgRFdPUkQgZHdYQ291bnRDaGFyczsKLSAgICAgICAgRFdPUkQgZHdZQ291bnRDaGFyczsKLSAgICAgICAgRFdPUkQgZHdGaWxsQXR0cmlidXRlOwotICAgICAgICBEV09SRCBkd0ZsYWdzOwotICAgICAgICBXT1JEIHdTaG93V2luZG93OwotICAgICAgICBXT1JEIGNiUmVzZXJ2ZWQyOwotICAgICAgICBCWVRFICpscFJlc2VydmVkMjsKLSAgICAgICAgSEFORExFMzIgaFN0ZElucHV0OwotICAgICAgICBIQU5ETEUzMiBoU3RkT3V0cHV0OwotICAgICAgICBIQU5ETEUzMiBoU3RkRXJyb3I7CisgICAgICAgIERXT1JEIGNiOwkJLyogMDA6IHNpemUgb2Ygc3RydWN0ICovCisgICAgICAgIExQU1RSIGxwUmVzZXJ2ZWQ7CS8qIDA0OiAqLworICAgICAgICBMUFNUUiBscERlc2t0b3A7CS8qIDA4OiAqLworICAgICAgICBMUFNUUiBscFRpdGxlOwkJLyogMGM6ICovCisgICAgICAgIERXT1JEIGR3WDsJCS8qIDEwOiAqLworICAgICAgICBEV09SRCBkd1k7CQkvKiAxNDogKi8KKyAgICAgICAgRFdPUkQgZHdYU2l6ZTsJCS8qIDE4OiAqLworICAgICAgICBEV09SRCBkd1lTaXplOwkJLyogMWM6ICovCisgICAgICAgIERXT1JEIGR3WENvdW50Q2hhcnM7CS8qIDIwOiAqLworICAgICAgICBEV09SRCBkd1lDb3VudENoYXJzOwkvKiAyNDogKi8KKyAgICAgICAgRFdPUkQgZHdGaWxsQXR0cmlidXRlOwkvKiAyODogKi8KKyAgICAgICAgRFdPUkQgZHdGbGFnczsJCS8qIDJjOiAqLworICAgICAgICBXT1JEIHdTaG93V2luZG93OwkvKiAzMDogKi8KKyAgICAgICAgV09SRCBjYlJlc2VydmVkMjsJLyogMzI6ICovCisgICAgICAgIEJZVEUgKmxwUmVzZXJ2ZWQyOwkvKiAzNDogKi8KKyAgICAgICAgSEFORExFMzIgaFN0ZElucHV0OwkvKiAzODogKi8KKyAgICAgICAgSEFORExFMzIgaFN0ZE91dHB1dDsJLyogM2M6ICovCisgICAgICAgIEhBTkRMRTMyIGhTdGRFcnJvcjsJLyogNDA6ICovCiB9IFNUQVJUVVBJTkZPMzJBLCAqTFBTVEFSVFVQSU5GTzMyQTsKIAogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtNTUwNCw2ICs1NTE3LDcgQEAKIERFQ0xfV0lORUxJQl9UWVBFX0FXKERFVk1PREUpCiBERUNMX1dJTkVMSUJfVFlQRV9BVyhMUERFVk1PREUpCiAKKwogI2RlZmluZSBETV9VUERBVEUJMQogI2RlZmluZSBETV9DT1BZCQkyCiAjZGVmaW5lIERNX1BST01QVAk0CkBAIC01NTE5LDcgKzU1MzMsOCBAQAogI2RlZmluZSBETV9QUklOVFFVQUxJVFkJCTB4MDAwMDA0MDBMCiAjZGVmaW5lIERNX0NPTE9SCQkweDAwMDAwODAwTAogI2RlZmluZSBETV9EVVBMRVgJCTB4MDAwMDEwMDBMCi0KKyNkZWZpbmUgRE1fWVJFU09MVVRJT04JCTB4MDAwMDIwMDBMCisjZGVmaW5lIERNX1RUT1BUSU9OCQkweDAwMDA0MDAwTAogI2RlZmluZSBETV9CSVRTUEVSUEVMICAgICAgICAgICAweDAwMDQwMDAwTAogI2RlZmluZSBETV9QRUxTV0lEVEggICAgICAgICAgICAweDAwMDgwMDAwTAogI2RlZmluZSBETV9QRUxTSEVJR0hUICAgICAgICAgICAweDAwMTAwMDAwTApAQCAtNTUzMSwxMyArNTU0NiwzNCBAQAogI2RlZmluZSBETU9SSUVOVF9QT1JUUkFJVAkxCiAjZGVmaW5lIERNT1JJRU5UX0xBTkRTQ0FQRQkyCiAKLSNkZWZpbmUgRE1QQVBFUl9MRVRURVIJMQotI2RlZmluZSBETVBBUEVSX0EzCTgKLSNkZWZpbmUgRE1QQVBFUl9BNAk5Ci0jZGVmaW5lIERNUEFQRVJfQTUJMTEKKyNkZWZpbmUgRE1QQVBFUl9MRVRURVIJCTEKKyNkZWZpbmUgRE1QQVBFUl9MRUdBTAkJNQorI2RlZmluZSBETVBBUEVSX0VYRUNVVElWRQk3CisjZGVmaW5lIERNUEFQRVJfQTMJCTgKKyNkZWZpbmUgRE1QQVBFUl9BNAkJOQorI2RlZmluZSBETVBBUEVSX0E1CQkxMQorI2RlZmluZSBETVBBUEVSX0VOVl8xMAkJMjAKKyNkZWZpbmUgRE1QQVBFUl9FTlZfREwJCTI3CisjZGVmaW5lIERNUEFQRVJfRU5WX0M1CQkyOAorI2RlZmluZSBETVBBUEVSX0VOVl9CNQkJMzQKKyNkZWZpbmUgRE1QQVBFUl9FTlZfTU9OQVJDSAkzNwogCi0jZGVmaW5lIERNQklOX1VQUEVSCTEKLSNkZWZpbmUgRE1CSU5fQVVUTwk3CisjZGVmaW5lIERNQklOX1VQUEVSCQkxCisjZGVmaW5lIERNQklOX0xPV0VSCQkyCisjZGVmaW5lIERNQklOX01JRERMRQkJMworI2RlZmluZSBETUJJTl9NQU5VQUwJCTQKKyNkZWZpbmUgRE1CSU5fRU5WRUxPUEUJCTUKKyNkZWZpbmUgRE1CSU5fRU5WTUFOVUFMCQk2CisjZGVmaW5lIERNQklOX0FVVE8JCTcKKyNkZWZpbmUgRE1CSU5fTEFSR0VDQVBBQ0lUWQkxMQorCisjZGVmaW5lIERNQ09MT1JfTU9OT0NIUk9NRQkxCisjZGVmaW5lIERNQ09MT1JfQ09MT1IJCTIKKworI2RlZmluZSBETVRUX0JJVE1BUAkJMQorI2RlZmluZSBETVRUX0RPV05MT0FECQkyCisjZGVmaW5lIERNVFRfU1VCREVWCQkzCisKIAogI2RlZmluZSBEQ19GSUVMRFMJCTEKICNkZWZpbmUgRENfUEFQRVJTCQkyCkBAIC01NTU4LDYgKzU1OTQsNyBAQAogI2RlZmluZSBEQ19PUklFTlRBVElPTgkJMTcKICNkZWZpbmUgRENfQ09QSUVTCQkxOAogCisKIHR5cGVkZWYgc3RydWN0IF9QUklOVEVSX0RFRkFVTFRTMzJBIHsKICAgICBMUFNUUiAgICAgICAgcERhdGF0eXBlOwogICAgIExQREVWTU9ERTMyQSBwRGV2TW9kZTsKQEAgLTY3MDUsNiArNjc0Miw3IEBACiAjZGVmaW5lICAgICBSZWdVbkxvYWRLZXkgV0lORUxJQl9OQU1FX0FXKFJlZ1VuTG9hZEtleSkKIEJPT0wzMiAgICAgIFdJTkFQSSBSZWxlYXNlU2VtYXBob3JlKEhBTkRMRTMyLExPTkcsTFBMT05HKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBSZXNldEV2ZW50KEhBTkRMRTMyKTsKK0RXT1JEICAgICAgIFdJTkFQSSBSZXN1bWVUaHJlYWQoSEFORExFMzIpOwogVk9JRCAgICAgICAgV0lOQVBJIFJ0bEZpbGxNZW1vcnkoTFBWT0lELFVJTlQzMixVSU5UMzIpOwogVk9JRCAgICAgICAgV0lOQVBJIFJ0bE1vdmVNZW1vcnkoTFBWT0lELExQQ1ZPSUQsVUlOVDMyKTsKIFZPSUQgICAgICAgIFdJTkFQSSBSdGxaZXJvTWVtb3J5KExQVk9JRCxVSU5UMzIpOwpAQCAtNjc1NCw2ICs2NzkyLDcgQEAKIEJPT0wzMiAgICAgIFdJTkFQSSBTdGFydFNlcnZpY2UzMkEoSEFORExFMzIsRFdPUkQsTFBDU1RSKik7CiBCT09MMzIgICAgICBXSU5BUEkgU3RhcnRTZXJ2aWNlMzJXKEhBTkRMRTMyLERXT1JELExQQ1dTVFIqKTsKICNkZWZpbmUgICAgIFN0YXJ0U2VydmljZSBXSU5FTElCX05BTUVfQVcoU3RhcnRTZXJ2aWNlKQorRFdPUkQgICAgICAgV0lOQVBJIFN1c3BlbmRUaHJlYWQoSEFORExFMzIpOwogQk9PTDMyICAgICAgV0lOQVBJIFN5c3RlbVRpbWVUb0ZpbGVUaW1lKGNvbnN0IFNZU1RFTVRJTUUqLExQRklMRVRJTUUpOwogV09SRCAgICAgICAgV0lOQVBJIFRpbGVXaW5kb3dzIChIV05EMzIsIFVJTlQzMiwgY29uc3QgTFBSRUNUMzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiwgY29uc3QgSFdORDMyICopOwpAQCAtNjk5MCw3ICs3MDI5LDcgQEAKIEhXTkQxNiAgICAgIFdJTkFQSSBDaGlsZFdpbmRvd0Zyb21Qb2ludDE2KEhXTkQxNixQT0lOVDE2KTsKIEhXTkQzMiAgICAgIFdJTkFQSSBDaGlsZFdpbmRvd0Zyb21Qb2ludDMyKEhXTkQzMixQT0lOVDMyKTsKICNkZWZpbmUgICAgIENoaWxkV2luZG93RnJvbVBvaW50IFdJTkVMSUJfTkFNRShDaGlsZFdpbmRvd0Zyb21Qb2ludCkKLUlOVDMyICAgICAgIENob29zZVBpeGVsRm9ybWF0KEhEQzMyLFBJWEVMRk9STUFUREVTQ1JJUFRPUiopOworSU5UMzIgICAgICAgV0lOQVBJIENob29zZVBpeGVsRm9ybWF0KEhEQzMyLFBJWEVMRk9STUFUREVTQ1JJUFRPUiopOwogQk9PTDE2ICAgICAgV0lOQVBJIENob3JkMTYoSERDMTYsSU5UMTYsSU5UMTYsSU5UMTYsSU5UMTYsSU5UMTYsSU5UMTYsSU5UMTYsSU5UMTYpOwogQk9PTDMyICAgICAgV0lOQVBJIENob3JkMzIoSERDMzIsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIpOwogI2RlZmluZSAgICAgQ2hvcmQgV0lORUxJQl9OQU1FKENob3JkKQpAQCAtODQyNiw2ICs4NDY1LDkgQEAKIEJPT0wxNiAgICAgIFdJTkFQSSBQb2x5QmV6aWVyMTYoSERDMTYsTFBQT0lOVDE2LElOVDE2KTsKIEJPT0wzMiAgICAgIFdJTkFQSSBQb2x5QmV6aWVyMzIoSERDMzIsTFBQT0lOVDMyLERXT1JEKTsKICNkZWZpbmUgICAgIFBvbHlCZXppZXIgV0lORUxJQl9OQU1FKFBvbHlCZXppZXIpCitCT09MMTYgICAgICBXSU5BUEkgUG9seUJlemllclRvMTYoSERDMTYsTFBQT0lOVDE2LElOVDE2KTsKK0JPT0wzMiAgICAgIFdJTkFQSSBQb2x5QmV6aWVyVG8zMihIREMzMixMUFBPSU5UMzIsRFdPUkQpOworI2RlZmluZSAgICAgUG9seUJlemllclRvIFdJTkVMSUJfTkFNRShQb2x5QmV6aWVyVG8pCiBCT09MMTYgICAgICBXSU5BUEkgUG9seVBvbHlnb24xNihIREMxNixMUFBPSU5UMTYsTFBJTlQxNixVSU5UMTYpOwogQk9PTDMyICAgICAgV0lOQVBJIFBvbHlQb2x5Z29uMzIoSERDMzIsTFBQT0lOVDMyLExQSU5UMzIsVUlOVDMyKTsKICNkZWZpbmUgICAgIFBvbHlQb2x5Z29uIFdJTkVMSUJfTkFNRShQb2x5UG9seWdvbikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luZXJyb3IuaCBiL2luY2x1ZGUvd2luZXJyb3IuaAppbmRleCA4YzZjOGQ2Li4xMmYxNzI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbmVycm9yLmgKKysrIGIvaW5jbHVkZS93aW5lcnJvci5oCkBAIC02Niw2ICs2NiwxMSBAQAogI2RlZmluZSBFUlJPUl9OT19ORVRXT1JLICAgICAgICAgICAgMTIyMgogI2RlZmluZSBFUlJPUl9BTFJFQURZX0lOSVRJQUxJWkVEICAgMTI0NwogI2RlZmluZSBFUlJPUl9QUklWSUxFR0VfTk9UX0hFTEQgICAgMTMxNAorI2RlZmluZSBFUlJPUl9DQU5OT1RfRklORF9XTkRfQ0xBU1MgMTQwNworI2RlZmluZSBFUlJPUl9XSU5ET1dfT0ZfT1RIRVJfVEhSRUFEIDE0MDgKKyNkZWZpbmUgRVJST1JfQ0xBU1NfQUxSRUFEWV9FWElTVFMgIDE0MTAKKyNkZWZpbmUgRVJST1JfQ0xBU1NfRE9FU19OT1RfRVhJU1QgIDE0MTEKKyNkZWZpbmUgRVJST1JfQ0xBU1NfSEFTX1dJTkRPV1MgICAgIDE0MTIKICNkZWZpbmUgRVJST1JfQ09NTUlUTUVOVF9MSU1JVCAgICAgIDE0NTUKICNkZWZpbmUgRVJST1JfSU5WQUxJRF9QUklOVEVSX05BTUUgIDE4MDEKIApAQCAtMTU1LDQgKzE2MCw3IEBACiAjZGVmaW5lCUVfRkFJTAkJCQkweDgwMDAwMDA4CiAjZGVmaW5lIEVfQUNDRVNTREVOSUVECQkJMHg4MDAwMDAwOSAqLwogCisvKiBPYnRhaW5lZCBmcm9tIGxjYy13aW4zMiBpbmNsdWRlIGZpbGVzICovCisjZGVmaW5lIEdESV9FUlJPUgkJCTB4ZmZmZmZmZmYKKwogI2VuZGlmICAvKiBfX1dJTkVfV0lORVJST1JfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5udC5oIGIvaW5jbHVkZS93aW5udC5oCmluZGV4IDQ0ZmM3MzIuLmJiNDRkZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2lubnQuaAorKysgYi9pbmNsdWRlL3dpbm50LmgKQEAgLTE0OCw2ICsxNDgsOSBAQAogI2RlZmluZSBTRVRfQ0ZMQUcoY29udGV4dCkgICAoRUZMX3JlZyhjb250ZXh0KSB8PSAweDAwMDEpCiAjZGVmaW5lIFJFU0VUX0NGTEFHKGNvbnRleHQpIChFRkxfcmVnKGNvbnRleHQpICY9IDB4ZmZmZmZmZmUpCiAKKyNkZWZpbmUgSVNWODYoY29udGV4dCkgICAgICAgKEVGTF9yZWcoY29udGV4dCkgJiAweDAwMDIwMDAwKQorI2RlZmluZSBWODZCQVNFKGNvbnRleHQpICAgICAoKGNvbnRleHQpLT5EcjcpIC8qIHVnbHkgKi8KKwogI2VuZGlmICAvKiBfX1dJTkVfXyAqLwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5zb2NrLmggYi9pbmNsdWRlL3dpbnNvY2suaAppbmRleCBhYTRiZGNhLi4zNjM2MTViIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbnNvY2suaAorKysgYi9pbmNsdWRlL3dpbnNvY2suaApAQCAtNTU3LDYgKzU1NywxMiBAQAogICBJTlQxNgkJCWxhc3RfZnJlZTsJCS8qIGVudHJ5IGluIHRoZSBzb2NrZXQgdGFibGUgKi8KICAgVUlOVDE2CQlidWZsZW47CiAgIGNoYXIqCQkJYnVmZmVyOwkJCS8qIGFsbG9jYXRlZCBmcm9tIFNFR1BUUiBoZWFwICovCisgIHN0cnVjdCB3c19ob3N0ZW50CSpoZTsKKyAgaW50CQkJaGVsZW47CisgIHN0cnVjdCB3c19zZXJ2ZW50CSpzZTsKKyAgaW50CQkJc2VsZW47CisgIHN0cnVjdCB3c19wcm90b2VudAkqcGU7CisgIGludAkJCXBlbGVuOwogICBjaGFyKgkJCWRidWZmZXI7CQkvKiBidWZmZXIgZm9yIGR1bW1pZXMgKDMyIGJ5dGVzKSAqLwogCiAgIHdzX3NvY2tldAkJc29ja1tXU19NQVhfU09DS0VUU19QRVJfUFJPQ0VTU107CmRpZmYgLS1naXQgYS9sb2FkZXIvZG9zL01ha2VmaWxlLmluIGIvbG9hZGVyL2Rvcy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjA1MDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbG9hZGVyL2Rvcy9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDE5IEBACitERUZTICAgICAgPSBARExMRkxBR1NAIC1EX19XSU5FX18KK1RPUFNSQ0RJUiA9IEB0b3Bfc3JjZGlyQAorVE9QT0JKRElSID0gLi4vLi4KK1NSQ0RJUiAgICA9IEBzcmNkaXJACitWUEFUSCAgICAgPSBAc3JjZGlyQAorTU9EVUxFICAgID0gZG9zCisKK0NfU1JDUyA9IFwKKwltb2R1bGUuYyBcCisJZG9zdm0uYworCithbGw6ICQoTU9EVUxFKS5vIGRvc21vZAorCitkb3Ntb2Q6IGRvc21vZC5jCisJJChDQykgJChBTExDRkxBR1MpIC1vIGRvc21vZCAkPAorCitATUFLRV9SVUxFU0AKKworIyMjIERlcGVuZGVuY2llczoKZGlmZiAtLWdpdCBhL2xvYWRlci9kb3MvZG9zbW9kLmMgYi9sb2FkZXIvZG9zL2Rvc21vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YWQyNGYKLS0tIC9kZXYvbnVsbAorKysgYi9sb2FkZXIvZG9zL2Rvc21vZC5jCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBET1MgVmlydHVhbCBNYWNoaW5lCisgKgorICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCisgKi8KKworI2lmZGVmIGxpbnV4CisKKy8qIGZvcmNlIGRvc21vZCBhdCBoaWdoIGFkZHJlc3NlcyAqLworYXNtKCIub3JnIDB4MTEwMDAwIik7CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3ZtODYuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorCisvKiBGSVhNRTogaGFjayBiZWNhdXNlIGxpYmMgdm04NiBtYXkgYmUgdGhlIG9sZCBzeXNjYWxsIHZlcnNpb24gKi8KK3N0YXRpYyBfX2lubGluZV9fIGludCB2bTg2cGx1cyggaW50IGZ1bmMsIHN0cnVjdCB2bTg2cGx1c19zdHJ1Y3QgKnB0ciApCit7CisgICAgaW50IHJlczsKKyNpZmRlZiBfX1BJQ19fCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oICJwdXNobCAlJWVieFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3ZsICUyLCUlZWJ4XG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImludCAkMHg4MFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3BsICUlZWJ4IgorICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI9YSIgKHJlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiMCIgKFNZU192bTg2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZyIgKGZ1bmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjIiAocHRyKSApOworI2Vsc2UKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiaW50ICQweDgwIgorICAgICAgICAgICAgICAgICAgICAgICAgIDogIj1hIiAocmVzKQorICAgICAgICAgICAgICAgICAgICAgICAgIDogIjAiIChTWVNfdm04NiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYiIgKGZ1bmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImMiIChwdHIpICk7CisjZW5kaWYgIC8qIF9fUElDX18gKi8KKyAgICBpZiAocmVzID49IDApIHJldHVybiByZXM7CisgICAgZXJybm8gPSAtcmVzOworICAgIHJldHVybiAtMTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsY2hhcioqYXJndikKK3sKKyBpbnQgbWZkPW9wZW4oYXJndlswXSxPX1JEV1IpOworIHZvaWQqaW1nOworIHN0cnVjdCB2bTg2cGx1c19zdHJ1Y3QgVk04NjsKKyBpbnQgZnVuYyxyZXQ7CisgCisvKiBmcHJpbnRmKHN0ZGVyciwibWFpbiBpcyBhdCAlMDhseCwgZmlsZSBpcyAlcywgZmQ9JWRcbiIsKHVuc2lnbmVkIGxvbmcpJm1haW4sYXJndlswXSxtZmQpOyAqLworIGlmIChtZmQ8MCkgcmV0dXJuIDE7CisvKiBNYXAgaW4gb3VyIERPUyBpbWFnZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHByb2Nlc3MgYWRkcmVzcyBzcGFjZSAqLworIGltZz1tbWFwKE5VTEwsMHgxMTAwMDAsUFJPVF9FWEVDfFBST1RfUkVBRHxQUk9UX1dSSVRFLE1BUF9GSVhFRHxNQVBfU0hBUkVELG1mZCwwKTsKKyBpZiAoaW1nPT0odm9pZCopLTEpIHsKKyAgZnByaW50ZihzdGRlcnIsIkRPUyBtZW1vcnkgbWFwIGZhaWxlZCwgZXJyb3I9JXNcbiIsc3RyZXJyb3IoZXJybm8pKTsKKyAgcmV0dXJuIDE7CisgfQorLyogZnByaW50ZihzdGRlcnIsIlN1Y2Nlc3NmdWxseSBtYXBwZWQgRE9TIG1lbW9yeSwgZW50ZXJpbmcgdm04NiBsb29wXG4iKTsgKi8KKy8qIGNvbnRleHQgZXhjaGFuZ2UgbG9vcCAqLworIGRvIHsKKyAgaWYgKHJlYWQoMCwmZnVuYyxzaXplb2YoZnVuYykpIT1zaXplb2YoZnVuYykpIHJldHVybiAxOworICBpZiAocmVhZCgwLCZWTTg2LHNpemVvZihWTTg2KSkhPXNpemVvZihWTTg2KSkgcmV0dXJuIDE7CisgIGlmIChmdW5jPDApIGJyZWFrOworICByZXQ9dm04NnBsdXMoZnVuYywmVk04Nik7CisgIGlmICh3cml0ZSgxLCZyZXQsc2l6ZW9mKHJldCkpIT1zaXplb2YocmV0KSkgcmV0dXJuIDE7CisgIGlmICh3cml0ZSgxLCZWTTg2LHNpemVvZihWTTg2KSkhPXNpemVvZihWTTg2KSkgcmV0dXJuIDE7CisgfSB3aGlsZSAoMSk7CisgcmV0dXJuIDA7Cit9CisKKyNlbHNlIC8qICFsaW51eCAqLworaW50IG1haW4odm9pZCkge3JldHVybiAxO30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbG9hZGVyL2Rvcy9kb3N2bS5jIGIvbG9hZGVyL2Rvcy9kb3N2bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MThkYWEKLS0tIC9kZXYvbnVsbAorKysgYi9sb2FkZXIvZG9zL2Rvc3ZtLmMKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBET1MgVmlydHVhbCBNYWNoaW5lCisgKgorICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCisgKi8KKworI2lmZGVmIGxpbnV4CisgCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAid2luYmFzZS5oIgorI2luY2x1ZGUgIm1zZG9zLmgiCisjaW5jbHVkZSAibWlzY2VtdS5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAibW9kdWxlLmgiCisjaW5jbHVkZSAibGR0LmgiCisjaW5jbHVkZSAiZG9zZXhlLmgiCisKK3ZvaWQgRE9TVk1fRHVtcCggTFBET1NUQVNLIGxwRG9zVGFzaykKK3sKKyB1bnNpZ25lZCBpb2ZzOworIEJZVEUqaW5zdDsKKyBpbnQgeDsKKworIHN3aXRjaCAoVk04Nl9UWVBFKGxwRG9zVGFzay0+Zm4pKSB7CisgIGNhc2UgVk04Nl9TSUdOQUw6CisgICBwcmludGYoIlRyYXBwZWQgc2lnbmFsXG4iKTsgYnJlYWs7CisgIGNhc2UgVk04Nl9VTktOT1dOOgorICAgcHJpbnRmKCJUcmFwcGVkIHVuaGFuZGxlZCBHUEZcbiIpOyBicmVhazsKKyAgY2FzZSBWTTg2X0lOVHg6CisgICBwcmludGYoIlRyYXBwZWQgSU5UICUwMnhcbiIsVk04Nl9BUkcobHBEb3NUYXNrLT5mbikpOyBicmVhazsKKyAgY2FzZSBWTTg2X1NUSToKKyAgIHByaW50ZigiVHJhcHBlZCBTVElcbiIpOyBicmVhazsKKyAgY2FzZSBWTTg2X1BJQ1JFVFVSTjoKKyAgIHByaW50ZigiVHJhcHBlZCBkdWUgdG8gcGVuZGluZyBQSUMgcmVxdWVzdFxuIik7IGJyZWFrOworICBjYXNlIFZNODZfVFJBUDoKKyAgIHByaW50ZigiVHJhcHBlZCBkZWJ1ZyByZXF1ZXN0XG4iKTsgYnJlYWs7CisgfQorI2RlZmluZSBSRUdTIGxwRG9zVGFzay0+Vk04Ni5yZWdzCisgZnByaW50ZihzdGRlcnIsIkFYPSUwNGxYIENYPSUwNGxYIERYPSUwNGxYIEJYPSUwNGxYXG4iLFJFR1MuZWF4LFJFR1MuZWJ4LFJFR1MuZWN4LFJFR1MuZWR4KTsKKyBmcHJpbnRmKHN0ZGVyciwiU0k9JTA0bFggREk9JTA0bFggU1A9JTA0bFggQlA9JTA0bFhcbiIsUkVHUy5lc2ksUkVHUy5lZGksUkVHUy5lc3AsUkVHUy5lYnApOworIGZwcmludGYoc3RkZXJyLCJDUz0lMDRYIERTPSUwNFggRVM9JTA0WCBTUz0lMDRYXG4iLFJFR1MuY3MsUkVHUy5kcyxSRUdTLmVzLFJFR1Muc3MpOworCisgaW9mcz0oKERXT1JEKVJFR1MuY3M8PDQpK1JFR1MuZWlwOworI3VuZGVmIFJFR1MKKyBpbnN0PShCWVRFKilscERvc1Rhc2stPmltZytpb2ZzOworIHByaW50ZigiT3Bjb2RlczoiKTsKKyBmb3IgKHg9MDsgeDw4OyB4KyspIHByaW50ZigiICUwMngiLGluc3RbeF0pOworIHByaW50ZigiXG4iKTsKKworIGV4aXQoMCk7Cit9CisKK2ludCBET1NWTV9JbnQoaW50IHZlY3QsIExQRE9TVEFTSyBscERvc1Rhc2ssIFBDT05URVhUIGNvbnRleHQgKQoreworIHN3aXRjaCAodmVjdCkgeworICBjYXNlIDB4MjA6CisgICByZXR1cm4gLTE7CisgIGNhc2UgMHgyMToKKyAgIGlmIChBSF9yZWcoY29udGV4dCk9PTB4NGMpIHJldHVybiAtMTsKKyAgIERPUzNDYWxsKGNvbnRleHQpOworICAgYnJlYWs7CisgfQorIHJldHVybiAwOworfQorCitpbnQgRE9TVk1fUHJvY2VzcyggTFBET1NUQVNLIGxwRG9zVGFzayApCit7CisgQ09OVEVYVCBjb250ZXh0OworIGludCByZXQ9MDsKKworI2RlZmluZSBSRUdTIGxwRG9zVGFzay0+Vk04Ni5yZWdzCisgY29udGV4dC5FYXg9UkVHUy5lYXg7IGNvbnRleHQuRWN4PVJFR1MuZWN4OyBjb250ZXh0LkVkeD1SRUdTLmVkeDsgY29udGV4dC5FYng9UkVHUy5lYng7CisgY29udGV4dC5Fc2k9UkVHUy5lc2k7IGNvbnRleHQuRWRpPVJFR1MuZWRpOyBjb250ZXh0LkVzcD1SRUdTLmVzcDsgY29udGV4dC5FYnA9UkVHUy5lYnA7CisgY29udGV4dC5TZWdDcz1SRUdTLmNzOyBjb250ZXh0LlNlZ0RzPVJFR1MuZHM7IGNvbnRleHQuU2VnRXM9UkVHUy5lczsKKyBjb250ZXh0LlNlZ1NzPVJFR1Muc3M7IGNvbnRleHQuU2VnRnM9UkVHUy5mczsgY29udGV4dC5TZWdHcz1SRUdTLmdzOworIGNvbnRleHQuRWlwPVJFR1MuZWlwOyBjb250ZXh0LkVGbGFncz1SRUdTLmVmbGFnczsKKyAodm9pZCopVjg2QkFTRSgmY29udGV4dCk9bHBEb3NUYXNrLT5pbWc7CisKKyBzd2l0Y2ggKFZNODZfVFlQRShscERvc1Rhc2stPmZuKSkgeworICBjYXNlIFZNODZfU0lHTkFMOgorICAgcHJpbnRmKCJUcmFwcGVkIHNpZ25hbFxuIik7CisgICByZXQ9LTE7IGJyZWFrOworICBjYXNlIFZNODZfVU5LTk9XTjoKKyAgIERPU1ZNX0R1bXAobHBEb3NUYXNrKTsKKyAgIGJyZWFrOworICBjYXNlIFZNODZfSU5UeDoKKyAgIFRSQUNFKGludCwiRE9TIEVYRSBjYWxscyBJTlQgJTAyeFxuIixWTTg2X0FSRyhscERvc1Rhc2stPmZuKSk7CisgICByZXQ9RE9TVk1fSW50KFZNODZfQVJHKGxwRG9zVGFzay0+Zm4pLGxwRG9zVGFzaywmY29udGV4dCk7IGJyZWFrOworICBjYXNlIFZNODZfU1RJOgorICAgYnJlYWs7CisgIGNhc2UgVk04Nl9QSUNSRVRVUk46CisgICBwcmludGYoIlRyYXBwZWQgZHVlIHRvIHBlbmRpbmcgUElDIHJlcXVlc3RcbiIpOyBicmVhazsKKyAgY2FzZSBWTTg2X1RSQVA6CisgICBwcmludGYoIlRyYXBwZWQgZGVidWcgcmVxdWVzdFxuIik7IGJyZWFrOworICBkZWZhdWx0OgorICAgRE9TVk1fRHVtcChscERvc1Rhc2spOworIH0KKworIGxwRG9zVGFzay0+Zm49Vk04Nl9FTlRFUjsKKyBSRUdTLmVheD1jb250ZXh0LkVheDsgUkVHUy5lY3g9Y29udGV4dC5FY3g7IFJFR1MuZWR4PWNvbnRleHQuRWR4OyBSRUdTLmVieD1jb250ZXh0LkVieDsKKyBSRUdTLmVzaT1jb250ZXh0LkVzaTsgUkVHUy5lZGk9Y29udGV4dC5FZGk7IFJFR1MuZXNwPWNvbnRleHQuRXNwOyBSRUdTLmVicD1jb250ZXh0LkVicDsKKyBSRUdTLmNzPWNvbnRleHQuU2VnQ3M7IFJFR1MuZHM9Y29udGV4dC5TZWdEczsgUkVHUy5lcz1jb250ZXh0LlNlZ0VzOworIFJFR1Muc3M9Y29udGV4dC5TZWdTczsgUkVHUy5mcz1jb250ZXh0LlNlZ0ZzOyBSRUdTLmdzPWNvbnRleHQuU2VnR3M7CisgUkVHUy5laXA9Y29udGV4dC5FaXA7IFJFR1MuZWZsYWdzPWNvbnRleHQuRUZsYWdzOworI3VuZGVmIFJFR1MKKyByZXR1cm4gcmV0OworfQorCisjZW5kaWYgLyogbGludXggKi8KZGlmZiAtLWdpdCBhL2xvYWRlci9kb3MvbW9kdWxlLmMgYi9sb2FkZXIvZG9zL21vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1M2MyYzMKLS0tIC9kZXYvbnVsbAorKysgYi9sb2FkZXIvZG9zL21vZHVsZS5jCkBAIC0wLDAgKzEsMzEzIEBACisvKgorICogRE9TIChNWikgbG9hZGVyCisgKgorICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCisgKi8KKworI2lmZGVmIGxpbnV4CisgCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpZmRlZiBNWl9VU0VTWVNWCisjaW5jbHVkZSA8c3lzL2lwYy5oPgorI2luY2x1ZGUgPHN5cy9zaG0uaD4KKyNlbHNlCisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy92bTg2Lmg+CisjaWZkZWYgTVpfVVNFU1lTVgorI2luY2x1ZGUgPGxpbnV4L21tLmg+IC8qIEZJWE1FOiB3aGVyZSBlbHNlIHNob3VsZCBJIGZldGNoIHRoZSBQQUdFX1NJWkUgZGVmaW5lPyAqLworI2VuZGlmCisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgIndpbmJhc2UuaCIKKyNpbmNsdWRlICJtb2R1bGUuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisjaW5jbHVkZSAibGR0LmgiCisjaW5jbHVkZSAicHJvY2Vzcy5oIgorI2luY2x1ZGUgIm1pc2NlbXUuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImRvc2V4ZS5oIgorCisjZGVmaW5lIEJJT1NfREFUQV9TRUdNRU5UIDB4NDAKKyNkZWZpbmUgQklPU19TRUdNRU5UIEJJT1NTRUcgLyogQklPU1NFRyBpcyBkZWZpbmVkIHRvIDB4ZjAwMCBpbiBzeXMvdm04Ni5oICovCisjZGVmaW5lIFNUVUJfU0VHTUVOVCBCSU9TX1NFR01FTlQKKyNpZmRlZiBNWl9VU0VTWVNWCisvKiBpdCBtaWdodCBiZSB0aGF0IFNZU1Ygc3VwcG9ydHMgU1RBUlRfT0ZGU0VUIDAgYWZ0ZXIgYWxsLCBoYXZlbid0IGNoZWNrZWQgKi8KKyNkZWZpbmUgU1RBUlRfT0ZGU0VUIFBBR0VfU0laRQorI2Vsc2UKKyNkZWZpbmUgU1RBUlRfT0ZGU0VUIDAKKyNlbmRpZgorI2RlZmluZSBQU1BfU0laRSAweDEwCisKKyNkZWZpbmUgU0VHMTYocHRyLHNlZykgKChMUFZPSUQpKChCWVRFKilwdHIrKChEV09SRCkoc2VnKTw8NCkpKQorI2RlZmluZSBTRUdQVFIxNihwdHIsc2VncHRyKSAoKExQVk9JRCkoKEJZVEUqKXB0cisoKERXT1JEKVNFTEVDVE9ST0Yoc2VncHRyKTw8NCkrT0ZGU0VUT0Yoc2VncHRyKSkpCisKKyNkZWZpbmUgU1RVQih4KSAoMHg5MENGMDBDRHwoeDw8OCkpIC8qIElOVCB4OyBJUkVUOyBOT1AgKi8KKworc3RhdGljIHZvaWQgTVpfSW5pdFN5c3RlbSggTFBWT0lEIGxwSW1hZ2UgKQoreworIFNFR1BUUippc3I9bHBJbWFnZTsKKyBEV09SRCpzdHViPVNFRzE2KGxwSW1hZ2UsU1RVQl9TRUdNRU5UKTsKKyBpbnQgeDsKKyAKKyAvKiBpbml0aWFsaXplIElTUiB0YWJsZSB0byBtYWtlIGl0IHBvaW50IHRvIElOVCBzdHVicyBpbiBCSU9TU0VHOworICAgIExpbnV4IG9ubHkgc2VuZHMgSU5UcyBwZXJmb3JtZWQgZnJvbSBvciBkZXN0aW5lZCB0byBCSU9TU0VHIGF0IHVzLAorICAgIGlmIHRoZSBpbnRfcmV2ZWN0b3JlZCB0YWJsZSBpcyBlbXB0eS4KKyAgICBUaGlzIGFsbG93cyBET1MgcHJvZ3JhbXMgdG8gaG9vayBpbnRlcnJ1cHRzLCBhcyB3ZWxsIGFzIHVzZSB0aGVpcgorICAgIGZhbWlsaWFyIHJldGYgdHJpY2tzIHRvIGNhbGwgdGhlbS4uLiAqLworIC8qIChub3RlIHRoYXQgdGhlIGhvb2tpbmcgbWlnaHQgbm90IGFjdHVhbGx5IHdvcmsgc2luY2UgRE9TM0NhbGwgc3R1ZmYKKyAgICAgaXNuJ3QgZnVsbHkgaW50ZWdyYXRlZCB3aXRoIHRoZSBET1MgVk0geWV0Li4uKSAqLworIFRSQUNFKG1vZHVsZSwiSW5pdGlhbGl6aW5nIGludGVycnVwdCB2ZWN0b3IgdGFibGVcbiIpOworIGZvciAoeD0wOyB4PDI1NjsgeCsrKSBpc3JbeF09UFRSX1NFR19PRkZfVE9fU0VHUFRSKFNUVUJfU0VHTUVOVCx4KjQpOworIFRSQUNFKG1vZHVsZSwiSW5pdGlhbGl6aW5nIGludGVycnVwdCBzdHViIHRhYmxlXG4iKTsKKyBmb3IgKHg9MDsgeDwyNTY7IHgrKykgc3R1Ylt4XT1TVFVCKHgpOworfQorCitzdGF0aWMgdm9pZCBNWl9Jbml0UFNQKCBMUFZPSUQgbHBQU1AsIExQQ1NUUiBjbWRsaW5lLCBMUENTVFIgZW52ICkKK3sKKyBQREIqcHNwPWxwUFNQOworIGNvbnN0IGNoYXIqY21kPWNtZGxpbmU/c3RyY2hyKGNtZGxpbmUsJyAnKTpOVUxMOworCisgcHNwLT5pbnQyMD0weDIwQ0Q7IC8qIGludCAyMCAqLworIC8qIHNvbWUgcHJvZ3JhbXMgdXNlIHRoaXMgdG8gY2FsY3VsYXRlIGhvdyBtdWNoIG1lbW9yeSB0aGV5IG5lZWQgKi8KKyBwc3AtPm5leHRQYXJhZ3JhcGg9MHg5RkZGOworIC8qIGNvcHkgcGFyYW1ldGVycyAqLworIGlmIChjbWQpIHsKKyAgd2hpbGUgKCpjbWQgPT0gJyAnKSBjbWQrKzsKKyAgcHNwLT5jbWRMaW5lWzBdPXN0cmxlbihjbWQpOworICBzdHJjcHkocHNwLT5jbWRMaW5lKzEsY21kKTsKKyAgcHNwLT5jbWRMaW5lW3BzcC0+Y21kTGluZVswXSsxXT0nXHInOworIH0gZWxzZSBwc3AtPmNtZExpbmVbMV09J1xyJzsKKyAvKiBGSVhNRTogaW50ZWdyYXRlIHRoZSBtZW1vcnkgc3R1ZmYgZnJvbSBXaW5lIChtc2Rvcy9kb3NtZW0uYykgKi8KKyAvKiBGSVhNRTogaW50ZWdyYXRlIHRoZSBQREIgc3R1ZmYgZnJvbSBXaW5lIChsb2FkZXIvdGFzay5jKSAqLworfQorCitzdGF0aWMgaW50IE1aX0xvYWRJbWFnZSggSEZJTEUxNiBoRmlsZSwgTFBDU1RSIGNtZGxpbmUsIExQQ1NUUiBlbnYsIExQRE9TVEFTSyBscERvc1Rhc2sgKQoreworIElNQUdFX0RPU19IRUFERVIgbXpfaGVhZGVyOworIERXT1JEIGltYWdlX3N0YXJ0LGltYWdlX3NpemUsbWluX3NpemUsbWF4X3NpemUsYXZhaWw7CisgV09SRCBwc3Bfc2VnLGxvYWRfc2VnOworIEJZVEUqcHNwX3N0YXJ0LCpsb2FkX3N0YXJ0OworIGludCB4OworIFNFR1BUUiByZWxvYzsKKworIGlmICgoX2hyZWFkMTYoaEZpbGUsJm16X2hlYWRlcixzaXplb2YobXpfaGVhZGVyKSkgIT0gc2l6ZW9mKG16X2hlYWRlcikpIHx8CisgICAgIChtel9oZWFkZXIuZV9tYWdpYyAhPSBJTUFHRV9ET1NfU0lHTkFUVVJFKSkKKyAgICAgcmV0dXJuIDExOyAvKiBpbnZhbGlkIGV4ZSAqLworIC8qIGNhbGN1bGF0ZSBsb2FkIHNpemUgKi8KKyBpbWFnZV9zdGFydD1tel9oZWFkZXIuZV9jcGFyaGRyPDw0OworIGltYWdlX3NpemU9bXpfaGVhZGVyLmVfY3A8PDk7IC8qIHBhZ2VzIGFyZSA1MTIgYnl0ZXMgKi8KKyBpZiAoKG16X2hlYWRlci5lX2NibHAhPTApJiYobXpfaGVhZGVyLmVfY2JscCE9NCkpIGltYWdlX3NpemUtPTUxMi1tel9oZWFkZXIuZV9jYmxwOworIGltYWdlX3NpemUtPWltYWdlX3N0YXJ0OworIG1pbl9zaXplPWltYWdlX3NpemUrKChEV09SRCltel9oZWFkZXIuZV9taW5hbGxvYzw8NCkrKFBTUF9TSVpFPDw0KTsKKyBtYXhfc2l6ZT1pbWFnZV9zaXplKygoRFdPUkQpbXpfaGVhZGVyLmVfbWF4YWxsb2M8PDQpKyhQU1BfU0laRTw8NCk7CisKKyAvKiBhbGxvY2F0ZSAxTUIrNjRLIHNoYXJlZCBtZW1vcnkgKi8KKyBscERvc1Rhc2stPmltZ19vZnM9U1RBUlRfT0ZGU0VUOworI2lmZGVmIE1aX1VTRVNZU1YKKyBscERvc1Rhc2stPmtleT1mdG9rKCIuIiwnZCcpOyAvKiBGSVhNRTogdGhpcyBpcyBmcm9tIG15IElQQyBpbnRybyBkb2MgKi8KKyBscERvc1Rhc2stPnNobV9pZD1zaG1nZXQobHBEb3NUYXNrLT5rZXksMHgxMTAwMDAtU1RBUlRfT0ZGU0VULElQQ19DUkVBVHxTSE1fUnxTSE1fVyk7CisgbHBEb3NUYXNrLT5pbWc9c2htYXQobHBEb3NUYXNrLT5zaG1faWQsTlVMTCwwKTsKKyNlbHNlCisgdG1wbmFtKGxwRG9zVGFzay0+bW1fbmFtZSk7CisvKiBzdHJjcHkobHBEb3NUYXNrLT5tbV9uYW1lLCIvdG1wL215ZG9zaW1hZ2UiKTsgKi8KKyBscERvc1Rhc2stPm1tX2ZkPW9wZW4obHBEb3NUYXNrLT5tbV9uYW1lLE9fUkRXUnxPX0NSRUFUIC8qIHxPX1RSVU5DICovLFNfSVJVU1J8U19JV1VTUik7CisgaWYgKGxwRG9zVGFzay0+bW1fZmQ8MCkgRVJSKG1vZHVsZSwiZmlsZSAlcyBjb3VsZCBub3QgYmUgb3BlbmVkXG4iLGxwRG9zVGFzay0+bW1fbmFtZSk7CisgLyogZXhwYW5kIGZpbGUgdG8gMU1CKzY0SyAqLworIGxzZWVrKGxwRG9zVGFzay0+bW1fZmQsMHgxMTAwMDAtMSxTRUVLX1NFVCk7CisgeD0wOyB3cml0ZShscERvc1Rhc2stPm1tX2ZkLCZ4LDEpOworIC8qIG1hcCBpdCBpbiAqLworIGxwRG9zVGFzay0+aW1nPW1tYXAoTlVMTCwweDExMDAwMC1TVEFSVF9PRkZTRVQsUFJPVF9SRUFEfFBST1RfV1JJVEUsTUFQX1NIQVJFRCxscERvc1Rhc2stPm1tX2ZkLDApOworI2VuZGlmCisgaWYgKGxwRG9zVGFzay0+aW1nPT0oTFBWT0lEKS0xKSB7CisgIEVSUihtb2R1bGUsImNvdWxkIG5vdCBtYXAgc2hhcmVkIG1lbW9yeSwgZXJyb3I9JXNcbiIsc3RyZXJyb3IoZXJybm8pKTsKKyAgcmV0dXJuIDA7CisgfQorIFRSQUNFKG1vZHVsZSwiRE9TIFZNODYgaW1hZ2UgbWFwcGVkIGF0ICUwOGx4XG4iLChEV09SRClscERvc1Rhc2stPmltZyk7CisKKyAvKiBpbml0aWFsaXplIHRoZSBtZW1vcnkgKi8KKyBNWl9Jbml0U3lzdGVtKGxwRG9zVGFzay0+aW1nKTsKKyBUUkFDRShtb2R1bGUsIkluaXRpYWxpemluZyBET1MgbWVtb3J5IHN0cnVjdHVyZXNcbiIpOworIERPU01FTV9Jbml0KGxwRG9zVGFzay0+aE1vZHVsZSk7CisKKyAvKiBGSVhNRTogYWxsb2NhdGUgbWVtb3J5IGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKi8KKworIC8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGV4ZWN1dGFibGUgKi8KKyBUUkFDRShtb2R1bGUsIkFsbG9jYXRpbmcgRE9TIG1lbW9yeSAobWluPSVsZCwgbWF4PSVsZClcbiIsbWluX3NpemUsbWF4X3NpemUpOworIGF2YWlsPURPU01FTV9BdmFpbGFibGUobHBEb3NUYXNrLT5oTW9kdWxlKTsKKyBpZiAoYXZhaWw8bWluX3NpemUpIHsKKyAgRVJSKG1vZHVsZSwgImluc3VmZmljaWVudCBET1MgbWVtb3J5XG4iKTsKKyAgcmV0dXJuIDA7CisgfQorIGlmIChhdmFpbD5tYXhfc2l6ZSkgYXZhaWw9bWF4X3NpemU7CisgcHNwX3N0YXJ0PURPU01FTV9HZXRCbG9jayhscERvc1Rhc2stPmhNb2R1bGUsYXZhaWwsJnBzcF9zZWcpOworIGlmICghcHNwX3N0YXJ0KSB7CisgIEVSUihtb2R1bGUsICJlcnJvciBhbGxvY2F0aW5nIERPUyBtZW1vcnlcbiIpOworICByZXR1cm4gMDsKKyB9CisgbG9hZF9zZWc9cHNwX3NlZytQU1BfU0laRTsKKyBsb2FkX3N0YXJ0PXBzcF9zdGFydCsoUFNQX1NJWkU8PDQpOworIE1aX0luaXRQU1AocHNwX3N0YXJ0LCBjbWRsaW5lLCBlbnYpOworCisgLyogbG9hZCBleGVjdXRhYmxlIGltYWdlICovCisgVFJBQ0UobW9kdWxlLCJsb2FkaW5nIERPUyBFWEUgaW1hZ2Ugc2l6ZSwgJTA4bHggYnl0ZXNcbiIsaW1hZ2Vfc2l6ZSk7CisgX2xsc2VlazE2KGhGaWxlLGltYWdlX3N0YXJ0LEZJTEVfQkVHSU4pOworIGlmICgoX2hyZWFkMTYoaEZpbGUsbG9hZF9zdGFydCxpbWFnZV9zaXplKSkgIT0gaW1hZ2Vfc2l6ZSkKKyAgcmV0dXJuIDExOyAvKiBpbnZhbGlkIGV4ZSAqLworCisgLyogbG9hZCByZWxvY2F0aW9uIHRhYmxlICovCisgVFJBQ0UobW9kdWxlLCJsb2FkaW5nIERPUyBFWEUgcmVsb2NhdGlvbiB0YWJsZSwgJWQgZW50cmllc1xuIixtel9oZWFkZXIuZV9sZmFybGMpOworIC8qIEZJWE1FOiBpcyB0aGlzIHRvbyBzbG93IHdpdGhvdXQgcmVhZCBidWZmZXJpbmc/ICovCisgX2xsc2VlazE2KGhGaWxlLG16X2hlYWRlci5lX2xmYXJsYyxGSUxFX0JFR0lOKTsKKyBmb3IgKHg9MDsgeDxtel9oZWFkZXIuZV9jcmxjOyB4KyspIHsKKyAgaWYgKF9scmVhZDE2KGhGaWxlLCZyZWxvYyxzaXplb2YocmVsb2MpKSAhPSBzaXplb2YocmVsb2MpKQorICAgcmV0dXJuIDExOyAvKiBpbnZhbGlkIGV4ZSAqLworICAqKFdPUkQqKVNFR1BUUjE2KGxvYWRfc3RhcnQscmVsb2MpKz1sb2FkX3NlZzsKKyB9CisKKyAvKiBpbml0aWFsaXplIHZtODYgc3RydWN0ICovCisgbWVtc2V0KCZscERvc1Rhc2stPlZNODYsMCxzaXplb2YobHBEb3NUYXNrLT5WTTg2KSk7CisgbHBEb3NUYXNrLT5WTTg2LnJlZ3MuY3M9bG9hZF9zZWcrbXpfaGVhZGVyLmVfY3M7CisgbHBEb3NUYXNrLT5WTTg2LnJlZ3MuZWlwPW16X2hlYWRlci5lX2lwOworIGxwRG9zVGFzay0+Vk04Ni5yZWdzLnNzPWxvYWRfc2VnK216X2hlYWRlci5lX3NzOworIGxwRG9zVGFzay0+Vk04Ni5yZWdzLmVzcD1tel9oZWFkZXIuZV9zcDsKKyBscERvc1Rhc2stPlZNODYucmVncy5kcz1wc3Bfc2VnOworIGxwRG9zVGFzay0+Vk04Ni5yZWdzLmVzPXBzcF9zZWc7CisgLyogaG1tLCB3aGF0IGVsc2UgZG8gd2UgbmVlZD8gKi8KKworIHJldHVybiAzMjsKK30KKworc3RhdGljIGludCBNWl9Jbml0VGFzayggTFBET1NUQVNLIGxwRG9zVGFzayApCit7CisgaW50IHJlYWRfZmRbMl0sd3JpdGVfZmRbMl07CisgcGlkX3QgY2hpbGQ7CisKKyAvKiBjcmVhdGUgcmVhZCBwaXBlICovCisgaWYgKHBpcGUocmVhZF9mZCk8MCkgcmV0dXJuIDA7CisgaWYgKHBpcGUod3JpdGVfZmQpPDApIHsKKyAgY2xvc2UocmVhZF9mZFswXSk7IGNsb3NlKHJlYWRfZmRbMV0pOyByZXR1cm4gMDsKKyB9CisgbHBEb3NUYXNrLT5yZWFkX3BpcGU9cmVhZF9mZFswXTsKKyBscERvc1Rhc2stPndyaXRlX3BpcGU9d3JpdGVfZmRbMV07CisgbHBEb3NUYXNrLT5mbj1WTTg2X0VOVEVSOworIGxwRG9zVGFzay0+c3RhdGU9MTsKKyBUUkFDRShtb2R1bGUsIlByZXBhcmluZyB0byBsb2FkIERPUyBFWEUgc3VwcG9ydCBtb2R1bGU6IGZvcmtpbmdcbiIpOworIGlmICgoY2hpbGQ9Zm9yaygpKTwwKSB7CisgIGNsb3NlKHdyaXRlX2ZkWzBdKTsgY2xvc2Uod3JpdGVfZmRbMV0pOworICBjbG9zZShyZWFkX2ZkWzBdKTsgY2xvc2UocmVhZF9mZFsxXSk7IHJldHVybiAwOworIH0KKyBpZiAoY2hpbGQhPTApIHsKKyAgLyogcGFyZW50IHByb2Nlc3MgKi8KKyAgY2xvc2UocmVhZF9mZFsxXSk7IGNsb3NlKHdyaXRlX2ZkWzBdKTsKKyAgbHBEb3NUYXNrLT50YXNrPWNoaWxkOworIH0gZWxzZSB7CisgIC8qIGNoaWxkIHByb2Nlc3MgKi8KKyAgY2xvc2UocmVhZF9mZFswXSk7IGNsb3NlKHdyaXRlX2ZkWzFdKTsKKyAgLyogcHV0IG91ciBwaXBlcyBzb21ld2hlcmUgZG9zbW9kIGNhbiBmaW5kIHRoZW0gKi8KKyAgZHVwMih3cml0ZV9mZFswXSwwKTsgICAgICAvKiBzdGRpbiAqLworICBkdXAyKHJlYWRfZmRbMV0sMSk7ICAgICAgIC8qIHN0ZG91dCAqLworICAvKiBub3cgbG9hZCBkb3Ntb2QgKi8KKyAgZXhlY2xwKCJkb3Ntb2QiLGxwRG9zVGFzay0+bW1fbmFtZSxOVUxMKTsKKyAgZXhlY2woImRvc21vZCIsbHBEb3NUYXNrLT5tbV9uYW1lLE5VTEwpOworICBleGVjbCgibG9hZGVyL2Rvcy9kb3Ntb2QiLGxwRG9zVGFzay0+bW1fbmFtZSxOVUxMKTsKKyAgLyogaWYgZmFpbHVyZSwgZXhpdCAqLworICBFUlIobW9kdWxlLCJGYWlsZWQgdG8gc3Bhd24gZG9zbW9kLCBlcnJvcj0lc1xuIixzdHJlcnJvcihlcnJubykpOworICBleGl0KDEpOworIH0KKyByZXR1cm4gMzI7Cit9CisKK0hJTlNUQU5DRTE2IE1aX0xvYWRNb2R1bGUoIExQQ1NUUiBuYW1lLCBMUENTVFIgY21kbGluZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgZW52LCBVSU5UMTYgc2hvd19jbWQgKQoreworIExQRE9TVEFTSyBscERvc1Rhc2s7CisgSE1PRFVMRTE2IGhNb2R1bGU7CisgSElOU1RBTkNFMTYgaEluc3RhbmNlOworIE5FX01PRFVMRSAqcE1vZHVsZTsKKyBIRklMRTE2IGhGaWxlOworIE9GU1RSVUNUIG9mczsKKyBQUk9DRVNTX0lORk9STUFUSU9OIGluZm87CisgaW50IGVycjsKKworIGlmICgobHBEb3NUYXNrID0gY2FsbG9jKDEsIHNpemVvZihET1NUQVNLKSkpID09IE5VTEwpCisgIHJldHVybiAwOworCisgaWYgKChoRmlsZSA9IE9wZW5GaWxlMTYoIG5hbWUsICZvZnMsIE9GX1JFQUQgKSkgPT0gSEZJTEVfRVJST1IxNikKKyAgcmV0dXJuIDI7IC8qIEZpbGUgbm90IGZvdW5kICovCisKKyBpZiAoKGhNb2R1bGUgPSBNT0RVTEVfQ3JlYXRlRHVtbXlNb2R1bGUoJm9mcykpIDwgMzIpCisgIHJldHVybiBoTW9kdWxlOworCisgbHBEb3NUYXNrLT5oTW9kdWxlID0gaE1vZHVsZTsKKworIHBNb2R1bGUgPSAoTkVfTU9EVUxFICopR2xvYmFsTG9jazE2KGhNb2R1bGUpOworIHBNb2R1bGUtPmxwRG9zVGFzayA9IGxwRG9zVGFzazsKKyAKKyBscERvc1Rhc2stPmltZz1OVUxMOyBscERvc1Rhc2stPm1tX25hbWVbMF09MDsgbHBEb3NUYXNrLT5tbV9mZD0tMTsKKyBlcnIgPSBNWl9Mb2FkSW1hZ2UoIGhGaWxlLCBjbWRsaW5lLCBlbnYsIGxwRG9zVGFzayApOworIF9sY2xvc2UxNihoRmlsZSk7CisgaWYgKGVycjwzMikgeworICBpZiAobHBEb3NUYXNrLT5pbWchPU5VTEwpIG11bm1hcChscERvc1Rhc2stPmltZywweDExMDAwMC1TVEFSVF9PRkZTRVQpOworICBpZiAobHBEb3NUYXNrLT5tbV9mZD49MCkgY2xvc2UobHBEb3NUYXNrLT5tbV9mZCk7CisgIGlmIChscERvc1Rhc2stPm1tX25hbWVbMF0hPTApIHVubGluayhscERvc1Rhc2stPm1tX25hbWUpOworICByZXR1cm4gZXJyOworIH0KKyBNWl9Jbml0VGFzayggbHBEb3NUYXNrICk7CisKKyBoSW5zdGFuY2UgPSBORV9DcmVhdGVJbnN0YW5jZShwTW9kdWxlLCBOVUxMLCAoY21kbGluZSA9PSBOVUxMKSk7CisgUFJPQ0VTU19DcmVhdGUoIHBNb2R1bGUsIGNtZGxpbmUsIGVudiwgaEluc3RhbmNlLCAwLCBzaG93X2NtZCwgJmluZm8gKTsKKyAvKiB3ZSBkb24ndCBuZWVkIHRoZSBoYW5kbGVzIGZvciBub3cgKi8KKyBDbG9zZUhhbmRsZSggaW5mby5oVGhyZWFkICk7CisgQ2xvc2VIYW5kbGUoIGluZm8uaFByb2Nlc3MgKTsKKyByZXR1cm4gaEluc3RhbmNlOworfQorCit2b2lkIE1aX0tpbGxNb2R1bGUoIExQRE9TVEFTSyBscERvc1Rhc2sgKQoreworIG11bm1hcChscERvc1Rhc2stPmltZywweDExMDAwMC1TVEFSVF9PRkZTRVQpOworIGNsb3NlKGxwRG9zVGFzay0+bW1fZmQpOworIHVubGluayhscERvc1Rhc2stPm1tX25hbWUpOworIGNsb3NlKGxwRG9zVGFzay0+cmVhZF9waXBlKTsKKyBjbG9zZShscERvc1Rhc2stPndyaXRlX3BpcGUpOworIGtpbGwobHBEb3NUYXNrLT50YXNrLFNJR1RFUk0pOworfQorCitpbnQgTVpfUnVuTW9kdWxlKCBMUERPU1RBU0sgbHBEb3NUYXNrICkKK3sKKy8qIHRyYW5zbWl0IHRoZSBjdXJyZW50IGNvbnRleHQgc3RydWN0dXJlIHRvIHRoZSBET1MgdGFzayAqLworIGlmIChscERvc1Rhc2stPnN0YXRlPT0xKSB7CisgIGlmICh3cml0ZShscERvc1Rhc2stPndyaXRlX3BpcGUsJmxwRG9zVGFzay0+Zm4sc2l6ZW9mKGxwRG9zVGFzay0+Zm4pKSE9c2l6ZW9mKGxwRG9zVGFzay0+Zm4pKQorICAgcmV0dXJuIC0xOworICBpZiAod3JpdGUobHBEb3NUYXNrLT53cml0ZV9waXBlLCZscERvc1Rhc2stPlZNODYsc2l6ZW9mKGxwRG9zVGFzay0+Vk04NikpIT1zaXplb2YobHBEb3NUYXNrLT5WTTg2KSkKKyAgIHJldHVybiAtMTsKKyAgbHBEb3NUYXNrLT5zdGF0ZT0yOworIH0KKy8qIHdhaXQgZm9yIGFub3RoZXIgY29udGV4dCBzdHJ1Y3R1cmUgdG8gYXBwZWFyICh0aGlzIG1heSBibG9jaykgKi8KKyBpZiAobHBEb3NUYXNrLT5zdGF0ZT09MikgeworICBpZiAocmVhZChscERvc1Rhc2stPnJlYWRfcGlwZSwmbHBEb3NUYXNrLT5mbixzaXplb2YobHBEb3NUYXNrLT5mbikpIT1zaXplb2YobHBEb3NUYXNrLT5mbikpIHsKKyAgIGlmICgoZXJybm89PUVJTlRSKXx8KGVycm5vPT1FQUdBSU4pKSByZXR1cm4gMDsKKyAgIHJldHVybiAtMTsKKyAgfQorICBscERvc1Rhc2stPnN0YXRlPTM7CisgfQorIGlmIChscERvc1Rhc2stPnN0YXRlPT0zKSB7CisgIGlmIChyZWFkKGxwRG9zVGFzay0+cmVhZF9waXBlLCZscERvc1Rhc2stPlZNODYsc2l6ZW9mKGxwRG9zVGFzay0+Vk04NikpIT1zaXplb2YobHBEb3NUYXNrLT5WTTg2KSkgeworICAgaWYgKChlcnJubz09RUlOVFIpfHwoZXJybm89PUVBR0FJTikpIHJldHVybiAwOworICAgcmV0dXJuIC0xOworICB9CisvKiBnb3Qgb25lICovCisgIGxwRG9zVGFzay0+c3RhdGU9MTsKKyAgcmV0dXJuIDE7CisgfQorIHJldHVybiAwOworfQorCisjZW5kaWYgLyogbGludXggKi8KZGlmZiAtLWdpdCBhL2xvYWRlci9tYWluLmMgYi9sb2FkZXIvbWFpbi5jCmluZGV4IDVmNTkyYTYuLmQ4NTliZmQgMTAwNjQ0Ci0tLSBhL2xvYWRlci9tYWluLmMKKysrIGIvbG9hZGVyL21haW4uYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgImRjZS5oIgogI2luY2x1ZGUgInNoZWxsLmgiCiAjaW5jbHVkZSAid2lucHJvYy5oIgorI2luY2x1ZGUgInN5c2xldmVsLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogCkBAIC00NSw2ICs0Niw5IEBACiAgKi8KIEJPT0wzMiBNQUlOX0tlcm5lbEluaXQodm9pZCkKIHsKKyAgICAvKiBJbml0aWFsaXplIHN5c2xldmVsIGhhbmRsaW5nICovCisgICAgU1lTTEVWRUxfSW5pdCgpOworCiAgICAgLyogSW5pdGlhbGl6ZSBzaWduYWwgaGFuZGxpbmcgKi8KICAgICBpZiAoIVNJR05BTF9Jbml0KCkpIHJldHVybiBGQUxTRTsKIApAQCAtNTIsNyArNTYsNyBAQAogICAgIGlmICghUFJPRklMRV9Mb2FkV2luZUluaSgpKSByZXR1cm4gRkFMU0U7CiAKICAgICAgIC8qIEluaXRpYWxpemUgRE9TIG1lbW9yeSAqLwotICAgIGlmICghRE9TTUVNX0luaXQoKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghRE9TTUVNX0luaXQoMCkpIHJldHVybiBGQUxTRTsKIAogICAgIC8qIEluaXRpYWxpc2UgRE9TIGRyaXZlcyAqLwogICAgIGlmICghRFJJVkVfSW5pdCgpKSByZXR1cm4gRkFMU0U7CmRpZmYgLS1naXQgYS9sb2FkZXIvbW9kdWxlLmMgYi9sb2FkZXIvbW9kdWxlLmMKaW5kZXggYjZmODU5Yi4uMjFkNTY2NSAxMDA2NDQKLS0tIGEvbG9hZGVyL21vZHVsZS5jCisrKyBiL2xvYWRlci9tb2R1bGUuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgIm5lZXhlLmgiCiAjaW5jbHVkZSAicGVfaW1hZ2UuaCIKKyNpbmNsdWRlICJkb3NleGUuaCIKICNpbmNsdWRlICJwcm9jZXNzLmgiCiAjaW5jbHVkZSAidGhyZWFkLmgiCiAjaW5jbHVkZSAicmVzb3VyY2UuaCIKQEAgLTMxMyw2ICszMTQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbWRfbGluZSA9PSBOVUxMKSApOwogICAgICAgICBpZiAoKGhJbnN0YW5jZSA9PSAyMSkgJiYgY21kX2xpbmUpCiAgICAgICAgICAgICByZXR1cm4gUEVfTG9hZE1vZHVsZSggbmFtZSwgY21kX2xpbmUsIGVudiwgc2hvd19jbWQgKTsKKyNpZmRlZiBsaW51eAorICAgICAgICBpZiAoaEluc3RhbmNlID09IDExKQorICAgICAgICAgICAgcmV0dXJuIE1aX0xvYWRNb2R1bGUobmFtZSwgY21kX2xpbmUsIGVudiwgc2hvd19jbWQgKTsKKyNlbmRpZgogICAgIH0KIAogICAgIC8qIENyZWF0ZSBhIHRhc2sgZm9yIHRoaXMgaW5zdGFuY2UgKi8KQEAgLTMyMiwxMSArMzI3LDE1IEBACiAgICAgaWYgKGNtZF9saW5lICYmICEocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfTElCTU9EVUxFKSkKICAgICB7CiAgICAgICAgIFBEQjMyICpwZGI7CisgICAgICAgIFBST0NFU1NfSU5GT1JNQVRJT04gaW5mbzsKIAogCXBNb2R1bGUtPmZsYWdzIHw9IE5FX0ZGTEFHU19HVUk7CiAKICAgICAgICAgcGRiID0gUFJPQ0VTU19DcmVhdGUoIHBNb2R1bGUsIGNtZF9saW5lLCBlbnYsIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQcmV2SW5zdGFuY2UsIHNob3dfY21kICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUHJldkluc3RhbmNlLCBzaG93X2NtZCwgJmluZm8gKTsKKyAgICAgICAgLyogd2UgZG9uJ3QgbmVlZCB0aGUgaGFuZGxlcyBmb3Igbm93ICovCisgICAgICAgIENsb3NlSGFuZGxlKCBpbmZvLmhUaHJlYWQgKTsKKyAgICAgICAgQ2xvc2VIYW5kbGUoIGluZm8uaFByb2Nlc3MgKTsKICAgICAgICAgaWYgKHBkYiAmJiAoR2V0TnVtVGFza3MoKSA+IDEpKSBZaWVsZDE2KCk7CiAgICAgfQogCkBAIC0zMzcsNyArMzQ2LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgICAgTG9hZE1vZHVsZTE2ICAgIChLRVJORUwuNDUpCiAgKi8KLUhJTlNUQU5DRTE2IExvYWRNb2R1bGUxNiggTFBDU1RSIG5hbWUsIExQVk9JRCBwYXJhbUJsb2NrICkKK0hJTlNUQU5DRTE2IFdJTkFQSSBMb2FkTW9kdWxlMTYoIExQQ1NUUiBuYW1lLCBMUFZPSUQgcGFyYW1CbG9jayApCiB7CiAgICAgTE9BRFBBUkFNUyAqcGFyYW1zOwogICAgIExQU1RSIGNtZF9saW5lLCBuZXdfY21kX2xpbmU7CkBAIC0zNzksNyArMzg4LDcgQEAKICAqICBUaGlzIHNob3VsZCBnZXQgaW1wbGVtZW50ZWQgdmlhIENyZWF0ZVByb2Nlc3MgLS0gTU9EVUxFX0xvYWQKICAqICBpcyByZXNvbHV0ZWx5IDE2LWJpdC4KICAqLwotRFdPUkQgTG9hZE1vZHVsZTMyKCBMUENTVFIgbmFtZSwgTFBWT0lEIHBhcmFtQmxvY2sgKSAKK0RXT1JEIFdJTkFQSSBMb2FkTW9kdWxlMzIoIExQQ1NUUiBuYW1lLCBMUFZPSUQgcGFyYW1CbG9jayApIAogewogICAgIExPQURQQVJBTVMzMiAqcGFyYW1zID0gKExPQURQQVJBTVMzMiAqKXBhcmFtQmxvY2s7CiAjaWYgMApkaWZmIC0tZ2l0IGEvbG9hZGVyL25lL21vZHVsZS5jIGIvbG9hZGVyL25lL21vZHVsZS5jCmluZGV4IDBiZjQ2ZTQuLmMwODU2NzggMTAwNjQ0Ci0tLSBhL2xvYWRlci9uZS9tb2R1bGUuYworKysgYi9sb2FkZXIvbmUvbW9kdWxlLmMKQEAgLTEwMjAsMTMgKzEwMjAsMTcgQEAKICAqIEZpbmQgYSBtb2R1bGUgZnJvbSBhIHBhdGggbmFtZS4KICAqCiAgKiBSRVRVUk5TCisgKiAgIExPV09SRDoKICAqCXRoZSB3aW4xNiBtb2R1bGUgaGFuZGxlIGlmIGZvdW5kCiAgKiAJMCBpZiBub3QKKyAqICAgSElXT1JEICh1bmRvY3VtZW50ZWQsIHNlZSAiVW5kb2N1bWVudGVkIFdpbmRvd3MiLCBjaGFwdGVyIDUpOgorICoJQWx3YXlzIGhGaXJzdE1vZHVsZQogICovCi1ITU9EVUxFMTYgV0lOQVBJIFdJTjE2X0dldE1vZHVsZUhhbmRsZSggU0VHUFRSIG5hbWUgKQorRFdPUkQgV0lOQVBJIFdJTjE2X0dldE1vZHVsZUhhbmRsZSggU0VHUFRSIG5hbWUgKQogewotICAgIGlmIChISVdPUkQobmFtZSkgPT0gMCkgcmV0dXJuIEdldEV4ZVB0ciggKEhJTlNUQU5DRTE2KW5hbWUgKTsKLSAgICByZXR1cm4gR2V0TW9kdWxlSGFuZGxlMTYoIFBUUl9TRUdfVE9fTElOKG5hbWUpICk7CisgICAgaWYgKEhJV09SRChuYW1lKSA9PSAwKQorCXJldHVybiBNQUtFTE9ORyhHZXRFeGVQdHIoIChISU5TVEFOQ0UxNiluYW1lKSwgaEZpcnN0TW9kdWxlICk7CisgICAgcmV0dXJuIE1BS0VMT05HKEdldE1vZHVsZUhhbmRsZTE2KCBQVFJfU0VHX1RPX0xJTihuYW1lKSksIGhGaXJzdE1vZHVsZSApOwogfQogCiBITU9EVUxFMTYgV0lOQVBJIEdldE1vZHVsZUhhbmRsZTE2KCBMUENTVFIgbmFtZSApCmRpZmYgLS1naXQgYS9sb2FkZXIvbmUvc2VnbWVudC5jIGIvbG9hZGVyL25lL3NlZ21lbnQuYwppbmRleCAxYzQ3ZGQxLi5mZjkyZDVjIDEwMDY0NAotLS0gYS9sb2FkZXIvbmUvc2VnbWVudC5jCisrKyBiL2xvYWRlci9uZS9zZWdtZW50LmMKQEAgLTQyNSw4ICs0MjUsMTMgQEAKICAgICAgICAgLyogc29tZSBCb290QXBwIHByb2NzIG92ZXJ3cml0ZSB0aGUgc2VsZWN0b3Igb2YgZGdyb3VwICovCiAgICAgICAgIHBTZWdUYWJsZVtwTW9kdWxlLT5kZ3JvdXAgLSAxXS5zZWxlY3RvciA9IHNhdmVkX2Rncm91cDsKICAgICAgICAgdGhkYi0+Y3VyX3N0YWNrID0gb2xkc3RhY2s7Ci0gICAgICAgIGZvciAoaSA9IDI7IGkgPD0gcE1vZHVsZS0+c2VnX2NvdW50OyBpKyspCi0gICAgICAgICAgICBpZiAoIU5FX0xvYWRTZWdtZW50KCBwTW9kdWxlLCBpICkpIHJldHVybiBGQUxTRTsKKworCS8qIEZJWE1FCisJY29tbWVudGVkIG91dCBieSBBbmRyZWFzIE1vaHI7CisJc29tZSBzZWxmLWxvYWRpbmcgZXhlICgiQkxJTktFUiIpIHJlbGllcyBvbiBub24tcHJpbWFyeSBzZWdzIG5vdCBsb2FkZWQuCisJY29udGFjdCBtZSBpZiB5b3UgZXhwZXJpZW5jZSBwcm9ibGVtcyAqLworICAgICAgICAvKmZvciAoaSA9IDI7IGkgPD0gcE1vZHVsZS0+c2VnX2NvdW50OyBpKyspCisgICAgICAgICAgICBpZiAoIU5FX0xvYWRTZWdtZW50KCBwTW9kdWxlLCBpICkpIHJldHVybiBGQUxTRTsqLwogICAgIH0KICAgICBlbHNlCiAgICAgewpAQCAtNTgwLDcgKzU4NSw3IEBACiBzdGF0aWMgQk9PTDMyIE5FX0luaXRETEwoIFREQiogcFRhc2ssIE5FX01PRFVMRSAqcE1vZHVsZSApCiB7CiAgICAgU0VHVEFCTEVFTlRSWSAqcFNlZ1RhYmxlOwotICAgIFdPUkQgaEluc3QsIGRzLCBoZWFwLCBmczsKKyAgICBXT1JEIGhJbnN0LCBkcywgaGVhcDsKICAgICBDT05URVhUIGNvbnRleHQ7CiAKICAgICBwU2VnVGFibGUgPSBORV9TRUdfVEFCTEUoIHBNb2R1bGUgKTsKQEAgLTYxMSwxMyArNjE2LDExIEBACiAgICAgbWVtc2V0KCAmY29udGV4dCwgMCwgc2l6ZW9mKGNvbnRleHQpICk7CiAKICAgICBORV9HZXRETExJbml0UGFyYW1zKCBwTW9kdWxlLCAmaEluc3QsICZkcywgJmhlYXAgKTsKLSAgICBHRVRfRlMoIGZzICk7CiAKICAgICBFQ1hfcmVnKCZjb250ZXh0KSA9IGhlYXA7CiAgICAgRURJX3JlZygmY29udGV4dCkgPSBoSW5zdDsKICAgICBEU19yZWcoJmNvbnRleHQpICA9IGRzOwogICAgIEVTX3JlZygmY29udGV4dCkgID0gZHM7ICAgLyogd2hvIGtub3dzIC4uLiAqLwotICAgIEZTX3JlZygmY29udGV4dCkgID0gZnM7CiAKICAgICBDU19yZWcoJmNvbnRleHQpICA9IHBTZWdUYWJsZVtwTW9kdWxlLT5jcy0xXS5zZWxlY3RvcjsKICAgICBFSVBfcmVnKCZjb250ZXh0KSA9IHBNb2R1bGUtPmlwOwpAQCAtNjQxLDcgKzY0NCw3IEBACiAKIHN0YXRpYyB2b2lkIE5FX0NhbGxEbGxFbnRyeVBvaW50KCBORV9NT0RVTEUgKnBNb2R1bGUsIERXT1JEIGR3UmVhc29uICkKIHsKLSAgICBXT1JEIGhJbnN0LCBkcywgaGVhcCwgZnM7CisgICAgV09SRCBoSW5zdCwgZHMsIGhlYXA7CiAgICAgRkFSUFJPQzE2IGVudHJ5UG9pbnQ7CiAgICAgV09SRCBvcmRpbmFsOwogICAgIENPTlRFWFQgY29udGV4dDsKQEAgLTY1NSwxMSArNjU4LDkgQEAKICAgICBtZW1zZXQoICZjb250ZXh0LCAwLCBzaXplb2YoY29udGV4dCkgKTsKIAogICAgIE5FX0dldERMTEluaXRQYXJhbXMoIHBNb2R1bGUsICZoSW5zdCwgJmRzLCAmaGVhcCApOwotICAgIEdFVF9GUyggZnMgKTsKIAogICAgIERTX3JlZygmY29udGV4dCkgPSBkczsKICAgICBFU19yZWcoJmNvbnRleHQpID0gZHM7ICAgLyogd2hvIGtub3dzIC4uLiAqLwotICAgIEZTX3JlZygmY29udGV4dCkgPSBmczsKIAogICAgIENTX3JlZygmY29udGV4dCkgPSBISVdPUkQoZW50cnlQb2ludCk7CiAgICAgSVBfcmVnKCZjb250ZXh0KSA9IExPV09SRChlbnRyeVBvaW50KTsKQEAgLTc0NSw2ICs3NDYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1vZHVsZS0+c2VsZiwgRkFMU0UsIEZBTFNFLCBGQUxTRSApOwogICAgIGlmICghaE5ld0luc3RhbmNlKSByZXR1cm4gMDsKICAgICBwU2VnbWVudC0+c2VsZWN0b3IgPSBoTmV3SW5zdGFuY2U7CisgICAgcFNlZ21lbnQtPmZsYWdzIHw9IE5FX1NFR0ZMQUdTX0FMTE9DQVRFRDsKICAgICByZXR1cm4gaE5ld0luc3RhbmNlOwogfQogCkBAIC04MjEsNiArODIzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgLypwU2VnbWVudC0+ZmxhZ3MgJiBORV9TRUdGTEFHU19SRUFET05MWSovICk7CiAgICAgICAgIGlmICghcFNlZ21lbnQtPnNlbGVjdG9yKSByZXR1cm4gRkFMU0U7CisJcFNlZ21lbnQtPmZsYWdzIHw9IE5FX1NFR0ZMQUdTX0FMTE9DQVRFRDsKICAgICB9CiAKICAgICBwTW9kdWxlLT5kZ3JvdXBfZW50cnkgPSBwTW9kdWxlLT5kZ3JvdXAgPyBwTW9kdWxlLT5zZWdfdGFibGUgKwpkaWZmIC0tZ2l0IGEvbG9hZGVyL3BlX2ltYWdlLmMgYi9sb2FkZXIvcGVfaW1hZ2UuYwppbmRleCA1ZDVhNTFjLi43NmRjODdlIDEwMDY0NAotLS0gYS9sb2FkZXIvcGVfaW1hZ2UuYworKysgYi9sb2FkZXIvcGVfaW1hZ2UuYwpAQCAtODU0LDEwICs4NTQsMTQgQEAKICAgICBpZiAoY21kX2xpbmUgJiYKICAgICAgICAgIShQRV9IRUFERVIoaE1vZHVsZTMyKS0+RmlsZUhlYWRlci5DaGFyYWN0ZXJpc3RpY3MgJiBJTUFHRV9GSUxFX0RMTCkpCiAgICAgeworICAgICAgICBQUk9DRVNTX0lORk9STUFUSU9OIGluZm87CiAgICAgICAgIFBEQjMyICpwZGIgPSBQUk9DRVNTX0NyZWF0ZSggcE1vZHVsZSwgY21kX2xpbmUsIGVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSW5zdGFuY2UsIDAsIHNob3dfY21kICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEluc3RhbmNlLCAwLCBzaG93X2NtZCwgJmluZm8gKTsKICAgICAgICAgVERCICpwVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIHBkYi0+dGFzayApOwogICAgICAgICB0aGRiID0gcFRhc2stPnRoZGI7CisgICAgICAgIC8qIHdlIGRvbid0IG5lZWQgdGhlIGhhbmRsZXMgZm9yIG5vdyAqLworICAgICAgICBDbG9zZUhhbmRsZSggaW5mby5oVGhyZWFkICk7CisgICAgICAgIENsb3NlSGFuZGxlKCBpbmZvLmhQcm9jZXNzICk7CiAgICAgfQogCiAgICAgcHJvY2VzcyA9IHRoZGItPnByb2Nlc3M7CmRpZmYgLS1naXQgYS9sb2FkZXIvcmVzb3VyY2UuYyBiL2xvYWRlci9yZXNvdXJjZS5jCmluZGV4IDRmMGQyOGQuLmJmZjAwYjkgMTAwNjQ0Ci0tLSBhL2xvYWRlci9yZXNvdXJjZS5jCisrKyBiL2xvYWRlci9yZXNvdXJjZS5jCkBAIC01NTAsNyArNTUwLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKglMb2FkTWVzc2FnZTMyQQkJKGludGVybmFsKQogICovCi1JTlQzMiBMb2FkTWVzc2FnZTMyQSggSE1PRFVMRTMyIGluc3RhbmNlLCBVSU5UMzIgaWQsIFdPUkQgbGFuZywKK0lOVDMyIFdJTkFQSSBMb2FkTWVzc2FnZTMyQSggSE1PRFVMRTMyIGluc3RhbmNlLCBVSU5UMzIgaWQsIFdPUkQgbGFuZywKICAgICAgICAgICAgICAgICAgICAgICBMUFNUUiBidWZmZXIsIElOVDMyIGJ1ZmxlbiApCiB7CiAgICAgSEdMT0JBTDMyCWhtZW07CkBAIC02MTcsNyArNjE3LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKglMb2FkTWVzc2FnZTMyVwkoaW50ZXJuYWwpCiAgKi8KLUlOVDMyIExvYWRNZXNzYWdlMzJXKCBITU9EVUxFMzIgaW5zdGFuY2UsIFVJTlQzMiBpZCwgV09SRCBsYW5nLAorSU5UMzIgV0lOQVBJIExvYWRNZXNzYWdlMzJXKCBITU9EVUxFMzIgaW5zdGFuY2UsIFVJTlQzMiBpZCwgV09SRCBsYW5nLAogICAgICAgICAgICAgICAgICAgICAgIExQV1NUUiBidWZmZXIsIElOVDMyIGJ1ZmxlbiApCiB7CiAgICAgSU5UMzIgcmV0dmFsOwpkaWZmIC0tZ2l0IGEvbG9hZGVyL3Rhc2suYyBiL2xvYWRlci90YXNrLmMKaW5kZXggODRkNWIxZC4uN2QxODE0ZCAxMDA2NDQKLS0tIGEvbG9hZGVyL3Rhc2suYworKysgYi9sb2FkZXIvdGFzay5jCkBAIC0zMCw3ICszMCw5IEBACiAjaW5jbHVkZSAid2lubnQuaCIKICNpbmNsdWRlICJ3aW5zb2NrLmgiCiAjaW5jbHVkZSAidGhyZWFkLmgiCisjaW5jbHVkZSAic3lzbGV2ZWwuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImRvc2V4ZS5oIgogI2luY2x1ZGUgImRkZV9wcm9jLmgiCiAjaW5jbHVkZSAic2VydmVyLmgiCiAKQEAgLTIyNyw4ICsyMjksMTAgQEAKIAogICAgIFNFVF9DVVJfVEhSRUFEKCBwVGFzay0+dGhkYiApOwogICAgIENMSUVOVF9Jbml0VGhyZWFkKCk7Ci0gICAgLyogVGVybWluYXRlIHRoZSBzdGFjayBmcmFtZSAqLwotICAgIFRIUkVBRF9TVEFDSzE2KHBUYXNrLT50aGRiKS0+ZnJhbWUzMiA9IE5VTEw7CisKKyAgICAvKiBUZXJtaW5hdGUgdGhlIHN0YWNrIGZyYW1lIGNoYWluICovCisgICAgbWVtc2V0KFRIUkVBRF9TVEFDSzE2KCBwVGFzay0+dGhkYiApLCAnXDAnLCBzaXplb2YoU1RBQ0sxNkZSQU1FKSk7CisKICAgICBpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfV0lOMzIpCiAgICAgewogICAgICAgICAvKiBGSVhNRTogYWxsIHRoaXMgaXMgYW4gdWdseSBoYWNrICovCkBAIC0yNDUsNiArMjQ5LDE5IEBACiAgICAgICAgIGV4aXRfY29kZSA9IGVudHJ5KCk7CiAgICAgICAgIFRBU0tfS2lsbEN1cnJlbnRUYXNrKCBleGl0X2NvZGUgKTsKICAgICB9CisjaWZkZWYgbGludXgKKyAgICBlbHNlIGlmIChwTW9kdWxlLT5scERvc1Rhc2spCisgICAgeworICAgICAgICBpbnQgc3RhdDsKKworICAgICAgICB3aGlsZSAoKHN0YXQgPSBNWl9SdW5Nb2R1bGUocE1vZHVsZS0+bHBEb3NUYXNrKSkgPj0gMCkKKyAgICAgICAgICAgIGlmIChzdGF0ID4gMCAmJiBET1NWTV9Qcm9jZXNzKHBNb2R1bGUtPmxwRG9zVGFzaykgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIE1aX0tpbGxNb2R1bGUocE1vZHVsZS0+bHBEb3NUYXNrKTsKKyAgICAgICAgVEFTS19LaWxsQ3VycmVudFRhc2soIDAgKTsKKyAgICB9CisjZW5kaWYKICAgICBlbHNlCiAgICAgewogICAgICAgICAvKiBSZWdpc3RlcnMgYXQgaW5pdGlhbGl6YXRpb24gbXVzdCBiZToKQEAgLTMxNSw2ICszMzIsOCBAQAogCiAgICAgaWYgKHBNb2R1bGUtPmZsYWdzICYgTkVfRkZMQUdTX1dJTjMyKQogICAgIAlwVGFzay0+ZmxhZ3MgCXw9IFREQkZfV0lOMzI7CisgICAgaWYgKHBNb2R1bGUtPmxwRG9zVGFzaykKKyAgICAJcFRhc2stPmZsYWdzIAl8PSBUREJGX1dJTk9MREFQOwogCiAgICAgcFRhc2stPnZlcnNpb24gICAgICAgPSBwTW9kdWxlLT5leHBlY3RlZF92ZXJzaW9uOwogICAgIHBUYXNrLT5oSW5zdGFuY2UgICAgID0gaEluc3RhbmNlOwpAQCAtMzkzLDEzICs0MTIsMTUgQEAKICAgICAgICAgc3AgPSBwU2VnVGFibGVbcE1vZHVsZS0+c3MtMV0ubWluc2l6ZSArIHBNb2R1bGUtPnN0YWNrX3NpemU7CiAgICAgc3AgJj0gfjE7CiAgICAgcFRhc2stPnRoZGItPmN1cl9zdGFjayA9IFBUUl9TRUdfT0ZGX1RPX1NFR1BUUiggcFRhc2stPmhJbnN0YW5jZSwgc3AgKTsKLSAgICBwVGFzay0+dGhkYi0+Y3VyX3N0YWNrIC09IHNpemVvZihTVEFDSzE2RlJBTUUpICsgc2l6ZW9mKFNUQUNLMzJGUkFNRSAqKTsKKyAgICBwVGFzay0+dGhkYi0+Y3VyX3N0YWNrIC09IDIqc2l6ZW9mKFNUQUNLMTZGUkFNRSk7CiAgICAgZnJhbWUxNiA9IChTVEFDSzE2RlJBTUUgKilQVFJfU0VHX1RPX0xJTiggcFRhc2stPnRoZGItPmN1cl9zdGFjayApOwogICAgIGZyYW1lMTYtPmVicCA9IHNwICsgKGludCkmKChTVEFDSzE2RlJBTUUgKikwKS0+YnA7CiAgICAgZnJhbWUxNi0+YnAgPSBMT1dPUkQoZnJhbWUxNi0+ZWJwKTsKICAgICBmcmFtZTE2LT5kcyA9IGZyYW1lMTYtPmVzID0gcFRhc2stPmhJbnN0YW5jZTsKKyAgICBmcmFtZTE2LT5mcyA9IDA7CiAgICAgZnJhbWUxNi0+ZW50cnlfcG9pbnQgPSAwOwogICAgIGZyYW1lMTYtPmVudHJ5X2NzID0gMDsKKyAgICBmcmFtZTE2LT5tdXRleF9jb3VudCA9IDE7IC8qIFRBU0tfUmVzY2hlZHVsZSBpcyBjYWxsZWQgZnJvbSAxNi1iaXQgY29kZSAqLwogICAgIC8qIFRoZSByZW1haW5pbmcgZmllbGRzIHdpbGwgYmUgaW5pdGlhbGl6ZWQgaW4gVEFTS19SZXNjaGVkdWxlICovCiAKICAgICAvKiBDcmVhdGUgdGhlIDMyLWJpdCBzdGFjayBmcmFtZSAqLwpAQCAtNTQ2LDYgKzU2Nyw4IEBACiAgICAgSFRBU0sxNiBoVGFzayA9IDA7CiAgICAgU1RBQ0sxNkZSQU1FICpuZXdmcmFtZTE2OwogCisgICAgU1lTTEVWRUxfUmVsZWFzZVdpbjE2TG9jaygpOworCiAjaWZkZWYgQ09ORklHX0lQQwogICAgIGRkZV9yZXNjaGVkdWxlKCk7CiAjZW5kaWYKQEAgLTU5OSw2ICs2MjIsNyBAQAogICAgIGlmIChoVGFzayA9PSBoQ3VycmVudFRhc2spIAogICAgIHsKICAgICAgICBUUkFDRSh0YXNrLCAicmV0dXJuaW5nIHRvIHRoZSBjdXJyZW50IHRhc2soJTA0eClcbiIsIGhUYXNrICk7CisgICAgICAgU1lTTEVWRUxfUmVzdG9yZVdpbjE2TG9jaygpOwogICAgICAgIHJldHVybjsgIC8qIE5vdGhpbmcgdG8gZG8gKi8KICAgICB9CiAgICAgcE5ld1Rhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBoVGFzayApOwpAQCAtNjM0LDYgKzY1OCw4IEBACiAgICAgaEN1cnJlbnRUYXNrID0gaFRhc2s7CiAgICAgU0VUX0NVUl9USFJFQUQoIHBOZXdUYXNrLT50aGRiICk7CiAgICAgcE5ld1Rhc2stPnNzX3NwID0gcE5ld1Rhc2stPnRoZGItPmN1cl9zdGFjazsKKworICAgIFNZU0xFVkVMX1Jlc3RvcmVXaW4xNkxvY2soKTsKIH0KIAogCkBAIC02OTYsNyArNzIyLDEzIEBACiAgICAgICAgICAqIHNpICAgICBpbnN0YW5jZSBoYW5kbGUgb2YgdGhlIHByZXZpb3VzIGluc3RhbmNlCiAgICAgICAgICAqIGRpICAgICBpbnN0YW5jZSBoYW5kbGUgb2YgdGhlIG5ldyB0YXNrCiAgICAgICAgICAqIGVzOmJ4ICBwb2ludGVyIHRvIGNvbW1hbmQtbGluZSBpbnNpZGUgUFNQCisgICAgICAgICAqCisgICAgICAgICAqIDAgKD0lYnApIGlzIHB1c2hlZCBvbiB0aGUgc3RhY2sKICAgICAgICAgICovCisgICAgICAgIFNFR1BUUiBwdHIgPSBTVEFDSzE2X1BVU0goIHBUYXNrLT50aGRiLCBzaXplb2YoV09SRCkgKTsKKyAgICAgICAgKihXT1JEICopUFRSX1NFR19UT19MSU4ocHRyKSA9IDA7CisgICAgICAgIFNQX3JlZyhjb250ZXh0KSAtPSAyOworCiAgICAgICAgIEVBWF9yZWcoY29udGV4dCkgPSAxOwogICAgICAgICAKIAlpZiAoIXBUYXNrLT5wZGIuY21kTGluZVswXSkgRUJYX3JlZyhjb250ZXh0KSA9IDB4ODA7CmRpZmYgLS1naXQgYS9tZW1vcnkvYXRvbS5jIGIvbWVtb3J5L2F0b20uYwppbmRleCBmMjc0NGNiLi5jM2FlYjliIDEwMDY0NAotLS0gYS9tZW1vcnkvYXRvbS5jCisrKyBiL21lbW9yeS9hdG9tLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlICJsZHQuaCIKICNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCiAjaW5jbHVkZSAidXNlci5oIgorI2luY2x1ZGUgImRlYnVnLmgiCiAKICNpZmRlZiBDT05GSUdfSVBDCiAjaW5jbHVkZSAiZGRlX2F0b20uaCIKQEAgLTEzNiw2ICsxMzcsOCBAQAogKSB7CiAgICAgV09SRCBpLCBoYXNoID0gMDsKIAorICAgIFRSQUNFKGF0b20sIiV4LCAlcywgJXhcbiIsIGVudHJpZXMsIHN0ciwgbGVuKTsKKyAgICAKICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIGhhc2ggXj0gdG91cHBlcihzdHJbaV0pICsgaTsKICAgICByZXR1cm4gaGFzaCAlIGVudHJpZXM7CiB9CkBAIC0xNjMsNiArMTY2LDggQEAKICAgICBBVE9NVEFCTEUgKiB0YWJsZTsKICAgICBpbnQgbGVuLCBhZV9sZW47CiAKKyAgICBUUkFDRShhdG9tLCIweCV4LCAlc1xuIiwgc2VsZWN0b3IsIHN0cik7CisgICAgCiAgICAgaWYgKHN0clswXSA9PSAnIycpIHJldHVybiBhdG9pKCAmc3RyWzFdICk7ICAvKiBDaGVjayBmb3IgaW50ZWdlciBhdG9tICovCiAgICAgaWYgKChsZW4gPSBzdHJsZW4oIHN0ciApKSA+IE1BWF9BVE9NX0xFTikgbGVuID0gTUFYX0FUT01fTEVOOwogICAgIGlmICghKHRhYmxlID0gQVRPTV9HZXRUYWJsZSggc2VsZWN0b3IsIFRSVUUgKSkpIHJldHVybiAwOwpAQCAtMTc1LDYgKzE4MCw3IEBACiAJICAgICghbHN0cm5jbXBpMzJBKCBlbnRyeVB0ci0+c3RyLCBzdHIsIGxlbiApKSkKIAl7CiAJICAgIGVudHJ5UHRyLT5yZWZDb3VudCsrOworICAgICAgICBUUkFDRShhdG9tLCItLSBleGlzdGluZyAweCV4XG4iLCBlbnRyeSk7CiAJICAgIHJldHVybiBIQU5ETEVUT0FUT00oIGVudHJ5ICk7CiAJfQogCWVudHJ5ID0gZW50cnlQdHItPm5leHQ7CkBAIC0xOTEsNiArMTk3LDcgQEAKICAgICBlbnRyeVB0ci0+bGVuZ3RoID0gbGVuOwogICAgIHN0cm5jcHkoIGVudHJ5UHRyLT5zdHIsIHN0ciwgYWVfbGVuIC0gc2l6ZW9mKEFUT01FTlRSWSkgKyAxKTsgLyogYWx3YXlzIHVzZSBzdHJuY3B5ICgnXDAncyBwYWRkaW5nKSAqLwogICAgIHRhYmxlLT5lbnRyaWVzW2hhc2hdID0gZW50cnk7CisgICAgVFJBQ0UoYXRvbSwiLS0gbmV3IDB4JXhcbiIsIGVudHJ5KTsKICAgICByZXR1cm4gSEFORExFVE9BVE9NKCBlbnRyeSApOwogfQogCkBAIC0yMDksNiArMjE2LDggQEAKICAgICBBVE9NVEFCTEUgKiB0YWJsZTsKICAgICBIQU5ETEUxNiBlbnRyeSwgKnByZXZFbnRyeTsKICAgICBXT1JEIGhhc2g7CisKKyAgICBUUkFDRShhdG9tLCIweCV4LCAweCV4XG4iLCBzZWxlY3RvciwgYXRvbSk7CiAgICAgCiAgICAgaWYgKGF0b20gPCBNSU5fU1RSX0FUT00pIHJldHVybiAwOyAgLyogSW50ZWdlciBhdG9tICovCiAKQEAgLTI1MSw2ICsyNjAsOCBAQAogICAgIEhBTkRMRTE2IGVudHJ5OwogICAgIGludCBsZW47CiAKKyAgICBUUkFDRShhdG9tLCIleCwgJXNcbiIsIHNlbGVjdG9yLCBzdHIpOworCiAgICAgaWYgKHN0clswXSA9PSAnIycpIHJldHVybiBhdG9pKCAmc3RyWzFdICk7ICAvKiBDaGVjayBmb3IgaW50ZWdlciBhdG9tICovCiAgICAgaWYgKChsZW4gPSBzdHJsZW4oIHN0ciApKSA+IDI1NSkgbGVuID0gMjU1OwogICAgIGlmICghKHRhYmxlID0gQVRPTV9HZXRUYWJsZSggc2VsZWN0b3IsIEZBTFNFICkpKSByZXR1cm4gMDsKQEAgLTI2MSw5ICsyNzIsMTIgQEAKIAlBVE9NRU5UUlkgKiBlbnRyeVB0ciA9IEFUT01fTWFrZVB0ciggc2VsZWN0b3IsIGVudHJ5ICk7CiAJaWYgKChlbnRyeVB0ci0+bGVuZ3RoID09IGxlbikgJiYgCiAJICAgICghbHN0cm5jbXBpMzJBKCBlbnRyeVB0ci0+c3RyLCBzdHIsIGxlbiApKSkKKyAgICB7ICAgIFRSQUNFKGF0b20sIi0tIGZvdW5kICV4XG4iLCBlbnRyeSk7CiAJICAgIHJldHVybiBIQU5ETEVUT0FUT00oIGVudHJ5ICk7CisgICAgfQogCWVudHJ5ID0gZW50cnlQdHItPm5leHQ7CiAgICAgfQorICAgIFRSQUNFKGF0b20sIi0tIG5vdCBmb3VuZFxuIik7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTI4Nyw2ICszMDEsOCBAQAogICAgIFVJTlQzMiBsZW47CiAgICAgY2hhciB0ZXh0WzhdOwogICAgIAorICAgIFRSQUNFKGF0b20sIiV4LCAleFxuIiwgc2VsZWN0b3IsIGF0b20pOworICAgIAogICAgIGlmICghY291bnQpIHJldHVybiAwOwogICAgIGlmIChhdG9tIDwgTUlOX1NUUl9BVE9NKQogICAgIHsKQEAgLTI5Niw3ICszMTIsNyBAQAogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgICBpZiAoISh0YWJsZSA9IEFUT01fR2V0VGFibGUoIHNlbGVjdG9yLCBGQUxTRSApKSkgcmV0dXJuIDA7CisgICAgICAgaWYgKCEodGFibGUgPSBBVE9NX0dldFRhYmxlKCBzZWxlY3RvciwgRkFMU0UgKSkpIHJldHVybiAwOwogCWVudHJ5ID0gQVRPTVRPSEFORExFKCBhdG9tICk7CiAJZW50cnlQdHIgPSBBVE9NX01ha2VQdHIoIHNlbGVjdG9yLCBlbnRyeSApOwogCWxlbiA9IGVudHJ5UHRyLT5sZW5ndGg7CmRpZmYgLS1naXQgYS9tZW1vcnkvZ2xvYmFsLmMgYi9tZW1vcnkvZ2xvYmFsLmMKaW5kZXggYjRiNGQwNS4uZjJiYThmMCAxMDA2NDQKLS0tIGEvbWVtb3J5L2dsb2JhbC5jCisrKyBiL21lbW9yeS9nbG9iYWwuYwpAQCAtNzE1LDcgKzcxNSw3IEBACiAgICAgICAgICAgICAgRFdPUkQgc2l6ZSAvKiBbaW5dIE51bWJlciBvZiBieXRlcyB0byBiZSBhbGxvY2F0ZWQgKi8KICkgewogICAgVUlOVDE2ICAgIHVQYXJhZ3JhcGg7Ci0gICBMUFZPSUQgICAgbHBCbG9jayA9IERPU01FTV9HZXRCbG9jayggc2l6ZSwgJnVQYXJhZ3JhcGggKTsKKyAgIExQVk9JRCAgICBscEJsb2NrID0gRE9TTUVNX0dldEJsb2NrKCAwLCBzaXplLCAmdVBhcmFncmFwaCApOwogCiAgICBpZiggbHBCbG9jayApCiAgICB7CkBAIC03NDQsNyArNzQ0LDcgQEAKICAgIGlmKCBibG9jayAmJiBibG9jayA8IDB4MTAwMDAwICkgCiAgICB7CiAgICAgICAgTFBWT0lEIGxwQmxvY2sgPSBET1NNRU1fTWFwRG9zVG9MaW5lYXIoIGJsb2NrICk7Ci0gICAgICAgaWYoIERPU01FTV9GcmVlQmxvY2soIGxwQmxvY2sgKSApCisgICAgICAgaWYoIERPU01FTV9GcmVlQmxvY2soIDAsIGxwQmxvY2sgKSApCiAJICAgR0xPQkFMX0ZyZWVCbG9jayggc2VsICk7CiAgICAgICAgc2VsID0gMDsKICAgIH0KZGlmZiAtLWdpdCBhL21lbW9yeS9oZWFwLmMgYi9tZW1vcnkvaGVhcC5jCmluZGV4IDY1ODVhYzUuLjNiY2MzOTYgMTAwNjQ0Ci0tLSBhL21lbW9yeS9oZWFwLmMKKysrIGIvbWVtb3J5L2hlYXAuYwpAQCAtMTMxMCw4ICsxMzEwLDggQEAKICAqLwogTFBTVFIgSEVBUF9zdHJkdXBBKCBIQU5ETEUzMiBoZWFwLCBEV09SRCBmbGFncywgTFBDU1RSIHN0ciApCiB7Ci0gICAgTFBTVFIgcCA9IEhFQVBfeGFsbG9jKCBoZWFwLCBmbGFncywgbHN0cmxlbjMyQShzdHIpICsgMSApOwotICAgIGxzdHJjcHkzMkEoIHAsIHN0ciApOworICAgIExQU1RSIHAgPSBIRUFQX3hhbGxvYyggaGVhcCwgZmxhZ3MsIHN0cmxlbihzdHIpICsgMSApOworICAgIHN0cmNweSggcCwgc3RyICk7CiAgICAgcmV0dXJuIHA7CiB9CiAKQEAgLTEzMzYsNyArMTMzNiw3IEBACiAgICAgTFBXU1RSIHJldDsKIAogICAgIGlmICghc3RyKSByZXR1cm4gTlVMTDsKLSAgICByZXQgPSBIRUFQX3hhbGxvYyggaGVhcCwgZmxhZ3MsIChsc3RybGVuMzJBKHN0cikrMSkgKiBzaXplb2YoV0NIQVIpICk7CisgICAgcmV0ID0gSEVBUF94YWxsb2MoIGhlYXAsIGZsYWdzLCAoc3RybGVuKHN0cikrMSkgKiBzaXplb2YoV0NIQVIpICk7CiAgICAgbHN0cmNweUF0b1coIHJldCwgc3RyICk7CiAgICAgcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL21lbW9yeS9zZWxlY3Rvci5jIGIvbWVtb3J5L3NlbGVjdG9yLmMKaW5kZXggZGJlNjhmZS4uODU5Y2M2YSAxMDA2NDQKLS0tIGEvbWVtb3J5L3NlbGVjdG9yLmMKKysrIGIvbWVtb3J5L3NlbGVjdG9yLmMKQEAgLTE3OSw4ICsxNzksNiBAQAogICAgICAgICAgICAgV0FSTihzZWxlY3RvciwgIkZyZWVpbmcgJSVmcyBzZWxlY3RvciAoJTA0eCksIG5vdCBnb29kLlxuIiwgZnMgKTsKICAgICAgICAgICAgIFNFVF9GUyggMCApOwogICAgICAgICB9Ci0gICAgICAgIGZzID0gVEhSRUFEX0N1cnJlbnQoKS0+c2F2ZWRfZnM7Ci0gICAgICAgIGlmICgoZnMgPj0gc2VsKSAmJiAoZnMgPCBuZXh0c2VsKSkgVEhSRUFEX0N1cnJlbnQoKS0+c2F2ZWRfZnMgPSAwOwogICAgICAgICBHRVRfR1MoZ3MpOwogICAgICAgICBpZiAoKGdzID49IHNlbCkgJiYgKGdzIDwgbmV4dHNlbCkpIFNFVF9HUyggMCApOwogICAgIH0KQEAgLTE5OSw2ICsxOTcsNyBAQAogICAgIHsKICAgICAgICAgaWYgKChmcmFtZS0+ZHMgPj0gc2VsKSAmJiAoZnJhbWUtPmRzIDwgbmV4dHNlbCkpIGZyYW1lLT5kcyA9IDA7CiAgICAgICAgIGlmICgoZnJhbWUtPmVzID49IHNlbCkgJiYgKGZyYW1lLT5lcyA8IG5leHRzZWwpKSBmcmFtZS0+ZXMgPSAwOworICAgICAgICBpZiAoKGZyYW1lLT5mcyA+PSBzZWwpICYmIChmcmFtZS0+ZnMgPCBuZXh0c2VsKSkgZnJhbWUtPmZzID0gMDsKICAgICAgICAgZnJhbWUgPSBQVFJfU0VHX1RPX0xJTiggZnJhbWUtPmZyYW1lMzItPmZyYW1lMTYgKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9tZW1vcnkvdmlydHVhbC5jIGIvbWVtb3J5L3ZpcnR1YWwuYwppbmRleCA0MTRlOWNhLi44MDEyMzdjIDEwMDY0NAotLS0gYS9tZW1vcnkvdmlydHVhbC5jCisrKyBiL21lbW9yeS92aXJ0dWFsLmMKQEAgLTgxNyw3ICs4MTcsNyBAQAogKSB7CiAgICAgQk9PTDMyIHJldCA9IEZBTFNFOwogCi0gICAgUERCMzIgKnBkYiA9IFBST0NFU1NfR2V0UHRyKCBoYW5kbGUsIFBST0NFU1NfVk1fT1BFUkFUSU9OICk7CisgICAgUERCMzIgKnBkYiA9IFBST0NFU1NfR2V0UHRyKCBoYW5kbGUsIFBST0NFU1NfVk1fT1BFUkFUSU9OLCBOVUxMICk7CiAgICAgaWYgKHBkYikKICAgICB7CiAgICAgICAgIGlmIChwZGIgPT0gUFJPQ0VTU19DdXJyZW50KCkpCkBAIC05MTQsNyArOTE0LDcgQEAKICkgewogICAgIERXT1JEIHJldCA9IGxlbjsKIAotICAgIFBEQjMyICpwZGIgPSBQUk9DRVNTX0dldFB0ciggaGFuZGxlLCBQUk9DRVNTX1FVRVJZX0lORk9STUFUSU9OICk7CisgICAgUERCMzIgKnBkYiA9IFBST0NFU1NfR2V0UHRyKCBoYW5kbGUsIFBST0NFU1NfUVVFUllfSU5GT1JNQVRJT04sIE5VTEwgKTsKICAgICBpZiAocGRiKQogICAgIHsKICAgICAgICAgaWYgKHBkYiA9PSBQUk9DRVNTX0N1cnJlbnQoKSkKQEAgLTEwODksMTMgKzEwODksMTUgQEAKICAgICAvKiBGaXJzdCBzZWFyY2ggZm9yIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIG5hbWUgKi8KIAogICAgIEszMk9CSiAqb2JqID0gSzMyT0JKX0ZpbmROYW1lKCBuYW1lICk7CisKKyAgICBTZXRMYXN0RXJyb3IoMCk7IC8qIFdpbjk1IGRvZXMgdGhhdCBmb3Igc29tZSBmdW5jdGlvbnMsIGxpa2UgQ0ZNICovCiAgICAgaWYgKG9iaikKICAgICB7CiAgICAgICAgIGlmIChvYmotPnR5cGUgPT0gSzMyT0JKX01FTV9NQVBQRURfRklMRSkKICAgICAgICAgewogICAgICAgICAgICAgU2V0TGFzdEVycm9yKCBFUlJPUl9BTFJFQURZX0VYSVNUUyApOwogICAgICAgICAgICAgaGFuZGxlID0gSEFORExFX0FsbG9jKCBQUk9DRVNTX0N1cnJlbnQoKSwgb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX01BUF9BTExfQUNDRVNTIC8qRklYTUUqLywgaW5oZXJpdCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX01BUF9BTExfQUNDRVNTIC8qRklYTUUqLywgaW5oZXJpdCwgLTEgKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKQEAgLTExNDUsNyArMTE0Nyw3IEBACiAgICAgICAgICAgICAoKHByb3RlY3QgJiAweGZmKSA9PSBQQUdFX0VYRUNVVEVfV1JJVEVDT1BZKSkKICAgICAgICAgICAgICAgICBhY2Nlc3MgfD0gR0VORVJJQ19XUklURTsKICAgICAgICAgaWYgKCEob2JqID0gSEFORExFX0dldE9ialB0ciggUFJPQ0VTU19DdXJyZW50KCksIGhGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLMzJPQkpfRklMRSwgYWNjZXNzICkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLMzJPQkpfRklMRSwgYWNjZXNzLCBOVUxMICkpKQogICAgICAgICAgICAgZ290byBlcnJvcjsKIAogICAgICAgICBpZiAoIUdldEZpbGVJbmZvcm1hdGlvbkJ5SGFuZGxlKCBoRmlsZSwgJmluZm8gKSkgZ290byBlcnJvcjsKQEAgLTExNzcsNyArMTE3OSw3IEBACiAKICAgICBpZiAoIUszMk9CSl9BZGROYW1lKCAmbWFwcGluZy0+aGVhZGVyLCBuYW1lICkpIGhhbmRsZSA9IDA7CiAgICAgZWxzZSBoYW5kbGUgPSBIQU5ETEVfQWxsb2MoIFBST0NFU1NfQ3VycmVudCgpLCAmbWFwcGluZy0+aGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX01BUF9BTExfQUNDRVNTIC8qRklYTUUqLywgaW5oZXJpdCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX01BUF9BTExfQUNDRVNTIC8qRklYTUUqLywgaW5oZXJpdCwgLTEgKTsKICAgICBLMzJPQkpfRGVjQ291bnQoICZtYXBwaW5nLT5oZWFkZXIgKTsKICAgICByZXR1cm4gaGFuZGxlOwogCkBAIC0xMjIyLDcgKzEyMjQsNyBAQAogICAgIFNZU1RFTV9MT0NLKCk7CiAgICAgaWYgKChvYmogPSBLMzJPQkpfRmluZE5hbWVUeXBlKCBuYW1lLCBLMzJPQkpfTUVNX01BUFBFRF9GSUxFICkpKQogICAgIHsKLSAgICAgICAgaGFuZGxlID0gSEFORExFX0FsbG9jKCBQUk9DRVNTX0N1cnJlbnQoKSwgb2JqLCBhY2Nlc3MsIGluaGVyaXQgKTsKKyAgICAgICAgaGFuZGxlID0gSEFORExFX0FsbG9jKCBQUk9DRVNTX0N1cnJlbnQoKSwgb2JqLCBhY2Nlc3MsIGluaGVyaXQsIC0xICk7CiAgICAgICAgIEszMk9CSl9EZWNDb3VudCggb2JqICk7CiAgICAgfQogICAgIFNZU1RFTV9VTkxPQ0soKTsKQEAgLTEzMTIsNyArMTMxNCw3IEBACiAgICAgaWYgKCEobWFwcGluZyA9IChGSUxFX01BUFBJTkcgKilIQU5ETEVfR2V0T2JqUHRyKCBQUk9DRVNTX0N1cnJlbnQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEszMk9CSl9NRU1fTUFQUEVEX0ZJTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBGSVhNRSAqLyApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEZJWE1FICovLCBOVUxMICkpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChtYXBwaW5nLT5zaXplX2hpZ2ggfHwgb2Zmc2V0X2hpZ2gpCmRpZmYgLS1naXQgYS9taXNjL2NydGRsbC5jIGIvbWlzYy9jcnRkbGwuYwppbmRleCBjMmYzNzUwLi42YjgwOGE0IDEwMDY0NAotLS0gYS9taXNjL2NydGRsbC5jCisrKyBiL21pc2MvY3J0ZGxsLmMKQEAgLTE0MCw2ICsxNDAsNDUgQEAKIAogdHlwZWRlZiB2b2lkICgqX0lOSVRURVJNRlVOKSgpOwogCisgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICBfZmluZGZpcnN0ICAgIChDUlRETEwuMDk5KQorICogCisgKiBCVUdTCisgKiAgIFVuaW1wbGVtZW50ZWQKKyAqLworRFdPUkQgX19jZGVjbCBDUlRETExfX2ZpbmRmaXJzdChMUENTVFIgZm5hbWUsc3RydWN0IGZpbmRfdCogeDIpCit7CisgIEZJWE1FKGNydGRsbCwgIjooJXMsJXApOiBzdHViXG4iLGZuYW1lLHgyKTsKKyAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgIF9maW5kbmV4dCAgICAgKENSVERMTC4xMDApCisgKiAKKyAqIEJVR1MKKyAqICAgVW5pbXBsZW1lbnRlZAorICovCitJTlQzMiBfX2NkZWNsIENSVERMTF9fZmluZG5leHQoRFdPUkQgaGFuZCxzdHJ1Y3QgZmluZF90KiB4MikKK3sKKyAgRklYTUUoY3J0ZGxsLCAiOiglZCwlcCk6IHN0dWJcbiIsaGFuZCx4Mik7CisgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CisgIHJldHVybiBGQUxTRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICBfZnN0YXQgICAgICAgIChDUlRETEwuMTExKQorICogCisgKiBCVUdTCisgKiAgIFVuaW1wbGVtZW50ZWQKKyAqLworaW50IF9fY2RlY2wgQ1JURExMX19mc3RhdChpbnQgZmlsZSwgc3RydWN0IHN0YXQqIGJ1ZikKK3sKKyAgRklYTUUoY3J0ZGxsLCAiOiglZCwlcCk6IHN0dWJcbiIsZmlsZSxidWYpOworICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOworICByZXR1cm4gRkFMU0U7Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgICAgX2luaXR0ZXJtICAgICAoQ1JURExMLjEzNSkKICAqLwpAQCAtMjA5LDYgKzI0OCwxOCBAQAogewogICAgIFRSQUNFKGNydGRsbCwiKCVwLCVsZClcbiIsZW5kZnJhbWUsbnIpOwogfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICBfcmVhZCAgICAgKENSVERMTC4yNTYpCisgKiAKKyAqIEJVR1MKKyAqICAgVW5pbXBsZW1lbnRlZAorICovCitJTlQzMiBfX2NkZWNsIENSVERMTF9fcmVhZChJTlQzMiBmZCwgTFBWT0lEIGJ1ZiwgVUlOVDMyIGNvdW50KQoreworICBGSVhNRShjcnRkbGwsIjooJWQsJXAsJWQpOiBzdHViXG4iLGZkLGJ1Zixjb3VudCk7CisgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CisgIHJldHVybiBGQUxTRTsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICBmb3BlbiAgICAgKENSVERMTC4zNzIpCkBAIC0yOTYsNyArMzQ3LDE5IEBACiAgIHJldHVybiByZXQ7CiAjZW5kaWYKIH0KLSAgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgIGZyZW9wZW4gICAgKENSVERMTC4zNzkpCisgKiAKKyAqIEJVR1MKKyAqICAgVW5pbXBsZW1lbnRlZAorICovCitEV09SRCBfX2NkZWNsIENSVERMTF9mcmVvcGVuKExQQ1NUUiBwYXRoLCBMUENTVFIgbW9kZSwgTFBWT0lEIHN0cmVhbSkKK3sKKyAgRklYTUUoY3J0ZGxsLCAiOiglcywlcywlcCk6IHN0dWJcbiIsIHBhdGgsIG1vZGUsIHN0cmVhbSk7CisgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CisgIHJldHVybiBGQUxTRTsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICBmc2NhbmYgICAgIChDUlRETEwuMzgxKQogICovCmRpZmYgLS1naXQgYS9taXNjL2RkZW1sLmMgYi9taXNjL2RkZW1sLmMKaW5kZXggOWE1NDY5NC4uN2E1YzQ3YSAxMDA2NDQKLS0tIGEvbWlzYy9kZGVtbC5jCisrKyBiL21pc2MvZGRlbWwuYwpAQCAtOSw2ICs5LDcgQEAKIAogI2luY2x1ZGUgImRkZW1sLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJhdG9tLmgiCiAKIC8qIEZJWE1FOiBXaGF0IGFyZSB0aGVzZSB2YWx1ZXM/ICovCiAjZGVmaW5lIERNTEVSUl9OT19FUlJPUgkJMApAQCAtMjQxLDEyICsyNDIsMTggQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBEZGVDcmVhdGVTdHJpbmdIYW5kbGUzMkEgW1VTRVIzMi45NV0KKyAqCisgKiBSRVRVUk5TCisgKiAgICBTdWNjZXNzOiBTdHJpbmcgaGFuZGxlCisgKiAgICBGYWlsdXJlOiAwCiAgKi8KIEhTWiBXSU5BUEkgRGRlQ3JlYXRlU3RyaW5nSGFuZGxlMzJBKCBEV09SRCBpZEluc3QsIExQQ1NUUiBwc3osIElOVDMyIGNvZGVwYWdlICkKLXsKLSAgICBGSVhNRShkZGVtbCwgIiguLi4pOiBzdHViXG4iICk7Ci0gICAgRERFX2N1cnJlbnRfaGFuZGxlKys7Ci0gICAgcmV0dXJuIERERV9jdXJyZW50X2hhbmRsZTsKK3sgVFJBQ0UoZGRlbWwsICIoJWxkLCVzLCVkKTogc3R1YlxuIixpZEluc3QsZGVidWdzdHJfYShwc3opLGNvZGVwYWdlKTsKKyAgCisgIGlmIChjb2RlcGFnZT09MTAwNCkgIC8qZml4bWU6IHNob3VsZCBiZSBDUF9XSU5BTlNJKi8KKyAgICByZXR1cm4gR2xvYmFsQWRkQXRvbTMyQSAocHN6KTsKKyAgZWxzZQorICAgIHJldHVybiAwOyAgCiB9CiAKIApAQCAtMjc5LDExICsyODYsMTIgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgIERkZUZyZWVTdHJpbmdIYW5kbGUzMiAgIChVU0VSMzIuMTAxKQorICogUkVUVVJOUzogc3VjY2Vzczogbm9uemVybworICogICAgICAgICAgZmFpbDogICAgemVybwogICovCiBCT09MMzIgV0lOQVBJIERkZUZyZWVTdHJpbmdIYW5kbGUzMiggRFdPUkQgaWRJbnN0LCBIU1ogaHN6ICkKLXsKLSAgICBGSVhNRSggZGRlbWwsICIoJWxkLCVsZCk6IHN0dWJcbiIsaWRJbnN0LCBoc3ogKTsKLSAgICByZXR1cm4gVFJVRTsKK3sgICBUUkFDRSggZGRlbWwsICIoJWxkLCVsZCk6IHN0dWJcbiIsaWRJbnN0LCBoc3ogKTsKKyAgICByZXR1cm4gR2xvYmFsRGVsZXRlQXRvbSAoaHN6KSA/IGhzeiA6IDA7CiB9CiAKIApkaWZmIC0tZ2l0IGEvbWlzYy9tYWluLmMgYi9taXNjL21haW4uYwppbmRleCBkNzE0YWFkLi44MTRjNWE0IDEwMDY0NAotLS0gYS9taXNjL21haW4uYworKysgYi9taXNjL21haW4uYwpAQCAtOTcwLDcgKzk3MCw3IEBACiAJCWNhc2UgU1BJX0dFVFNDUkVFTlNBVkVUSU1FT1VUOgogCQkJLyogRklYTUUgR2V0UHJvZmlsZUludCggIndpbmRvd3MiLCAiU2NyZWVuU2F2ZVRpbWVvdXQiLCAzMDAgKTsgKi8KIAkJCVRTWEdldFNjcmVlblNhdmVyKGRpc3BsYXksICZ0aW1lb3V0LCAmdGVtcCwmdGVtcCwmdGVtcCk7Ci0JCQkqKElOVDE2ICopIGxwdlBhcmFtID0gdGltZW91dCAqIDEwMDA7CisJCQkqKElOVDE2ICopIGxwdlBhcmFtID0gdGltZW91dDsKIAkJCWJyZWFrOwogCiAJCWNhc2UgU1BJX0lDT05IT1JJWk9OVEFMU1BBQ0lORzoKZGlmZiAtLWdpdCBhL21pc2MvbmV0d29yay5jIGIvbWlzYy9uZXR3b3JrLmMKaW5kZXggZDk1NTAxNi4uODk2NjRkMCAxMDA2NDQKLS0tIGEvbWlzYy9uZXR3b3JrLmMKKysrIGIvbWlzYy9uZXR3b3JrLmMKQEAgLTExNSw3ICsxMTUsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFdOZXRDb25uZWN0aW9uRGlhbG9nMV8zMkEgW01QUi41OV0KICAqLwotVUlOVDMyIFdOZXRDb25uZWN0aW9uRGlhbG9nMV8zMkEgKExQQ09OTkVDVERMR1NUUlVDVDMyQSBscENvbm5EbGdTdHJ1Y3QpCitVSU5UMzIgV0lOQVBJIFdOZXRDb25uZWN0aW9uRGlhbG9nMV8zMkEgKExQQ09OTkVDVERMR1NUUlVDVDMyQSBscENvbm5EbGdTdHJ1Y3QpCiB7IEZJWE1FKHduZXQsIiVwIHN0dWJcbiIsIGxwQ29ubkRsZ1N0cnVjdCk7ICAgCiAgIFNldExhc3RFcnJvcihXTl9OT19ORVRXT1JLKTsKICAgcmV0dXJuIEVSUk9SX05PX05FVFdPUks7CkBAIC0xMjMsMTYgKzEyMywxNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFdOZXRDb25uZWN0aW9uRGlhbG9nMV8zMlcgW01QUi42MF0KICAqLyAKLVVJTlQzMiBXTmV0Q29ubmVjdGlvbkRpYWxvZzFfMzJXIChMUENPTk5FQ1RETEdTVFJVQ1QzMlcgbHBDb25uRGxnU3RydWN0KQorVUlOVDMyIFdJTkFQSSBXTmV0Q29ubmVjdGlvbkRpYWxvZzFfMzJXIChMUENPTk5FQ1RETEdTVFJVQ1QzMlcgbHBDb25uRGxnU3RydWN0KQogeyBGSVhNRSh3bmV0LCIlcCBzdHViXG4iLCBscENvbm5EbGdTdHJ1Y3QpOwogICBTZXRMYXN0RXJyb3IoV05fTk9fTkVUV09SSyk7CiAgIHJldHVybiBFUlJPUl9OT19ORVRXT1JLOwogfQogIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFdOZXRDb25uZWN0aW9uRGlhbG9nMV8zMiBbTVBSLjYxXQorICogV05ldENvbm5lY3Rpb25EaWFsb2dfMzIgW01QUi42MV0KICAqLyAKLVVJTlQzMiBXTmV0Q29ubmVjdGlvbkRpYWxvZzFfMzIoSFdORDMyIG93bmVyLCBEV09SRCBmbGFncyAgKQorVUlOVDMyIFdJTkFQSSBXTmV0Q29ubmVjdGlvbkRpYWxvZ18zMihIV05EMzIgb3duZXIsIERXT1JEIGZsYWdzICApCiB7IEZJWE1FKHduZXQsIm93bmVyID0gMHgleCwgZmxhZ3M9MHglbHggc3R1YlxuIiwgb3duZXIsZmxhZ3MpOwogICBTZXRMYXN0RXJyb3IoV05fTk9fTkVUV09SSyk7CiAgIHJldHVybiBFUlJPUl9OT19ORVRXT1JLOwpAQCAtMjc1LDE1ICsyNzUsMTEgQEAKICAgICBpZiAobHBMb2NhbE5hbWVbMV0gPT0gJzonKQogICAgIHsKICAgICAgICAgaW50IGRyaXZlID0gdG91cHBlcihscExvY2FsTmFtZVswXSkgLSAnQSc7Ci0gICAgICAgIHN3aXRjaChHZXREcml2ZVR5cGUxNihkcml2ZSkpCisgICAgICAgIHN3aXRjaChEUklWRV9HZXRUeXBlKGRyaXZlKSkKICAgICAgICAgewotICAgICAgICBjYXNlIERSSVZFX0NBTk5PVERFVEVSTUlORToKLSAgICAgICAgY2FzZSBEUklWRV9ET0VTTk9URVhJU1Q6CisgICAgICAgIGNhc2UgVFlQRV9JTlZBTElEOgogICAgICAgICAgICAgcmV0dXJuIFdOX0JBRF9MT0NBTE5BTUU7Ci0gICAgICAgIGNhc2UgRFJJVkVfUkVNT1ZBQkxFOgotICAgICAgICBjYXNlIERSSVZFX0ZJWEVEOgotICAgICAgICAgICAgcmV0dXJuIFdOX05PVF9DT05ORUNURUQ7Ci0gICAgICAgIGNhc2UgRFJJVkVfUkVNT1RFOgorICAgICAgICBjYXNlIFRZUEVfTkVUV09SSzoKICAgICAgICAgICAgIHBhdGggPSBEUklWRV9HZXRMYWJlbChkcml2ZSk7CiAgICAgICAgICAgICBpZiAoc3RybGVuKHBhdGgpICsgMSA+ICpjYlJlbW90ZU5hbWUpCiAgICAgICAgICAgICB7CkBAIC0yOTMsNiArMjg5LDggQEAKICAgICAgICAgICAgIHN0cmNweSggbHBSZW1vdGVOYW1lLCBwYXRoICk7CiAgICAgICAgICAgICAqY2JSZW1vdGVOYW1lID0gc3RybGVuKGxwUmVtb3RlTmFtZSkgKyAxOwogICAgICAgICAgICAgcmV0dXJuIFdOX1NVQ0NFU1M7CisJZGVmYXVsdDoKKwkgICAgcmV0dXJuIFdOX0JBRF9MT0NBTE5BTUU7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIFdOX0JBRF9MT0NBTE5BTUU7CkBAIC02OTAsMTUgKzY4OCw2IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFtNUFIuMjVdCi0gKi8KLQotRFdPUkQgV0lOQVBJIF9NUFJfMjUoRFdPUkQgeCwgRFdPUkQgeSkKLXsKLQlGSVhNRShtcHIsIiglbHgsJWx4KTogc3R1YlxuIix4LHkpOwotCXJldHVybiAxOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgTXVsdGluZXRHZXRFcnJvclRleHRBIFtNUFIuMjhdCiAgKi8KIApkaWZmIC0tZ2l0IGEvbWlzYy9wcmludGRydi5jIGIvbWlzYy9wcmludGRydi5jCmluZGV4IDc1YTZhOGYuLmEyMTQ2ZTUgMTAwNjQ0Ci0tLSBhL21pc2MvcHJpbnRkcnYuYworKysgYi9taXNjL3ByaW50ZHJ2LmMKQEAgLTQxLDMxICs0MSwyOSBAQAogICByZXR1cm4gIEVzY2FwZTE2KGhkYywgRU5ERE9DLCAwLCAwLCAwKTsKIH0KIAotV09SRCBEcnZHZXRQcmludGVyRGF0YUludGVybmFsKExQU1RSIFJlZ1N0cl9QcmludGVyLCBMUEJZVEUgbHBQcmludGVyRGF0YSwgaW50IGNiRGF0YSkKK0RXT1JEIERydkdldFByaW50ZXJEYXRhSW50ZXJuYWwoTFBTVFIgUmVnU3RyX1ByaW50ZXIsIExQQllURSBscFByaW50ZXJEYXRhLCBpbnQgY2JEYXRhKQogewotICAgIFdPUkQgcmVzID0gLTE7CisgICAgRFdPUkQgcmVzID0gLTE7CiAgICAgSEtFWSBoa2V5OwogICAgIERXT1JEIGR3VHlwZSwgY2JRdWVyeURhdGE7CiAKICAgICBpZiAoIShSZWdPcGVuS2V5MzJBKEhLRVlfTE9DQUxfTUFDSElORSwgUmVnU3RyX1ByaW50ZXIsICZoa2V5KSkpIHsKICAgICAgICAgaWYgKGNiRGF0YSA+IDEpIHsgLyogIkRlZmF1bHQgRGV2TW9kZSIgKi8KICAgICAgICAgICAgIGlmICghKFJlZ1F1ZXJ5VmFsdWVFeDMyQShoa2V5LCBEZWZhdWx0RGV2TW9kZSwgMCwgJmR3VHlwZSwgMCwgJmNiUXVlcnlEYXRhKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWxwUHJpbnRlckRhdGEpIHJlcyA9IGNiUXVlcnlEYXRhOwotCQllbHNlCi0JCWlmICgoY2JRdWVyeURhdGEpICYmIChjYlF1ZXJ5RGF0YSA8PSBjYkRhdGEpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFscFByaW50ZXJEYXRhKQorCQkgICAgcmVzID0gY2JRdWVyeURhdGE7CisJCWVsc2UgaWYgKChjYlF1ZXJ5RGF0YSkgJiYgKGNiUXVlcnlEYXRhIDw9IGNiRGF0YSkpIHsKIAkJICAgIGNiUXVlcnlEYXRhID0gY2JEYXRhOwogCQkgICAgaWYgKFJlZ1F1ZXJ5VmFsdWVFeDMyQShoa2V5LCBEZWZhdWx0RGV2TW9kZSwgMCwKIAkJCQkmZHdUeXBlLCBscFByaW50ZXJEYXRhLCAmY2JRdWVyeURhdGEpKQogCQkgICAgICAgIHJlcyA9IGNiUXVlcnlEYXRhOwogCQl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIC8qICJQcmludGVyIERyaXZlciIgKi8KLQkgICAgewotCQljYlF1ZXJ5RGF0YSA9IDMyOwotCSAgICAgICAgUmVnUXVlcnlWYWx1ZUV4MzJBKGhrZXksICJQcmludGVyIERyaXZlciIsIDAsCi0JCQkmZHdUeXBlLCBscFByaW50ZXJEYXRhLCAmY2JRdWVyeURhdGEpOwotCQlyZXMgPSBjYlF1ZXJ5RGF0YTsKIAkgICAgfQorCX0gZWxzZSB7IC8qICJQcmludGVyIERyaXZlciIgKi8KKwkgICAgY2JRdWVyeURhdGEgPSAzMjsKKwkgICAgUmVnUXVlcnlWYWx1ZUV4MzJBKGhrZXksICJQcmludGVyIERyaXZlciIsIDAsCisJCQkmZHdUeXBlLCBscFByaW50ZXJEYXRhLCAmY2JRdWVyeURhdGEpOworCSAgICByZXMgPSBjYlF1ZXJ5RGF0YTsKIAl9CiAgICAgfQogICAgIGlmIChoa2V5KSBSZWdDbG9zZUtleShoa2V5KTsKQEAgLTE5MiwyMCArMTkwLDI0IEBACiAKICAgICBpZiAoKChEV09SRClscFByb2ZpbGUgPT0gSU5UX1BEX0RFRkFVTFRfREVWTU9ERSkgfHwgKEhJV09SRChscFByb2ZpbGUpICYmCiAgICAgKCFzdHJjbXAobHBQcm9maWxlLCBEZWZhdWx0RGV2TW9kZSkpKSkgewotCWlmICghKFJlZ09wZW5LZXkzMkEoSEtFWV9MT0NBTF9NQUNISU5FLCBSZWdTdHJfUHJpbnRlciwgJmhrZXkpKSB8fAotCSAgICAoUmVnU2V0VmFsdWVFeDMyQShoa2V5LCBEZWZhdWx0RGV2TW9kZSwgMCwgUkVHX0JJTkFSWSwgbHBQcmludGVyRGF0YSwgZHdTaXplKSkpCisJaWYgKCBSZWdPcGVuS2V5MzJBKEhLRVlfTE9DQUxfTUFDSElORSwgUmVnU3RyX1ByaW50ZXIsICZoa2V5KSAKKwkgICAgICE9IEVSUk9SX1NVQ0NFU1MgfHwKKwkgICAgIFJlZ1NldFZhbHVlRXgzMkEoaGtleSwgRGVmYXVsdERldk1vZGUsIDAsIFJFR19CSU5BUlksIAorCQkJICAgICAgbHBQcmludGVyRGF0YSwgZHdTaXplKSAhPSBFUlJPUl9TVUNDRVNTICkKIAkgICAgICAgIHJlcyA9IEVSUk9SX0lOVkFMSURfUFJJTlRFUl9OQU1FOwogICAgIH0KICAgICBlbHNlCiAgICAgewogCXN0cmNhdChSZWdTdHJfUHJpbnRlciwgIlxcIik7CiAKLQlpZiAoIShyZXMgPSBSZWdPcGVuS2V5MzJBKEhLRVlfTE9DQUxfTUFDSElORSwgUmVnU3RyX1ByaW50ZXIsICZoa2V5KSkpIHsKKwlpZiggKHJlcyA9IFJlZ09wZW5LZXkzMkEoSEtFWV9MT0NBTF9NQUNISU5FLCBSZWdTdHJfUHJpbnRlciwgJmhrZXkpKSA9PQorCSAgICBFUlJPUl9TVUNDRVNTICkgewogCiAJICAgIGlmICghbHBQcmludGVyRGF0YSkgCiAJICAgICAgICByZXMgPSBSZWdEZWxldGVWYWx1ZTMyQShoa2V5LCBscFByb2ZpbGUpOwogCSAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmVzID0gUmVnU2V0VmFsdWVFeDMyQShoa2V5LCBscFByb2ZpbGUsIDAsIGxwVHlwZSwgbHBQcmludGVyRGF0YSwgZHdTaXplKTsKKyAgICAgICAgICAgICAgICByZXMgPSBSZWdTZXRWYWx1ZUV4MzJBKGhrZXksIGxwUHJvZmlsZSwgMCwgbHBUeXBlLAorCQkJCSAgICAgICBscFByaW50ZXJEYXRhLCBkd1NpemUpOwogCX0KICAgICB9CiAKZGlmZiAtLWdpdCBhL21pc2Mvc2hlbGwuYyBiL21pc2Mvc2hlbGwuYwppbmRleCA2NzE5MTRjLi4xYjhlYmJmIDEwMDY0NAotLS0gYS9taXNjL3NoZWxsLmMKKysrIGIvbWlzYy9zaGVsbC5jCkBAIC0yOCw2ICsyOCw4IEBACiAjaW5jbHVkZSAic2hsb2JqLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJ3aW5yZWcuaCIKKyNpbmNsdWRlICJpbWFnZWxpc3QuaCIKKyNpbmNsdWRlICJjb21tY3RybC5oIgogCiAvKiBGSVhNRSBzaG91bGQgYmUgbW92ZWQgdG8gYSBoZWFkZXIgZmlsZS4gSXNFcXVhbEdVSUQgCiBpcyBkZWNsYXJlZCBidXQgbm90IGV4cG9ydGVkIGluIGNvbXBvYmouYyAhISEqLwpAQCAtOTYsNiArOTgsNyBAQAogICAgICJBbGV4IEtvcm9ia2EiLAogICAgICJHcmVnIEtyZWlkZXIiLAogICAgICJBbmFuZCBLdW1yaWEiLAorICAgICJPdmUgS+V2ZW4iLAogICAgICJTY290dCBBLiBMYWlyZCIsCiAgICAgIkRhdmlkIExlZSBMYW1iZXJ0IiwKICAgICAiQW5kcmV3IExld3lja3kiLApAQCAtMjE4LDggKzIyMSw3IEBACiAgKgkJCQlEcmFnQWNjZXB0RmlsZXMJCVtTSEVMTC45XQogICovCiB2b2lkIFdJTkFQSSBEcmFnQWNjZXB0RmlsZXMoSFdORDE2IGhXbmQsIEJPT0wxNiBiKQotewotICAgIFdORCogd25kID0gV0lOX0ZpbmRXbmRQdHIoaFduZCk7Cit7IFdORCogd25kID0gV0lOX0ZpbmRXbmRQdHIoaFduZCk7CiAKICAgICBpZiggd25kICkKIAl3bmQtPmR3RXhTdHlsZSA9IGI/IHduZC0+ZHdFeFN0eWxlIHwgV1NfRVhfQUNDRVBURklMRVMKQEAgLTIzMiw4ICsyMzQsNyBAQAogICovCiBVSU5UMTYgV0lOQVBJIERyYWdRdWVyeUZpbGUoSERST1AxNiBoRHJvcCwgV09SRCB3RmlsZSwgTFBTVFIgbHBzekZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCB3TGVuZ3RoKQotewotICAgIC8qIGhEcm9wIGlzIGEgZ2xvYmFsIG1lbW9yeSBibG9jayBhbGxvY2F0ZWQgd2l0aCBHTUVNX1NIQVJFIAoreyAvKiBoRHJvcCBpcyBhIGdsb2JhbCBtZW1vcnkgYmxvY2sgYWxsb2NhdGVkIHdpdGggR01FTV9TSEFSRSAKICAgICAgKiB3aXRoIERST1BGSUxFU1RSVUNUIGFzIGEgaGVhZGVyIGFuZCBmaWxlbmFtZXMgZm9sbG93aW5nCiAgICAgICogaXQsIHplcm8gbGVuZ3RoIGZpbGVuYW1lIGlzIGluIHRoZSBlbmQgKi8gICAgICAgCiAgICAgCkBAIC0yNDEsMjQgKzI0MiwyNSBAQAogICAgIExQU1RSIGxwQ3VycmVudDsKICAgICBXT1JEICBpOwogICAgIAotICAgIFRSQUNFKHJlZywiKCUwNHgsICVpLCAlcCwgJXUpXG4iLAorICBUUkFDRShzaGVsbCwiKCUwNHgsICVpLCAlcCwgJXUpXG4iLAogCQloRHJvcCx3RmlsZSxscHN6RmlsZSx3TGVuZ3RoKTsKICAgICAKICAgICBscERyb3BGaWxlU3RydWN0ID0gKExQRFJPUEZJTEVTVFJVQ1QpIEdsb2JhbExvY2sxNihoRHJvcCk7IAotICAgIGlmKCFscERyb3BGaWxlU3RydWN0KSByZXR1cm4gMDsKKyAgaWYoIWxwRHJvcEZpbGVTdHJ1Y3QpCisgICAgcmV0dXJuIDA7CiAKICAgICBscEN1cnJlbnQgPSAoTFBTVFIpIGxwRHJvcEZpbGVTdHJ1Y3QgKyBscERyb3BGaWxlU3RydWN0LT53U2l6ZTsKICAgICAKICAgICBpID0gMDsKICAgICB3aGlsZSAoaSsrIDwgd0ZpbGUpCi0gICAgewotCXdoaWxlICgqbHBDdXJyZW50KyspOyAgLyogc2tpcCBmaWxlbmFtZSAqLworICB7IHdoaWxlICgqbHBDdXJyZW50KyspOyAgLyogc2tpcCBmaWxlbmFtZSAqLwogCWlmICghKmxwQ3VycmVudCkgCiAJICAgIHJldHVybiAod0ZpbGUgPT0gMHhGRkZGKSA/IGkgOiAwOyAgCiAgICAgfQogICAgIAogICAgIGkgPSBzdHJsZW4obHBDdXJyZW50KTsgCi0gICAgaWYgKCFscHN6RmlsZSkgcmV0dXJuIGkrMTsgICAvKiBuZWVkZWQgYnVmZmVyIHNpemUgKi8KKyAgaWYgKCFscHN6RmlsZSkKKyAgICByZXR1cm4gaSsxOyAgIC8qIG5lZWRlZCBidWZmZXIgc2l6ZSAqLwogICAgIAogICAgIGkgPSAod0xlbmd0aCA+IGkpID8gaSA6IHdMZW5ndGgtMTsKICAgICBzdHJuY3B5KGxwc3pGaWxlLCBscEN1cnJlbnQsIGkpOwpAQCAtMjczLDcgKzI3NSw3IEBACiAgKgkJCQlEcmFnRmluaXNoCQlbU0hFTEwuMTJdCiAgKi8KIHZvaWQgV0lOQVBJIERyYWdGaW5pc2goSERST1AxNiBoKQoteworeyBUUkFDRShzaGVsbCwiXG4iKTsKICAgICBHbG9iYWxGcmVlMTYoKEhHTE9CQUwxNiloKTsKIH0KIApAQCAtMjgyLDEwICsyODQsOSBAQAogICoJCQkJRHJhZ1F1ZXJ5UG9pbnQJCVtTSEVMTC4xM10KICAqLwogQk9PTDE2IFdJTkFQSSBEcmFnUXVlcnlQb2ludChIRFJPUDE2IGhEcm9wLCBQT0lOVDE2ICpwKQotewotICAgIExQRFJPUEZJTEVTVFJVQ1QgbHBEcm9wRmlsZVN0cnVjdDsgIAoreyBMUERST1BGSUxFU1RSVUNUIGxwRHJvcEZpbGVTdHJ1Y3Q7ICAKICAgICBCT09MMTYgICAgICAgICAgIGJSZXQ7Ci0KKyAgVFJBQ0Uoc2hlbGwsIlxuIik7CiAgICAgbHBEcm9wRmlsZVN0cnVjdCA9IChMUERST1BGSUxFU1RSVUNUKSBHbG9iYWxMb2NrMTYoaERyb3ApOwogCiAgICAgbWVtY3B5KHAsJmxwRHJvcEZpbGVTdHJ1Y3QtPnB0TW91c2VQb3Msc2l6ZW9mKFBPSU5UMTYpKTsKQEAgLTMwMyw4ICszMDQsNyBAQAogc3RhdGljIEhJTlNUQU5DRTMyIFNIRUxMX0ZpbmRFeGVjdXRhYmxlKCBMUENTVFIgbHBGaWxlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwT3BlcmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUUiBscFJlc3VsdCkKLXsKLSAgICBjaGFyICpleHRlbnNpb24gPSBOVUxMOyAvKiBwb2ludGVyIHRvIGZpbGUgZXh0ZW5zaW9uICovCit7IGNoYXIgKmV4dGVuc2lvbiA9IE5VTEw7IC8qIHBvaW50ZXIgdG8gZmlsZSBleHRlbnNpb24gKi8KICAgICBjaGFyIHRtcGV4dFs1XTsgICAgICAgICAvKiBsb2NhbCBjb3B5IHRvIG11bmcgYXMgd2UgcGxlYXNlICovCiAgICAgY2hhciBmaWxldHlwZVsyNTZdOyAgICAgLyogcmVnaXN0cnkgbmFtZSBmb3IgdGhpcyBmaWxldHlwZSAqLwogICAgIExPTkcgZmlsZXR5cGVsZW49MjU2OyAgIC8qIGxlbmd0aCBvZiBhYm92ZSAqLwpAQCAtMzE2LDIxICszMTYsMTkgQEAKICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAvKiByYW5kb20gY291bnRlciAqLwogICAgIGNoYXIgeGxwRmlsZVsyNTZdOyAgICAgIC8qIHJlc3VsdCBvZiBTZWFyY2hQYXRoICovCiAKLSAgICBUUkFDRShleGVjLCAiJXNcbiIsIChscEZpbGUgIT0gTlVMTD9scEZpbGU6Ii0iKSApOworICBUUkFDRShzaGVsbCwgIiVzXG4iLCAobHBGaWxlICE9IE5VTEw/bHBGaWxlOiItIikgKTsKIAogICAgIGxwUmVzdWx0WzBdPSdcMCc7IC8qIFN0YXJ0IG9mZiB3aXRoIGFuIGVtcHR5IHJldHVybiBzdHJpbmcgKi8KIAogICAgIC8qIHRyYXAgTlVMTCBwYXJhbWV0ZXJzIG9uIGVudHJ5ICovCiAgICAgaWYgKCggbHBGaWxlID09IE5VTEwgKSB8fCAoIGxwUmVzdWx0ID09IE5VTEwgKSB8fCAoIGxwT3BlcmF0aW9uID09IE5VTEwgKSkKLSAgICB7Ci0JV0FSTihleGVjLCAiKGxwRmlsZT0lcyxscFJlc3VsdD0lcyxscE9wZXJhdGlvbj0lcyk6IE5VTEwgcGFyYW1ldGVyXG4iLAorICB7IFdBUk4oZXhlYywgIihscEZpbGU9JXMsbHBSZXN1bHQ9JXMsbHBPcGVyYXRpb249JXMpOiBOVUxMIHBhcmFtZXRlclxuIiwKICAgICAgICAgICAgbHBGaWxlLCBscE9wZXJhdGlvbiwgbHBSZXN1bHQpOwogICAgICAgICByZXR1cm4gMjsgLyogRmlsZSBub3QgZm91bmQuIENsb3NlIGVub3VnaCwgSSBndWVzcy4gKi8KICAgICB9CiAKICAgICBpZiAoU2VhcmNoUGF0aDMyQSggTlVMTCwgbHBGaWxlLCIuZXhlIixzaXplb2YoeGxwRmlsZSkseGxwRmlsZSxOVUxMKSkKLSAgICB7Ci0JVFJBQ0UoZXhlYywgIlNlYXJjaFBhdGgzMkEgcmV0dXJuZWQgbm9uLXplcm9cbiIpOworICB7IFRSQUNFKHNoZWxsLCAiU2VhcmNoUGF0aDMyQSByZXR1cm5lZCBub24temVyb1xuIik7CiAgICAgICAgIGxwRmlsZSA9IHhscEZpbGU7CiAgICAgfQogCkBAIC0zMzgsMTggKzMzNiwxNyBAQAogICAgIGV4dGVuc2lvbiA9IHN0cnJjaHIoIHhscEZpbGUsICcuJyApOyAvKiBBc3N1bWUgbGFzdCAiLiIgaXMgdGhlIG9uZTsgKi8KIAkJCQkJLyogRmlsZS0+UnVuIGluIHByb2dtYW4gdXNlcyAqLwogCQkJCQkvKiAuXEZJTEUuRVhFIDooICovCi0gICAgVFJBQ0UoZXhlYywgInhscEZpbGU9JXMsZXh0ZW5zaW9uPSVzXG4iLCB4bHBGaWxlLCBleHRlbnNpb24pOworICBUUkFDRShzaGVsbCwgInhscEZpbGU9JXMsZXh0ZW5zaW9uPSVzXG4iLCB4bHBGaWxlLCBleHRlbnNpb24pOwogCiAgICAgaWYgKChleHRlbnNpb24gPT0gTlVMTCkgfHwgKGV4dGVuc2lvbiA9PSAmeGxwRmlsZVtzdHJsZW4oeGxwRmlsZSldKSkKLSAgICB7Ci0gICAgICAgIFdBUk4oZXhlYywgIlJldHVybmluZyAzMSAtIE5vIGFzc29jaWF0aW9uXG4iKTsKKyAgeyBXQVJOKHNoZWxsLCAiUmV0dXJuaW5nIDMxIC0gTm8gYXNzb2NpYXRpb25cbiIpOwogICAgICAgICByZXR1cm4gMzE7IC8qIG5vIGFzc29jaWF0aW9uICovCiAgICAgfQogCiAgICAgLyogTWFrZSBsb2NhbCBjb3B5ICYgbG93ZXJjYXNlIGl0IGZvciByZWcgJiAncHJvZ3JhbXM9JyBsb29rdXAgKi8KICAgICBsc3RyY3B5bjMyQSggdG1wZXh0LCBleHRlbnNpb24sIDUgKTsKICAgICBDaGFyTG93ZXIzMkEoIHRtcGV4dCApOwotICAgIFRSQUNFKGV4ZWMsICIlcyBmaWxlXG4iLCB0bXBleHQpOworICBUUkFDRShzaGVsbCwgIiVzIGZpbGVcbiIsIHRtcGV4dCk7CiAgICAgCiAgICAgLyogVGhyZWUgcGxhY2VzIHRvIGNoZWNrOiAqLwogICAgIC8qIDEuIHdpbi5pbmksIFt3aW5kb3dzXSwgcHJvZ3JhbXMgKE5CIG5vIGxlYWRpbmcgJy4nKSAqLwpAQCAtMzY0LDggKzM2MSw3IEBACiAgICAgICogZ290IGEgbG90IG1vcmUgdG8gd29ycnkgYWJvdXQgdGhhbiBydW5uaW5nIGEgcHJvZ3JhbS4uLiAqLwogICAgIGlmICggR2V0UHJvZmlsZVN0cmluZzMyQSgid2luZG93cyIsICJwcm9ncmFtcyIsICJleGUgcGlmIGJhdCBjb20iLAogCQkJCQkJICBidWZmZXIsIHNpemVvZihidWZmZXIpKSA+IDAgKQotCSAgewotCQlmb3IgKGk9MDtpPHN0cmxlbihidWZmZXIpOyBpKyspIGJ1ZmZlcltpXT10b2xvd2VyKGJ1ZmZlcltpXSk7CisgIHsgZm9yIChpPTA7aTxzdHJsZW4oYnVmZmVyKTsgaSsrKSBidWZmZXJbaV09dG9sb3dlcihidWZmZXJbaV0pOwogCiAJCXRvayA9IHN0cnRvayhidWZmZXIsICIgXHQiKTsgLyogPyAqLwogCQl3aGlsZSggdG9rIT0gTlVMTCkKQEAgLTM3NSw4ICszNzEsNyBAQAogCQkJCXN0cmNweShscFJlc3VsdCwgeGxwRmlsZSk7CiAJCQkJLyogTmVlZCB0byBwZXJoYXBzIGNoZWNrIHRoYXQgdGhlIGZpbGUgaGFzIGEgcGF0aAogCQkJCSAqIGF0dGFjaGVkICovCi0JCQkJVFJBQ0UoZXhlYywgImZvdW5kICVzXG4iLAotCQkJCQkJCSBscFJlc3VsdCk7CisgICAgICAgIFRSQUNFKHNoZWxsLCAiZm91bmQgJXNcbiIsIGxwUmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMzOwogCiAJCS8qIEdyZWF0ZXIgdGhhbiAzMiB0byBpbmRpY2F0ZSBzdWNjZXNzIEZJWE1FIEFjY29yZGluZyB0byB0aGUKQEAgLTM5Myw4ICszODgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxldHlwZWxlbiApID09IEVSUk9SX1NVQ0NFU1MgKQogICAgIHsKIAlmaWxldHlwZVtmaWxldHlwZWxlbl09J1wwJzsKLQlUUkFDRShleGVjLCAiRmlsZSB0eXBlOiAlc1xuIiwKLQkJICAgICBmaWxldHlwZSk7CisgIFRSQUNFKHNoZWxsLCAiRmlsZSB0eXBlOiAlc1xuIiwgZmlsZXR5cGUpOwogCiAJLyogTG9va2luZyBmb3IgLi4uYnVmZmVyXHNoZWxsXGxwT3BlcmF0aW9uXGNvbW1hbmQgKi8KIAlzdHJjYXQoIGZpbGV0eXBlLCAiXFxzaGVsbFxcIiApOwpAQCAtNDQ3LDcgKzQ0MSw3IEBACiAJICB9CiAJfQogCi0gICAgVFJBQ0UoZXhlYywgInJldHVybmluZyAlc1xuIiwgbHBSZXN1bHQpOworICAgIFRSQUNFKHNoZWxsLCAicmV0dXJuaW5nICVzXG4iLCBscFJlc3VsdCk7CiAgICAgcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtNDU3LDEyICs0NTEsMTEgQEAKIEhJTlNUQU5DRTE2IFdJTkFQSSBTaGVsbEV4ZWN1dGUxNiggSFdORDE2IGhXbmQsIExQQ1NUUiBscE9wZXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwRmlsZSwgTFBDU1RSIGxwUGFyYW1ldGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwRGlyZWN0b3J5LCBJTlQxNiBpU2hvd0NtZCApCi17Ci0gICAgSElOU1RBTkNFMTYgcmV0dmFsPTMxOworeyAgIEhJTlNUQU5DRTE2IHJldHZhbD0zMTsKICAgICBjaGFyIG9sZF9kaXJbMTAyNF07CiAgICAgY2hhciBjbWRbMjU2XTsKIAotICAgIFRSQUNFKGV4ZWMsICIoJTA0eCwnJXMnLCclcycsJyVzJywnJXMnLCV4KVxuIiwKKyAgICBUUkFDRShzaGVsbCwgIiglMDR4LCclcycsJyVzJywnJXMnLCclcycsJXgpXG4iLAogCQloV25kLCBscE9wZXJhdGlvbiA/IGxwT3BlcmF0aW9uOiI8bnVsbD4iLCBscEZpbGUgPyBscEZpbGU6IjxudWxsPiIsCiAJCWxwUGFyYW1ldGVycyA/IGxwUGFyYW1ldGVycyA6ICI8bnVsbD4iLCAKIAkJbHBEaXJlY3RvcnkgPyBscERpcmVjdG9yeSA6ICI8bnVsbD4iLCBpU2hvd0NtZCk7CkBAIC00NzIsMjUgKzQ2NSwyMyBAQAogICAgICAgbHBPcGVyYXRpb249Im9wZW4iOwogCiAgICAgaWYgKGxwRGlyZWN0b3J5KQotICAgIHsKLSAgICAgICAgR2V0Q3VycmVudERpcmVjdG9yeTMyQSggc2l6ZW9mKG9sZF9kaXIpLCBvbGRfZGlyICk7CisgICAgeyBHZXRDdXJyZW50RGlyZWN0b3J5MzJBKCBzaXplb2Yob2xkX2RpciksIG9sZF9kaXIgKTsKICAgICAgICAgU2V0Q3VycmVudERpcmVjdG9yeTMyQSggbHBEaXJlY3RvcnkgKTsKICAgICB9CiAKICAgICByZXR2YWwgPSBTSEVMTF9GaW5kRXhlY3V0YWJsZSggbHBGaWxlLCBscE9wZXJhdGlvbiwgY21kICk7CiAKICAgICBpZiAocmV0dmFsID4gMzIpICAvKiBGb3VuZCAqLwotICAgIHsKLSAgICAgICAgaWYgKGxwUGFyYW1ldGVycykKLSAgICAgICAgewotICAgICAgICAgICAgc3RyY2F0KGNtZCwiICIpOworICAgIHsgaWYgKGxwUGFyYW1ldGVycykKKyAgICAgIHsgc3RyY2F0KGNtZCwiICIpOwogICAgICAgICAgICAgc3RyY2F0KGNtZCxscFBhcmFtZXRlcnMpOwogICAgICAgICB9CiAKLSAgICAgICAgVFJBQ0UoZXhlYywic3RhcnRpbmcgJXNcbiIsY21kKTsKKyAgICAgIFRSQUNFKHNoZWxsLCJzdGFydGluZyAlc1xuIixjbWQpOwogICAgICAgICByZXR2YWwgPSBXaW5FeGVjMzIoIGNtZCwgaVNob3dDbWQgKTsKICAgICB9Ci0gICAgaWYgKGxwRGlyZWN0b3J5KSBTZXRDdXJyZW50RGlyZWN0b3J5MzJBKCBvbGRfZGlyICk7CisgICAgaWYgKGxwRGlyZWN0b3J5KQorICAgICAgU2V0Q3VycmVudERpcmVjdG9yeTMyQSggb2xkX2RpciApOwogICAgIHJldHVybiByZXR2YWw7CiB9CiAKQEAgLTUwMSwxOSArNDkyLDE3IEBACiBISU5TVEFOQ0UzMiBXSU5BUEkgU2hlbGxFeGVjdXRlMzJBKCBIV05EMzIgaFduZCwgTFBDU1RSIGxwT3BlcmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwRmlsZSwgTFBDU1RSIGxwUGFyYW1ldGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBscERpcmVjdG9yeSwgSU5UMzIgaVNob3dDbWQgKQoteworeyAgIFRSQUNFKHNoZWxsLCJcbiIpOwogICAgIHJldHVybiBTaGVsbEV4ZWN1dGUxNiggaFduZCwgbHBPcGVyYXRpb24sIGxwRmlsZSwgbHBQYXJhbWV0ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBEaXJlY3RvcnksIGlTaG93Q21kICk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgIEZpbmRFeGVjdXRhYmxlMTYgICAoU0hFTEwuMjEpCiAgKi8KIEhJTlNUQU5DRTE2IFdJTkFQSSBGaW5kRXhlY3V0YWJsZTE2KCBMUENTVFIgbHBGaWxlLCBMUENTVFIgbHBEaXJlY3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVFIgbHBSZXN1bHQgKQotewotICAgIHJldHVybiAoSElOU1RBTkNFMTYpRmluZEV4ZWN1dGFibGUzMkEoIGxwRmlsZSwgbHBEaXJlY3RvcnksIGxwUmVzdWx0ICk7Cit7IHJldHVybiAoSElOU1RBTkNFMTYpRmluZEV4ZWN1dGFibGUzMkEoIGxwRmlsZSwgbHBEaXJlY3RvcnksIGxwUmVzdWx0ICk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC01MjEsMTEgKzUxMCwxMCBAQAogICovCiBISU5TVEFOQ0UzMiBXSU5BUEkgRmluZEV4ZWN1dGFibGUzMkEoIExQQ1NUUiBscEZpbGUsIExQQ1NUUiBscERpcmVjdG9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVFIgbHBSZXN1bHQgKQotewotICAgIEhJTlNUQU5DRTMyIHJldHZhbD0zMTsgICAgLyogZGVmYXVsdCAtICdObyBhc3NvY2lhdGlvbiB3YXMgZm91bmQnICovCit7IEhJTlNUQU5DRTMyIHJldHZhbD0zMTsgICAgLyogZGVmYXVsdCAtICdObyBhc3NvY2lhdGlvbiB3YXMgZm91bmQnICovCiAgICAgY2hhciBvbGRfZGlyWzEwMjRdOwogCi0gICAgVFJBQ0UoZXhlYywgIkZpbGUgJXMsIERpciAlc1xuIiwgCisgIFRSQUNFKHNoZWxsLCAiRmlsZSAlcywgRGlyICVzXG4iLCAKIAkJIChscEZpbGUgIT0gTlVMTD9scEZpbGU6Ii0iKSwgCiAJCSAobHBEaXJlY3RvcnkgIT0gTlVMTD9scERpcmVjdG9yeToiLSIpKTsKIApAQCAtNTMzLDI3ICs1MjEsMjUgQEAKIAogICAgIC8qIHRyYXAgTlVMTCBwYXJhbWV0ZXJzIG9uIGVudHJ5ICovCiAgICAgaWYgKCggbHBGaWxlID09IE5VTEwgKSB8fCAoIGxwUmVzdWx0ID09IE5VTEwgKSkKLSAgICB7Ci0JLyogRklYTUUgLSBzaG91bGQgdGhyb3cgYSB3YXJuaW5nLCBwZXJoYXBzISAqLworICB7IC8qIEZJWE1FIC0gc2hvdWxkIHRocm93IGEgd2FybmluZywgcGVyaGFwcyEgKi8KIAlyZXR1cm4gMjsgLyogRmlsZSBub3QgZm91bmQuIENsb3NlIGVub3VnaCwgSSBndWVzcy4gKi8KICAgICB9CiAKICAgICBpZiAobHBEaXJlY3RvcnkpCi0gICAgewotICAgICAgICBHZXRDdXJyZW50RGlyZWN0b3J5MzJBKCBzaXplb2Yob2xkX2RpciksIG9sZF9kaXIgKTsKKyAgeyBHZXRDdXJyZW50RGlyZWN0b3J5MzJBKCBzaXplb2Yob2xkX2RpciksIG9sZF9kaXIgKTsKICAgICAgICAgU2V0Q3VycmVudERpcmVjdG9yeTMyQSggbHBEaXJlY3RvcnkgKTsKICAgICB9CiAKICAgICByZXR2YWwgPSBTSEVMTF9GaW5kRXhlY3V0YWJsZSggbHBGaWxlLCAib3BlbiIsIGxwUmVzdWx0ICk7CiAKLSAgICBUUkFDRShleGVjLCAicmV0dXJuaW5nICVzXG4iLCBscFJlc3VsdCk7Ci0gICAgaWYgKGxwRGlyZWN0b3J5KSBTZXRDdXJyZW50RGlyZWN0b3J5MzJBKCBvbGRfZGlyICk7CisgIFRSQUNFKHNoZWxsLCAicmV0dXJuaW5nICVzXG4iLCBscFJlc3VsdCk7CisgIGlmIChscERpcmVjdG9yeSkKKyAgICBTZXRDdXJyZW50RGlyZWN0b3J5MzJBKCBvbGRfZGlyICk7CiAgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMUENTVFIgIHN6QXBwOworeyBMUENTVFIgIHN6QXBwOwogICAgIExQQ1NUUiAgc3pPdGhlclN0dWZmOwogICAgIEhJQ09OMzIgaEljb247CiB9IEFCT1VUX0lORk87CkBAIC01NjgsMTEgKzU1NCw5IEBACiBleHRlcm4gSElDT04zMiBoSWNvblRpdGxlRm9udDsKIAogc3RhdGljIEJPT0wzMiBfX2dldF9kcm9wbGluZSggSFdORDMyIGhXbmQsIExQUkVDVDMyIGxwcmVjdCApCi17Ci0gICAgSFdORDMyIGhXbmRDdGwgPSBHZXREbGdJdGVtMzIoaFduZCwgSURDX1dJTkVfVEVYVCk7Cit7IEhXTkQzMiBoV25kQ3RsID0gR2V0RGxnSXRlbTMyKGhXbmQsIElEQ19XSU5FX1RFWFQpOwogICAgIGlmKCBoV25kQ3RsICkKLSAgICB7Ci0JR2V0V2luZG93UmVjdDMyKCBoV25kQ3RsLCBscHJlY3QgKTsKKyAgeyBHZXRXaW5kb3dSZWN0MzIoIGhXbmRDdGwsIGxwcmVjdCApOwogCU1hcFdpbmRvd1BvaW50czMyKCAwLCBoV25kLCAoTFBQT0lOVDMyKWxwcmVjdCwgMiApOwogCWxwcmVjdC0+Ym90dG9tID0gKGxwcmVjdC0+dG9wICs9IERST1BfRklFTERfVE9QKTsKIAlyZXR1cm4gVFJVRTsKQEAgLTU4NSwxOCArNTY5LDE2IEBACiAgKi8KIExSRVNVTFQgV0lOQVBJIEFib3V0RGxnUHJvYzMyKCBIV05EMzIgaFduZCwgVUlOVDMyIG1zZywgV1BBUkFNMzIgd1BhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0gKQotewotICAgIEhXTkQzMiBoV25kQ3RsOworeyAgIEhXTkQzMiBoV25kQ3RsOwogICAgIGNoYXIgVGVtcGxhdGVbNTEyXSwgQXBwVGl0bGVbNTEyXTsKIAorICAgIFRSQUNFKHNoZWxsLCJcbiIpOworCiAgICAgc3dpdGNoKG1zZykKLSAgICB7Ci0gICAgY2FzZSBXTV9JTklURElBTE9HOgotICAgICAgICB7Ci0gICAgICAgICAgICBBQk9VVF9JTkZPICppbmZvID0gKEFCT1VUX0lORk8gKilsUGFyYW07CisgICAgeyBjYXNlIFdNX0lOSVRESUFMT0c6CisgICAgICB7IEFCT1VUX0lORk8gKmluZm8gPSAoQUJPVVRfSU5GTyAqKWxQYXJhbTsKICAgICAgICAgICAgIGlmIChpbmZvKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0ICpwc3RyID0gU0hFTExfUGVvcGxlOworICAgICAgICB7IGNvbnN0IGNoYXIqIGNvbnN0ICpwc3RyID0gU0hFTExfUGVvcGxlOwogICAgICAgICAgICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZTMyQShoV25kLCBzdGMxLCBTVE1fU0VUSUNPTjMyLGluZm8tPmhJY29uLCAwKTsKICAgICAgICAgICAgICAgICBHZXRXaW5kb3dUZXh0MzJBKCBoV25kLCBUZW1wbGF0ZSwgc2l6ZW9mKFRlbXBsYXRlKSApOwogICAgICAgICAgICAgICAgIHNwcmludGYoIEFwcFRpdGxlLCBUZW1wbGF0ZSwgaW5mby0+c3pBcHAgKTsKQEAgLTYwNyw5ICs1ODksNyBAQAogICAgICAgICAgICAgICAgIFNlbmRNZXNzYWdlMzJBKCBoV25kQ3RsLCBXTV9TRVRSRURSQVcsIDAsIDAgKTsKICAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZTMyQSggaFduZEN0bCwgV01fU0VURk9OVCwgaEljb25UaXRsZUZvbnQsIDAgKTsKICAgICAgICAgICAgICAgICB3aGlsZSAoKnBzdHIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZTMyQSggaFduZEN0bCwgTEJfQUREU1RSSU5HMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV1BBUkFNMzIpLTEsIChMUEFSQU0pKnBzdHIgKTsKKyAgICAgICAgICB7IFNlbmRNZXNzYWdlMzJBKCBoV25kQ3RsLCBMQl9BRERTVFJJTkczMiwgKFdQQVJBTTMyKS0xLCAoTFBBUkFNKSpwc3RyICk7CiAgICAgICAgICAgICAgICAgICAgIHBzdHIrKzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UzMkEoIGhXbmRDdGwsIFdNX1NFVFJFRFJBVywgMSwgMCApOwpAQCAtNjE4LDggKzU5OCw3IEBACiAgICAgICAgIHJldHVybiAxOwogCiAgICAgY2FzZSBXTV9QQUlOVDoKLQl7Ci0JICAgIFJFQ1QzMiByZWN0OworICAgICAgeyBSRUNUMzIgcmVjdDsKIAkgICAgUEFJTlRTVFJVQ1QzMiBwczsKIAkgICAgSERDMzIgaERDID0gQmVnaW5QYWludDMyKCBoV25kLCAmcHMgKTsKIApAQCAtNjMwLDI5ICs2MDksMjUgQEAKIAlicmVhazsKIAogICAgIGNhc2UgV01fTEJUUkFDS1BPSU5UOgotCiAJaFduZEN0bCA9IEdldERsZ0l0ZW0zMihoV25kLCBJRENfTElTVEJPWCk7CiAJaWYoIChJTlQxNilHZXRLZXlTdGF0ZTE2KCBWS19DT05UUk9MICkgPCAwICkKLQl7Ci0JICAgIGlmKCBEcmFnRGV0ZWN0MzIoIGhXbmRDdGwsICooKExQUE9JTlQzMikmbFBhcmFtKSApICkKLQkgICAgewotCQlJTlQzMiBpZHggPSBTZW5kTWVzc2FnZTMyQSggaFduZEN0bCwgTEJfR0VUQ1VSU0VMMzIsIDAsIDAgKTsKKyAgICAgIHsgaWYoIERyYWdEZXRlY3QzMiggaFduZEN0bCwgKigoTFBQT0lOVDMyKSZsUGFyYW0pICkgKQorICAgICAgICB7IElOVDMyIGlkeCA9IFNlbmRNZXNzYWdlMzJBKCBoV25kQ3RsLCBMQl9HRVRDVVJTRUwzMiwgMCwgMCApOwogCQlpZiggaWR4ICE9IC0xICkKLQkJewotCQkgICAgSU5UMzIgbGVuZ3RoID0gU2VuZE1lc3NhZ2UzMkEoIGhXbmRDdGwsIExCX0dFVFRFWFRMRU4zMiwgKFdQQVJBTTMyKWlkeCwgMCApOworICAgICAgICAgIHsgSU5UMzIgbGVuZ3RoID0gU2VuZE1lc3NhZ2UzMkEoIGhXbmRDdGwsIExCX0dFVFRFWFRMRU4zMiwgKFdQQVJBTTMyKWlkeCwgMCApOwogCQkgICAgSEdMT0JBTDE2IGhNZW1PYmogPSBHbG9iYWxBbGxvYzE2KCBHTUVNX01PVkVBQkxFLCBsZW5ndGggKyAxICk7CiAJCSAgICBjaGFyKiBwc3RyID0gKGNoYXIqKUdsb2JhbExvY2sxNiggaE1lbU9iaiApOwogCiAJCSAgICBpZiggcHN0ciApCi0JCSAgICB7Ci0JCQlIQ1VSU09SMTYgaEN1cnNvciA9IExvYWRDdXJzb3IxNiggMCwgTUFLRUlOVFJFU09VUkNFMTYoT0NSX0RSQUdPQkpFQ1QpICk7CisgICAgICAgICAgICB7IEhDVVJTT1IxNiBoQ3Vyc29yID0gTG9hZEN1cnNvcjE2KCAwLCBNQUtFSU5UUkVTT1VSQ0UxNihPQ1JfRFJBR09CSkVDVCkgKTsKIAkJCVNlbmRNZXNzYWdlMzJBKCBoV25kQ3RsLCBMQl9HRVRURVhUMzIsIChXUEFSQU0zMilpZHgsIChMUEFSQU0pcHN0ciApOwogCQkJU2VuZE1lc3NhZ2UzMkEoIGhXbmRDdGwsIExCX0RFTEVURVNUUklORzMyLCAoV1BBUkFNMzIpaWR4LCAwICk7CiAJCQlVcGRhdGVXaW5kb3czMiggaFduZEN0bCApOwogCQkJaWYoICFEcmFnT2JqZWN0MTYoKEhXTkQxNiloV25kLCAoSFdORDE2KWhXbmQsIERSQUdPQkpfREFUQSwgMCwgKFdPUkQpaE1lbU9iaiwgaEN1cnNvcikgKQogCQkJICAgIFNlbmRNZXNzYWdlMzJBKCBoV25kQ3RsLCBMQl9BRERTVFJJTkczMiwgKFdQQVJBTTMyKS0xLCAoTFBBUkFNKXBzdHIgKTsKIAkJICAgIH0KLQkJICAgIGlmKCBoTWVtT2JqICkgR2xvYmFsRnJlZTE2KCBoTWVtT2JqICk7CisgICAgICAgICAgICBpZiggaE1lbU9iaiApCisgICAgICAgICAgICAgIEdsb2JhbEZyZWUxNiggaE1lbU9iaiApOwogCQl9CiAJICAgIH0KIAl9CkBAIC02NjAsMTggKzYzNSwxNCBAQAogCiAgICAgY2FzZSBXTV9RVUVSWURST1BPQkpFQ1Q6CiAJaWYoIHdQYXJhbSA9PSAwICkKLQl7Ci0JICAgIExQRFJBR0lORk8gbHBEcmFnSW5mbyA9IChMUERSQUdJTkZPKVBUUl9TRUdfVE9fTElOKChTRUdQVFIpbFBhcmFtKTsKKyAgICAgIHsgTFBEUkFHSU5GTyBscERyYWdJbmZvID0gKExQRFJBR0lORk8pUFRSX1NFR19UT19MSU4oKFNFR1BUUilsUGFyYW0pOwogCSAgICBpZiggbHBEcmFnSW5mbyAmJiBscERyYWdJbmZvLT53RmxhZ3MgPT0gRFJBR09CSl9EQVRBICkKLQkgICAgewotCQlSRUNUMzIgcmVjdDsKKyAgICAgICAgeyBSRUNUMzIgcmVjdDsKIAkJaWYoIF9fZ2V0X2Ryb3BsaW5lKCBoV25kLCAmcmVjdCApICkKLQkJewotCQkgICAgUE9JTlQzMiBwdCA9IHsgbHBEcmFnSW5mby0+cHQueCwgbHBEcmFnSW5mby0+cHQueSB9OworICAgICAgICAgIHsgUE9JTlQzMiBwdCA9IHsgbHBEcmFnSW5mby0+cHQueCwgbHBEcmFnSW5mby0+cHQueSB9OwogCQkgICAgcmVjdC5ib3R0b20gKz0gRFJPUF9GSUVMRF9IRUlHSFQ7CiAJCSAgICBpZiggUHRJblJlY3QzMiggJnJlY3QsIHB0ICkgKQotCQkgICAgewotCQkJU2V0V2luZG93TG9uZzMyQSggaFduZCwgRFdMX01TR1JFU1VMVCwgMSApOworICAgICAgICAgICAgeyBTZXRXaW5kb3dMb25nMzJBKCBoV25kLCBEV0xfTVNHUkVTVUxULCAxICk7CiAJCQlyZXR1cm4gVFJVRTsKIAkJICAgIH0KIAkJfQpAQCAtNjgxLDIyICs2NTIsMTggQEAKIAogICAgIGNhc2UgV01fRFJPUE9CSkVDVDoKIAlpZiggd1BhcmFtID09IGhXbmQgKQotCXsKLQkgICAgTFBEUkFHSU5GTyBscERyYWdJbmZvID0gKExQRFJBR0lORk8pUFRSX1NFR19UT19MSU4oKFNFR1BUUilsUGFyYW0pOworICAgICAgeyBMUERSQUdJTkZPIGxwRHJhZ0luZm8gPSAoTFBEUkFHSU5GTylQVFJfU0VHX1RPX0xJTigoU0VHUFRSKWxQYXJhbSk7CiAJICAgIGlmKCBscERyYWdJbmZvICYmIGxwRHJhZ0luZm8tPndGbGFncyA9PSBEUkFHT0JKX0RBVEEgJiYgbHBEcmFnSW5mby0+aExpc3QgKQotCSAgICB7Ci0JCWNoYXIqIHBzdHIgPSAoY2hhciopR2xvYmFsTG9jazE2KCAoSEdMT0JBTDE2KShscERyYWdJbmZvLT5oTGlzdCkgKTsKKyAgICAgICAgeyBjaGFyKiBwc3RyID0gKGNoYXIqKUdsb2JhbExvY2sxNiggKEhHTE9CQUwxNikobHBEcmFnSW5mby0+aExpc3QpICk7CiAJCWlmKCBwc3RyICkKLQkJewotCQkgICAgc3RhdGljIGNoYXIgX19hcHBlbmRpeF9zdHJbXSA9ICIgd2l0aCI7CisgICAgICAgICAgeyBzdGF0aWMgY2hhciBfX2FwcGVuZGl4X3N0cltdID0gIiB3aXRoIjsKIAogCQkgICAgaFduZEN0bCA9IEdldERsZ0l0ZW0zMiggaFduZCwgSURDX1dJTkVfVEVYVCApOwogCQkgICAgU2VuZE1lc3NhZ2UzMkEoIGhXbmRDdGwsIFdNX0dFVFRFWFQsIDUxMiwgKExQQVJBTSlUZW1wbGF0ZSApOwogCQkgICAgaWYoICFsc3RybmNtcDMyQSggVGVtcGxhdGUsICJXSU5FIiwgNCApICkKIAkJCVNldFdpbmRvd1RleHQzMkEoIEdldERsZ0l0ZW0zMihoV25kLCBJRENfU1RBVElDX1RFWFQpLCBUZW1wbGF0ZSApOwogCQkgICAgZWxzZQotCQkgICAgewotCQkJY2hhciogcGNoID0gVGVtcGxhdGUgKyBzdHJsZW4oVGVtcGxhdGUpIC0gc3RybGVuKF9fYXBwZW5kaXhfc3RyKTsKKyAgICAgICAgICB7IGNoYXIqIHBjaCA9IFRlbXBsYXRlICsgc3RybGVuKFRlbXBsYXRlKSAtIHN0cmxlbihfX2FwcGVuZGl4X3N0cik7CiAJCQkqcGNoID0gJ1wwJzsKIAkJCVNlbmRNZXNzYWdlMzJBKCBHZXREbGdJdGVtMzIoaFduZCwgSURDX0xJU1RCT1gpLCBMQl9BRERTVFJJTkczMiwgCiAJCQkJCShXUEFSQU0zMiktMSwgKExQQVJBTSlUZW1wbGF0ZSApOwpAQCAtNzA1LDcgKzY3Miw2IEBACiAJCSAgICBsc3RyY3B5MzJBKCBUZW1wbGF0ZSwgcHN0ciApOwogCQkgICAgbHN0cmNhdDMyQSggVGVtcGxhdGUsIF9fYXBwZW5kaXhfc3RyICk7CiAJCSAgICBTZXRXaW5kb3dUZXh0MzJBKCBoV25kQ3RsLCBUZW1wbGF0ZSApOwotCiAJCSAgICBTZXRXaW5kb3dMb25nMzJBKCBoV25kLCBEV0xfTVNHUkVTVUxULCAxICk7CiAJCSAgICByZXR1cm4gVFJVRTsKIAkJfQpAQCAtNzE1LDggKzY4MSw3IEBACiAKICAgICBjYXNlIFdNX0NPTU1BTkQ6CiAgICAgICAgIGlmICh3UGFyYW0gPT0gSURPSykKLSAgICAgICAgewotICAgICAgICAgICAgRW5kRGlhbG9nMzIoaFduZCwgVFJVRSk7CisgICAgeyAgRW5kRGlhbG9nMzIoaFduZCwgVFJVRSk7CiAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKQEAgLTczMCw4ICs2OTUsNyBAQAogICovCiBMUkVTVUxUIFdJTkFQSSBBYm91dERsZ1Byb2MxNiggSFdORDE2IGhXbmQsIFVJTlQxNiBtc2csIFdQQVJBTTE2IHdQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtICkKLXsKLSAgICByZXR1cm4gQWJvdXREbGdQcm9jMzIoIGhXbmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKK3sgcmV0dXJuIEFib3V0RGxnUHJvYzMyKCBoV25kLCBtc2csIHdQYXJhbSwgbFBhcmFtICk7CiB9CiAKIApAQCAtNzQwLDggKzcwNCw3IEBACiAgKi8KIEJPT0wxNiBXSU5BUEkgU2hlbGxBYm91dDE2KCBIV05EMTYgaFduZCwgTFBDU1RSIHN6QXBwLCBMUENTVFIgc3pPdGhlclN0dWZmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhJQ09OMTYgaEljb24gKQotewotICAgIHJldHVybiBTaGVsbEFib3V0MzJBKCBoV25kLCBzekFwcCwgc3pPdGhlclN0dWZmLCBoSWNvbiApOworeyByZXR1cm4gU2hlbGxBYm91dDMyQSggaFduZCwgc3pBcHAsIHN6T3RoZXJTdHVmZiwgaEljb24gKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTc0OSw4ICs3MTIsOCBAQAogICovCiBCT09MMzIgV0lOQVBJIFNoZWxsQWJvdXQzMkEoIEhXTkQzMiBoV25kLCBMUENTVFIgc3pBcHAsIExQQ1NUUiBzek90aGVyU3R1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhJQ09OMzIgaEljb24gKQotewotICAgIEFCT1VUX0lORk8gaW5mbzsKK3sgICBBQk9VVF9JTkZPIGluZm87CisgICAgVFJBQ0Uoc2hlbGwsIlxuIik7CiAgICAgaW5mby5zekFwcCAgICAgICAgPSBzekFwcDsKICAgICBpbmZvLnN6T3RoZXJTdHVmZiA9IHN6T3RoZXJTdHVmZjsKICAgICBpbmZvLmhJY29uICAgICAgICA9IGhJY29uOwpAQCAtNzY2LDEwICs3MjksMTEgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBTaGVsbEFib3V0MzJXKCBIV05EMzIgaFduZCwgTFBDV1NUUiBzekFwcCwgTFBDV1NUUiBzek90aGVyU3R1ZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhJQ09OMzIgaEljb24gKQotewotICAgIEJPT0wzMiByZXQ7Cit7ICAgQk9PTDMyIHJldDsKICAgICBBQk9VVF9JTkZPIGluZm87CiAKKyAgICBUUkFDRShzaGVsbCwiXG4iKTsKKyAgICAKICAgICBpbmZvLnN6QXBwICAgICAgICA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3pBcHAgKTsKICAgICBpbmZvLnN6T3RoZXJTdHVmZiA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3pPdGhlclN0dWZmICk7CiAgICAgaW5mby5oSWNvbiAgICAgICAgPSBoSWNvbjsKQEAgLTc5MCw3ICs3NTQsNyBAQAogICovCiBCT09MMzIgV0lOQVBJIFNoZWxsX05vdGlmeUljb24oCURXT1JEIGR3TWVzc2FnZSwKIAkJCQlQTk9USUZZSUNPTkRBVEEgcG5pZCApCi17Cit7ICAgVFJBQ0Uoc2hlbGwsIlxuIik7CiAgICAgcmV0dXJuIEZBTFNFOwogfQogCkBAIC04MDIsNyArNzY2LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBTaGVsbF9Ob3RpZnlJY29uQShEV09SRCBkd01lc3NhZ2UsCiAJCQkJUE5PVElGWUlDT05EQVRBIHBuaWQgKQoteworeyAgIFRSQUNFKHNoZWxsLCJcbiIpOwogICAgIHJldHVybiBGQUxTRTsKIH0KIApAQCAtODE0LDcgKzc3OCw3IEBACiAgIElNQUdFX0RPU19IRUFERVIJbXpfaGVhZGVyOwogICBjaGFyCQkJbWFnaWNbNF07CiAgIGludAkJCXNpemU7Ci0gIAorICBUUkFDRShzaGVsbCwiXG4iKTsgIAogICAqcmV0cHRyID0gTlVMTDsKICAgX2xsc2VlazMyKCBoRmlsZSwgMCwgU0VFS19TRVQgKTsKICAgaWYgKAkoX2xyZWFkMzIoaEZpbGUsJm16X2hlYWRlcixzaXplb2YobXpfaGVhZGVyKSkgIT0gc2l6ZW9mKG16X2hlYWRlcikpIHx8CkBAIC04NjQsMTMgKzgyOCwxMSBAQAogICoJCQlTSEVMTF9Mb2FkUmVzb3VyY2UKICAqLwogc3RhdGljIEhHTE9CQUwxNiBTSEVMTF9Mb2FkUmVzb3VyY2UoSElOU1RBTkNFMTYgaEluc3QsIEhGSUxFMzIgaEZpbGUsIE5FX05BTUVJTkZPKiBwTkluZm8sIFdPUkQgc2l6ZVNoaWZ0KQotewotIEJZVEUqCXB0cjsKK3sgQllURSogIHB0cjsKICBIR0xPQkFMMTYgaGFuZGxlID0gRGlyZWN0UmVzQWxsb2MoIGhJbnN0LCAweDEwLCAoRFdPUkQpcE5JbmZvLT5sZW5ndGggPDwgc2l6ZVNoaWZ0KTsKLQorICBUUkFDRShzaGVsbCwiXG4iKTsKICBpZiggKHB0ciA9IChCWVRFKilHbG9iYWxMb2NrMTYoIGhhbmRsZSApKSApCi0gICB7Ci0gICAgX2xsc2VlazMyKCBoRmlsZSwgKERXT1JEKXBOSW5mby0+b2Zmc2V0IDw8IHNpemVTaGlmdCwgU0VFS19TRVQpOworICB7IF9sbHNlZWszMiggaEZpbGUsIChEV09SRClwTkluZm8tPm9mZnNldCA8PCBzaXplU2hpZnQsIFNFRUtfU0VUKTsKICAgICAgX2xyZWFkMzIoIGhGaWxlLCAoY2hhciopcHRyLCBwTkluZm8tPmxlbmd0aCA8PCBzaXplU2hpZnQpOwogICAgICByZXR1cm4gaGFuZGxlOwogICAgfQpAQCAtODgxLDEzICs4NDMsMTEgQEAKICAqICAgICAgICAgICAgICAgICAgICAgIElDT19Mb2FkSWNvbgogICovCiBzdGF0aWMgSEdMT0JBTDE2IElDT19Mb2FkSWNvbihISU5TVEFOQ0UxNiBoSW5zdCwgSEZJTEUzMiBoRmlsZSwgTFBpY29JQ09ORElSRU5UUlkgbHBpSURFKQotewotIEJZVEUqICBwdHI7Cit7IEJZVEUqICBwdHI7CiAgSEdMT0JBTDE2IGhhbmRsZSA9IERpcmVjdFJlc0FsbG9jKCBoSW5zdCwgMHgxMCwgbHBpSURFLT5kd0J5dGVzSW5SZXMpOwotCisgIFRSQUNFKHNoZWxsLCJcbiIpOwogIGlmKCAocHRyID0gKEJZVEUqKUdsb2JhbExvY2sxNiggaGFuZGxlICkpICkKLSAgIHsKLSAgICBfbGxzZWVrMzIoIGhGaWxlLCBscGlJREUtPmR3SW1hZ2VPZmZzZXQsIFNFRUtfU0VUKTsKKyAgeyBfbGxzZWVrMzIoIGhGaWxlLCBscGlJREUtPmR3SW1hZ2VPZmZzZXQsIFNFRUtfU0VUKTsKICAgICAgX2xyZWFkMzIoIGhGaWxlLCAoY2hhciopcHRyLCBscGlJREUtPmR3Qnl0ZXNJblJlcyk7CiAgICAgIHJldHVybiBoYW5kbGU7CiAgICB9CkBAIC05MDAsMTEgKzg2MCwxMSBAQAogICogIFJlYWQgLmljbyBmaWxlIGFuZCBidWlsZCBwaG9ueSBJQ09ORElSIHN0cnVjdCBmb3IgR2V0SWNvbklECiAgKi8KIHN0YXRpYyBIR0xPQkFMMTYgSUNPX0dldEljb25EaXJlY3RvcnkoSElOU1RBTkNFMTYgaEluc3QsIEhGSUxFMzIgaEZpbGUsIExQaWNvSUNPTkRJUiogbHBscGlJRCApIAotewotICBXT1JECQlpZFszXTsJLyogaWRSZXNlcnZlZCwgaWRUeXBlLCBpZENvdW50ICovCit7IFdPUkQgICAgaWRbM107ICAvKiBpZFJlc2VydmVkLCBpZFR5cGUsIGlkQ291bnQgKi8KICAgTFBpY29JQ09ORElSCWxwaUlEOwogICBpbnQJCWk7CiAgCisgIFRSQUNFKHNoZWxsLCJcbiIpOyAKICAgX2xsc2VlazMyKCBoRmlsZSwgMCwgU0VFS19TRVQgKTsKICAgaWYoIF9scmVhZDMyKGhGaWxlLChjaGFyKilpZCxzaXplb2YoaWQpKSAhPSBzaXplb2YoaWQpICkgcmV0dXJuIDA7CiAKQEAgLTkyMCwxOCArODgwLDE1IEBACiAgIGxwaUlEID0gKExQaWNvSUNPTkRJUilIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIGkpOwogCiAgIGlmKCBfbHJlYWQzMihoRmlsZSwoY2hhciopbHBpSUQtPmlkRW50cmllcyxpKSA9PSBpICkKLSAgeyAgCi0gICAgIEhHTE9CQUwxNiBoYW5kbGUgPSBEaXJlY3RSZXNBbGxvYyggaEluc3QsIDB4MTAsCisgIHsgSEdMT0JBTDE2IGhhbmRsZSA9IERpcmVjdFJlc0FsbG9jKCBoSW5zdCwgMHgxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFsyXSpzaXplb2YoSUNPTkRJUkVOVFJZKSArIHNpemVvZihpZCkgKTsKICAgICAgaWYoIGhhbmRsZSApIAotICAgICB7Ci0gICAgICAgQ1VSU09SSUNPTkRJUiogICAgIGxwSUQgPSAoQ1VSU09SSUNPTkRJUiopR2xvYmFsTG9jazE2KCBoYW5kbGUgKTsKKyAgICB7IENVUlNPUklDT05ESVIqICAgICBscElEID0gKENVUlNPUklDT05ESVIqKUdsb2JhbExvY2sxNiggaGFuZGxlICk7CiAgICAgICAgbHBJRC0+aWRSZXNlcnZlZCA9IGxwaUlELT5pZFJlc2VydmVkID0gaWRbMF07CiAgICAgICAgbHBJRC0+aWRUeXBlID0gbHBpSUQtPmlkVHlwZSA9IGlkWzFdOwogICAgICAgIGxwSUQtPmlkQ291bnQgPSBscGlJRC0+aWRDb3VudCA9IGlkWzJdOwogICAgICAgIGZvciggaT0wOyBpIDwgbHBpSUQtPmlkQ291bnQ7IGkrKyApCi0gICAgICAgICB7Ci0JICAgIG1lbWNweSgodm9pZCopKGxwSUQtPmlkRW50cmllcyArIGkpLCAKKyAgICAgIHsgbWVtY3B5KCh2b2lkKikobHBJRC0+aWRFbnRyaWVzICsgaSksIAogCQkgICAodm9pZCopKGxwaUlELT5pZEVudHJpZXMgKyBpKSwgc2l6ZW9mKElDT05ESVJFTlRSWSkgLSAyKTsKIAkgICAgbHBJRC0+aWRFbnRyaWVzW2ldLmljb24ud1Jlc0lkID0gaTsKICAgICAgICAgIH0KQEAgLTk2MiwxMCArOTE5LDExIEBACiAgIEhGSUxFMzIgCWhGaWxlID0gT3BlbkZpbGUzMiggbHBzekV4ZUZpbGVOYW1lLCAmb2ZzLCBPRl9SRUFEICk7CiAgIFVJTlQxNglpY29uRGlyQ291bnQgPSAwLGljb25Db3VudCA9IDA7CiAgIAotICBUUkFDRShyZWcsIiglMDR4LGZpbGUgJXMsc3RhcnQgJWQsZXh0cmFjdCAlZFxuIiwgCisgIFRSQUNFKHNoZWxsLCIoJTA0eCxmaWxlICVzLHN0YXJ0ICVkLGV4dHJhY3QgJWRcbiIsIAogCQkgICAgICAgaEluc3RhbmNlLCBscHN6RXhlRmlsZU5hbWUsIG5JY29uSW5kZXgsIG4pOwogCi0gIGlmKCBoRmlsZSA9PSBIRklMRV9FUlJPUjMyIHx8ICFuICkgcmV0dXJuIDA7CisgIGlmKCBoRmlsZSA9PSBIRklMRV9FUlJPUjMyIHx8ICFuICkKKyAgICByZXR1cm4gMDsKIAogICBoUmV0ID0gR2xvYmFsQWxsb2MxNiggR01FTV9GSVhFRCB8IEdNRU1fWkVST0lOSVQsIHNpemVvZihISUNPTjE2KSpuKTsKICAgUmV0UHRyID0gKEhJQ09OMTYqKUdsb2JhbExvY2sxNihoUmV0KTsKQEAgLTk5OCwxMyArOTU2LDEzIEBACiAJICB7CiAJICAgICBpY29uRGlyQ291bnQgPSBwVEluZm8tPmNvdW50OwogCSAgICAgcEljb25EaXIgPSAoKE5FX05BTUVJTkZPKikocFRJbmZvICsgMSkpOwotCSAgICAgVFJBQ0UocmVnLCJcdGZvdW5kIGRpcmVjdG9yeSAtICVpIGljb24gZmFtaWxpZXNcbiIsIGljb25EaXJDb3VudCk7CisgICAgICAgVFJBQ0Uoc2hlbGwsIlx0Zm91bmQgZGlyZWN0b3J5IC0gJWkgaWNvbiBmYW1pbGllc1xuIiwgaWNvbkRpckNvdW50KTsKIAkgIH0KIAlpZiggcFRJbmZvLT50eXBlX2lkID09IE5FX1JTQ1RZUEVfSUNPTiApIAogCSAgeyAKIAkgICAgIGljb25Db3VudCA9IHBUSW5mby0+Y291bnQ7CiAJICAgICBwSWNvblN0b3JhZ2UgPSAoKE5FX05BTUVJTkZPKikocFRJbmZvICsgMSkpOwotCSAgICAgVFJBQ0UocmVnLCJcdHRvdGFsIGljb25zIC0gJWlcbiIsIGljb25Db3VudCk7CisgICAgICAgVFJBQ0Uoc2hlbGwsIlx0dG90YWwgaWNvbnMgLSAlaVxuIiwgaWNvbkNvdW50KTsKIAkgIH0KICAgCXBUSW5mbyA9IChORV9UWVBFSU5GTyAqKSgoY2hhciopKHBUSW5mbysxKStwVEluZm8tPmNvdW50KnNpemVvZihORV9OQU1FSU5GTykpOwogICAgIH0KQEAgLTEwNjgsMTMgKzEwMjYsMTMgQEAKIAkKIAlmbWFwcGluZyA9IENyZWF0ZUZpbGVNYXBwaW5nMzJBKGhGaWxlLE5VTEwsUEFHRV9SRUFET05MWXxTRUNfQ09NTUlULDAsMCxOVUxMKTsKIAlpZiAoZm1hcHBpbmcgPT0gMCkgeyAvKiBGSVhNRSwgSU5WQUxJRF9IQU5ETEVfVkFMVUU/ICovCi0JCVdBUk4ocmVnLCJmYWlsZWQgdG8gY3JlYXRlIGZpbGVtYXAuXG4iKTsKKyAgICBXQVJOKHNoZWxsLCJmYWlsZWQgdG8gY3JlYXRlIGZpbGVtYXAuXG4iKTsKIAkJX2xjbG9zZTMyKCBoRmlsZSk7CiAJCXJldHVybiAwOwogCX0KIAlwZWltYWdlID0gTWFwVmlld09mRmlsZShmbWFwcGluZyxGSUxFX01BUF9SRUFELDAsMCwwKTsKIAlpZiAoIXBlaW1hZ2UpIHsKLQkJV0FSTihyZWcsImZhaWxlZCB0byBtbWFwIGZpbGVtYXAuXG4iKTsKKyAgICBXQVJOKHNoZWxsLCJmYWlsZWQgdG8gbW1hcCBmaWxlbWFwLlxuIik7CiAJCUNsb3NlSGFuZGxlKGZtYXBwaW5nKTsKIAkJX2xjbG9zZTMyKCBoRmlsZSk7CiAJCXJldHVybiAwOwpAQCAtMTA5OCw3ICsxMDU2LDcgQEAKIAl9CiAKIAlpZiAoIXJvb3RyZXNkaXIpIHsKLQkJV0FSTihyZWcsImhhdmVuJ3QgZm91bmQgc2VjdGlvbiBmb3IgcmVzb3VyY2UgZGlyZWN0b3J5LlxuIik7CisgICAgV0FSTihzaGVsbCwiaGF2ZW4ndCBmb3VuZCBzZWN0aW9uIGZvciByZXNvdXJjZSBkaXJlY3RvcnkuXG4iKTsKIAkJVW5tYXBWaWV3T2ZGaWxlKHBlaW1hZ2UpOwogCQlDbG9zZUhhbmRsZShmbWFwcGluZyk7CiAJCV9sY2xvc2UzMiggaEZpbGUpOwpAQCAtMTEwNyw3ICsxMDY1LDcgQEAKIAlpY29uZ3JvdXByZXNkaXIgPSBHZXRSZXNEaXJFbnRyeVcocm9vdHJlc2RpcixSVF9HUk9VUF9JQ09OMzJXLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERXT1JEKXJvb3RyZXNkaXIsRkFMU0UpOwogCWlmICghaWNvbmdyb3VwcmVzZGlyKSB7Ci0JCVdBUk4ocmVnLCJObyBJY29uZ3JvdXByZXNvdXJjZWRpcmVjdG9yeSFcbiIpOworICAgIFdBUk4oc2hlbGwsIk5vIEljb25ncm91cHJlc291cmNlZGlyZWN0b3J5IVxuIik7CiAJCVVubWFwVmlld09mRmlsZShwZWltYWdlKTsKIAkJQ2xvc2VIYW5kbGUoZm1hcHBpbmcpOwogCQlfbGNsb3NlMzIoIGhGaWxlKTsKQEAgLTExMjQsNyArMTA4Miw3IEBACiAJfQogCiAJaWYgKG5JY29uSW5kZXggPj0gaWNvbkRpckNvdW50KSB7Ci0JCVdBUk4ocmVnLCJuSWNvbkluZGV4ICVkIGlzIGxhcmdlciB0aGFuIGljb25EaXJDb3VudCAlZFxuIiwKKyAgICBXQVJOKHNoZWxsLCJuSWNvbkluZGV4ICVkIGlzIGxhcmdlciB0aGFuIGljb25EaXJDb3VudCAlZFxuIiwKIAkJCSAgICBuSWNvbkluZGV4LGljb25EaXJDb3VudCk7CiAJCVVubWFwVmlld09mRmlsZShwZWltYWdlKTsKIAkJQ2xvc2VIYW5kbGUoZm1hcHBpbmcpOwpAQCAtMTE2Myw3ICsxMTIxLDcgQEAKIAkJCWlnZGF0YSA9IHBlaW1hZ2UrKGlnZGF0YWVudC0+T2Zmc2V0VG9EYXRhLXBlX3NlY3Rpb25zW2pdLlZpcnR1YWxBZGRyZXNzK3BlX3NlY3Rpb25zW2pdLlBvaW50ZXJUb1Jhd0RhdGEpOwogCQl9CiAJCWlmICghaWdkYXRhKSB7Ci0JCQlXQVJOKHJlZywibm8gbWF0Y2hpbmcgcmVhbCBhZGRyZXNzIGZvciBpY29uZ3JvdXAhXG4iKTsKKyAgICAgIFdBUk4oc2hlbGwsIm5vIG1hdGNoaW5nIHJlYWwgYWRkcmVzcyBmb3IgaWNvbmdyb3VwIVxuIik7CiAJCQlVbm1hcFZpZXdPZkZpbGUocGVpbWFnZSk7CiAJCQlDbG9zZUhhbmRsZShmbWFwcGluZyk7CiAJCQlfbGNsb3NlMzIoIGhGaWxlKTsKQEAgLTExNzcsNyArMTEzNSw3IEBACiAJaWNvbnJlc2Rpcj1HZXRSZXNEaXJFbnRyeVcocm9vdHJlc2RpcixSVF9JQ09OMzJXLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpcm9vdHJlc2RpcixGQUxTRSk7CiAJaWYgKCFpY29ucmVzZGlyKSB7Ci0JICAgIFdBUk4ocmVnLCJObyBJY29ucmVzb3VyY2VkaXJlY3RvcnkhXG4iKTsKKyAgICAgIFdBUk4oc2hlbGwsIk5vIEljb25yZXNvdXJjZWRpcmVjdG9yeSFcbiIpOwogCSAgICBVbm1hcFZpZXdPZkZpbGUocGVpbWFnZSk7CiAJICAgIENsb3NlSGFuZGxlKGZtYXBwaW5nKTsKIAkgICAgX2xjbG9zZTMyKCBoRmlsZSk7CkBAIC0xMjAxLDcgKzExNTksNyBAQAogCQlpZGF0YSA9IHBlaW1hZ2UrKGlkYXRhZW50LT5PZmZzZXRUb0RhdGEtcGVfc2VjdGlvbnNbal0uVmlydHVhbEFkZHJlc3MrcGVfc2VjdGlvbnNbal0uUG9pbnRlclRvUmF3RGF0YSk7CiAJICAgIH0KIAkgICAgaWYgKCFpZGF0YSkgewotCQlXQVJOKHJlZywibm8gbWF0Y2hpbmcgcmVhbCBhZGRyZXNzIGZvdW5kIGZvciBpY29uZGF0YSFcbiIpOworICAgIFdBUk4oc2hlbGwsIm5vIG1hdGNoaW5nIHJlYWwgYWRkcmVzcyBmb3VuZCBmb3IgaWNvbmRhdGEhXG4iKTsKIAkJUmV0UHRyW2ldPTA7CiAJCWNvbnRpbnVlOwogCSAgICB9CkBAIC0xMjIzLDcgKzExODEsNyBAQAogICovCiBISUNPTjE2IFdJTkFQSSBFeHRyYWN0SWNvbjE2KCBISU5TVEFOQ0UxNiBoSW5zdGFuY2UsIExQQ1NUUiBscHN6RXhlRmlsZU5hbWUsCiAJVUlOVDE2IG5JY29uSW5kZXggKQoteworeyAgIFRSQUNFKHNoZWxsLCJcbiIpOwogICAgIHJldHVybiBFeHRyYWN0SWNvbjMyQSggaEluc3RhbmNlLCBscHN6RXhlRmlsZU5hbWUsIG5JY29uSW5kZXggKTsKIH0KIApAQCAtMTIzMyw5ICsxMTkxLDggQEAKICAqLwogSElDT04zMiBXSU5BUEkgRXh0cmFjdEljb24zMkEoIEhJTlNUQU5DRTMyIGhJbnN0YW5jZSwgTFBDU1RSIGxwc3pFeGVGaWxlTmFtZSwKIAlVSU5UMzIgbkljb25JbmRleCApCi17Ci0gICAgSEdMT0JBTDE2IGhhbmRsZSA9IEludGVybmFsRXh0cmFjdEljb24oaEluc3RhbmNlLGxwc3pFeGVGaWxlTmFtZSxuSWNvbkluZGV4LCAxKTsKLQoreyAgIEhHTE9CQUwxNiBoYW5kbGUgPSBJbnRlcm5hbEV4dHJhY3RJY29uKGhJbnN0YW5jZSxscHN6RXhlRmlsZU5hbWUsbkljb25JbmRleCwgMSk7CisgICAgVFJBQ0Uoc2hlbGwsIlxuIik7CiAgICAgaWYoIGhhbmRsZSApCiAgICAgewogCUhJQ09OMTYqIHB0ciA9IChISUNPTjE2KilHbG9iYWxMb2NrMTYoaGFuZGxlKTsKQEAgLTEyNTIsOSArMTIwOSwxMiBAQAogICovCiBISUNPTjMyIFdJTkFQSSBFeHRyYWN0SWNvbjMyVyggSElOU1RBTkNFMzIgaEluc3RhbmNlLCBMUENXU1RSIGxwc3pFeGVGaWxlTmFtZSwKIAlVSU5UMzIgbkljb25JbmRleCApCi17Ci0JTFBTVFIJZXhlZm4gPSBIRUFQX3N0cmR1cFd0b0EoR2V0UHJvY2Vzc0hlYXAoKSwwLGxwc3pFeGVGaWxlTmFtZSk7Ci0JSElDT04zMglyZXQgPSBFeHRyYWN0SWNvbjMyQShoSW5zdGFuY2UsZXhlZm4sbkljb25JbmRleCk7Cit7IExQU1RSICBleGVmbjsKKyAgSElDT04zMiAgcmV0OworICBUUkFDRShzaGVsbCwiXG4iKTsKKworICBleGVmbiA9IEhFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLDAsbHBzekV4ZUZpbGVOYW1lKTsKKyAgcmV0ID0gRXh0cmFjdEljb24zMkEoaEluc3RhbmNlLGV4ZWZuLG5JY29uSW5kZXgpOwogCiAJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGV4ZWZuKTsKIAlyZXR1cm4gcmV0OwpAQCAtMTI2OSwyOSArMTIyOSwyOCBAQAogICovCiBISUNPTjMyIFdJTkFQSSBFeHRyYWN0QXNzb2NpYXRlZEljb24zMkEoSElOU1RBTkNFMzIgaEluc3QsTFBTVFIgbHBJY29uUGF0aCwKIAlMUFdPUkQgbHBpSWNvbikKLXsKK3sgVFJBQ0Uoc2hlbGwsIlxuIik7CiAJcmV0dXJuIEV4dHJhY3RBc3NvY2lhdGVkSWNvbjE2KGhJbnN0LGxwSWNvblBhdGgsbHBpSWNvbik7CiB9CiAKIEhJQ09OMTYgV0lOQVBJIEV4dHJhY3RBc3NvY2lhdGVkSWNvbjE2KEhJTlNUQU5DRTE2IGhJbnN0LExQU1RSIGxwSWNvblBhdGgsCiAJTFBXT1JEIGxwaUljb24pCi17Ci0gICAgSElDT04xNiBoSWNvbiA9IEV4dHJhY3RJY29uMTYoaEluc3QsIGxwSWNvblBhdGgsICpscGlJY29uKTsKK3sgSElDT04xNiBoSWNvbjsKIAotICAgIGlmKCBoSWNvbiA8IDIgKQotICAgIHsKKyAgVFJBQ0Uoc2hlbGwsIlxuIik7CiAKLQlpZiggaEljb24gPT0gMSApIC8qIG5vIGljb25zIGZvdW5kIGluIGdpdmVuIGZpbGUgKi8KLQl7Ci0JICAgIGNoYXIgIHRlbXBQYXRoWzB4ODBdOworICBoSWNvbiA9IEV4dHJhY3RJY29uMTYoaEluc3QsIGxwSWNvblBhdGgsICpscGlJY29uKTsKKworICBpZiggaEljb24gPCAyICkKKyAgeyBpZiggaEljb24gPT0gMSApIC8qIG5vIGljb25zIGZvdW5kIGluIGdpdmVuIGZpbGUgKi8KKyAgICB7IGNoYXIgIHRlbXBQYXRoWzB4ODBdOwogCSAgICBVSU5UMTYgIHVSZXQgPSBGaW5kRXhlY3V0YWJsZTE2KGxwSWNvblBhdGgsTlVMTCx0ZW1wUGF0aCk7CiAKIAkgICAgaWYoIHVSZXQgPiAzMiAmJiB0ZW1wUGF0aFswXSApCi0JICAgIHsKLQkJc3RyY3B5KGxwSWNvblBhdGgsdGVtcFBhdGgpOworICAgICAgeyBzdHJjcHkobHBJY29uUGF0aCx0ZW1wUGF0aCk7CiAJCWhJY29uID0gRXh0cmFjdEljb24xNihoSW5zdCwgbHBJY29uUGF0aCwgKmxwaUljb24pOwotCi0JCWlmKCBoSWNvbiA+IDIgKSByZXR1cm4gaEljb247CisgICAgICAgIGlmKCBoSWNvbiA+IDIgKSAKKyAgICAgICAgICByZXR1cm4gaEljb247CiAJICAgIH0KIAkgICAgZWxzZSBoSWNvbiA9IDA7CiAJfQpAQCAtMTMwNCw3ICsxMjYzLDYgQEAKIAlHZXRNb2R1bGVGaWxlTmFtZTE2KGhJbnN0LCBscEljb25QYXRoLCAweDgwKTsKIAloSWNvbiA9IExvYWRJY29uMTYoIGhJbnN0LCBNQUtFSU5UUkVTT1VSQ0UxNigqbHBpSWNvbikpOwogICAgIH0KLQogICAgIHJldHVybiBoSWNvbjsKIH0KIApAQCAtMTMxNCwxMiArMTI3MiwxNCBAQAogICogUmV0dXJucyBhIHBvaW50ZXIgaW50byB0aGUgRE9TIGVudmlyb25tZW50Li4uIFVnaC4KICAqLwogTFBTVFIgU0hFTExfRmluZFN0cmluZyhMUFNUUiBscEVudiwgTFBDU1RSIGVudHJ5KQotewotICAgIFVJTlQxNiAJbCA9IHN0cmxlbihlbnRyeSk7IAotICAgIGZvciggOyAqbHBFbnYgOyBscEVudis9c3RybGVuKGxwRW52KSsxICkKLSAgICB7Ci0JaWYoIGxzdHJuY21waTMyQShscEVudiwgZW50cnksIGwpICkgY29udGludWU7Cit7IFVJTlQxNiBsOwogCisgIFRSQUNFKHNoZWxsLCJcbiIpOworCisgIGwgPSBzdHJsZW4oZW50cnkpOyAKKyAgZm9yKCA7ICpscEVudiA7IGxwRW52Kz1zdHJsZW4obHBFbnYpKzEgKQorICB7IGlmKCBsc3RybmNtcGkzMkEobHBFbnYsIGVudHJ5LCBsKSApIAorICAgICAgY29udGludWU7CiAJaWYoICEqKGxwRW52K2wpICkKIAkgICAgcmV0dXJuIChscEVudiArIGwpOyAJCS8qIGVtcHR5IGVudHJ5ICovCiAJZWxzZSBpZiAoICoobHBFbnYrbCk9PSAnPScgKQpAQCAtMTMyOSwxNSArMTI4OSwxNyBAQAogfQogCiBTRUdQVFIgV0lOQVBJIEZpbmRFbnZpcm9ubWVudFN0cmluZyhMUFNUUiBzdHIpCi17Ci0gICAgU0VHUFRSICBzcEVudiA9IEdldERPU0Vudmlyb25tZW50KCk7Ci0gICAgTFBTVFIgIGxwRW52ID0gKExQU1RSKVBUUl9TRUdfVE9fTElOKHNwRW52KTsKK3sgU0VHUFRSICBzcEVudjsKKyAgTFBTVFIgbHBFbnYsbHBTdHJpbmc7CisgIFRSQUNFKHNoZWxsLCJcbiIpOworICAgIAorICBzcEVudiA9IEdldERPU0Vudmlyb25tZW50KCk7CiAKLSAgICBMUFNUUiAgbHBTdHJpbmcgPSAoc3BFbnYpP1NIRUxMX0ZpbmRTdHJpbmcobHBFbnYsIHN0cik6TlVMTDsgCisgIGxwRW52ID0gKExQU1RSKVBUUl9TRUdfVE9fTElOKHNwRW52KTsKKyAgbHBTdHJpbmcgPSAoc3BFbnYpP1NIRUxMX0ZpbmRTdHJpbmcobHBFbnYsIHN0cik6TlVMTDsgCiAKICAgICBpZiggbHBTdHJpbmcgKQkJLyogIG9mZnNldCBzaG91bGQgYmUgc21hbGwgZW5vdWdoICovCiAJcmV0dXJuIHNwRW52ICsgKGxwU3RyaW5nIC0gbHBFbnYpOwotCiAgICAgcmV0dXJuIChTRUdQVFIpTlVMTDsKIH0KIApAQCAtMTM1Niw3ICsxMzE4LDcgQEAKIAogICBDaGFyVG9PZW0zMkEoc3RyLHN0cik7CiAKLSAgVFJBQ0UocmVnLCJhY2NlcHQgJXNcbiIsIHN0cik7CisgIFRSQUNFKHNoZWxsLCJhY2NlcHQgJXNcbiIsIHN0cik7CiAKICAgd2hpbGUoICpscHN0ciAmJiBscGJzdHIgLSBscEJ1ZmZlciA8IGxlbmd0aCApCiAgICB7CkBAIC0xMzc2LDcgKzEzMzgsNyBAQAogCiAJCSAgIGlmKCBsID4gbGVuZ3RoIC0gKGxwYnN0ciAtIGxwQnVmZmVyKSAtIDEgKQogCQkgICAgIHsKLQkJICAgICAgIFdBUk4ocmVnLCJFbnYgc3Vic3QgYWJvcnRlZCAtIHN0cmluZyB0b28gc2hvcnRcbiIpOworICAgICAgICAgICBXQVJOKHNoZWxsLCItLSBFbnYgc3Vic3QgYWJvcnRlZCAtIHN0cmluZyB0b28gc2hvcnRcbiIpOwogCQkgICAgICAqbHBlbmQgPSAnJSc7CiAJCSAgICAgICBicmVhazsKIAkJICAgICB9CkBAIC0xNDA0LDcgKzEzNjYsNyBAQAogICBlbHNlCiAgICAgICBsZW5ndGggPSAwOwogCi0gIFRSQUNFKHJlZywiICAgIHJldHVybiAlc1xuIiwgc3RyKTsKKyAgVFJBQ0Uoc2hlbGwsIi0tIHJldHVybiAlc1xuIiwgc3RyKTsKIAogICBPZW1Ub0NoYXIzMkEoc3RyLHN0cik7CiAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBscEJ1ZmZlcik7CkBAIC0xNDIxLDcgKzEzODMsNyBAQAogICovCiBMUkVTVUxUIFdJTkFQSSBTaGVsbEhvb2tQcm9jKElOVDE2IGNvZGUsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLSAgICBUUkFDRShyZWcsIiVpLCAlMDR4LCAlMDh4XG4iLCBjb2RlLCB3UGFyYW0sIAorICAgIFRSQUNFKHNoZWxsLCIlaSwgJTA0eCwgJTA4eFxuIiwgY29kZSwgd1BhcmFtLCAKIAkJCQkJCSAgICAgICh1bnNpZ25lZClsUGFyYW0gKTsKICAgICBpZiggU0hFTExfaEhvb2sgJiYgU0hFTExfaFduZCApCiAgICAgewpAQCAtMTQ0MSw2NCArMTQwMywxNDQgQEAKICAqCQkJCVJlZ2lzdGVyU2hlbGxIb29rCVtTSEVMTC4xMDJdCiAgKi8KIEJPT0wzMiBXSU5BUEkgUmVnaXN0ZXJTaGVsbEhvb2soSFdORDE2IGhXbmQsIFVJTlQxNiB1QWN0aW9uKQotewotICAgIFRSQUNFKHJlZywiJTA0eCBbJXVdXG4iLCBoV25kLCB1QWN0aW9uICk7Cit7IFRSQUNFKHNoZWxsLCIlMDR4IFsldV1cbiIsIGhXbmQsIHVBY3Rpb24gKTsKIAogICAgIHN3aXRjaCggdUFjdGlvbiApCi0gICAgewotCWNhc2UgMjoJLyogcmVnaXN0ZXIgaFduZCBhcyBhIHNoZWxsIHdpbmRvdyAqLwotCisgIHsgY2FzZSAyOiAgLyogcmVnaXN0ZXIgaFduZCBhcyBhIHNoZWxsIHdpbmRvdyAqLwogCSAgICAgaWYoICFTSEVMTF9oSG9vayApCi0JICAgICB7Ci0JCUhNT0RVTEUxNiBoU2hlbGwgPSBHZXRNb2R1bGVIYW5kbGUxNiggIlNIRUxMIiApOwotCi0JCVNIRUxMX2hIb29rID0gU2V0V2luZG93c0hvb2tFeDE2KCBXSF9TSEVMTCwgU2hlbGxIb29rUHJvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNoZWxsLCAwICk7CisgICAgICB7IEhNT0RVTEUxNiBoU2hlbGwgPSBHZXRNb2R1bGVIYW5kbGUxNiggIlNIRUxMIiApOworICAgICAgICBTSEVMTF9oSG9vayA9IFNldFdpbmRvd3NIb29rRXgxNiggV0hfU0hFTEwsIFNoZWxsSG9va1Byb2MsIGhTaGVsbCwgMCApOwogCQlpZiggU0hFTExfaEhvb2sgKQotCQl7Ci0JCSAgICB1TXNnV25kQ3JlYXRlZCA9IFJlZ2lzdGVyV2luZG93TWVzc2FnZTMyQSggbHBzdHJNc2dXbmRDcmVhdGVkICk7CisgICAgICAgIHsgdU1zZ1duZENyZWF0ZWQgPSBSZWdpc3RlcldpbmRvd01lc3NhZ2UzMkEoIGxwc3RyTXNnV25kQ3JlYXRlZCApOwogCQkgICAgdU1zZ1duZERlc3Ryb3llZCA9IFJlZ2lzdGVyV2luZG93TWVzc2FnZTMyQSggbHBzdHJNc2dXbmREZXN0cm95ZWQgKTsKIAkJICAgIHVNc2dTaGVsbEFjdGl2YXRlID0gUmVnaXN0ZXJXaW5kb3dNZXNzYWdlMzJBKCBscHN0ck1zZ1NoZWxsQWN0aXZhdGUgKTsKIAkJfSAKLQkJZWxzZSBXQVJOKHJlZywgInVuYWJsZSB0byBpbnN0YWxsIFNoZWxsSG9va1Byb2MoKSFcbiIpOworICAgICAgICBlbHNlIAorICAgICAgICAgIFdBUk4oc2hlbGwsIi0tIHVuYWJsZSB0byBpbnN0YWxsIFNoZWxsSG9va1Byb2MoKSFcbiIpOwogCSAgICAgfQogCi0JICAgICBpZiggU0hFTExfaEhvb2sgKSByZXR1cm4gKChTSEVMTF9oV25kID0gaFduZCkgIT0gMCk7CisgICAgICBpZiggU0hFTExfaEhvb2sgKQorICAgICAgICByZXR1cm4gKChTSEVMTF9oV25kID0gaFduZCkgIT0gMCk7CiAJICAgICBicmVhazsKIAogCWRlZmF1bHQ6Ci0KLQkgICAgIFdBUk4ocmVnLCAidW5rbm93biBjb2RlICVpXG4iLCB1QWN0aW9uICk7Ci0KKyAgICBXQVJOKHNoZWxsLCAiLS0gdW5rbm93biBjb2RlICVpXG4iLCB1QWN0aW9uICk7CiAJICAgICAvKiBqdXN0IGluIGNhc2UgKi8KLQogCSAgICAgU0hFTExfaFduZCA9IDA7CiAgICAgfQogICAgIHJldHVybiBGQUxTRTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJU0hHZXRGaWxlSW5mb0EJCVtTSEVMTDMyLjIxOF0KKyAqCisgKiBGSVhNRQorICogICAKICAqLworSElNQUdFTElTVCBTaGVsbFNtYWxsSWNvbkxpc3QgPSAwOworSElNQUdFTElTVCBTaGVsbEJpZ0ljb25MaXN0ID0gMDsKKwogRFdPUkQgV0lOQVBJIFNIR2V0RmlsZUluZm8zMkEoTFBDU1RSIHBhdGgsRFdPUkQgZHdGaWxlQXR0cmlidXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIRklMRUlORk8zMkEgKnBzZmksIFVJTlQzMiBzaXplb2Zwc2ZpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGZsYWdzICkKLXsKLQlGSVhNRShzaGVsbCwiKCVzLDB4JTA4bHgsJXAsJWQsMHglMDh4KTogc3R1YlxuIiwKK3sgQ0hBUiBzelRlbXBbTUFYX1BBVEhdOworICBEV09SRCByZXQ9MDsKKyAgCisgIFRSQUNFKHNoZWxsLCIoJXMsMHgleCwlcCwweCV4LDB4JXgpXG4iLAogCSAgICAgIHBhdGgsZHdGaWxlQXR0cmlidXRlcyxwc2ZpLHNpemVvZnBzZmksZmxhZ3MpOwotCXJldHVybiBUUlVFOworCisgIC8qIHRyYW5zbGF0ZSB0aGUgcGlkbCB0byBhIHBhdGgqLworICBpZiAoZmxhZ3MgJiBTSEdGSV9QSURMKQorICB7IFNIR2V0UGF0aEZyb21JRExpc3QzMkEgKChMUENJVEVNSURMSVNUKXBhdGgsc3pUZW1wKTsKKyAgICBUUkFDRShzaGVsbCwicGlkbD0lcCBpcyAlc1xuIixwYXRoLHN6VGVtcCk7CisgIH0KKworICBpZiAoZmxhZ3MgJiBTSEdGSV9BVFRSSUJVVEVTKQorICB7IEZJWE1FKHNoZWxsLCJmaWxlIGF0dHJpYnV0ZXMsIHN0dWJcbiIpOworICAgIHBzZmktPmR3QXR0cmlidXRlcz0wOworICAgIHJldD1UUlVFOyAgICAKKyAgfQorCisgIGlmIChmbGFncyAmIFNIR0ZJX0RJU1BMQVlOQU1FKQorICB7IGlmIChmbGFncyAmIFNIR0ZJX1BJREwpCisgICAgeyBzdHJjcHkocHNmaS0+c3pEaXNwbGF5TmFtZSxzelRlbXApOworICAgIH0KKyAgICBlbHNlCisgICAgeyBzdHJjcHkocHNmaS0+c3pEaXNwbGF5TmFtZSxwYXRoKTsKKyAgICAgIFRSQUNFKHNoZWxsLCJkaXNwbGF5bmFtZT0lc1xuIiwgc3pUZW1wKTsKKyAgICB9CisgICAgcmV0PVRSVUU7CisgIH0KKyAgCisgIGlmIChmbGFncyAmIFNIR0ZJX1RZUEVOQU1FKQorICB7IEZJWE1FKHNoZWxsLCJnZXQgdGhlIGZpbGUgdHlwZSwgc3R1YlxuIik7CisgICAgc3RyY3B5KHBzZmktPnN6VHlwZU5hbWUsIiIpOworICAgIHJldD1UUlVFOworICB9CisgIAorICBpZiAoZmxhZ3MgJiBTSEdGSV9JQ09OTE9DQVRJT04pCisgIHsgRklYTUUoc2hlbGwsImxvY2F0aW9uIG9mIGljb24sIHN0dWJcbiIpOworICAgIHN0cmNweShwc2ZpLT5zekRpc3BsYXlOYW1lLCIiKTsKKyAgICByZXQ9VFJVRTsKKyAgfQorCisgIGlmIChmbGFncyAmIFNIR0ZJX0VYRVRZUEUpCisgICAgRklYTUUoc2hlbGwsInR5cGUgb2YgZXhlY3V0YWJsZSwgc3R1YlxuIik7CisKKyAgaWYgKGZsYWdzICYgU0hHRklfTElOS09WRVJMQVkpCisgICAgRklYTUUoc2hlbGwsInNldCBpY29uIHRvIGxpbmssIHN0dWJcbiIpOworCisgIGlmIChmbGFncyAmIFNIR0ZJX09QRU5JQ09OKQorICAgIEZJWE1FKHNoZWxsLCJzZXQgdG8gb3BlbiBpY29uLCBzdHViXG4iKTsKKworICBpZiAoZmxhZ3MgJiBTSEdGSV9TRUxFQ1RFRCkKKyAgICBGSVhNRShzaGVsbCwic2V0IGljb24gdG8gc2VsZWN0ZWQsIHN0dWJcbiIpOworCisgIGlmIChmbGFncyAmIFNIR0ZJX1NIRUxMSUNPTlNJWkUpCisgICAgRklYTUUoc2hlbGwsInNldCBpY29uIHRvIHNoZWxsIHNpemUsIHN0dWJcbiIpOworCisgIGlmIChmbGFncyAmIFNIR0ZJX1VTRUZJTEVBVFRSSUJVVEVTKQorICAgIEZJWE1FKHNoZWxsLCJ1c2UgdGhlIGR3RmlsZUF0dHJpYnV0ZXMsIHN0dWJcbiIpOworIAorICBpZiAoZmxhZ3MgJiBTSEdGSV9JQ09OKQorICB7IEZJWE1FKHNoZWxsLCJpY29uIGhhbmRsZVxuIik7CisgICAgaWYgKGZsYWdzICYgU0hHRklfU01BTExJQ09OKQorICAgICB7IFRSQUNFKHNoZWxsLCJzZXQgdG8gc21hbGwgaWNvblxuIik7IAorICAgICAgIHBzZmktPmhJY29uPUltYWdlTGlzdF9HZXRJY29uKFNoZWxsU21hbGxJY29uTGlzdCwwLElMRF9OT1JNQUwpOworICAgICAgIHJldCA9IChEV09SRCkgU2hlbGxTbWFsbEljb25MaXN0OworICAgICB9CisgICAgIGVsc2UKKyAgICAgeyBUUkFDRShzaGVsbCwic2V0IHRvIGJpZyBpY29uXG4iKTsKKyAgICAgICBwc2ZpLT5oSWNvbj1JbWFnZUxpc3RfR2V0SWNvbihTaGVsbEJpZ0ljb25MaXN0LDAsSUxEX05PUk1BTCk7CisgICAgICAgcmV0ID0gKERXT1JEKSBTaGVsbEJpZ0ljb25MaXN0OworICAgICB9ICAgICAgCisgIH0KKworICBpZiAoZmxhZ3MgJiBTSEdGSV9TWVNJQ09OSU5ERVgpCisgIHsgIEZJWE1FKHNoZWxsLCJnZXQgdGhlIFNZU0lDT05JTkRFWFxuIik7CisgICAgIHBzZmktPmlJY29uPTE7CisgICAgIGlmIChmbGFncyAmIFNIR0ZJX1NNQUxMSUNPTikKKyAgICAgeyBUUkFDRShzaGVsbCwic2V0IHRvIHNtYWxsIGljb25cbiIpOyAKKyAgICAgICByZXQgPSAoRFdPUkQpIFNoZWxsU21hbGxJY29uTGlzdDsKKyAgICAgfQorICAgICBlbHNlICAgICAgICAKKyAgICAgeyBUUkFDRShzaGVsbCwic2V0IHRvIGJpZyBpY29uXG4iKTsKKyAgICAgICByZXQgPSAoRFdPUkQpIFNoZWxsQmlnSWNvbkxpc3Q7CisgICAgIH0KKyAgfQorCisgCisgIHJldHVybiByZXQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQlTSEFwcEJhck1lc3NhZ2UzMglbU0hFTEwzMi4yMDddCiAgKi8KIFVJTlQzMiBXSU5BUEkgU0hBcHBCYXJNZXNzYWdlMzIoRFdPUkQgbXNnLCBQQVBQQkFSREFUQSBkYXRhKQotewotICAgIEZJWE1FKHNoZWxsLCIoMHglMDhseCwlcCk6IHN0dWJcbiIsIG1zZywgZGF0YSk7Cit7IEZJWE1FKHNoZWxsLCIoMHglMDhseCwlcCk6IHN0dWJcbiIsIG1zZywgZGF0YSk7CiAjaWYgMAotICAgIHN3aXRjaCAobXNnKSB7Ci0gICAgICAgIGNhc2UgQUJNX0FDVElWQVRFOgorICBzd2l0Y2ggKG1zZykKKyAgeyBjYXNlIEFCTV9BQ1RJVkFURToKICAgICAgICAgY2FzZSBBQk1fR0VUQVVUT0hJREVCQVI6CiAgICAgICAgIGNhc2UgQUJNX0dFVFNUQVRFOgogICAgICAgICBjYXNlIEFCTV9HRVRUQVNLQkFSUE9TOgpAQCAtMTUxOCwxNyArMTU2MCwxNyBAQAogICoJCQkJQ29tbWFuZExpbmVUb0FyZ3ZXCVtTSEVMTDMyLjddCiAgKi8KIExQV1NUUiogV0lOQVBJIENvbW1hbmRMaW5lVG9Bcmd2VyhMUFdTVFIgY21kbGluZSxMUERXT1JEIG51bWFyZ3MpCi17Ci0JTFBXU1RSCSphcmd2LHMsdDsKK3sgTFBXU1RSICAqYXJndixzLHQ7CiAJaW50CWk7CisgIFRSQUNFKHNoZWxsLCJcbiIpOwogCiAgICAgICAgIC8qIHRvIGdldCB3cml0ZWFibGUgY29weSAqLwogCWNtZGxpbmUgPSBIRUFQX3N0cmR1cFcoIEdldFByb2Nlc3NIZWFwKCksIDAsIGNtZGxpbmUpOwogCXM9Y21kbGluZTtpPTA7Ci0Jd2hpbGUgKCpzKSB7Ci0JCS8qIHNwYWNlICovCi0JCWlmICgqcz09MHgwMDIwKSB7Ci0JCQlpKys7CisgIHdoaWxlICgqcykKKyAgeyAvKiBzcGFjZSAqLworICAgIGlmICgqcz09MHgwMDIwKSAKKyAgICB7IGkrKzsKIAkJCXMrKzsKIAkJCXdoaWxlICgqcyAmJiAqcz09MHgwMDIwKQogCQkJCXMrKzsKQEAgLTE1MzksOSArMTU4MSw5IEBACiAJYXJndj0oTFBXU1RSKilIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihMUFdTVFIpKihpKzEpICk7CiAJcz10PWNtZGxpbmU7CiAJaT0wOwotCXdoaWxlICgqcykgewotCQlpZiAoKnM9PTB4MDAyMCkgewotCQkJKnM9MDsKKyAgd2hpbGUgKCpzKQorICB7IGlmICgqcz09MHgwMDIwKQorICAgIHsgKnM9MDsKIAkJCWFyZ3ZbaSsrXT1IRUFQX3N0cmR1cFcoIEdldFByb2Nlc3NIZWFwKCksIDAsIHQgKTsKIAkJCSpzPTB4MDAyMDsKIAkJCXdoaWxlICgqcyAmJiAqcz09MHgwMDIwKQpAQCAtMTU3MSw4ICsxNjEzLDcgQEAKICAqLwogCiB2b2lkIFdJTkFQSSBDb250cm9sX1J1bkRMTCAoSFdORDMyIGh3bmQsIExQQ1ZPSUQgY29kZSwgTFBDU1RSIGNtZCwgRFdPUkQgYXJnNCkKLXsKLSAgVFJBQ0UoZXhlYywgIiglMDh4LCAlcCwgXCIlc1wiLCAlMDhseClcbiIsCit7IEZJWE1FKHNoZWxsLCAiKCUwOHgsICVwLCBcIiVzXCIsICUwOGx4KVxuIiwKIAlod25kLCBjb2RlID8gY29kZSA6ICIobnVsbCkiLCBjbWQgPyBjbWQgOiAiKG51bGwpIiwgYXJnNCk7CiB9CiAKQEAgLTE1ODAsOCArMTYyMSw3IEBACiAgKiBGcmVlSWNvbkxpc3QKICAqLwogdm9pZCBXSU5BUEkgRnJlZUljb25MaXN0KCBEV09SRCBkdyApCi17Ci0gICAgRklYTUUocmVnLCAiKCVseCk6IHN0dWJcbiIsZHcpOworeyBGSVhNRShzaGVsbCwgIiglbHgpOiBzdHViXG4iLGR3KTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE2MTUsOCArMTY1NSw2IEBACiAJICBpZihJc0VxdWFsQ0xTSUQocmNsc2lkLCAmQ0xTSURfU2hlbGxMaW5rKSkgICAgICAgICAvKmRlYnVnKi8KIAkgICAgVFJBQ0Uoc2hlbGwsInJlcXVlc3RlZCBDTFNJRF9TaGVsbExpbmtcbiIpOwogCi0gICAgLyogZml4bWU6IHRoZSBJQ2xhc3NGYWN0b3J5X0NvbnN0cnVjdG9yIGlzIGF0IHRoZSBtb21lbnQgb25seSAKLQkJIGZvciByY2xzaWQ9Q0xTSURfU2hlbGxEZXNrdG9wLCBzbyB3ZSBnZXQgdGhlIHJpZ2h0IEludGVyZmFjZSAoanNjaCkqLwogCSAgbHBjbGYgPSBJQ2xhc3NGYWN0b3J5X0NvbnN0cnVjdG9yKCk7CiAgICAgaWYobHBjbGYpCiAgICAgeyBocmVzID0gbHBjbGYtPmxwdnRibC0+Zm5RdWVyeUludGVyZmFjZShscGNsZixpaWQsIHBwdik7CkBAIC0xODkxLDQ4ICsxOTI5LDcxIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogU0hHZXRQYXRoRnJvbUlETGlzdDMyQSAgICAgICAgW1NIRUxMMzIuMjYxXVtOVCA0LjA6IFNIRUxMMzIuMjIwXQogICoKKyAqIFBBUkFNRVRFUlMKKyAqICBwaWRsLCAgIFtJTl0gcGlkbCAKKyAqICBwc3pQYXRoIFtPVVRdIHBhdGgKKyAqCisgKiBSRVRVUk5TIAorICogIHBhdGggZnJvbSBhIHBhc3NlZCBQSURMLgorICoKICAqIE5PVEVTCiAgKiAgICAgZXhwb3J0ZWQgYnkgbmFtZQorICoKICAqIEZJWE1FCiAgKiAgZm5HZXREaXNwbGF5TmFtZU9mIGNhbiByZXR1cm4gZGlmZmVyZW50IHR5cGVzIG9mIE9MRVN0cmluZwogICovCi1EV09SRCBXSU5BUEkgU0hHZXRQYXRoRnJvbUlETGlzdDMyQSAoCi0gICAgTFBDSVRFTUlETElTVCBwaWRsLCAvKiBbSU5dIHBpZGwgKi8KLQkJTFBTVFIgcHN6UGF0aCkgICAgICAvKiBbT1VUXSBwYXRoICovCitEV09SRCBXSU5BUEkgU0hHZXRQYXRoRnJvbUlETGlzdDMyQSAoTFBDSVRFTUlETElTVCBwaWRsLExQU1RSIHBzelBhdGgpCiB7CVNUUlJFVCBscE5hbWU7CiAJTFBTSEVMTEZPTERFUiBzaGVsbGZvbGRlcjsKKyAgQ0hBUiAgYnVmZmVyW01BWF9QQVRIXSx0cGF0aFtNQVhfUEFUSF07CisgIERXT1JEIHR5cGUsdHBhdGhsZW49TUFYX1BBVEgsZHdkaXNwOworICBIS0VZICBrZXk7CisKIAlUUkFDRShzaGVsbCwiKHBpZGw9JXAsJXApXG4iLHBpZGwscHN6UGF0aCk7CiAKLQlpZiAoU0hHZXREZXNrdG9wRm9sZGVyKCZzaGVsbGZvbGRlcik9PVNfT0spCisgIGlmICghcGlkbCkKKyAgeyAgc3RyY3B5KGJ1ZmZlciwiU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXEV4cGxvcmVyXFxTaGVsbCBGb2xkZXJzXFwiKTsKKworICAgICBpZiAoUmVnQ3JlYXRlS2V5RXgzMkEoSEtFWV9DVVJSRU5UX1VTRVIsYnVmZmVyLDAsTlVMTCxSRUdfT1BUSU9OX05PTl9WT0xBVElMRSxLRVlfV1JJVEUsTlVMTCwma2V5LCZkd2Rpc3ApKQorICAgICB7IHJldHVybiBFX09VVE9GTUVNT1JZOworICAgICB9CisgICAgIHR5cGU9UkVHX1NaOyAgICAKKyAgICAgc3RyY3B5IChidWZmZXIsIkRlc2t0b3AiKTsJCQkJCS8qcmVnaXN0cnkgbmFtZSovCisgICAgIGlmICggUmVnUXVlcnlWYWx1ZUV4MzJBKGtleSxidWZmZXIsTlVMTCwmdHlwZSx0cGF0aCwmdHBhdGhsZW4pKQorICAgICB7IEdldFdpbmRvd3NEaXJlY3RvcnkzMkEodHBhdGgsTUFYX1BBVEgpOworICAgICAgIFBhdGhBZGRCYWNrc2xhc2godHBhdGgpOworICAgICAgIHN0cmNhdCAodHBhdGgsIkRlc2t0b3AiKTsJCQkJLypmb2xkZXIgbmFtZSovCisgICAgICAgUmVnU2V0VmFsdWVFeDMyQShrZXksYnVmZmVyLDAsUkVHX1NaLHRwYXRoLHRwYXRobGVuKTsKKyAgICAgICBDcmVhdGVEaXJlY3RvcnkzMkEodHBhdGgsTlVMTCk7CisgICAgIH0KKyAgICAgUmVnQ2xvc2VLZXkoa2V5KTsKKyAgICAgc3RyY3B5KHBzelBhdGgsdHBhdGgpOworICB9CisgIGVsc2UKKyAgeyBpZiAoU0hHZXREZXNrdG9wRm9sZGVyKCZzaGVsbGZvbGRlcik9PVNfT0spCiAJeyBzaGVsbGZvbGRlci0+bHB2dGJsLT5mbkdldERpc3BsYXlOYW1lT2Yoc2hlbGxmb2xkZXIscGlkbCxTSEdETl9GT1JQQVJTSU5HLCZscE5hbWUpOwogCSAgc2hlbGxmb2xkZXItPmxwdnRibC0+Zm5SZWxlYXNlKHNoZWxsZm9sZGVyKTsKIAl9CiAgIC8qV2lkZUNoYXJUb0xvY2FsMzIocHN6UGF0aCwgbHBOYW1lLnUucE9sZVN0ciwgTUFYX1BBVEgpOyovCiAJc3RyY3B5KHBzelBhdGgsbHBOYW1lLnUuY1N0cik7CiAJLyogZml4bWUgZnJlZSB0aGUgb2xlc3RyaW5nKi8KKyAgfQogCVRSQUNFKHNoZWxsLCItLSAoJXMpXG4iLHBzelBhdGgpOwogCXJldHVybiBOT0VSUk9SOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFNIR2V0UGF0aEZyb21JRExpc3QzMlcgW1NIRUxMMzIuMjYyXQotICoKLSAqIE5PVEVTCi0gKiAgICAgZXhwb3J0ZWQgYnkgbmFtZQogICovCi1EV09SRCBXSU5BUEkgU0hHZXRQYXRoRnJvbUlETGlzdDMyVyAoRFdPUkQgZHdQYXJhbTEsRFdPUkQgZHdQYXJhbTIpCi17IEZJWE1FIChzaGVsbCwiKDB4JTA4bHgsMHglMDhseCk6c3R1Yi5cbiIsIGR3UGFyYW0xLCBkd1BhcmFtMik7CitEV09SRCBXSU5BUEkgU0hHZXRQYXRoRnJvbUlETGlzdDMyVyAoTFBDSVRFTUlETElTVCBwaWRsLExQV1NUUiBwc3pQYXRoKQoreyBGSVhNRSAoc2hlbGwsIihwaWRsPSVwICVzKTpzdHViLlxuIiwgcGlkbCwgZGVidWdzdHJfdyhwc3pQYXRoKSk7CiAgIHJldHVybiAwOwogfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkgU0hHZXRQYXRoRnJvbUlETGlzdAkJW1NIRUxMMzIuMjIxXVtOVCA0LjA6IFNIRUxMMzIuMjE5XQotICoKLSAqIHJldHVybnMgdGhlIHBhdGggZnJvbSBhIHBhc3NlZCBQSURMLgogICovCi1CT09MMzIgV0lOQVBJIFNIR2V0UGF0aEZyb21JRExpc3QoIAotICAgIExQQ0lURU1JRExJU1QgcGlkbCwgLyogW0lOXSBwaWRsICovCi0JCUxQU1RSIHBzelBhdGgpICAgICAgLyogW09VVF0gcGF0aCAqLworQk9PTDMyIFdJTkFQSSBTSEdldFBhdGhGcm9tSURMaXN0MzIoTFBDSVRFTUlETElTVCBwaWRsLExQU1RSIHBzelBhdGgpICAgICAKIHsgVFJBQ0Uoc2hlbGwsIihwaWRsPSVwLCVwKVxuIixwaWRsLHBzelBhdGgpOwotCiAgIHJldHVybiBTSEdldFBhdGhGcm9tSURMaXN0MzJBKHBpZGwscHN6UGF0aCk7CiB9CiAKQEAgLTE5NDAsOSArMjAwMSw3IEBACiAgKiBTSEhlbHBTaG9ydGN1dHNfUnVuRExMIFtTSEVMTDMyLjIyNF0KICAqCiAgKi8KLQotRFdPUkQgV0lOQVBJCi1TSEhlbHBTaG9ydGN1dHNfUnVuRExMIChEV09SRCBkd0FyZzEsIERXT1JEIGR3QXJnMiwgRFdPUkQgZHdBcmczLCBEV09SRCBkd0FyZzQpCitEV09SRCBXSU5BUEkgU0hIZWxwU2hvcnRjdXRzX1J1bkRMTCAoRFdPUkQgZHdBcmcxLCBEV09SRCBkd0FyZzIsIERXT1JEIGR3QXJnMywgRFdPUkQgZHdBcmc0KQogeyBGSVhNRSAoZXhlYywgIiglbHgsICVseCwgJWx4LCAlbHgpIGVtcHR5IHN0dWIhXG4iLAogCWR3QXJnMSwgZHdBcmcyLCBkd0FyZzMsIGR3QXJnNCk7CiAKQEAgLTE5NTQsMTEgKzIwMTMsOCBAQAogICoKICAqLwogCi1EV09SRCBXSU5BUEkKLVNITG9hZEluUHJvYyAoRFdPUkQgZHdBcmcxKQotewotICAgIEZJWE1FIChzaGVsbCwgIiglbHgpIGVtcHR5IHN0dWIhXG4iLCBkd0FyZzEpOwotCitEV09SRCBXSU5BUEkgU0hMb2FkSW5Qcm9jIChEV09SRCBkd0FyZzEpCit7IEZJWE1FIChzaGVsbCwgIiglbHgpIGVtcHR5IHN0dWIhXG4iLCBkd0FyZzEpOwogICAgIHJldHVybiAwOwogfQogCkBAIC0xOTY2LDExICsyMDIyLDYwIEBACiAgKiBTSEJyb3dzZUZvckZvbGRlckEgW1NIRUxMMzIuMjA5XQogICoKICAqLwotCi1MUElURU1JRExJU1QgV0lOQVBJCi1TSEJyb3dzZUZvckZvbGRlcjMyQSAoTFBCUk9XU0VJTkZPMzJBIGxwYmkpCi17IEZJWE1FIChzaGVsbCwgIiglbHgpIGVtcHR5IHN0dWIhXG4iLCAoRFdPUkQpbHBiaSk7Ci0gIEZJWE1FIChzaGVsbCwgIiglcykgZW1wdHkgc3R1YiFcbiIsIGxwYmktPmxwc3pUaXRsZSk7CitMUElURU1JRExJU1QgV0lOQVBJIFNIQnJvd3NlRm9yRm9sZGVyMzJBIChMUEJST1dTRUlORk8zMkEgbHBiaSkKK3sgRklYTUUgKHNoZWxsLCAiKCVseCwlcykgZW1wdHkgc3R1YiFcbiIsIChEV09SRClscGJpLCBscGJpLT5scHN6VGl0bGUpOwogICByZXR1cm4gTlVMTDsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNIRUxMMzIgTGliTWFpbgorICoKKyAqIEZJWE1FCisgKiAgYXQgdGhlIG1vbWVudCB0aGUgaWNvbnMgYXJlIGV4dHJhY3RlZCBmcm9tIHNoZWxsMzIuZGxsCisgKi8KK0hJTlNUQU5DRTMyIHNoZWxsMzJfaEluc3RhbmNlOyAKKworQk9PTDMyIFdJTkFQSSBTaGVsbDMyTGliTWFpbihISU5TVEFOQ0UzMiBoaW5zdERMTCwgRFdPUkQgZmR3UmVhc29uLCBMUFZPSUQgbHB2UmVzZXJ2ZWQpCit7IEhJQ09OMzIgaHRtcEljb247CisgIFVJTlQzMiBpaWNvbmluZGV4OworICBVSU5UMzIgaW5kZXg7CisgIENIQVIgICBzelNoZWxsUGF0aFtNQVhfUEFUSF07CisgIAorICBUUkFDRShzaGVsbCwiMHgleCAweCVseCAlcFxuIiwgaGluc3RETEwsIGZkd1JlYXNvbiwgbHB2UmVzZXJ2ZWQpOworCisgIHNoZWxsMzJfaEluc3RhbmNlID0gaGluc3RETEw7CisgIAorICBHZXRXaW5kb3dzRGlyZWN0b3J5MzJBKHN6U2hlbGxQYXRoLE1BWF9QQVRIKTsKKyAgUGF0aEFkZEJhY2tzbGFzaChzelNoZWxsUGF0aCk7CisgIHN0cmNhdChzelNoZWxsUGF0aCwic3lzdGVtXFxzaGVsbDMyLmRsbCIpOworICAgICAgIAorICBpZiAoZmR3UmVhc29uPT1ETExfUFJPQ0VTU19BVFRBQ0gpCisgIHsgaWYgKCAhIFNoZWxsU21hbGxJY29uTGlzdCApCisgICAgeyBpZiAoIChTaGVsbFNtYWxsSWNvbkxpc3QgPSBJbWFnZUxpc3RfQ3JlYXRlKDE2LDE2LElMQ19DT0xPUiw2NCwxNikpICkKKyAgICAgIHsgZm9yIChpbmRleD0wO2luZGV4IDwgNDA7IGluZGV4KyspCisgICAgICAgIHsgaWYgKCAoIGh0bXBJY29uID0gRXh0cmFjdEljb24zMkEoaGluc3RETEwsIHN6U2hlbGxQYXRoLCBpbmRleCkpICkKKyAgICAgICAgICB7IGlpY29uaW5kZXggPSBJbWFnZUxpc3RfQWRkSWNvbiAoU2hlbGxTbWFsbEljb25MaXN0LCBodG1wSWNvbik7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICB7IEVSUihzaGVsbCwiY291bGQgbm90IGluaXRpYWxpemUgaWNvbmxpc3QgKGlzIHNoZWxsMzIuZGxsIGluIHRoZSBzeXN0ZW0gZGlyZWN0b3J5PylcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmICggISBTaGVsbEJpZ0ljb25MaXN0ICkKKyAgICB7IGlmICggKFNoZWxsQmlnSWNvbkxpc3QgPSBJbWFnZUxpc3RfQ3JlYXRlKDMyLDMyLElMQ19DT0xPUiw2NCwxNikpICkKKyAgICAgIHsgZm9yIChpbmRleD0wO2luZGV4IDwgNDA7IGluZGV4KyspCisgICAgICAgIHsgaWYgKCAoaHRtcEljb24gPSBFeHRyYWN0SWNvbjMyQSggaGluc3RETEwsIHN6U2hlbGxQYXRoLCBpbmRleCkpICkKKyAgICAgICAgICB7IGlpY29uaW5kZXggPSBJbWFnZUxpc3RfQWRkSWNvbiAoU2hlbGxCaWdJY29uTGlzdCwgaHRtcEljb24pOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgeyBFUlIoc2hlbGwsImNvdWxkIG5vdCBpbml0aWFsaXplIGljb25saXN0IChpcyBzaGVsbDMyLmRsbCBpbiB0aGUgc3lzdGVtIGRpcmVjdG9yeT8pXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL21pc2Mvc2hlbGxvcmQuYyBiL21pc2Mvc2hlbGxvcmQuYwppbmRleCA2NjYxNzgwLi45MDc2ODM4IDEwMDY0NAotLS0gYS9taXNjL3NoZWxsb3JkLmMKKysrIGIvbWlzYy9zaGVsbG9yZC5jCkBAIC04LDYgKzgsNyBAQAogICogVGhleSBhcmUganVzdCBoZXJlIHNvIHRoYXQgZXhwbG9yZXIuZXhlIGFuZCBpZXhwbG9yZS5leGUgY2FuIGJlIHRlc3RlZC4KICAqCiAgKiBDb3B5cmlnaHQgMTk5NyBNYXJjdXMgTWVpc3NuZXIKKyAqICAgICAgICAgICAxOTk4IEr8cmdlbiBTY2htaWVkCiAgKi8KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTMwLDYgKzMxLDE4IEBACiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJ3aW5yZWcuaCIKIAordm9pZCBwZHVtcCAoTFBDSVRFTUlETElTVCBwaWRsKQoreyBEV09SRCB0eXBlOworICBDSEFSICogc3pEYXRhOworICBMUElURU1JRExJU1QgcGlkbHRlbXAgPSBwaWRsOworICBUUkFDRShzaGVsbCwiLS0tLS0tLS0tLSBwaWRsPSVwIFxuIiwgcGlkbCk7CisgIGRvCisgIHsgc3pEYXRhID0gKChMUFBJRExEQVRBICkocGlkbHRlbXAtPm1raWQuYWJJRCkpLT5zelRleHQ7CisgICAgdHlwZSAgID0gKChMUFBJRExEQVRBICkocGlkbHRlbXAtPm1raWQuYWJJRCkpLT50eXBlOworICAgIFRSQUNFIChzaGVsbCwiLS0tLSBwaWRsPSVwIHNpemU9JXUgdHlwZT0lbHggJXNcbiIscGlkbHRlbXAsIHBpZGx0ZW1wLT5ta2lkLmNiLHR5cGUsZGVidWdzdHJfYShzekRhdGEpKTsKKyAgICBwaWRsdGVtcCA9IChMUElURU1JRExJU1QpKCgoQllURSopcGlkbHRlbXApK3BpZGx0ZW1wLT5ta2lkLmNiKTsKKyAgfSB3aGlsZSAocGlkbHRlbXAtPm1raWQuY2IpOworfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFNIQ2hhbmdlTm90aWZ5UmVnaXN0ZXIgW1NIRUxMMzIuMl0KICAqIE5PVEVTCkBAIC04NSw5ICs5OCwxMiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIElMRmluZExhc3RJRCBbU0hFTEwzMi4xN10KICAqIE5PVEVTCi0gKiAgQ3JlYXRlcyBhIG5ldyBsaXN0IHdpdGggdGhlIGxhc3QgdGllbSByZW1vdmVkCisgKiAgQ3JlYXRlcyBhIG5ldyBsaXN0IHdpdGggdGhlIGxhc3QgaXRlbSByZW1vdmVkCiAgKi8KLSBMUElURU1JRExJU1QgV0lOQVBJIElMUmVtb3ZlTGFzdElEKExQQ0lURU1JRExJU1QpOworTFBJVEVNSURMSVNUIFdJTkFQSSBJTFJlbW92ZUxhc3RJRChMUENJVEVNSURMSVNUIHBpZGwpCit7IFRSQUNFKHNoZWxsLCJwaWRsPSVwXG4iLHBpZGwpOworICByZXR1cm4gTlVMTDsKK30KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtOTYsMTUgKzExMiwyMCBAQAogICogTk9URVMKICAqICAgIGR1cGljYXRlIGFuIGlkbGlzdAogICovCi1MUElURU1JRExJU1QgV0lOQVBJIElMQ2xvbmUgKExQSVRFTUlETElTVCBpaWwpIHsKLQlEV09SRAkJbGVuOwotCUxQSVRFTUlETElTVAluZXdpaWw7Ci0gIFRSQUNFKHNoZWxsLCIlcFxuIixpaWwpOwotCWxlbiA9IElMR2V0U2l6ZShpaWwpOwotCW5ld2lpbCA9IChMUElURU1JRExJU1QpU0hBbGxvYyhsZW4pOwotCWlmIChuZXdpaWwpCi0JCW1lbWNweShuZXdpaWwsaWlsLGxlbik7Ci0JcmV0dXJuIG5ld2lpbDsKK0xQSVRFTUlETElTVCBXSU5BUEkgSUxDbG9uZSAoTFBDSVRFTUlETElTVCBwaWRsKQoreyBEV09SRCAgICBsZW47CisgIExQSVRFTUlETElTVCAgbmV3cGlkbDsKKworICBUUkFDRShzaGVsbCwiJXBcbiIscGlkbCk7CisKKyAgaWYgKCFwaWRsKQorICAgIHJldHVybiBOVUxMOworICAgIAorICBsZW4gPSBJTEdldFNpemUocGlkbCk7CisgIG5ld3BpZGwgPSAoTFBJVEVNSURMSVNUKVNIQWxsb2MobGVuKTsKKyAgaWYgKG5ld3BpZGwpCisgICAgbWVtY3B5KG5ld3BpZGwscGlkbCxsZW4pOworICByZXR1cm4gbmV3cGlkbDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTExMyw3ICsxMzQsMTAgQEAKICAqIE5PVEVTCiAgKiAgZHVwbGljYXRlcyB0aGUgZmlyc3QgaWRsaXN0IG9mIGEgY29tcGxleCBwaWRsCiAgKi8KLUxQSVRFTUlETElTVCBXSU5BUEkgSUxDbG9uZUZpcnN0KExQQ0lURU1JRExJU1QgcGlkbCk7CitMUElURU1JRExJU1QgV0lOQVBJIElMQ2xvbmVGaXJzdChMUENJVEVNSURMSVNUIHBpZGwpCit7IEZJWE1FKHNoZWxsLCJwaWRsPSVwXG4iLHBpZGwpOworICByZXR1cm4gTlVMTDsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIElMQ29tYmluZSBbU0hFTEwzMi4yNV0KQEAgLTEyMywxNiArMTQ3LDM3IEBACiAgKiAgVGhlIHBpZGwgaXMgdGhlIGZpcnN0IG9uZSwgcGlkbHN1YiB0aGUgbmV4dCBvbmUKICAqICBEb2VzIG5vdCBkZXN0cm95IHRoZSBwYXNzZWQgaW4gaWRsaXN0cyEKICAqLwotTFBJVEVNSURMSVNUIFdJTkFQSSBJTENvbWJpbmUoTFBJVEVNSURMSVNUIGlpbDEsTFBJVEVNSURMSVNUIGlpbDIpIHsKLQlEV09SRAkJbGVuMSxsZW4yOwotCUxQSVRFTUlETElTVAluZXdpaWw7Ci0JVFJBQ0Uoc2hlbGwsIiVwICVwXG4iLGlpbDEsaWlsMik7Ci0JbGVuMSAJPSBJTEdldFNpemUoaWlsMSktMjsKLQlsZW4yCT0gSUxHZXRTaXplKGlpbDIpOwotCW5ld2lpbAk9IFNIQWxsb2MobGVuMStsZW4yKTsKLQltZW1jcHkobmV3aWlsLGlpbDEsbGVuMSk7Ci0JbWVtY3B5KCgoY2hhciopbmV3aWlsKStsZW4xLGlpbDIsbGVuMik7Ci0JcmV0dXJuIG5ld2lpbDsKK0xQSVRFTUlETElTVCBXSU5BUEkgSUxDb21iaW5lKExQQ0lURU1JRExJU1QgcGlkbDEsTFBDSVRFTUlETElTVCBwaWRsMikKK3sgRFdPUkQgICAgbGVuMSxsZW4yOworICBMUElURU1JRExJU1QgIHBpZGxOZXc7CisgIAorICBUUkFDRShzaGVsbCwicGlkbD0lcCBwaWRsPSVwXG4iLHBpZGwxLHBpZGwyKTsKKworICBpZighcGlkbDEgJiYgIXBpZGwyKQorICB7ICByZXR1cm4gTlVMTDsKKyAgfQorIAorICBpZighcGlkbDEpCisgIHsgcGlkbE5ldyA9IElMQ2xvbmUocGlkbDIpOworICAgIHJldHVybiBwaWRsTmV3OworICB9CisKKyAgaWYoIXBpZGwyKQorICB7IHBpZGxOZXcgPSBJTENsb25lKHBpZGwxKTsKKyAgICByZXR1cm4gcGlkbE5ldzsKKyAgfQorCisgIGxlbjEgID0gSUxHZXRTaXplKHBpZGwxKS0yOworICBsZW4yICA9IElMR2V0U2l6ZShwaWRsMik7CisgIHBpZGxOZXcgID0gU0hBbGxvYyhsZW4xK2xlbjIpOworICAKKyAgaWYgKHBpZGxOZXcpCisgIHsgbWVtY3B5KHBpZGxOZXcscGlkbDEsbGVuMSk7CisgICAgbWVtY3B5KCgoQllURSAqKXBpZGxOZXcpK2xlbjEscGlkbDIsbGVuMik7CisgIH0KKworLyogIFRSQUNFKHNoZWxsLCItLW5ldyBwaWRsPSVwXG4iLHBpZGxOZXcpOyovCisgIHJldHVybiBwaWRsTmV3OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjkxLDYgKzMzNiwxOSBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUGF0aEFwcGVuZCBbU0hFTEwzMi4zNl0KKyAqIAorICogTk9URVMKKyAqICAgICBjb25jYXRfcGF0aHMoY2hhcip0YXJnZXQsY29uc3QgY2hhciphZGQpOworICogICAgIGNvbmNhdHMgInRhcmdldFxcYWRkIiBhbmQgd3JpdGVzIHRoZW0gdG8gdGFyZ2V0CisgKi8KK0xQU1RSIFdJTkFQSSBQYXRoQXBwZW5kKExQU1RSIHgxLExQU1RSIHgyKSB7CisgIFRSQUNFKHNoZWxsLCIlcyAlc1xuIix4MSx4Mik7CisgIHdoaWxlICh4MlswXT09J1xcJykgeDIrKzsKKyAgcmV0dXJuIFBhdGhDb21iaW5lKHgxLHgxLHgyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFBhdGhDb21iaW5lIFtTSEVMTDMyLjM3XQogICogCiAgKiBOT1RFUwpAQCAtMzEyLDE5ICszNzAsNiBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUGF0aEFwcGVuZCBbU0hFTEwzMi4zNl0KLSAqIAotICogTk9URVMKLSAqICAgICBjb25jYXRfcGF0aHMoY2hhcip0YXJnZXQsY29uc3QgY2hhciphZGQpOwotICogICAgIGNvbmNhdHMgInRhcmdldFxcYWRkIiBhbmQgd3JpdGVzIHRoZW0gdG8gdGFyZ2V0Ci0gKi8KLUxQU1RSIFdJTkFQSSBQYXRoQXBwZW5kKExQU1RSIHgxLExQU1RSIHgyKSB7Ci0gIFRSQUNFKHNoZWxsLCIlcyAlc1xuIix4MSx4Mik7Ci0Jd2hpbGUgKHgyWzBdPT0nXFwnKSB4MisrOwotCXJldHVybiBQYXRoQ29tYmluZSh4MSx4MSx4Mik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBQYXRoSXNVTkMgW1NIRUxMMzIuMzldCiAgKiAKICAqIE5PVEVTCkBAIC00NTcsNjkgKzUwMiwyOCBAQAogICogU2hlbGxfR2V0Q2FjaGVkSW1hZ2VJbmRleCBbU0hFTEwzMi43Ml0KICAqCiAgKi8KLXZvaWQgV0lOQVBJIFNoZWxsX0dldENhY2hlZEltYWdlSW5kZXgoTFBTVFIgeCxEV09SRCB5LERXT1JEIHopIHsKLQlGSVhNRShzaGVsbCwiKCVzLCUwOGx4LCUwOGx4KTpzdHViLlxuIix4LHkseik7Cit2b2lkIFdJTkFQSSBTaGVsbF9HZXRDYWNoZWRJbWFnZUluZGV4KExQU1RSIHgsRFdPUkQgeSxEV09SRCB6KSAKK3sgRklYTUUoc2hlbGwsIiglcywlMDhseCwlMDhseCk6c3R1Yi5cbiIseCx5LHopOwogfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogU0hTaGVsbEZvbGRlclZpZXdfTWVzc2FnZSBbU0hFTEwzMi43M10KKyAqCisgKiBQQVJBTUVURVJTCisgKiAgaHduZENhYmluZXQgZGVmaW5lcyB0aGUgZXhwbG9yZXIgY2FiaW5ldCB3aW5kb3cgdGhhdCBjb250YWlucyB0aGUgCisgKiAgICAgICAgICAgICAgc2hlbGx2aWV3IHlvdSBuZWVkIHRvIGNvbW11bmljYXRlIHdpdGgKKyAqICB1TXNnICAgICAgICBpZGVudGlmeWluZyB0aGUgU0ZWTSBlbnVtIHRvIHBlcmZvcm0KKyAqICBsUGFyYW0KKyAqCiAgKiBOT1RFUwogICogIE1lc3NhZ2UgU0ZWTV9SRUFSUkFOR0UgPSAxCiAgKiAgICBUaGlzIG1lc3NhZ2UgZ2V0cyBzZW50IHdoZW4gYSBjb2x1bW4gZ2V0cyBjbGlja2VkIHRvIGluc3RydWN0IHRoZQogICogICAgc2hlbGwgdmlldyB0byByZS1zb3J0IHRoZSBpdGVtIGxpc3QuIGxQYXJhbSBpZGVudGlmaWVzIHRoZSBjb2x1bW4KICAqICAgIHRoYXQgd2FzIGNsaWNrZWQuCiAgKi8KLWludCBXSU5BUEkgU0hTaGVsbEZvbGRlclZpZXdfTWVzc2FnZSgKLSAgICBIV05EMzIgaHduZENhYmluZXQsIC8qIFRoaXMgaHduZCBkZWZpbmVzIHRoZSBleHBsb3JlciBjYWJpbmV0IHdpbmRvdyB0aGF0IGNvbnRhaW5zIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaGVsbHZpZXcgeW91IG5lZWQgdG8gY29tbXVuaWNhdGUgd2l0aCovCi0JCVVJTlQzMiB1TXNnLCAgICAgICAgLyogQSBwYXJhbWV0ZXIgaWRlbnRpZnlpbmcgdGhlIFNGVk0gZW51bSB0byBwZXJmb3JtICovCi0JCUxQQVJBTSBsUGFyYW0pOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFNIQ2xvbmVTcGVjaWFsSURMaXN0IFtTSEVMTDMyLjg5XQotICogCi0gKiBOT1RFUwotICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKLSAqLwotRFdPUkQgV0lOQVBJIFNIQ2xvbmVTcGVjaWFsSURMaXN0KERXT1JEIHgxLERXT1JEIHgyLERXT1JEIHgzKSB7Ci0JRklYTUUoc2hlbGwsIigweCUwOGx4LDB4JTA4bHgsMHglMDhseCk6c3R1Yi5cbiIsCi0JCXgxLHgyLHgzCi0JKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIElzTEZORHJpdmUgW1NIRUxMMzIuMTE5XQotICogCi0gKiBOT1RFUwotICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwgTmFtZQotICovCi12b2lkIFdJTkFQSSBJc0xGTkRyaXZlKExQVk9JRCB4KSB7Ci0gICAgRklYTUUoc2hlbGwsIiglcCglcykpOnN0dWIuXG4iLHgsKGNoYXIgKil4KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFNIR2V0U3BlY2lhbEZvbGRlclBhdGggW1NIRUxMMzIuMTc1XQotICogCi0gKiBOT1RFUwotICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKLSAqLwotdm9pZCBXSU5BUEkgU0hHZXRTcGVjaWFsRm9sZGVyUGF0aChEV09SRCB4MSxEV09SRCB4MixEV09SRCB4MyxEV09SRCB4NCkgewotICAgIEZJWE1FKHNoZWxsLCIoMHglMDhseCwweCUwOGx4LDB4JTA4bHgsMHglMDhseCk6c3R1Yi5cbiIsCi0gICAgCXgxLHgyLHgzLHg0Ci0gICAgKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJlZ2lzdGVyU2hlbGxIb29rIFtTSEVMTDMyLjE4MV0KLSAqCi0gKiBQQVJBTVMKLSAqICAgICAgaHduZCBbSV0gIHdpbmRvdyBoYW5kbGUKLSAqICAgICAgeSAgICBbSV0gIGZsYWcgPz8/PwotICoKLSAqIE5PVEVTCi0gKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAotICovCi12b2lkIFdJTkFQSSBSZWdpc3RlclNoZWxsSG9vazMyKEhXTkQzMiBod25kLCBEV09SRCB5KSB7Ci0gICAgRklYTUUoc2hlbGwsIigweCUwOHgsMHglMDhseCk6c3R1Yi5cbiIsaHduZCx5KTsKK2ludCBXSU5BUEkgU0hTaGVsbEZvbGRlclZpZXdfTWVzc2FnZShIV05EMzIgaHduZENhYmluZXQsVUlOVDMyIHVNc2csTFBBUkFNIGxQYXJhbSkKK3sgRklYTUUoc2hlbGwsIiUwNHggJTA4dXggJTA4bHggc3R1YlxuIixod25kQ2FiaW5ldCx1TXNnLGxQYXJhbSk7CisgIHJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNTM1LDIyICs1MzksMjIgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFNITWFwUElETFRvU3lzdGVtSW1hZ2VMaXN0SW5kZXggW1NIRUxMMzIuNzddCisgKgorICogUEFSQU1FVEVSUworICogeCAgcG9pbnRlciB0byBhbiBpbnN0YW5jZSBvZiBJU2hlbGxGb2xkZXIgCiAgKiAKICAqIE5PVEVTCiAgKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogICoKICAqLwogRFdPUkQgV0lOQVBJCi1TSE1hcFBJRExUb1N5c3RlbUltYWdlTGlzdEluZGV4KAotICAgIERXT1JEIHgsCS8qIHBvaW50ZXIgdG8gYW4gaW5zdGFuY2Ugb2YgSVNoZWxsRm9sZGVyICovCi0JCURXT1JEIHksCi0JCURXT1JEIHopCi17CUZJWE1FKHNoZWxsLCIoJTA4bHgsJTA4bHgsJTA4bHgpOnN0dWIuXG4iLHgseSx6KTsKLQlyZXR1cm4gMDsKK1NITWFwUElETFRvU3lzdGVtSW1hZ2VMaXN0SW5kZXgoRFdPUkQgeCxEV09SRCB5LERXT1JEIHopCit7IEZJWE1FKHNoZWxsLCIoJTA4bHgsJTA4bHgsJTA4bHgpOnN0dWIuXG4iLHgseSx6KTsKKyAgcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBPbGVTdHJUb1N0ck4JW1NIRUxMMzIuNzhdCisgKiBPbGVTdHJUb1N0ck4gIFtTSEVMTDMyLjc4XQogICogCiAgKiBOT1RFUwogICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKQEAgLTU1OCwxMiArNTYyLDEyIEBACiBCT09MMzIgV0lOQVBJCiBPbGVTdHJUb1N0ck4gKExQU1RSIGxwTXVsdGksIElOVDMyIG5NdWx0aSwgTFBDV1NUUiBscFdpZGUsIElOVDMyIG5XaWRlKSB7CiAgICAgcmV0dXJuIFdpZGVDaGFyVG9NdWx0aUJ5dGUgKDAsIDAsIGxwV2lkZSwgbldpZGUsCi0JCQkJbHBNdWx0aSwgbk11bHRpLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgbHBNdWx0aSwgbk11bHRpLCBOVUxMLCBOVUxMKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFN0clRvT2xlU3RyTglbU0hFTEwzMi43OV0KLSAqIAorICogU3RyVG9PbGVTdHJOICBbU0hFTEwzMi43OV0KKyAqCiAgKiBOT1RFUwogICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICAqLwpAQCAtNTczLDE0ICs1NzcsNjggQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNIQ2xvbmVTcGVjaWFsSURMaXN0IFtTSEVMTDMyLjg5XQorICogCisgKiBQQVJBTUVURVJTCisgKiAgaHduZCAKKyAqIE5PVEVTCisgKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAorICovCitEV09SRCBXSU5BUEkgU0hDbG9uZVNwZWNpYWxJRExpc3QoSFdORDMyIGh3bmQsRFdPUkQgeDIsRFdPUkQgeDMpIHsKKyAgRklYTUUoc2hlbGwsIihod25kPTB4JXgsMHglbHgsMHglbHgpOnN0dWIuXG4iLAorICAgIGh3bmQseDIseDMKKyAgKTsKKyAgcmV0dXJuIFNfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJc0xGTkRyaXZlIFtTSEVMTDMyLjExOV0KKyAqIAorICogTk9URVMKKyAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsIE5hbWUKKyAqLworQk9PTDMyIFdJTkFQSSBJc0xGTkRyaXZlKExQQ1NUUiBwYXRoKSB7CisgICAgRFdPUkQJZm5sZW47CisKKyAgICBpZiAoIUdldFZvbHVtZUluZm9ybWF0aW9uMzJBKHBhdGgsTlVMTCwwLE5VTEwsJmZubGVuLE5VTEwsTlVMTCwwKSkKKwlyZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIGZubGVuPjEyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU0hHZXRTcGVjaWFsRm9sZGVyUGF0aCBbU0hFTEwzMi4xNzVdCisgKiAKKyAqIE5PVEVTCisgKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAorICovCit2b2lkIFdJTkFQSSBTSEdldFNwZWNpYWxGb2xkZXJQYXRoKERXT1JEIHgxLERXT1JEIHgyLERXT1JEIHgzLERXT1JEIHg0KSB7CisgICAgRklYTUUoc2hlbGwsIigweCUwOGx4LDB4JTA4bHgsMHglMDhseCwweCUwOGx4KTpzdHViLlxuIiwKKyAgICAgIHgxLHgyLHgzLHg0CisgICAgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlZ2lzdGVyU2hlbGxIb29rIFtTSEVMTDMyLjE4MV0KKyAqCisgKiBQQVJBTVMKKyAqICAgICAgaHduZCBbSV0gIHdpbmRvdyBoYW5kbGUKKyAqICAgICAgeSAgICBbSV0gIGZsYWcgPz8/PworICogCisgKiBOT1RFUworICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKKyAqLwordm9pZCBXSU5BUEkgUmVnaXN0ZXJTaGVsbEhvb2szMihIV05EMzIgaHduZCwgRFdPUkQgeSkgeworICAgIEZJWE1FKHNoZWxsLCIoMHglMDh4LDB4JTA4bHgpOnN0dWIuXG4iLGh3bmQseSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICovCiB0eXBlZGVmIERXT1JEICgqIFdJTkFQSSBHZXRDbGFzc1B0cikoUkVGQ0xTSUQsUkVGSUlELExQVk9JRCk7CiAKIHN0YXRpYyBHZXRDbGFzc1B0ciBTSF9maW5kX21vZHVsZXByb2MoTFBTVFIgZGxsbmFtZSxITU9EVUxFMzIgKnhobW9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUUiBuYW1lKQotewotCUhNT0RVTEUzMglobW9kOworeyBITU9EVUxFMzIgIGhtb2Q7CiAJRkFSUFJPQzMyCWRsbHVubG9hZCxuYW1lcHJvYzsKIAogCWlmICh4aG1vZCkgKnhobW9kID0gMDsKQEAgLTc2MCwyMyArODE4LDMxIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBJTEdldFNpemUgW1NIRUxMMzIuMTUyXQorICogIGdldHMgdGhlIGJ5dGUgc2l6ZSBvZiBhbiBpZGxpc3QgaW5jbHVkaW5nIHplcm8gdGVybWluYXRvciAocGlkbCkKKyAqCisgKiBQQVJBTUVURVJTCisgKiAgcGlkbCBJVEVNSURMSVNUCisgKgorICogUkVUVVJOUworICogIHNpemUgb2YgcGlkbAogICoKICAqIE5PVEVTCiAgKiAgZXhwb3J0ZWQgYnkgb3JkaW5hbAotICogIEdldHMgdGhlIGJ5dGUgc2l6ZSBvZiBhbiBpZGxpc3QgaW5jbHVkaW5nIHplcm8gdGVybWluYXRvcgogICovCi1EV09SRCBXSU5BUEkgSUxHZXRTaXplKExQSVRFTUlETElTVCBpaWwpIHsKLQlMUFNISVRFTUlECXNpOwotCURXT1JECQlsZW47Ci0JVFJBQ0Uoc2hlbGwsIiVwXG4iLGlpbCk7Ci0JaWYgKCFpaWwpCi0JCXJldHVybiAwOwotCXNpID0gJihpaWwtPm1raWQpOwotCWxlbiA9IDI7Ci0Jd2hpbGUgKHNpLT5jYikgewotCQlsZW4JKz0gc2ktPmNiOwotCQlzaQkgPSAoTFBTSElURU1JRCkoKChjaGFyKilzaSkrc2ktPmNiKTsKK0RXT1JEIFdJTkFQSSBJTEdldFNpemUoTFBJVEVNSURMSVNUIHBpZGwpCit7IExQU0hJVEVNSUQgc2kgPSAmKHBpZGwtPm1raWQpOworICBEV09SRCAgbGVuPTA7CisKKyAgVFJBQ0Uoc2hlbGwsInBpZGw9JXBcbiIscGlkbCk7CisKKyAgaWYgKHBpZGwpCisgIHsgd2hpbGUgKHNpLT5jYikgCisgICAgeyBsZW4gKz0gc2ktPmNiOworICAgICAgc2kgID0gKExQU0hJVEVNSUQpKCgoTFBCWVRFKXNpKStzaS0+Y2IpOworICAgIH0KKyAgICBsZW4gKz0gMjsKIAl9CisvKiAgVFJBQ0Uoc2hlbGwsIi0tIHNpemU9JWx1XG4iLGxlbik7Ki8KIAlyZXR1cm4gbGVuOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTc4OCw3ICs4NTQsMTAgQEAKICAqICBvdGhlcndpc2UgYWRkcyB0aGUgaXRlbSB0byB0aGUgZW5kLgogICogIERlc3Ryb3lzIHRoZSBwYXNzZWQgaW4gaWRsaXN0IQogICovCi1MUElURU1JRExJU1QgV0lOQVBJIElMQXBwZW5kKExQSVRFTUlETElTVCBwaWRsLExQQ0lURU1JRExJU1QgaXRlbSxCT09MMzIgYkVuZCk7CitMUElURU1JRExJU1QgV0lOQVBJIElMQXBwZW5kKExQSVRFTUlETElTVCBwaWRsLExQQ0lURU1JRExJU1QgaXRlbSxCT09MMzIgYkVuZCkKK3sgVFJBQ0Uoc2hlbGwsIihwaWRsPSVwLHBpZGw9JXAsJTA4dSlcbiIscGlkbCxpdGVtLGJFbmQpOworICByZXR1cm4gTlVMTDsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFBhdGhHZXRFeHRlbnNpb24gW1NIRUxMMzIuMTU4XQpAQCAtNzk2LDggKzg2NSw4IEBACiAgKiBOT1RFUwogICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICAqLwotTFBTVFIgV0lOQVBJIFBhdGhHZXRFeHRlbnNpb24oTFBTVFIgcGF0aCxEV09SRCB5LERXT1JEIHopIHsKLSAgICBUUkFDRShzaGVsbCwiKCVzLCUwOGx4LCUwOGx4KVxuIixwYXRoLHkseik7CitMUFNUUiBXSU5BUEkgUGF0aEdldEV4dGVuc2lvbihMUFNUUiBwYXRoLERXT1JEIHksRFdPUkQgeikKK3sgVFJBQ0Uoc2hlbGwsIiglcywlMDhseCwlMDhseClcbiIscGF0aCx5LHopOwogICAgIHBhdGggPSBQYXRoRmluZEV4dGVuc2lvbihwYXRoKTsKICAgICByZXR1cm4gKnBhdGg/KHBhdGgrMSk6cGF0aDsKIH0KQEAgLTgzMSw3ICs5MDAsOCBAQAogICovCiBEV09SRCBXSU5BUEkgU0hGcmVlKExQVk9JRCB4KSB7CiAgIFRSQUNFKHNoZWxsLCIlcFxuIix4KTsKLQlyZXR1cm4gTG9jYWxGcmVlMzIoKEhBTkRMRTMyKXgpOworICAvKnJldHVybiBMb2NhbEZyZWUzMigoSEFORExFMzIpeCk7Ki8gLyogY3Jhc2hlcyAqLworICByZXR1cm4gSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHgpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtODQyLDggKzkxMiwxMCBAQAogICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKICAqLwogTFBWT0lEIFdJTkFQSSBTSEFsbG9jKERXT1JEIGxlbikgewotICBUUkFDRShzaGVsbCwiJWx1XG4iLGxlbik7Ci0JcmV0dXJuIChMUFZPSUQpTG9jYWxBbGxvYzMyKGxlbixMTUVNX1pFUk9JTklUKTsgLyogRklYTUUgKi8KKyAvKiB2b2lkICogcmV0ID0gKExQVk9JRClMb2NhbEFsbG9jMzIobGVuLExNRU1fWkVST0lOSVQpOyovIC8qIGNocmFzaGVzICovCisgdm9pZCAqIHJldCA9IChMUFZPSUQpIEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsbGVuKTsKKyAgVFJBQ0Uoc2hlbGwsIiVsdSBieXRlcyBhdCAlcFxuIixsZW4sIHJldCk7CisgIHJldHVybiByZXQ7CiB9CiAKIApAQCAtODU1LDExICs5MjcsMTEgQEAKICAqICAgICBhbGxvY2F0ZWQgYnkgU0hNYWxsb2MgYWxsb2NhdG9yCiAgKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAogICovCi1EV09SRCBXSU5BUEkgSUxGcmVlKExQVk9JRCB4KSB7Ci0JRklYTUUgKHNoZWxsLCIoMHglMDhseCk6c3R1Yi5cbiIsIChEV09SRCl4KTsKLQlpZiAoIXgpCitEV09SRCBXSU5BUEkgSUxGcmVlKExQVk9JRCBwaWRsKSAKK3sgVFJBQ0UgKHNoZWxsLCIocGlkbD0weCUwOGx4KVxuIiwoRFdPUkQpcGlkbCk7CisgIGlmICghcGlkbCkKIAkJcmV0dXJuIDA7Ci0JcmV0dXJuIFNIRnJlZSh4KTsKKyAgcmV0dXJuIFNIRnJlZShwaWRsKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTk3NiwxMiArMTA0OCwxNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFNIQWRkVG9SZWNlbnREb2NzIFtTSEVMTDMyLjIzNF0KICAqCisgKiBQQVJBTUVURVJTCisgKiAgIHVGbGFncyAgW0lOXSBTSEFSRF9QQVRIIG9yIFNIQVJEX1BJREwKKyAqICAgcHYgICAgICBbSU5dIHN0cmluZyBvciBwaWRsLCBOVUxMIGNsZWFycyB0aGUgbGlzdAorICoKICAqIE5PVEVTCiAgKiAgICAgZXhwb3J0ZWQgYnkgbmFtZQogICovCi1EV09SRCBXSU5BUEkgU0hBZGRUb1JlY2VudERvY3MzMiAoCi0gICAgVUlOVDMyIHVGbGFncywgIC8qIFtJTl0gU0hBUkRfUEFUSCBvciBTSEFSRF9QSURMICovCi0JCUxQQ1ZPSUQgcHYpICAgICAvKiBbSU5dIHN0cmluZyBvciBwaWRsLCBOVUxMIGNsZWFycyB0aGUgbGlzdCAqLworRFdPUkQgV0lOQVBJIFNIQWRkVG9SZWNlbnREb2NzMzIgKFVJTlQzMiB1RmxhZ3MsTFBDVk9JRCBwdikgICAKIHsgaWYgKFNIQVJEX1BJREw9PXVGbGFncykKICAgeyBGSVhNRSAoc2hlbGwsIigweCUwOHgscGlkbD0lcCk6c3R1Yi5cbiIsIHVGbGFncyxwdik7CiAJfQpAQCAtMTAyMCw2ICsxMDk0LDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBTSENyZWF0ZVNoZWxsRm9sZGVyVmlld0V4IFtTSEVMTDMyLjE3NF0KICAqCisgKiBOT1RFUworICogIHNlZSBJU2hlbGxGb2xkZXI6OkNyZWF0ZVZpZXdPYmplY3QKICAqLwogSFJFU1VMVCBXSU5BUEkgU0hDcmVhdGVTaGVsbEZvbGRlclZpZXdFeDMyKAogICBMUFNIRUxMVklFV0RBVEEgcHN2Y2JpLCAvKltpbiBdIHNoZWxsdGVtcGxhdGUgc3RydWN0Ki8KQEAgLTEwMjcsMyArMTEwMyw1NSBAQAogeyBGSVhNRSAoc2hlbGwsIiglcCwlcCk6c3R1Yi5cbiIsIHBzdmNiaSxwcHYpOwogICByZXR1cm4gMDsKIH0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTSEZpbmRfSW5pdE1lbnVQb3B1cCBbU0hFTEwzMi4xNDldCisgKgorICovCitIUkVTVUxUIFdJTkFQSSBTSEZpbmRfSW5pdE1lbnVQb3B1cCAoRFdPUkQgdSwgRFdPUkQgdiwgRFdPUkQgdywgRFdPUkQgeCkKK3sgRklYTUUoc2hlbGwsIjB4JTA4bHggMHglMDhseCAweCUwOGx4IDB4JTA4bHggc3R1YlxuIix1LHYsdyx4KTsKKyAgcmV0dXJuIDA7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRmlsZU1lbnVfQ3JlYXRlIFtTSEVMTDMyLjExNF0KKyAqCisgKi8KK0hSRVNVTFQgV0lOQVBJIEZpbGVNZW51X0NyZWF0ZSAoRFdPUkQgdSwgRFdPUkQgdiwgRFdPUkQgdywgRFdPUkQgeCwgRFdPUkQgeikKK3sgRklYTUUoc2hlbGwsIjB4JTA4bHggMHglMDhseCAweCUwOGx4IDB4JTA4bHggMHglMDhseCBzdHViXG4iLHUsdix3LHgseik7CisgIHJldHVybiAwOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNoZWxsRXhlY3V0ZUV4IFtTSEVMTDMyLjI5MV0KKyAqCisgKi8KK0hSRVNVTFQgV0lOQVBJIFNoZWxsRXhlY3V0ZUV4IChEV09SRCB1KQoreyBGSVhNRShzaGVsbCwiMHglMDhseCBzdHViXG4iLHUpOworICByZXR1cm4gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTSFNldEluc3RhbmNlRXhwbG9yZXIgW1NIRUxMMzIuMTc2XQorICoKKyAqLworSFJFU1VMVCBXSU5BUEkgU0hTZXRJbnN0YW5jZUV4cGxvcmVyIChEV09SRCB1KQoreyBGSVhNRShzaGVsbCwiMHglMDhseCBzdHViXG4iLHUpOworICByZXR1cm4gMDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTSEdldEluc3RhbmNlRXhwbG9yZXIgW1NIRUxMMzIuMjU2XQorICoKKyAqIE5PVEVTCisgKiAgZXhwb3J0ZWQgYnkgbmFtZQorICovCitIUkVTVUxUIFdJTkFQSSBTSEdldEluc3RhbmNlRXhwbG9yZXIgKERXT1JEIHUpCit7IEZJWE1FKHNoZWxsLCIweCUwOGx4IHN0dWJcbiIsdSk7CisgIHJldHVybiAwOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNIRnJlZVVudXNlZExpYnJhcmllcyBbU0hFTEwzMi4xMjNdCisgKgorICogTk9URVMKKyAqICBleHBvcnRlZCBieSBuYW1lCisgKi8KK0hSRVNVTFQgV0lOQVBJIFNIRnJlZVVudXNlZExpYnJhcmllcyAoRFdPUkQgdSkKK3sgRklYTUUoc2hlbGwsIjB4JTA4bHggc3R1YlxuIix1KTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9taXNjL3R3ZWFrLmMgYi9taXNjL3R3ZWFrLmMKaW5kZXggMTFjMTlhNC4uOTUyZTE0MSAxMDA2NDQKLS0tIGEvbWlzYy90d2Vhay5jCisrKyBiL21pc2MvdHdlYWsuYwpAQCAtMjIsNiArMjIsOSBAQAogICogICAgICAgIDAzLUp1bC0xOTk3IERhdmUgQ3V0aGJlcnQgKGRhY3V0QGVjZS5jbXUuZWR1KQogICogICAgICAgICAgICAgT3JpZ2luYWwgaW1wbGVtZW50YXRpb24uCiAgKgorICogICAgICAgIDA1LUF1Zy0xOTk4IEVyaWMgS29obCAoZWtvaGxAYWJvLnJoZWluLXplaXR1bmcuZGUpCisgKiAgICAgICAgICAgICBSZW1vdmVkIHNvbWUgdW51c2VkIGNvZGUuCisgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSA8bWFsbG9jLmg+CkBAIC0zNSwxMCArMzgsNiBAQAogI2luY2x1ZGUgInR3ZWFrLmgiCiAjaW5jbHVkZSAid2luZG93cy5oIgogCi0vKiBQYXJhbWV0ZXJzIGZvciB3aW5kb3dzL25vbmNsaWVudC5jICovCi1leHRlcm4gaW50ICBOQ19NYXhDb250cm9sTnVkZ2U7Ci1leHRlcm4gaW50ICBOQ19NaW5Db250cm9sTnVkZ2U7Ci1leHRlcm4gVUlOVDMyICBOQ19DYXB0aW9uVGV4dEZsYWdzOwogCiAvKiBQYXJhbWV0ZXJzIGZvciBjb250cm9scy9tZW51LmMgKi8KIGV4dGVybiBVSU5UMzIgIE1FTlVfQmFySXRlbVRvcE51ZGdlOwpAQCAtNTAsMTMgKzQ5LDggQEAKIGV4dGVybiBVSU5UMzIgIE1FTlVfSGlnaGxpZ2h0Qm90dG9tTnVkZ2U7CiBleHRlcm4gVUlOVDMyICBNRU5VX0hpZ2hsaWdodFJpZ2h0TnVkZ2U7CiAKLS8qIEdlbmVyYWwgb3B0aW9ucyAqLwotSFBFTjMyICBUV0VBS19QZW5GRjk1OwotSFBFTjMyICBUV0VBS19QZW5FMDk1OwotSFBFTjMyICBUV0VBS19QZW5DMDk1OwotSFBFTjMyICBUV0VBS19QZW44MDk1OwotSFBFTjMyICBUV0VBS19QZW4wMDk1OwogCisvKiBHZW5lcmFsIG9wdGlvbnMgKi8KICNpZiBkZWZpbmVkKFdJTl85NV9MT09LKQogaW50ICBUV0VBS19XaW45NUxvb2sgPSAxOwogI2Vsc2UKQEAgLTEwNCw1MyArOTgsNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogICBpbnQgIFRXRUFLX05vbkNsaWVudEluaXQoKQotICoKLSAqICAgSW5pdGlhbGl6ZXMgdGhlIFdpbjk1IHR3ZWFrcyB0byB0aGUgbm9uLWNsaWVudCBkcmF3aW5nIGZ1bmN0aW9ucy4gIFNlZQotICogICB3aW5kb3dzL25vbmNsaWVudC5jLiAgUmV0dXJuIHZhbHVlIGluZGljYXRlcyBzdWNjZXNzIChub24temVybykgb3IKLSAqICAgZmFpbHVyZS4KLSAqCi0gKiAgIFJldmlzaW9uIGhpc3RvcnkKLSAqICAgICAgICAwNS1KdWwtMTk5NyBEYXZlIEN1dGhiZXJ0IChkYWN1dEBlY2UuY211LmVkdSkKLSAqICAgICAgICAgICAgIE9yaWdpbmFsIGltcGxlbWVudGF0aW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludCAgVFdFQUtfTm9uQ2xpZW50SW5pdCgpCi17Ci0gICAgY2hhciAga2V5X3ZhbHVlWzJdOwotCi0gICAgTkNfTWF4Q29udHJvbE51ZGdlID0KLQlQUk9GSUxFX0dldFdpbmVJbmlJbnQoIlR3ZWFrLkxheW91dCIsICJNYXhDb250cm9sTnVkZ2UiLCAwKTsKLSAgICBOQ19NaW5Db250cm9sTnVkZ2UgPQotCVBST0ZJTEVfR2V0V2luZUluaUludCgiVHdlYWsuTGF5b3V0IiwgIk1pbkNvbnRyb2xOdWRnZSIsIDApOwotCi0gICAgTkNfQ2FwdGlvblRleHRGbGFncyA9IERUX1NJTkdMRUxJTkUgfCBEVF9WQ0VOVEVSIHwgRFRfTk9QUkVGSVg7Ci0KLSAgICBQUk9GSUxFX0dldFdpbmVJbmlTdHJpbmcoIlR3ZWFrLkxheW91dCIsICJDYXB0aW9uQWxpZ25tZW50IiwgCi0JCQkgICAgIFRXRUFLX1dpbjk1TG9vayA/ICJsIiA6ICJjIiwga2V5X3ZhbHVlLCAyKTsKLQotICAgIHN3aXRjaChrZXlfdmFsdWVbMF0pIHsKLSAgICBjYXNlICdsJzoKLSAgICBjYXNlICdMJzoKLQlOQ19DYXB0aW9uVGV4dEZsYWdzIHw9IERUX0xFRlQ7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLQlOQ19DYXB0aW9uVGV4dEZsYWdzIHw9IERUX1JJR0hUOwotCWJyZWFrOwotCi0gICAgZGVmYXVsdDoKLQlOQ19DYXB0aW9uVGV4dEZsYWdzIHw9IERUX0NFTlRFUjsKLSAgICB9Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgogICogICBpbnQgIFRXRUFLX1ZhckluaXQoKQogICoKICAqICAgSW5pdGlhbGl6ZXMgdGhlIG1pc2NlbGxhbmVvdXMgdmFyaWFibGVzIHdoaWNoIGFyZSB1c2VkIGluIHRoZSB0d2VhawpAQCAtMTY2LDM1ICsxMTMsNiBAQAogewogICAgIFRXRUFLX1dpbjk1TG9vayA9IFBST0ZJTEVfR2V0V2luZUluaUJvb2woIlR3ZWFrLkxheW91dCIsICJXaW45NUxvb2siLCAwKTsKIAotICAgIC8qIEZJWE1FOiBFYWNoIGNvbG9yIHNob3VsZCByZWFsbHkgb2NjdXB5IGEgc2luZ2xlIGVudHJ5IGluIHRoZSB3aW5lLmNvbmYKLSAgICAgICBmaWxlLCBidXQgSSBjb3VsZG4ndCBzZXR0bGUgb24gYSBnb29kIChpbnR1aXRpdmUhKSBmb3JtYXQuICovCi0KLSAgICBUV0VBS19QZW5GRjk1ID0gQ3JlYXRlUGVuMzIoCi0JUFNfU09MSUQsIDEsCi0JUkdCKFBST0ZJTEVfR2V0V2luZUluaUludCgiVHdlYWsuQ29sb3JzIiwgIlBlbkZGOTUuUmVkIiwgMHhmZiksCi0JICAgIFBST0ZJTEVfR2V0V2luZUluaUludCgiVHdlYWsuQ29sb3JzIiwgIlBlbkZGOTUuR3JuIiwgMHhmZiksCi0JICAgIFBST0ZJTEVfR2V0V2luZUluaUludCgiVHdlYWsuQ29sb3JzIiwgIlBlbkZGOTUuQmx1IiwgMHhmZikpKTsKLSAgICBUV0VBS19QZW5FMDk1ID0gQ3JlYXRlUGVuMzIoCi0JUFNfU09MSUQsIDEsCi0JUkdCKFBST0ZJTEVfR2V0V2luZUluaUludCgiVHdlYWsuQ29sb3JzIiwgIlBlbkUwOTUuUmVkIiwgMHhlMCksCi0JICAgIFBST0ZJTEVfR2V0V2luZUluaUludCgiVHdlYWsuQ29sb3JzIiwgIlBlbkUwOTUuR3JuIiwgMHhlMCksCi0JICAgIFBST0ZJTEVfR2V0V2luZUluaUludCgiVHdlYWsuQ29sb3JzIiwgIlBlbkUwOTUuQmx1IiwgMHhlMCkpKTsKLSAgICBUV0VBS19QZW5DMDk1ID0gQ3JlYXRlUGVuMzIoCi0JUFNfU09MSUQsIDEsCi0JUkdCKFBST0ZJTEVfR2V0V2luZUluaUludCgiVHdlYWsuQ29sb3JzIiwgIlBlbkMwOTUuUmVkIiwgMHhjMCksCi0JICAgIFBST0ZJTEVfR2V0V2luZUluaUludCgiVHdlYWsuQ29sb3JzIiwgIlBlbkMwOTUuR3JuIiwgMHhjMCksCi0JICAgIFBST0ZJTEVfR2V0V2luZUluaUludCgiVHdlYWsuQ29sb3JzIiwgIlBlbkMwOTUuQmx1IiwgMHhjMCkpKTsKLSAgICBUV0VBS19QZW44MDk1ID0gQ3JlYXRlUGVuMzIoCi0JUFNfU09MSUQsIDEsCi0JUkdCKFBST0ZJTEVfR2V0V2luZUluaUludCgiVHdlYWsuQ29sb3JzIiwgIlBlbjgwOTUuUmVkIiwgMHg4MCksCi0JICAgIFBST0ZJTEVfR2V0V2luZUluaUludCgiVHdlYWsuQ29sb3JzIiwgIlBlbjgwOTUuR3JuIiwgMHg4MCksCi0JICAgIFBST0ZJTEVfR2V0V2luZUluaUludCgiVHdlYWsuQ29sb3JzIiwgIlBlbjgwOTUuQmx1IiwgMHg4MCkpKTsKLSAgICBUV0VBS19QZW4wMDk1ID0gQ3JlYXRlUGVuMzIoCi0JUFNfU09MSUQsIDEsCi0JUkdCKFBST0ZJTEVfR2V0V2luZUluaUludCgiVHdlYWsuQ29sb3JzIiwgIlBlbjAwOTUuUmVkIiwgMHgwMCksCi0JICAgIFBST0ZJTEVfR2V0V2luZUluaUludCgiVHdlYWsuQ29sb3JzIiwgIlBlbjAwOTUuR3JuIiwgMHgwMCksCi0JICAgIFBST0ZJTEVfR2V0V2luZUluaUludCgiVHdlYWsuQ29sb3JzIiwgIlBlbjAwOTUuQmx1IiwgMHgwMCkpKTsKLQogICAgIFRSQUNFKHR3ZWFrLCAiVXNpbmcgJXMgbG9vayBhbmQgZmVlbC5cbiIsCiAJCSBUV0VBS19XaW45NUxvb2sgPyAiV2luOTUiIDogIldpbjMuMSIpOwogICAgIHJldHVybiAxOwpAQCAtMjE3LDcgKzEzNSw2IEBACiBpbnQgIFRXRUFLX0luaXQoKQogewogICAgIFRXRUFLX1ZhckluaXQoKTsKLSAgICBUV0VBS19Ob25DbGllbnRJbml0KCk7CiAgICAgVFdFQUtfTWVudUluaXQoKTsKICAgICByZXR1cm4gMTsKIH0KQEAgLTI3OSwxNCArMTk2LDE0IEBACiAgICAgaWYoKGRjID0gKERDICopR0RJX0dldE9ialB0cihoZGMsIERDX01BR0lDKSkpIHsKIAogCS8qIERyYXcgdGhlIHRvcC9sZWZ0IGxpbmVzIGZpcnN0ICovCi0JcHJldnBlbiA9IFNlbGVjdE9iamVjdDMyKGhkYywgVFdFQUtfUGVuRTA5NSk7CisJcHJldnBlbiA9IFNlbGVjdE9iamVjdDMyKGhkYywgR2V0U3lzQ29sb3JQZW4zMihDT0xPUl8zRExJR0hUKSk7CiAJRENfU2V0dXBHQ0ZvclBlbihkYyk7CiAJVFNYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgcmVjdC0+bGVmdCwgcmVjdC0+dG9wLAogCQkgIHJlY3QtPnJpZ2h0IC0gMSwgcmVjdC0+dG9wKTsKIAlUU1hEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCByZWN0LT5sZWZ0LCByZWN0LT50b3AsCiAJCSAgcmVjdC0+bGVmdCwgcmVjdC0+Ym90dG9tIC0gMSk7CiAKLQlTZWxlY3RPYmplY3QzMihoZGMsIFRXRUFLX1BlbkZGOTUpOworCVNlbGVjdE9iamVjdDMyKGhkYywgR2V0U3lzQ29sb3JQZW4zMihDT0xPUl8zREhJR0hMSUdIVCkpOwogCURDX1NldHVwR0NGb3JQZW4oZGMpOwogCVRTWERyYXdMaW5lKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIHJlY3QtPmxlZnQgKyAxLAogCQkgIHJlY3QtPnRvcCArIDEsIHJlY3QtPnJpZ2h0IC0gMiwgcmVjdC0+dG9wICsgMSk7CkBAIC0yOTUsMTQgKzIxMiwxNCBAQAogCiAKIAkvKiBOb3cgdGhlIGJvdHRvbS9yaWdodCBsaW5lcyAqLwotCVNlbGVjdE9iamVjdDMyKGhkYywgVFdFQUtfUGVuMDA5NSk7CisJU2VsZWN0T2JqZWN0MzIoaGRjLCBHZXRTeXNDb2xvclBlbjMyKENPTE9SXzNEREtTSEFET1cpKTsKIAlEQ19TZXR1cEdDRm9yUGVuKGRjKTsKIAlUU1hEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCByZWN0LT5sZWZ0LAogCQkgIHJlY3QtPmJvdHRvbSAtIDEsIHJlY3QtPnJpZ2h0IC0gMSwgcmVjdC0+Ym90dG9tIC0gMSk7CiAJVFNYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgcmVjdC0+cmlnaHQgLSAxLAogCQkgIHJlY3QtPnRvcCwgcmVjdC0+cmlnaHQgLSAxLCByZWN0LT5ib3R0b20gLSAxKTsKIAotCVNlbGVjdE9iamVjdDMyKGhkYywgVFdFQUtfUGVuODA5NSk7CisJU2VsZWN0T2JqZWN0MzIoaGRjLCBHZXRTeXNDb2xvclBlbjMyKENPTE9SXzNEU0hBRE9XKSk7CiAJRENfU2V0dXBHQ0ZvclBlbihkYyk7CiAJVFNYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgcmVjdC0+bGVmdCArIDEsCiAJCSAgcmVjdC0+Ym90dG9tIC0gMiwgcmVjdC0+cmlnaHQgLSAyLCByZWN0LT5ib3R0b20gLSAyKTsKQEAgLTM0OCwxNCArMjY1LDE0IEBACiAgICAgaWYoKGRjID0gKERDICopR0RJX0dldE9ialB0cihoZGMsIERDX01BR0lDKSkpIHsKIAogCS8qIERyYXcgdGhlIHRvcC9sZWZ0IGxpbmVzIGZpcnN0ICovCi0JcHJldnBlbiA9IFNlbGVjdE9iamVjdDMyKGhkYywgVFdFQUtfUGVuODA5NSk7CisJcHJldnBlbiA9IFNlbGVjdE9iamVjdDMyKGhkYywgR2V0U3lzQ29sb3JQZW4zMihDT0xPUl8zRFNIQURPVykpOwogCURDX1NldHVwR0NGb3JQZW4oZGMpOwogCVRTWERyYXdMaW5lKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwKIAkJICByZWN0LT5yaWdodCAtIDEsIHJlY3QtPnRvcCk7CiAJVFNYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgcmVjdC0+bGVmdCwgcmVjdC0+dG9wLAogCQkgIHJlY3QtPmxlZnQsIHJlY3QtPmJvdHRvbSAtIDEpOwogCi0JU2VsZWN0T2JqZWN0MzIoaGRjLCBUV0VBS19QZW4wMDk1KTsKKwlTZWxlY3RPYmplY3QzMihoZGMsIEdldFN5c0NvbG9yUGVuMzIoQ09MT1JfM0RES1NIQURPVykpOwogCURDX1NldHVwR0NGb3JQZW4oZGMpOwogCVRTWERyYXdMaW5lKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIHJlY3QtPmxlZnQgKyAxLAogCQkgIHJlY3QtPnRvcCArIDEsIHJlY3QtPnJpZ2h0IC0gMiwgcmVjdC0+dG9wICsgMSk7CkBAIC0zNjQsMTQgKzI4MSwxNCBAQAogCiAKIAkvKiBOb3cgdGhlIGJvdHRvbS9yaWdodCBsaW5lcyAqLwotCVNlbGVjdE9iamVjdDMyKGhkYywgVFdFQUtfUGVuRkY5NSk7CisJU2VsZWN0T2JqZWN0MzIoaGRjLCBHZXRTeXNDb2xvclBlbjMyKENPTE9SXzNESElHSExJR0hUKSk7CiAJRENfU2V0dXBHQ0ZvclBlbihkYyk7CiAJVFNYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgcmVjdC0+bGVmdCwKIAkJICByZWN0LT5ib3R0b20gLSAxLCByZWN0LT5yaWdodCAtIDEsIHJlY3QtPmJvdHRvbSAtIDEpOwogCVRTWERyYXdMaW5lKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIHJlY3QtPnJpZ2h0IC0gMSwKIAkJICByZWN0LT50b3AsIHJlY3QtPnJpZ2h0IC0gMSwgcmVjdC0+Ym90dG9tIC0gMSk7CiAKLQlTZWxlY3RPYmplY3QzMihoZGMsIFRXRUFLX1BlbkUwOTUpOworCVNlbGVjdE9iamVjdDMyKGhkYywgR2V0U3lzQ29sb3JQZW4zMihDT0xPUl8zRExJR0hUKSk7CiAJRENfU2V0dXBHQ0ZvclBlbihkYyk7CiAJVFNYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgcmVjdC0+bGVmdCArIDEsCiAJCSAgcmVjdC0+Ym90dG9tIC0gMiwgcmVjdC0+cmlnaHQgLSAyLCByZWN0LT5ib3R0b20gLSAyKTsKQEAgLTQxOSwxMyArMzM2LDEzIEBACiAgICAgaWYoKGRjID0gKERDICopR0RJX0dldE9ialB0cihoZGMsIERDX01BR0lDKSkpIHsKIAogCS8qIERyYXcgdGhlIHRvcCBsaW5lICovCi0JcHJldnBlbiA9IFNlbGVjdE9iamVjdDMyKGhkYywgVFdFQUtfUGVuODA5NSk7CisJcHJldnBlbiA9IFNlbGVjdE9iamVjdDMyKGhkYywgR2V0U3lzQ29sb3JQZW4zMihDT0xPUl8zRFNIQURPVykpOwogCURDX1NldHVwR0NGb3JQZW4oZGMpOwogCVRTWERyYXdMaW5lKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIHhjMSwgeWMgLSAxLCB4YzIsCiAJCSAgeWMgLSAxKTsKIAogCS8qIEFuZCB0aGUgYm90dG9tIGxpbmUgKi8KLQlTZWxlY3RPYmplY3QzMihoZGMsIFRXRUFLX1BlbkZGOTUpOworCVNlbGVjdE9iamVjdDMyKGhkYywgR2V0U3lzQ29sb3JQZW4zMihDT0xPUl8zREhJR0hMSUdIVCkpOwogCURDX1NldHVwR0NGb3JQZW4oZGMpOwogCVRTWERyYXdMaW5lKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIHhjMSwgeWMsIHhjMiwgeWMpOwogCkBAIC00NjcsMTMgKzM4NCwxMyBAQAogICAgIGlmKChkYyA9IChEQyAqKUdESV9HZXRPYmpQdHIoaGRjLCBEQ19NQUdJQykpKSB7CiAKIAkvKiBEcmF3IHRoZSB0b3AgbGluZSAqLwotCXByZXZwZW4gPSBTZWxlY3RPYmplY3QzMihoZGMsIFRXRUFLX1BlbjgwOTUpOworCXByZXZwZW4gPSBTZWxlY3RPYmplY3QzMihoZGMsIEdldFN5c0NvbG9yUGVuMzIoQ09MT1JfM0RTSEFET1cpKTsKIAlEQ19TZXR1cEdDRm9yUGVuKGRjKTsKIAlUU1hEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCB4YywgeWMxLCB4YywKIAkJICB5YzIpOwogCiAJLyogQW5kIHRoZSBib3R0b20gbGluZSAqLwotCVNlbGVjdE9iamVjdDMyKGhkYywgVFdFQUtfUGVuRkY5NSk7CisJU2VsZWN0T2JqZWN0MzIoaGRjLCBHZXRTeXNDb2xvclBlbjMyKENPTE9SXzNESElHSExJR0hUKSk7CiAJRENfU2V0dXBHQ0ZvclBlbihkYyk7CiAJVFNYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgeGMgKyAxLCB5YzEsIHhjICsgMSwKIAkJICB5YzIpOwpkaWZmIC0tZ2l0IGEvbWlzYy92ZXIuYyBiL21pc2MvdmVyLmMKaW5kZXggMGM4MTQ5Yi4uMDBkOTgxNSAxMDA2NDQKLS0tIGEvbWlzYy92ZXIuYworKysgYi9taXNjL3Zlci5jCkBAIC0xMDY5LDcgKzEwNjksNyBAQAogICAgIH0KICAgICBpZiAoeHJldCkgewogCWlmICgqdG1wZmlsZWxlbjxzdHJsZW4odG1wZm4rdG1wbGFzdCkpIHsKLQkgICAgeHJldHw9VklGX0JVRlRPU01BTEw7CisJICAgIHhyZXR8PVZJRl9CVUZGVE9PU01BTEw7CiAJICAgIERlbGV0ZUZpbGUzMkEodG1wZm4pOwogCX0gZWxzZSB7CiAJICAgIHN0cmNweSh0bXBmaWxlLHRtcGZuK3RtcGxhc3QpOwpkaWZmIC0tZ2l0IGEvbWlzYy93aW5zb2NrLmMgYi9taXNjL3dpbnNvY2suYwppbmRleCA1ZWI2N2Q1Li5iMzI4Nzk0IDEwMDY0NAotLS0gYS9taXNjL3dpbnNvY2suYworKysgYi9taXNjL3dpbnNvY2suYwpAQCAtNTE0LDYgKzUxNCwzMyBAQAogICAgIHJldHVybiBwd3NpLT5idWZmZXI7CiB9CiAKK3N0cnVjdCB3c19ob3N0ZW50KiBfY2hlY2tfYnVmZmVyX2hlKExQV1NJTkZPIHB3c2ksIGludCBzaXplKQoreworICAgIGlmKCBwd3NpLT5oZSAmJiBwd3NpLT5oZWxlbiA+PSBzaXplICkgcmV0dXJuIHB3c2ktPmhlOworICAgIGVsc2UgU0VHUFRSX0ZSRUUocHdzaS0+aGUpOworCisgICAgcHdzaS0+aGUgPSAoc3RydWN0IHdzX2hvc3RlbnQqKVNFR1BUUl9BTExPQygocHdzaS0+aGVsZW4gPSBzaXplKSk7IAorICAgIHJldHVybiBwd3NpLT5oZTsKK30KKworc3RydWN0IHdzX3NlcnZlbnQqIF9jaGVja19idWZmZXJfc2UoTFBXU0lORk8gcHdzaSwgaW50IHNpemUpCit7CisgICAgaWYoIHB3c2ktPnNlICYmIHB3c2ktPnNlbGVuID49IHNpemUgKSByZXR1cm4gcHdzaS0+c2U7CisgICAgZWxzZSBTRUdQVFJfRlJFRShwd3NpLT5zZSk7CisKKyAgICBwd3NpLT5zZSA9IChzdHJ1Y3Qgd3Nfc2VydmVudCopU0VHUFRSX0FMTE9DKChwd3NpLT5zZWxlbiA9IHNpemUpKTsgCisgICAgcmV0dXJuIHB3c2ktPnNlOworfQorCitzdHJ1Y3Qgd3NfcHJvdG9lbnQqIF9jaGVja19idWZmZXJfcGUoTFBXU0lORk8gcHdzaSwgaW50IHNpemUpCit7CisgICAgaWYoIHB3c2ktPnBlICYmIHB3c2ktPnBlbGVuID49IHNpemUgKSByZXR1cm4gcHdzaS0+cGU7CisgICAgZWxzZSBTRUdQVFJfRlJFRShwd3NpLT5wZSk7CisKKyAgICBwd3NpLT5wZSA9IChzdHJ1Y3Qgd3NfcHJvdG9lbnQqKVNFR1BUUl9BTExPQygocHdzaS0+cGVsZW4gPSBzaXplKSk7IAorICAgIHJldHVybiBwd3NpLT5wZTsKK30KKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaS9vIEFQSXMgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNDMwLDcgKzE0NTcsNyBAQAogCXN0cnVjdCBob3N0ZW50Kglob3N0OwogCWlmKCAoaG9zdCA9IGdldGhvc3RieWFkZHIoYWRkciwgbGVuLCB0eXBlKSkgIT0gTlVMTCApCiAJICAgIGlmKCBXU19kdXBfaGUocHdzaSwgaG9zdCwgZHVwX2ZsYWcpICkKLQkJcmV0dXJuIChzdHJ1Y3QgV0lOX2hvc3RlbnQqKShwd3NpLT5idWZmZXIpOworCQlyZXR1cm4gKHN0cnVjdCBXSU5faG9zdGVudCopKHB3c2ktPmhlKTsKIAkgICAgZWxzZSAKIAkJcHdzaS0+ZXJyID0gV1NBRU5PQlVGUzsKIAllbHNlIApAQCAtMTQ2OCw3ICsxNDk1LDcgQEAKIAlzdHJ1Y3QgaG9zdGVudCogICAgIGhvc3Q7CiAJaWYoIChob3N0ID0gZ2V0aG9zdGJ5bmFtZShuYW1lKSkgIT0gTlVMTCApCiAJICAgICBpZiggV1NfZHVwX2hlKHB3c2ksIGhvc3QsIGR1cF9mbGFnKSApCi0JCSByZXR1cm4gKHN0cnVjdCBXSU5faG9zdGVudCopKHB3c2ktPmJ1ZmZlcik7CisJCSByZXR1cm4gKHN0cnVjdCBXSU5faG9zdGVudCopKHB3c2ktPmhlKTsKIAkgICAgIGVsc2UgcHdzaS0+ZXJyID0gV1NBRU5PQlVGUzsKIAllbHNlIHB3c2ktPmVyciA9IChoX2Vycm5vIDwgMCkgPyB3c2FFcnJubygpIDogd3NhSGVycm5vKCk7CiAgICAgfQpAQCAtMTUwMiw3ICsxNTI5LDcgQEAKIAlzdHJ1Y3QgcHJvdG9lbnQqICAgICBwcm90bzsKIAlpZiggKHByb3RvID0gZ2V0cHJvdG9ieW5hbWUobmFtZSkpICE9IE5VTEwgKQogCSAgICBpZiggV1NfZHVwX3BlKHB3c2ksIHByb3RvLCBkdXBfZmxhZykgKQotCQlyZXR1cm4gKHN0cnVjdCBXSU5fcHJvdG9lbnQqKShwd3NpLT5idWZmZXIpOworCQlyZXR1cm4gKHN0cnVjdCBXSU5fcHJvdG9lbnQqKShwd3NpLT5wZSk7CiAJICAgIGVsc2UgcHdzaS0+ZXJyID0gV1NBRU5PQlVGUzsKIAllbHNlIHB3c2ktPmVyciA9IChoX2Vycm5vIDwgMCkgPyB3c2FFcnJubygpIDogd3NhSGVycm5vKCk7CiAgICAgfQpAQCAtMTUzNiw3ICsxNTYzLDcgQEAKIAlzdHJ1Y3QgcHJvdG9lbnQqICAgICBwcm90bzsKIAlpZiggKHByb3RvID0gZ2V0cHJvdG9ieW51bWJlcihudW1iZXIpKSAhPSBOVUxMICkKIAkgICAgaWYoIFdTX2R1cF9wZShwd3NpLCBwcm90bywgZHVwX2ZsYWcpICkKLQkJcmV0dXJuIChzdHJ1Y3QgV0lOX3Byb3RvZW50KikocHdzaS0+YnVmZmVyKTsKKwkJcmV0dXJuIChzdHJ1Y3QgV0lOX3Byb3RvZW50KikocHdzaS0+cGUpOwogCSAgICBlbHNlIHB3c2ktPmVyciA9IFdTQUVOT0JVRlM7CiAJZWxzZSBwd3NpLT5lcnIgPSBXU0FOT19EQVRBOwogICAgIH0KQEAgLTE1NzMsNyArMTYwMCw3IEBACiAJaWYoIGkgKQogCSAgICBpZiggKHNlcnYgPSBnZXRzZXJ2YnluYW1lKHB3c2ktPmJ1ZmZlciwgcHdzaS0+YnVmZmVyICsgaSkpICE9IE5VTEwgKQogCQlpZiggV1NfZHVwX3NlKHB3c2ksIHNlcnYsIGR1cF9mbGFnKSApCi0JCSAgICByZXR1cm4gKHN0cnVjdCBXSU5fc2VydmVudCopKHB3c2ktPmJ1ZmZlcik7CisJCSAgICByZXR1cm4gKHN0cnVjdCBXSU5fc2VydmVudCopKHB3c2ktPnNlKTsKIAkJZWxzZSBwd3NpLT5lcnIgPSBXU0FFTk9CVUZTOwogCSAgICBlbHNlIHB3c2ktPmVyciA9IChoX2Vycm5vIDwgMCkgPyB3c2FFcnJubygpIDogd3NhSGVycm5vKCk7CiAJZWxzZSBwd3NpLT5lcnIgPSBXU0FFTk9CVUZTOwpAQCAtMTYxMyw3ICsxNjQwLDcgQEAKIAlpZiggaSApCiAJICAgIGlmKCAoc2VydiA9IGdldHNlcnZieXBvcnQocG9ydCwgcHdzaS0+YnVmZmVyKSkgIT0gTlVMTCApCiAJCWlmKCBXU19kdXBfc2UocHdzaSwgc2VydiwgZHVwX2ZsYWcpICkKLQkJICAgIHJldHVybiAoc3RydWN0IFdJTl9zZXJ2ZW50KikocHdzaS0+YnVmZmVyKTsKKwkJICAgIHJldHVybiAoc3RydWN0IFdJTl9zZXJ2ZW50KikocHdzaS0+c2UpOwogCQllbHNlIHB3c2ktPmVyciA9IFdTQUVOT0JVRlM7CiAJICAgIGVsc2UgcHdzaS0+ZXJyID0gKGhfZXJybm8gPCAwKSA/IHdzYUVycm5vKCkgOiB3c2FIZXJybm8oKTsKIAllbHNlIHB3c2ktPmVyciA9IFdTQUVOT0JVRlM7CkBAIC0yNDUwLDI5ICsyNDc3LDMwIEBACiAgICAgKi8KIAogICAgaW50IHNpemUgPSBob3N0ZW50X3NpemUocF9oZSk7CisKICAgIGlmKCBzaXplICkKICAgIHsKICAgICAgc3RydWN0IHdzX2hvc3RlbnQqIHBfdG87CiAgICAgIGNoYXIqIHBfbmFtZSwqcF9hbGlhc2VzLCpwX2FkZHIsKnBfYmFzZSwqcDsKIAotICAgICBfY2hlY2tfYnVmZmVyKHB3c2ksIHNpemUpOwotICAgICBwX3RvID0gKHN0cnVjdCB3c19ob3N0ZW50Kilwd3NpLT5idWZmZXI7Ci0gICAgIHAgPSBwd3NpLT5idWZmZXI7CisgICAgIF9jaGVja19idWZmZXJfaGUocHdzaSwgc2l6ZSk7CisgICAgIHBfdG8gPSAoc3RydWN0IHdzX2hvc3RlbnQqKXB3c2ktPmhlOworICAgICBwID0gKGNoYXIqKXB3c2ktPmhlOwogICAgICBwX2Jhc2UgPSAoZmxhZyAmIFdTX0RVUF9PRkZTRVQpID8gTlVMTAogCQkJCSAgICAgOiAoKGZsYWcgJiBXU19EVVBfU0VHUFRSKSA/IChjaGFyKilTRUdQVFJfR0VUKHApIDogcCk7CiAgICAgIHAgKz0gc2l6ZW9mKHN0cnVjdCB3c19ob3N0ZW50KTsKICAgICAgcF9uYW1lID0gcDsKICAgICAgc3RyY3B5KHAsIHBfaGUtPmhfbmFtZSk7IHAgKz0gc3RybGVuKHApICsgMTsKICAgICAgcF9hbGlhc2VzID0gcDsKLSAgICAgcCArPSBsaXN0X2R1cChwX2hlLT5oX2FsaWFzZXMsIHAsIHBfYmFzZSArIChwIC0gcHdzaS0+YnVmZmVyKSwgMCk7CisgICAgIHAgKz0gbGlzdF9kdXAocF9oZS0+aF9hbGlhc2VzLCBwLCBwX2Jhc2UgKyAocCAtIChjaGFyKilwd3NpLT5oZSksIDApOwogICAgICBwX2FkZHIgPSBwOwotICAgICBsaXN0X2R1cChwX2hlLT5oX2FkZHJfbGlzdCwgcCwgcF9iYXNlICsgKHAgLSBwd3NpLT5idWZmZXIpLCBwX2hlLT5oX2xlbmd0aCk7CisgICAgIGxpc3RfZHVwKHBfaGUtPmhfYWRkcl9saXN0LCBwLCBwX2Jhc2UgKyAocCAtIChjaGFyKilwd3NpLT5oZSksIHBfaGUtPmhfbGVuZ3RoKTsKIAogICAgICBwX3RvLT5oX2FkZHJ0eXBlID0gKElOVDE2KXBfaGUtPmhfYWRkcnR5cGU7IAogICAgICBwX3RvLT5oX2xlbmd0aCA9IChJTlQxNilwX2hlLT5oX2xlbmd0aDsKLSAgICAgcF90by0+aF9uYW1lID0gKFNFR1BUUikocF9iYXNlICsgKHBfbmFtZSAtIHB3c2ktPmJ1ZmZlcikpOwotICAgICBwX3RvLT5oX2FsaWFzZXMgPSAoU0VHUFRSKShwX2Jhc2UgKyAocF9hbGlhc2VzIC0gcHdzaS0+YnVmZmVyKSk7Ci0gICAgIHBfdG8tPmhfYWRkcl9saXN0ID0gKFNFR1BUUikocF9iYXNlICsgKHBfYWRkciAtIHB3c2ktPmJ1ZmZlcikpOworICAgICBwX3RvLT5oX25hbWUgPSAoU0VHUFRSKShwX2Jhc2UgKyAocF9uYW1lIC0gKGNoYXIqKXB3c2ktPmhlKSk7CisgICAgIHBfdG8tPmhfYWxpYXNlcyA9IChTRUdQVFIpKHBfYmFzZSArIChwX2FsaWFzZXMgLSAoY2hhciopcHdzaS0+aGUpKTsKKyAgICAgcF90by0+aF9hZGRyX2xpc3QgPSAoU0VHUFRSKShwX2Jhc2UgKyAocF9hZGRyIC0gKGNoYXIqKXB3c2ktPmhlKSk7CiAKICAgICAgc2l6ZSArPSAoc2l6ZW9mKHN0cnVjdCB3c19ob3N0ZW50KSAtIHNpemVvZihzdHJ1Y3QgaG9zdGVudCkpOwogICAgfQpAQCAtMjQ5OSwyMCArMjUyNywyMCBAQAogICAgICBzdHJ1Y3Qgd3NfcHJvdG9lbnQqIHBfdG87CiAgICAgIGNoYXIqIHBfbmFtZSwqcF9hbGlhc2VzLCpwX2Jhc2UsKnA7CiAKLSAgICAgX2NoZWNrX2J1ZmZlcihwd3NpLCBzaXplKTsKLSAgICAgcF90byA9IChzdHJ1Y3Qgd3NfcHJvdG9lbnQqKXB3c2ktPmJ1ZmZlcjsKLSAgICAgcCA9IHB3c2ktPmJ1ZmZlcjsgCisgICAgIF9jaGVja19idWZmZXJfcGUocHdzaSwgc2l6ZSk7CisgICAgIHBfdG8gPSAoc3RydWN0IHdzX3Byb3RvZW50Kilwd3NpLT5wZTsKKyAgICAgcCA9IChjaGFyKilwd3NpLT5wZTsgCiAgICAgIHBfYmFzZSA9IChmbGFnICYgV1NfRFVQX09GRlNFVCkgPyBOVUxMCiAJCQkJICAgICA6ICgoZmxhZyAmIFdTX0RVUF9TRUdQVFIpID8gKGNoYXIqKVNFR1BUUl9HRVQocCkgOiBwKTsKICAgICAgcCArPSBzaXplb2Yoc3RydWN0IHdzX3Byb3RvZW50KTsKICAgICAgcF9uYW1lID0gcDsKICAgICAgc3RyY3B5KHAsIHBfcGUtPnBfbmFtZSk7IHAgKz0gc3RybGVuKHApICsgMTsKICAgICAgcF9hbGlhc2VzID0gcDsKLSAgICAgbGlzdF9kdXAocF9wZS0+cF9hbGlhc2VzLCBwLCBwX2Jhc2UgKyAocCAtIHB3c2ktPmJ1ZmZlciksIDApOworICAgICBsaXN0X2R1cChwX3BlLT5wX2FsaWFzZXMsIHAsIHBfYmFzZSArIChwIC0gKGNoYXIqKXB3c2ktPnBlKSwgMCk7CiAKICAgICAgcF90by0+cF9wcm90byA9IChJTlQxNilwX3BlLT5wX3Byb3RvOwotICAgICBwX3RvLT5wX25hbWUgPSAoU0VHUFRSKShwX2Jhc2UpICsgKHBfbmFtZSAtIHB3c2ktPmJ1ZmZlcik7Ci0gICAgIHBfdG8tPnBfYWxpYXNlcyA9IChTRUdQVFIpKChwX2Jhc2UpICsgKHBfYWxpYXNlcyAtIHB3c2ktPmJ1ZmZlcikpOyAKKyAgICAgcF90by0+cF9uYW1lID0gKFNFR1BUUikocF9iYXNlKSArIChwX25hbWUgLSAoY2hhciopcHdzaS0+cGUpOworICAgICBwX3RvLT5wX2FsaWFzZXMgPSAoU0VHUFRSKSgocF9iYXNlKSArIChwX2FsaWFzZXMgLSAoY2hhciopcHdzaS0+cGUpKTsgCiAKICAgICAgc2l6ZSArPSAoc2l6ZW9mKHN0cnVjdCB3c19wcm90b2VudCkgLSBzaXplb2Yoc3RydWN0IHByb3RvZW50KSk7CiAgICB9CkBAIC0yNTM5LDkgKzI1NjcsOSBAQAogICAgICBzdHJ1Y3Qgd3Nfc2VydmVudCogcF90bzsKICAgICAgY2hhciogcF9uYW1lLCpwX2FsaWFzZXMsKnBfcHJvdG8sKnBfYmFzZSwqcDsKIAotICAgICBfY2hlY2tfYnVmZmVyKHB3c2ksIHNpemUpOwotICAgICBwX3RvID0gKHN0cnVjdCB3c19zZXJ2ZW50Kilwd3NpLT5idWZmZXI7Ci0gICAgIHAgPSBwd3NpLT5idWZmZXI7CisgICAgIF9jaGVja19idWZmZXJfc2UocHdzaSwgc2l6ZSk7CisgICAgIHBfdG8gPSAoc3RydWN0IHdzX3NlcnZlbnQqKXB3c2ktPnNlOworICAgICBwID0gKGNoYXIqKXB3c2ktPnNlOwogICAgICBwX2Jhc2UgPSAoZmxhZyAmIFdTX0RVUF9PRkZTRVQpID8gTlVMTCAKIAkJCQkgICAgIDogKChmbGFnICYgV1NfRFVQX1NFR1BUUikgPyAoY2hhciopU0VHUFRSX0dFVChwKSA6IHApOwogICAgICBwICs9IHNpemVvZihzdHJ1Y3Qgd3Nfc2VydmVudCk7CkBAIC0yNTUwLDEyICsyNTc4LDEyIEBACiAgICAgIHBfcHJvdG8gPSBwOwogICAgICBzdHJjcHkocCwgcF9zZS0+c19wcm90byk7IHAgKz0gc3RybGVuKHApICsgMTsKICAgICAgcF9hbGlhc2VzID0gcDsKLSAgICAgbGlzdF9kdXAocF9zZS0+c19hbGlhc2VzLCBwLCBwX2Jhc2UgKyAocCAtIHB3c2ktPmJ1ZmZlciksIDApOworICAgICBsaXN0X2R1cChwX3NlLT5zX2FsaWFzZXMsIHAsIHBfYmFzZSArIChwIC0gKGNoYXIqKXB3c2ktPnNlKSwgMCk7CiAKICAgICAgcF90by0+c19wb3J0ID0gKElOVDE2KXBfc2UtPnNfcG9ydDsKLSAgICAgcF90by0+c19uYW1lID0gKFNFR1BUUikocF9iYXNlICsgKHBfbmFtZSAtIHB3c2ktPmJ1ZmZlcikpOwotICAgICBwX3RvLT5zX3Byb3RvID0gKFNFR1BUUikocF9iYXNlICsgKHBfcHJvdG8gLSBwd3NpLT5idWZmZXIpKTsKLSAgICAgcF90by0+c19hbGlhc2VzID0gKFNFR1BUUikocF9iYXNlICsgKHBfYWxpYXNlcyAtIHB3c2ktPmJ1ZmZlcikpOyAKKyAgICAgcF90by0+c19uYW1lID0gKFNFR1BUUikocF9iYXNlICsgKHBfbmFtZSAtIChjaGFyKilwd3NpLT5zZSkpOworICAgICBwX3RvLT5zX3Byb3RvID0gKFNFR1BUUikocF9iYXNlICsgKHBfcHJvdG8gLSAoY2hhciopcHdzaS0+c2UpKTsKKyAgICAgcF90by0+c19hbGlhc2VzID0gKFNFR1BUUikocF9iYXNlICsgKHBfYWxpYXNlcyAtIChjaGFyKilwd3NpLT5zZSkpOyAKIAogICAgICBzaXplICs9IChzaXplb2Yoc3RydWN0IHdzX3NlcnZlbnQpIC0gc2l6ZW9mKHN0cnVjdCBzZXJ2ZW50KSk7CiAgICB9CmRpZmYgLS1naXQgYS9taXNjL3dpbnNvY2tfZG5zLmMgYi9taXNjL3dpbnNvY2tfZG5zLmMKaW5kZXggY2Y4NDE3Mi4uMTEzYzUwZSAxMDA2NDQKLS0tIGEvbWlzYy93aW5zb2NrX2Rucy5jCisrKyBiL21pc2Mvd2luc29ja19kbnMuYwpAQCAtNDcwLDcgKzQ3MCw3IEBACiAJCSAgICAgKChmbGFnICYgV1NNU0dfV0lOMzJfQU9QKSA/IFdTX0RVUF9MSU5FQVIgOiBXU19EVVBfU0VHUFRSKSApOwogICBpZiggc2l6ZSApCiAgIHsKLSAgICAgIGFzeW5jX2N0bC5idWZmZXIgPSBwd3NpLT5idWZmZXI7CisgICAgICBhc3luY19jdGwuYnVmZmVyID0gKGNoYXIqKXB3c2ktPmhlOwogICAgICAgYXN5bmNfY3RsLmlsZW5ndGggPSAodW5zaWduZWQpV1NBTUFLRUFTWU5DUkVQTFkoIChVSU5UMTYpc2l6ZSwgMCApOwogICAgICBfYXN5bmNfbm90aWZ5KCBmbGFnICk7CiAgIH0KQEAgLTQ5NCw3ICs0OTQsNyBAQAogCQkgICAgICgoZmxhZyAmIFdTTVNHX1dJTjMyX0FPUCkgPyBXU19EVVBfTElORUFSIDogV1NfRFVQX1NFR1BUUikgKTsKICAgaWYoIHNpemUgKQogICB7Ci0gICAgICBhc3luY19jdGwuYnVmZmVyID0gcHdzaS0+YnVmZmVyOworICAgICAgYXN5bmNfY3RsLmJ1ZmZlciA9IChjaGFyKilwd3NpLT5wZTsKICAgICAgIGFzeW5jX2N0bC5pbGVuZ3RoID0gKHVuc2lnbmVkKVdTQU1BS0VBU1lOQ1JFUExZKCAoVUlOVDE2KXNpemUsIDAgKTsKICAgICAgX2FzeW5jX25vdGlmeSggZmxhZyApOwogICB9IApAQCAtNTE2LDcgKzUxNiw3IEBACiAJCSAgICAgICgoZmxhZyAmIFdTTVNHX1dJTjMyX0FPUCkgPyBXU19EVVBfTElORUFSIDogV1NfRFVQX1NFR1BUUikgKTsKICAgaWYoIHNpemUgKQogICB7Ci0gICAgICBhc3luY19jdGwuYnVmZmVyID0gcHdzaS0+YnVmZmVyOworICAgICAgYXN5bmNfY3RsLmJ1ZmZlciA9IChjaGFyKilwd3NpLT5zZTsKICAgICAgIGFzeW5jX2N0bC5pbGVuZ3RoID0gKHVuc2lnbmVkKVdTQU1BS0VBU1lOQ1JFUExZKCAoVUlOVDE2KXNpemUsIDAgKTsKICAgICAgX2FzeW5jX25vdGlmeSggZmxhZyApOwogICB9CkBAIC01NjksNCArNTY5LDMgQEAKICAgICgocF93c3NlLT5zX2FsaWFzZXMpKSArPSAodW5zaWduZWQpYmFzZTsKICAgIGZvcihpPTA7cF9hbGlhc2VzW2ldO2krKykgcF9hbGlhc2VzW2ldICs9ICh1bnNpZ25lZCliYXNlOwogfQotCmRpZmYgLS1naXQgYS9taXNjZW11L21haW4uYyBiL21pc2NlbXUvbWFpbi5jCmluZGV4IDRlYWMyYzQuLjcyMzBkMDUgMTAwNjQ0Ci0tLSBhL21pc2NlbXUvbWFpbi5jCisrKyBiL21pc2NlbXUvbWFpbi5jCkBAIC04NCw3ICs4NCw2IEBACiAKICAgICAvKiBJbml0aWFsaXplIENBTEwzMiByb3V0aW5lcyAqLwogICAgIC8qIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBqdXN0IGJlZm9yZSB0YXNrLXN3aXRjaGluZyBzdGFydHMgKi8KLSAgICBJRjE2MzJfQ2FsbExhcmdlU3RhY2sgPSAoaW50ICgqKShpbnQgKCpmdW5jKSgpLCB2b2lkICphcmcpKUNBTEwzMl9Jbml0KCk7CiAKICAgICBsb2FkZWQ9MDsKICAgICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQpAQCAtMTE3LDYgKzExNiw3IEBACiAKICAgICBpZiAoT3B0aW9ucy5kZWJ1ZykgREVCVUdfQWRkTW9kdWxlQnJlYWtwb2ludHMoKTsKIAorICAgIElGMTYzMl9DYWxsTGFyZ2VTdGFjayA9IChpbnQgKCopKGludCAoKmZ1bmMpKCksIHZvaWQgKmFyZykpQ0FMTDMyX0luaXQoKTsKICAgICBZaWVsZDE2KCk7ICAvKiBTdGFydCB0aGUgZmlyc3QgdGFzayAqLwogICAgIE1TRygiV2luTWFpbjogU2hvdWxkIG5ldmVyIGhhcHBlbjogcmV0dXJuZWQgZnJvbSBZaWVsZDE2KClcbiIgKTsKICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL21zZG9zL2Rvc21lbS5jIGIvbXNkb3MvZG9zbWVtLmMKaW5kZXggMDIyNjQ1MC4uZDBiZmRkZCAxMDA2NDQKLS0tIGEvbXNkb3MvZG9zbWVtLmMKKysrIGIvbXNkb3MvZG9zbWVtLmMKQEAgLTE0LDYgKzE0LDggQEAKICNpbmNsdWRlICJsZHQuaCIKICNpbmNsdWRlICJtaXNjZW11LmgiCiAjaW5jbHVkZSAibW9kdWxlLmgiCisjaW5jbHVkZSAidGFzay5oIgorI2luY2x1ZGUgImRvc2V4ZS5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIEhBTkRMRTE2IERPU01FTV9CaW9zU2VnOyAgLyogQklPUyBkYXRhIHNlZ21lbnQgYXQgMHg0MDowICovCkBAIC03NSw3ICs3Nyw2IEBACiAKIHN0YXRpYyBCSU9TREFUQSAqcEJpb3NEYXRhID0gTlVMTDsKIHN0YXRpYyBjaGFyCSpET1NNRU1fZG9zbWVtOwotc3RhdGljIGNoYXIJKkRPU01FTV90b3A7CiAKICAgICAgICBEV09SRCAJIERPU01FTV9Db2xsYXRlVGFibGU7CiAKQEAgLTEwNyw2ICsxMDgsMzIgQEAKIAkgc2l6ZW9mKGRvc21lbV9lbnRyeSkgKyAoKGJsb2NrKS0+c2l6ZSAmIERNX0JMT0NLX01BU0spKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBET1NNRU1fTWVtb3J5QmFzZQorICoKKyAqIEdldHMgdGhlIERPUyBtZW1vcnkgYmFzZS4KKyAqLworc3RhdGljIGNoYXIgKkRPU01FTV9NZW1vcnlCYXNlKEhNT0RVTEUxNiBoTW9kdWxlKQoreworICAgIFREQiAqcFRhc2sgPSBoTW9kdWxlID8gTlVMTCA6IChUREIgKilHbG9iYWxMb2NrMTYoIEdldEN1cnJlbnRUYXNrKCkgKTsKKyAgICBORV9NT0RVTEUgKnBNb2R1bGUgPSAoaE1vZHVsZSB8fCBwVGFzaykgPyBORV9HZXRQdHIoIGhNb2R1bGUgPyBoTW9kdWxlIDogcFRhc2stPmhNb2R1bGUgKSA6IE5VTEw7CisKKyAgICBpZiAocE1vZHVsZSAmJiBwTW9kdWxlLT5scERvc1Rhc2spCisgICAgICAgIHJldHVybiBwTW9kdWxlLT5scERvc1Rhc2stPmltZzsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBET1NNRU1fZG9zbWVtOworfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBET1NNRU1fTWVtb3J5VG9wCisgKgorICogR2V0cyB0aGUgRE9TIG1lbW9yeSB0b3AuCisgKi8KK3N0YXRpYyBjaGFyICpET1NNRU1fTWVtb3J5VG9wKEhNT0RVTEUxNiBoTW9kdWxlKQoreworICAgIHJldHVybiBET1NNRU1fTWVtb3J5QmFzZShoTW9kdWxlKSsweDlGRkZDOyAvKiA2NDBLICovCit9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIERPU01FTV9GaWxsQmlvc1NlZ21lbnQKICAqCiAgKiBGaWxsIHRoZSBCSU9TIGRhdGEgc2VnbWVudCB3aXRoIGR1bW15IHZhbHVlcy4KQEAgLTE2MywyMSArMTkwLDIyIEBACiAgKgogICogSW5pdGlhbGlzZXMgdGhlIERPUyBtZW1vcnkgc3RydWN0dXJlcy4KICAqLwotc3RhdGljIHZvaWQgRE9TTUVNX0luaXRNZW1vcnkoKQorc3RhdGljIHZvaWQgRE9TTUVNX0luaXRNZW1vcnkoSE1PRFVMRTE2IGhNb2R1bGUpCiB7CiAgICAvKiBMb3cgNjRLYiBhcmUgcmVzZXJ2ZWQgZm9yIERPUy9CSU9TIHNvIHRoZSB1c2VhYmxlIGFyZWEgc3RhcnRzIGF0CiAgICAgKiAxMDAwOjAwMDAgYW5kIGVuZHMgYXQgOUZGRjpGRkVGLiAqLwogCisgICAgY2hhciogICAgICAgICAgICAgICBkb3NtZW0gPSBET1NNRU1fTWVtb3J5QmFzZShoTW9kdWxlKTsKICAgICBkb3NtZW1fZW50cnkqICAgICAgIGRtOwogCi0gICAgRE9TTUVNX3RvcCA9IERPU01FTV9kb3NtZW0rMHg5RkZGQzsgLyogNjQwSyAqLwotICAgIGluZm9fYmxvY2sgPSAoZG9zbWVtX2luZm8qKSggRE9TTUVNX2Rvc21lbSArIDB4MTAwMDAgKTsKKyAgICAvKiBGSVhNRTogdGhlc2Ugc3RhdGljIHZhcmlhYmxlcyBjYW4ndCBjb3BlIHdpdGggc2V2ZXJhbCBET1MgaGVhcHMgKi8KKyAgICBpbmZvX2Jsb2NrID0gKGRvc21lbV9pbmZvKikoIGRvc21lbSArIDB4MTAwMDAgKTsKIAogICAgIC8qIGZpcnN0IGJsb2NrIGhhcyB0byBiZSBwYXJhZ3JhcGgtYWxpZ25lZCByZWxhdGl2ZSB0byB0aGUgRE9TTUVNX2Rvc21lbSAqLwogCi0gICAgcm9vdF9ibG9jayA9IChkb3NtZW1fZW50cnkqKSggRE9TTUVNX2Rvc21lbSArIDB4MTAwMDAgKworICAgIHJvb3RfYmxvY2sgPSAoZG9zbWVtX2VudHJ5KikoIGRvc21lbSArIDB4MTAwMDAgKwogICAgICAgICAgICAgICAgICAoKCgoc2l6ZW9mKGRvc21lbV9pbmZvKSArIDB4ZikgJiB+MHhmKSAtIHNpemVvZihkb3NtZW1fZW50cnkpKSkpOwotICAgIHJvb3RfYmxvY2stPnNpemUgPSBET1NNRU1fdG9wIC0gKCgoY2hhciopcm9vdF9ibG9jaykgKyBzaXplb2YoZG9zbWVtX2VudHJ5KSk7CisgICAgcm9vdF9ibG9jay0+c2l6ZSA9IERPU01FTV9NZW1vcnlUb3AoaE1vZHVsZSkgLSAoKChjaGFyKilyb290X2Jsb2NrKSArIHNpemVvZihkb3NtZW1fZW50cnkpKTsKIAogICAgIGluZm9fYmxvY2stPmJsb2NrcyA9IDA7CiAgICAgaW5mb19ibG9jay0+ZnJlZSA9IHJvb3RfYmxvY2stPnNpemU7CkBAIC0xOTcsMjQgKzIyNSwyOSBAQAogICogQ3JlYXRlIHRoZSBkb3MgbWVtb3J5IHNlZ21lbnRzLCBhbmQgc3RvcmUgdGhlbSBpbnRvIHRoZSBLRVJORUwKICAqIGV4cG9ydGVkIHZhbHVlcy4KICAqLwotQk9PTDMyIERPU01FTV9Jbml0KHZvaWQpCitCT09MMzIgRE9TTUVNX0luaXQoSE1PRFVMRTE2IGhNb2R1bGUpCiB7Ci0gICAgLyogQWxsb2NhdGUgMSBNQiBkb3NtZW1vcnkgCi0gICAgICogLSBpdCBpcyBtb3N0bHkgd2FzdGVkIGJ1dCB3ZSB1c2UgY2FuIHNvbWUgb2YgaXQgdG8gCi0gICAgICogICBzdG9yZSBpbnRlcm5hbCB0cmFuc2xhdGlvbiB0YWJsZXMsIGV0Yy4uLgotICAgICAqLwotICAgIERPU01FTV9kb3NtZW0gPSBWaXJ0dWFsQWxsb2MoIE5VTEwsIDB4MTAwMDAwLCBNRU1fQ09NTUlULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUgKTsKLSAgICBpZiAoIURPU01FTV9kb3NtZW0pCisgICAgaWYgKCFoTW9kdWxlKQogICAgIHsKLSAgICAgICAgV0FSTihkb3NtZW0sICJDb3VsZCBub3QgYWxsb2NhdGUgRE9TIG1lbW9yeS5cbiIgKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBET1NNRU1fQmlvc1NlZyA9IEdMT0JBTF9DcmVhdGVCbG9jayhHTUVNX0ZJWEVELERPU01FTV9kb3NtZW0rMHg0MDAsMHgxMDAsCisgICAgICAgIC8qIEFsbG9jYXRlIDEgTUIgZG9zbWVtb3J5IAorICAgICAgICAgKiAtIGl0IGlzIG1vc3RseSB3YXN0ZWQgYnV0IHdlIHVzZSBjYW4gc29tZSBvZiBpdCB0byAKKyAgICAgICAgICogICBzdG9yZSBpbnRlcm5hbCB0cmFuc2xhdGlvbiB0YWJsZXMsIGV0Yy4uLgorICAgICAgICAgKi8KKyAgICAgICAgRE9TTUVNX2Rvc21lbSA9IFZpcnR1YWxBbGxvYyggTlVMTCwgMHgxMDAwMDAsIE1FTV9DT01NSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUgKTsKKyAgICAgICAgaWYgKCFET1NNRU1fZG9zbWVtKQorICAgICAgICB7CisgICAgICAgICAgICBXQVJOKGRvc21lbSwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBET1MgbWVtb3J5LlxuIiApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIERPU01FTV9CaW9zU2VnID0gR0xPQkFMX0NyZWF0ZUJsb2NrKEdNRU1fRklYRUQsRE9TTUVNX2Rvc21lbSsweDQwMCwweDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBOVUxMICk7Ci0gICAgRE9TTUVNX0ZpbGxCaW9zU2VnbWVudCgpOwotICAgIERPU01FTV9Jbml0TWVtb3J5KCk7Ci0gICAgRE9TTUVNX0luaXRDb2xsYXRlVGFibGUoKTsKKyAgICAgICAgRE9TTUVNX0ZpbGxCaW9zU2VnbWVudCgpOworICAgICAgICBET1NNRU1fSW5pdE1lbW9yeSgwKTsKKyAgICAgICAgRE9TTUVNX0luaXRDb2xsYXRlVGFibGUoKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBET1NNRU1fSW5pdE1lbW9yeShoTW9kdWxlKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMjM0LDcgKzI2Nyw3IEBACiAgKgogICogQ2FydmUgYSBjaHVuayBvZiB0aGUgRE9TIG1lbW9yeSBibG9jayAod2l0aG91dCBzZWxlY3RvcikuCiAgKi8KLUxQVk9JRCBET1NNRU1fR2V0QmxvY2soVUlOVDMyIHNpemUsIFVJTlQxNiogcHNlZykKK0xQVk9JRCBET1NNRU1fR2V0QmxvY2soSE1PRFVMRTE2IGhNb2R1bGUsIFVJTlQzMiBzaXplLCBVSU5UMTYqIHBzZWcpCiB7CiAgICBVSU5UMzIgIAkgYmxvY2tzaXplOwogICAgY2hhciAgICAgICAgICpibG9jayA9IE5VTEw7CkBAIC0yOTAsNyArMzIzLDcgQEAKIAogCSAgICAgICBpbmZvX2Jsb2NrLT5ibG9ja3MrKzsKIAkgICAgICAgaW5mb19ibG9jay0+ZnJlZSAtPSBkbS0+c2l6ZTsKLQkgICAgICAgaWYoIHBzZWcgKSAqcHNlZyA9IChibG9jayAtIERPU01FTV9kb3NtZW0pID4+IDQ7CisJICAgICAgIGlmKCBwc2VnICkgKnBzZWcgPSAoYmxvY2sgLSBET1NNRU1fTWVtb3J5QmFzZShoTW9kdWxlKSkgPj4gNDsKICNpZmRlZiBfX0RPU01FTV9ERUJVR19fCiAgICAgICAgICAgICAgICBkbS0+c2l6ZSB8PSBETV9CTE9DS19ERUJVRzsKICNlbmRpZgpAQCAtMzA2LDEwICszMzksMTEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIERPU01FTV9GcmVlQmxvY2sKICAqLwotQk9PTDMyIERPU01FTV9GcmVlQmxvY2sodm9pZCogcHRyKQorQk9PTDMyIERPU01FTV9GcmVlQmxvY2soSE1PRFVMRTE2IGhNb2R1bGUsIHZvaWQqIHB0cikKIHsKICAgIGlmKCBwdHIgPj0gKHZvaWQqKSgoKGNoYXIqKXJvb3RfYmxvY2spICsgc2l6ZW9mKGRvc21lbV9lbnRyeSkpICYmCi0gICAgICAgcHRyIDwgKHZvaWQqKURPU01FTV90b3AgJiYgISgoKChjaGFyKilwdHIpIC0gRE9TTUVNX2Rvc21lbSkgJiAweGYpICkKKyAgICAgICBwdHIgPCAodm9pZCopRE9TTUVNX01lbW9yeVRvcChoTW9kdWxlKSAmJiAhKCgoKGNoYXIqKXB0cikKKyAgICAgICAgICAgICAgICAgIC0gRE9TTUVNX01lbW9yeUJhc2UoaE1vZHVsZSkpICYgMHhmKSApCiAgICB7CiAgICAgICAgZG9zbWVtX2VudHJ5ICAqZG0gPSAoZG9zbWVtX2VudHJ5KikoKChjaGFyKilwdHIpIC0gc2l6ZW9mKGRvc21lbV9lbnRyeSkpOwogCkBAIC0zMjksNiArMzYzLDEwOSBAQAogICAgcmV0dXJuIEZBTFNFOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBET1NNRU1fUmVzaXplQmxvY2sKKyAqLworTFBWT0lEIERPU01FTV9SZXNpemVCbG9jayhITU9EVUxFMTYgaE1vZHVsZSwgdm9pZCogcHRyLCBVSU5UMzIgc2l6ZSwgVUlOVDE2KiBwc2VnKQoreworICAgY2hhciAgICAgICAgICpibG9jayA9IE5VTEw7CisKKyAgIGlmKCBwdHIgPj0gKHZvaWQqKSgoKGNoYXIqKXJvb3RfYmxvY2spICsgc2l6ZW9mKGRvc21lbV9lbnRyeSkpICYmCisgICAgICAgcHRyIDwgKHZvaWQqKURPU01FTV9NZW1vcnlUb3AoaE1vZHVsZSkgJiYgISgoKChjaGFyKilwdHIpCisgICAgICAgICAgICAgICAgICAtIERPU01FTV9NZW1vcnlCYXNlKGhNb2R1bGUpKSAmIDB4ZikgKQorICAgeworICAgICAgIGRvc21lbV9lbnRyeSAgKmRtID0gKGRvc21lbV9lbnRyeSopKCgoY2hhciopcHRyKSAtIHNpemVvZihkb3NtZW1fZW50cnkpKTsKKworICAgICAgIGlmKCBwc2VnICkgKnBzZWcgPSAoKGNoYXIqKXB0ciAtIERPU01FTV9NZW1vcnlCYXNlKGhNb2R1bGUpKSA+PiA0OworCisgICAgICAgaWYoICEoZG0tPnNpemUgJiAoRE1fQkxPQ0tfRlJFRSB8IERNX0JMT0NLX1RFUk1JTkFMKSkKKwkgKQorICAgICAgIHsKKwkgICAgIGRvc21lbV9lbnRyeSAgKm5leHQgPSBORVhUX0JMT0NLKGRtKTsKKwkgICAgIFVJTlQzMiBibG9ja3NpemUsIG9yZ3NpemUgPSBkbS0+c2l6ZSAmIERNX0JMT0NLX01BU0s7CisKKwkgICAgIHdoaWxlKCBuZXh0LT5zaXplICYgRE1fQkxPQ0tfRlJFRSApIC8qIGNvbGxhcHNlIGZyZWUgYmxvY2tzICovCisJICAgICB7CisJICAgICAgICAgZG0tPnNpemUgKz0gc2l6ZW9mKGRvc21lbV9lbnRyeSkgKyAobmV4dC0+c2l6ZSAmIERNX0JMT0NLX01BU0spOworCSAgICAgICAgIG5leHQtPnNpemUgPSAoRE1fQkxPQ0tfRlJFRSB8IERNX0JMT0NLX1RFUk1JTkFMKTsKKwkgICAgICAgICBuZXh0ID0gTkVYVF9CTE9DSyhkbSk7CisJICAgICB9CisKKwkgICAgIGJsb2Nrc2l6ZSA9IGRtLT5zaXplICYgRE1fQkxPQ0tfTUFTSzsKKwkgICAgIGlmIChibG9ja3NpemUgPj0gc2l6ZSkKKwkgICAgIHsKKwkgICAgICAgICBibG9jayA9ICgoY2hhciopZG0pICsgc2l6ZW9mKGRvc21lbV9lbnRyeSk7CisJICAgICAgICAgaWYoIGJsb2Nrc2l6ZSAtIHNpemUgPiAweDIwICkKKwkgICAgICAgICB7CisJCSAgICAgLyogc3BsaXQgZG0gc28gdGhhdCB0aGUgbmV4dCBvbmUgc3RheXMKKwkJICAgICAgKiBwYXJhZ3JhcGgtYWxpZ25lZCAoYW5kIG5leHQgZ2FpbnMgZnJlZSBiaXQpICovCisKKwkgICAgICAgICAgICAgZG0tPnNpemUgPSAoKChzaXplICsgMHhmICsgc2l6ZW9mKGRvc21lbV9lbnRyeSkpICYgfjB4ZikgLQorCQkJICAgICAgICAgCSAgICAgICAgc2l6ZW9mKGRvc21lbV9lbnRyeSkpOworCSAgICAgICAgICAgICBuZXh0ID0gKGRvc21lbV9lbnRyeSopKCgoY2hhciopZG0pICsgCisJIAkJICAgICBzaXplb2YoZG9zbWVtX2VudHJ5KSArIGRtLT5zaXplKTsKKwkgICAgICAgICAgICAgbmV4dC0+c2l6ZSA9IChibG9ja3NpemUgLSAoZG0tPnNpemUgKyAKKwkJCSAgICAgc2l6ZW9mKGRvc21lbV9lbnRyeSkpKSB8IERNX0JMT0NLX0ZSRUUgCisJCQkJCQkgICAgOworCSAgICAgICAgIH0gZWxzZSBkbS0+c2l6ZSAmPSBETV9CTE9DS19NQVNLOworCisJCSBpbmZvX2Jsb2NrLT5mcmVlICs9IG9yZ3NpemUgLSBkbS0+c2l6ZTsKKwkgICAgIH0gZWxzZSB7CisJCSBibG9jayA9IERPU01FTV9HZXRCbG9jayhoTW9kdWxlLCBzaXplLCBwc2VnKTsKKwkJIGlmIChibG9jaykgeworCQkgICAgIGluZm9fYmxvY2stPmJsb2Nrcy0tOworCQkgICAgIGluZm9fYmxvY2stPmZyZWUgKz0gZG0tPnNpemU7CisKKwkJICAgICBkbS0+c2l6ZSB8PSBETV9CTE9DS19GUkVFOworCQkgfQorCSAgICAgfQorICAgICAgIH0KKyAgIH0KKyAgIHJldHVybiAoTFBWT0lEKWJsb2NrOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERPU01FTV9BdmFpbGFibGUKKyAqLworVUlOVDMyIERPU01FTV9BdmFpbGFibGUoSE1PRFVMRTE2IGhNb2R1bGUpCit7CisgICBVSU5UMzIgIAkgYmxvY2tzaXplLCBhdmFpbGFibGUgPSAwOworICAgY2hhciAgICAgICAgICpibG9jayA9IE5VTEw7CisgICBkb3NtZW1fZW50cnkgKmRtOworICAgCisgICBkbSA9IHJvb3RfYmxvY2s7CisKKyAgIHdoaWxlIChkbSAmJiBkbS0+c2l6ZSAhPSBETV9CTE9DS19URVJNSU5BTCkKKyAgIHsKKyNpZmRlZiBfX0RPU01FTV9ERUJVR19fCisgICAgICAgaWYoIChkbS0+c2l6ZSAmIERNX0JMT0NLX0RFQlVHKSAhPSBETV9CTE9DS19ERUJVRyApCisgICAgICAgeworCSAgICBXQVJOKGRvc21lbSwiTUNCIG92ZXJydW4hIFtwcmV2ID0gMHglMDh4XVxuIiwgNCArIChVSU5UMzIpcHJldik7CisJICAgIHJldHVybiBOVUxMOworICAgICAgIH0KKyAgICAgICBwcmV2ID0gZG07CisjZW5kaWYKKyAgICAgICBpZiggZG0tPnNpemUgJiBETV9CTE9DS19GUkVFICkKKyAgICAgICB7CisJICAgZG9zbWVtX2VudHJ5ICAqbmV4dCA9IE5FWFRfQkxPQ0soZG0pOworCisJICAgd2hpbGUoIG5leHQtPnNpemUgJiBETV9CTE9DS19GUkVFICkgLyogY29sbGFwc2UgZnJlZSBibG9ja3MgKi8KKwkgICB7CisJICAgICAgIGRtLT5zaXplICs9IHNpemVvZihkb3NtZW1fZW50cnkpICsgKG5leHQtPnNpemUgJiBETV9CTE9DS19NQVNLKTsKKwkgICAgICAgbmV4dC0+c2l6ZSA9IChETV9CTE9DS19GUkVFIHwgRE1fQkxPQ0tfVEVSTUlOQUwpOworCSAgICAgICBuZXh0ID0gTkVYVF9CTE9DSyhkbSk7CisJICAgfQorCisJICAgYmxvY2tzaXplID0gZG0tPnNpemUgJiBETV9CTE9DS19NQVNLOworCSAgIGlmICggYmxvY2tzaXplID4gYXZhaWxhYmxlICkgYXZhaWxhYmxlID0gYmxvY2tzaXplOworIAkgICBkbSA9IG5leHQ7CisgICAgICAgfQorICAgICAgIGVsc2UgZG0gPSBORVhUX0JMT0NLKGRtKTsKKyAgIH0KKyAgIHJldHVybiBhdmFpbGFibGU7Cit9CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgRE9TTUVNX01hcExpbmVhclRvRG9zCkBAIC0zMzcsOSArNDc0LDkgQEAKICAqLwogVUlOVDMyIERPU01FTV9NYXBMaW5lYXJUb0RvcyhMUFZPSUQgcHRyKQogewotICAgIGlmICgoKGNoYXIqKXB0ciA+PSBET1NNRU1fZG9zbWVtKSAmJgotICAgICAgICAoKGNoYXIqKXB0ciA8IERPU01FTV9kb3NtZW0gKyAweDEwMDAwMCkpCi0JICByZXR1cm4gKFVJTlQzMilwdHIgLSAoVUlOVDMyKURPU01FTV9kb3NtZW07CisgICAgaWYgKCgoY2hhciopcHRyID49IERPU01FTV9NZW1vcnlCYXNlKDApKSAmJgorICAgICAgICAoKGNoYXIqKXB0ciA8IERPU01FTV9NZW1vcnlCYXNlKDApICsgMHgxMDAwMDApKQorCSAgcmV0dXJuIChVSU5UMzIpcHRyIC0gKFVJTlQzMilET1NNRU1fTWVtb3J5QmFzZSgwKTsKICAgICByZXR1cm4gKFVJTlQzMilwdHI7CiB9CiAKQEAgLTM1MSw3ICs0ODgsNyBAQAogICovCiBMUFZPSUQgRE9TTUVNX01hcERvc1RvTGluZWFyKFVJTlQzMiBwdHIpCiB7Ci0gICAgaWYgKHB0ciA8IDB4MTAwMDAwKSByZXR1cm4gKExQVk9JRCkocHRyICsgKFVJTlQzMilET1NNRU1fZG9zbWVtKTsKKyAgICBpZiAocHRyIDwgMHgxMDAwMDApIHJldHVybiAoTFBWT0lEKShwdHIgKyAoVUlOVDMyKURPU01FTV9NZW1vcnlCYXNlKDApKTsKICAgICByZXR1cm4gKExQVk9JRClwdHI7CiB9CiAKQEAgLTM2NSw3ICs1MDIsNyBAQAogewogICAgTFBWT0lEICAgICAgIGxpbjsKIAotICAgbGluPURPU01FTV9kb3NtZW0rKHgmMHhmZmZmKSsoKCh4JjB4ZmZmZjAwMDApPj4xNikqMTYpOworICAgbGluPURPU01FTV9NZW1vcnlCYXNlKDApKyh4JjB4ZmZmZikrKCgoeCYweGZmZmYwMDAwKT4+MTYpKjE2KTsKICAgIFRSQUNFKHNlbGVjdG9yLCIoMHglMDhseCkgcmV0dXJucyAweCVwLlxuIiwKICAgICAgICAgICAgICAgICAgICAgeCxsaW4gKTsKICAgIHJldHVybiBsaW47CmRpZmYgLS1naXQgYS9tc2Rvcy9kcG1pLmMgYi9tc2Rvcy9kcG1pLmMKaW5kZXggZWUyMGEzOC4uZWJjZmNhMSAxMDA2NDQKLS0tIGEvbXNkb3MvZHBtaS5jCisrKyBiL21zZG9zL2RwbWkuYwpAQCAtMTI2LDcgKzEyNiw3IEBACiAJCSAqLwogCQlpZiAobmV3c2l6ZTw9bWJpLlJlZ2lvblNpemUpCiAJCQlyZXR1cm4gcHRyOwotCQltZW1jcHkobmV3cHRyLHB0cixuZXdzaXplKTsKKwkJbWVtY3B5KG5ld3B0cixwdHIsbWJpLlJlZ2lvblNpemUpOwogCQlEUE1JX3hmcmVlKHB0cik7CiAJfQogCXJldHVybiBuZXdwdHI7CkBAIC00MTcsNyArNDE3LDcgQEAKIAogICAgIGlmIChOZXdSTUNCKQogICAgIHsKLQlMUFZPSUQgUk1DQm1lbSA9IERPU01FTV9HZXRCbG9jaygyMCwgJnVQYXJhZ3JhcGgpOworCUxQVk9JRCBSTUNCbWVtID0gRE9TTUVNX0dldEJsb2NrKDAsIDIwLCAmdVBhcmFncmFwaCk7CiAJTFBCWVRFIHAgPSBSTUNCbWVtOwogCiAJKnArKyA9IDB4Njg7IC8qIHB1c2hsICovCkBAIC00NjcsNyArNDY3LDcgQEAKIAlQcmV2Uk1DQi0+bmV4dCA9IEN1cnJSTUNCLT5uZXh0OwogCSAgICBlbHNlCiAJRmlyc3RSTUNCID0gQ3VyclJNQ0ItPm5leHQ7Ci0JRE9TTUVNX0ZyZWVCbG9jayhET1NNRU1fTWFwUmVhbFRvTGluZWFyKEN1cnJSTUNCLT5hZGRyZXNzKSk7CisJRE9TTUVNX0ZyZWVCbG9jaygwLCBET1NNRU1fTWFwUmVhbFRvTGluZWFyKEN1cnJSTUNCLT5hZGRyZXNzKSk7CiAJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgQ3VyclJNQ0IpOwogICAgIH0KICAgICBlbHNlCmRpZmYgLS1naXQgYS9tc2Rvcy9pbnQyMS5jIGIvbXNkb3MvaW50MjEuYwppbmRleCBiMzk1OTJmLi42YmI2NTBlIDEwMDY0NAotLS0gYS9tc2Rvcy9pbnQyMS5jCisrKyBiL21zZG9zL2ludDIxLmMKQEAgLTMyLDYgKzMyLDE0IEBACiAjZW5kaWYKIAogCisjZGVmaW5lIERPU19UT19IQU5ETEUoaGFuZGxlKSAoKChoYW5kbGUpPT0wKSA/IEdldFN0ZEhhbmRsZShTVERfSU5QVVRfSEFORExFKSA6IFwKKwkJCSAgICAgICgoaGFuZGxlKT09MSkgPyBHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpIDogXAorCQkJICAgICAgKChoYW5kbGUpPT0yKSA/IEdldFN0ZEhhbmRsZShTVERfRVJST1JfSEFORExFKSA6IFwKKwkJCSAgICAgICAoaGFuZGxlKS01KQorI2RlZmluZSBIQU5ETEVfVE9fRE9TKGhhbmRsZSkgKHsgV09SRCBobmQ9aGFuZGxlOyBcCisJCQkgICAgICAoKGhuZD09SEZJTEVfRVJST1IxNikgPyBIRklMRV9FUlJPUjE2IDogXAorCQkJICAgICAgICBobmQrNSk7IH0pCisKICNkZWZpbmUgRE9TX0dFVF9EUklWRShyZWcpICgocmVnKSA/IChyZWcpIC0gMSA6IERSSVZFX0dldEN1cnJlbnREcml2ZSgpKQogCiAvKiBEZWZpbmUgdGhlIGRyaXZlIHBhcmFtZXRlciBibG9jaywgYXMgdXNlZCBieSBpbnQyMS8xRgpAQCAtOTIsMTAgKzEwMCwxMyBAQAogICAgIHJldHVybiBUUlVFOwogfQogCi1zdGF0aWMgQllURSAqR2V0Q3VycmVudERUQSh2b2lkKQorc3RhdGljIEJZVEUgKkdldEN1cnJlbnREVEEoIENPTlRFWFQgKmNvbnRleHQgKQogewogICAgIFREQiAqcFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBHZXRDdXJyZW50VGFzaygpICk7Ci0gICAgcmV0dXJuIChCWVRFICopUFRSX1NFR19UT19MSU4oIHBUYXNrLT5kdGEgKTsKKworICAgIC8qIEZJWE1FOiBUaGlzIGFzc3VtZXMgRFRBIHdhcyBzZXQgY29ycmVjdGx5ISAqLworICAgIHJldHVybiAoQllURSAqKUNUWF9TRUdfT0ZGX1RPX0xJTiggY29udGV4dCwgU0VMRUNUT1JPRihwVGFzay0+ZHRhKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVRPRihwVGFzay0+ZHRhKSApOwogfQogCiAKQEAgLTIwOSw3ICsyMjAsNyBAQAogCiBzdGF0aWMgdm9pZCBpb2N0bEdldERldmljZUluZm8oIENPTlRFWFQgKmNvbnRleHQgKQogewotICAgIGludCBjdXJyX2RyaXZlLCBpOworICAgIGludCBjdXJyX2RyaXZlOwogICAgIEZJTEVfT0JKRUNUICpmaWxlOwogCiAgICAgVFJBQ0UoaW50MjEsICIoJWQpXG4iLCBCWF9yZWcoY29udGV4dCkpOwpAQCAtMjE3LDcgKzIyOCw3IEBACiAgICAgUkVTRVRfQ0ZMQUcoY29udGV4dCk7CiAKICAgICAvKiBET1MgZGV2aWNlID8gKi8KLSAgICBpZiAoKGZpbGUgPSBGSUxFX0dldEZpbGUoIEJYX3JlZyhjb250ZXh0KSApKSkKKyAgICBpZiAoKGZpbGUgPSBGSUxFX0dldEZpbGUoIERPU19UT19IQU5ETEUoQlhfcmVnKGNvbnRleHQpKSApKSkKICAgICB7CiAgICAgICAgIGNvbnN0IERPU19ERVZJQ0UgKmRldiA9IERPU0ZTX0dldERldmljZSggZmlsZS0+dW5peF9uYW1lICk7CiAgICAgICAgIEZJTEVfUmVsZWFzZUZpbGUoIGZpbGUgKTsKQEAgLTI0Myw3ICsyNTQsNyBAQAogCiBzdGF0aWMgQk9PTDMyIGlvY3RsR2VuZXJpY0Jsa0RldlJlcSggQ09OVEVYVCAqY29udGV4dCApCiB7Ci0JQllURSAqZGF0YXB0ciA9IFBUUl9TRUdfT0ZGX1RPX0xJTihEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSk7CisJQllURSAqZGF0YXB0ciA9IENUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LCBEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSk7CiAJaW50IGRyaXZlID0gRE9TX0dFVF9EUklWRSggQkxfcmVnKGNvbnRleHQpICk7CiAKIAlpZiAoIURSSVZFX0lzVmFsaWQoZHJpdmUpKQpAQCAtMzUzLDE2ICszNjQsMTYgQEAKIH0KIHN0YXRpYyBCT09MMzIgSU5UMjFfQ3JlYXRlRmlsZSggQ09OVEVYVCAqY29udGV4dCApCiB7Ci0gICAgQVhfcmVnKGNvbnRleHQpID0gX2xjcmVhdDE2KCBQVFJfU0VHX09GRl9UT19MSU4oIERTX3JlZyhjb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSApLCBDWF9yZWcoY29udGV4dCkgKTsKKyAgICBBWF9yZWcoY29udGV4dCkgPSBIQU5ETEVfVE9fRE9TKF9sY3JlYXQxNiggQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsICBEU19yZWcoY29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWF9yZWcoY29udGV4dCkgKSwgQ1hfcmVnKGNvbnRleHQpICkpOwogICAgIHJldHVybiAoQVhfcmVnKGNvbnRleHQpID09IChXT1JEKUhGSUxFX0VSUk9SMTYpOwogfQogCiAKIHN0YXRpYyB2b2lkIE9wZW5FeGlzdGluZ0ZpbGUoIENPTlRFWFQgKmNvbnRleHQgKQogewotICAgIEFYX3JlZyhjb250ZXh0KSA9IF9sb3BlbjE2KCBQVFJfU0VHX09GRl9UT19MSU4oRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTF9yZWcoY29udGV4dCkgKTsKKyAgICBBWF9yZWcoY29udGV4dCkgPSBIQU5ETEVfVE9fRE9TKF9sb3BlbjE2KCBDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTF9yZWcoY29udGV4dCkgKSk7CiAgICAgaWYgKEFYX3JlZyhjb250ZXh0KSA9PSAoV09SRClIRklMRV9FUlJPUjE2KQogICAgIHsKICAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gRE9TX0V4dGVuZGVkRXJyb3I7CkBAIC0zODMsNyArMzk0LDcgQEAKIAogCSAgY2FzZSAweDMwOiAgICAvKiBERU5ZUkVBRCAqLwogCSAgICBUUkFDRShpbnQyMSwgIiglcyk6IERFTllSRUFEIGNoYW5nZWQgdG8gREVOWUFMTFxuIiwKLQkJCSAoY2hhciAqKVBUUl9TRUdfT0ZGX1RPX0xJTihEU19yZWcoY29udGV4dCksRFhfcmVnKGNvbnRleHQpKSk7CisJCQkgKGNoYXIgKilDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSkpOwogCSAgY2FzZSAweDEwOiAgICAvKiBERU5ZQUxMICovICAKIAkgICAgbG9jayA9IExPQ0tfRVg7CiAJICAgIGJyZWFrOwpAQCAtNDMxLDcgKzQ0Miw3IEBACiAgICAgICAgIH0KIAogCUVycm9yICgwLDAsMCk7Ci0JQVhfcmVnKGNvbnRleHQpID0gaGFuZGxlOworCUFYX3JlZyhjb250ZXh0KSA9IEhBTkRMRV9UT19ET1MoaGFuZGxlKTsKIAlSRVNFVF9DRkxBRyhjb250ZXh0KTsKICAgICB9CiAjZW5kaWYKQEAgLTQzOSw3ICs0NTAsNyBAQAogCiBzdGF0aWMgdm9pZCBDbG9zZUZpbGUoIENPTlRFWFQgKmNvbnRleHQgKQogewotICAgIGlmICgoQVhfcmVnKGNvbnRleHQpID0gX2xjbG9zZTE2KCBCWF9yZWcoY29udGV4dCkgKSkgIT0gMCkKKyAgICBpZiAoKEFYX3JlZyhjb250ZXh0KSA9IF9sY2xvc2UxNiggRE9TX1RPX0hBTkRMRShCWF9yZWcoY29udGV4dCkpICkpICE9IDApCiAgICAgewogICAgICAgICBBWF9yZWcoY29udGV4dCkgPSBET1NfRXh0ZW5kZWRFcnJvcjsKICAgICAgICAgU0VUX0NGTEFHKGNvbnRleHQpOwpAQCAtNTUwLDcgKzU2MSw3IEBACiBzdGF0aWMgQk9PTDMyIElOVDIxX0NoYW5nZURpciggQ09OVEVYVCAqY29udGV4dCApCiB7CiAgICAgaW50IGRyaXZlOwotICAgIGNoYXIgKmRpcm5hbWUgPSBQVFJfU0VHX09GRl9UT19MSU4oRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSk7CisgICAgY2hhciAqZGlybmFtZSA9IENUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LCBEU19yZWcoY29udGV4dCksRFhfcmVnKGNvbnRleHQpKTsKIAogICAgIFRSQUNFKGludDIxLCJjaGFuZ2VkaXIgJXNcbiIsIGRpcm5hbWUpOwogICAgIGlmIChkaXJuYW1lWzBdICYmIChkaXJuYW1lWzFdID09ICc6JykpCkBAIC01NjgsOSArNTc5LDkgQEAKICAgICBjaGFyICpwOwogICAgIGNvbnN0IGNoYXIgKnBhdGg7CiAgICAgRE9TX0ZVTExfTkFNRSBmdWxsX25hbWU7Ci0gICAgRklOREZJTEVfRFRBICpkdGEgPSAoRklOREZJTEVfRFRBICopR2V0Q3VycmVudERUQSgpOworICAgIEZJTkRGSUxFX0RUQSAqZHRhID0gKEZJTkRGSUxFX0RUQSAqKUdldEN1cnJlbnREVEEoY29udGV4dCk7CiAKLSAgICBwYXRoID0gKGNvbnN0IGNoYXIgKilQVFJfU0VHX09GRl9UT19MSU4oRFNfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkpOworICAgIHBhdGggPSAoY29uc3QgY2hhciAqKUNUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LCBEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSk7CiAgICAgZHRhLT51bml4UGF0aCA9IE5VTEw7CiAgICAgaWYgKCFET1NGU19HZXRGdWxsTmFtZSggcGF0aCwgRkFMU0UsICZmdWxsX25hbWUgKSkKICAgICB7CkBAIC02MDQsNyArNjE1LDcgQEAKIAogc3RhdGljIGludCBJTlQyMV9GaW5kTmV4dCggQ09OVEVYVCAqY29udGV4dCApCiB7Ci0gICAgRklOREZJTEVfRFRBICpkdGEgPSAoRklOREZJTEVfRFRBICopR2V0Q3VycmVudERUQSgpOworICAgIEZJTkRGSUxFX0RUQSAqZHRhID0gKEZJTkRGSUxFX0RUQSAqKUdldEN1cnJlbnREVEEoY29udGV4dCk7CiAgICAgV0lOMzJfRklORF9EQVRBMzJBIGVudHJ5OwogICAgIGludCBjb3VudDsKIApAQCAtNjI5LDYgKzY0MCwxMyBAQAogICAgIEZpbGVUaW1lVG9Eb3NEYXRlVGltZSggJmVudHJ5LmZ0TGFzdFdyaXRlVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdGEtPmZpbGVkYXRlLCAmZHRhLT5maWxldGltZSApOwogICAgIHN0cmNweSggZHRhLT5maWxlbmFtZSwgZW50cnkuY0FsdGVybmF0ZUZpbGVOYW1lICk7CisgICAgaWYgKCFtZW1jaHIoZHRhLT5tYXNrLCc/JywxMSkpIHsKKwkvKiB3aWxkY2FyZGxlc3Mgc2VhcmNoLCByZWxlYXNlIHJlc291cmNlcyBpbiBjYXNlIG5vIGZpbmRuZXh0IHdpbGwKKwkgKiBiZSBpc3N1ZWQsIGFuZCBhcyBhIHdvcmthcm91bmQgaW4gY2FzZSBmaWxlIGNyZWF0aW9uIG1lc3NlcyB1cAorCSAqIGZpbmRuZXh0LCBhcyBzb21ldGltZXMgaGFwcGVucyB3aXRoIHBrdW56aXAgKi8KKyAgICAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGR0YS0+dW5peFBhdGggKTsKKyAgICAgICAgZHRhLT51bml4UGF0aCA9IE5VTEw7CisgICAgfQogICAgIHJldHVybiAxOwogfQogCkBAIC02MzYsNyArNjU0LDcgQEAKIHN0YXRpYyBCT09MMzIgSU5UMjFfQ3JlYXRlVGVtcEZpbGUoIENPTlRFWFQgKmNvbnRleHQgKQogewogICAgIHN0YXRpYyBpbnQgY291bnRlciA9IDA7Ci0gICAgY2hhciAqbmFtZSA9IFBUUl9TRUdfT0ZGX1RPX0xJTiggRFNfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkgKTsKKyAgICBjaGFyICpuYW1lID0gQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsICBEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSApOwogICAgIGNoYXIgKnAgPSBuYW1lICsgc3RybGVuKG5hbWUpOwogCiAgICAgLyogZGVzcGl0ZSB3aGF0IFJhbGYgQnJvd24gc2F5cywgc29tZSBwcm9ncmFtcyBzZWVtIHRvIGNhbGwgd2l0aG91dCAKQEAgLTY0OCw3ICs2NjYsNyBAQAogICAgICAgICBzcHJpbnRmKCBwLCAid2luZSUwNHguJTAzZCIsIChpbnQpZ2V0cGlkKCksIGNvdW50ZXIgKTsKICAgICAgICAgY291bnRlciA9IChjb3VudGVyICsgMSkgJSAxMDAwOwogCi0gICAgICAgIGlmICgoQVhfcmVnKGNvbnRleHQpID0gX2xjcmVhdF91bmlxKCBuYW1lLCAwICkpICE9IChXT1JEKUhGSUxFX0VSUk9SMTYpCisgICAgICAgIGlmICgoQVhfcmVnKGNvbnRleHQpID0gSEFORExFX1RPX0RPUyhfbGNyZWF0X3VuaXEoIG5hbWUsIDAgKSkpICE9IChXT1JEKUhGSUxFX0VSUk9SMTYpCiAgICAgICAgIHsKICAgICAgICAgICAgIFRSQUNFKGludDIxLCAiY3JlYXRlZCAlc1xuIiwgbmFtZSApOwogICAgICAgICAgICAgcmV0dXJuIFRSVUU7CkBAIC02NjEsNyArNjc5LDcgQEAKIHN0YXRpYyBCT09MMzIgSU5UMjFfR2V0Q3VycmVudERpcmVjdG9yeSggQ09OVEVYVCAqY29udGV4dCApIAogewogICAgIGludCBkcml2ZSA9IERPU19HRVRfRFJJVkUoIERMX3JlZyhjb250ZXh0KSApOwotICAgIGNoYXIgKnB0ciA9IChjaGFyICopUFRSX1NFR19PRkZfVE9fTElOKCBEU19yZWcoY29udGV4dCksIFNJX3JlZyhjb250ZXh0KSApOworICAgIGNoYXIgKnB0ciA9IChjaGFyICopQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsICBEU19yZWcoY29udGV4dCksIFNJX3JlZyhjb250ZXh0KSApOwogCiAgICAgaWYgKCFEUklWRV9Jc1ZhbGlkKGRyaXZlKSkKICAgICB7CkBAIC02NzYsNyArNjk0LDcgQEAKIAogc3RhdGljIGludCBJTlQyMV9HZXREaXNrU2VyaWFsTnVtYmVyKCBDT05URVhUICpjb250ZXh0ICkKIHsKLSAgICBCWVRFICpkYXRhcHRyID0gUFRSX1NFR19PRkZfVE9fTElOKERTX3JlZyhjb250ZXh0KSwgRFhfcmVnKGNvbnRleHQpKTsKKyAgICBCWVRFICpkYXRhcHRyID0gQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsIERTX3JlZyhjb250ZXh0KSwgRFhfcmVnKGNvbnRleHQpKTsKICAgICBpbnQgZHJpdmUgPSBET1NfR0VUX0RSSVZFKCBCTF9yZWcoY29udGV4dCkgKTsKIAkKICAgICBpZiAoIURSSVZFX0lzVmFsaWQoZHJpdmUpKQpAQCAtNjk1LDcgKzcxMyw3IEBACiAKIHN0YXRpYyBpbnQgSU5UMjFfU2V0RGlza1NlcmlhbE51bWJlciggQ09OVEVYVCAqY29udGV4dCApCiB7Ci0gICAgQllURSAqZGF0YXB0ciA9IFBUUl9TRUdfT0ZGX1RPX0xJTihEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSk7CisgICAgQllURSAqZGF0YXB0ciA9IENUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LCBEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSk7CiAgICAgaW50IGRyaXZlID0gRE9TX0dFVF9EUklWRSggQkxfcmVnKGNvbnRleHQpICk7CiAKICAgICBpZiAoIURSSVZFX0lzVmFsaWQoZHJpdmUpKQpAQCAtNzE0LDcgKzczMiw3IEBACiAKIHN0YXRpYyBpbnQgSU5UMjFfRmluZEZpcnN0RkNCKCBDT05URVhUICpjb250ZXh0ICkKIHsKLSAgICBCWVRFICpmY2IgPSAoQllURSAqKVBUUl9TRUdfT0ZGX1RPX0xJTihEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSk7CisgICAgQllURSAqZmNiID0gKEJZVEUgKilDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgRFNfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkpOwogICAgIEZJTkRGSUxFX0ZDQiAqcEZDQjsKICAgICBMUENTVFIgcm9vdCwgY3dkOwogICAgIGludCBkcml2ZTsKQEAgLTczNyw5ICs3NTUsOSBAQAogCiBzdGF0aWMgaW50IElOVDIxX0ZpbmROZXh0RkNCKCBDT05URVhUICpjb250ZXh0ICkKIHsKLSAgICBCWVRFICpmY2IgPSAoQllURSAqKVBUUl9TRUdfT0ZGX1RPX0xJTihEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSk7CisgICAgQllURSAqZmNiID0gKEJZVEUgKilDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgRFNfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkpOwogICAgIEZJTkRGSUxFX0ZDQiAqcEZDQjsKLSAgICBET1NfRElSRU5UUllfTEFZT1VUICpwUmVzdWx0ID0gKERPU19ESVJFTlRSWV9MQVlPVVQgKilHZXRDdXJyZW50RFRBKCk7CisgICAgRE9TX0RJUkVOVFJZX0xBWU9VVCAqcFJlc3VsdCA9IChET1NfRElSRU5UUllfTEFZT1VUICopR2V0Q3VycmVudERUQShjb250ZXh0KTsKICAgICBXSU4zMl9GSU5EX0RBVEEzMkEgZW50cnk7CiAgICAgQllURSBhdHRyOwogICAgIGludCBjb3VudDsKQEAgLTgyNiw3ICs4NDQsNyBAQAogCQlCWF9yZWcoY29udGV4dCksCiAJCU1BS0VMT05HKERYX3JlZyhjb250ZXh0KSxDWF9yZWcoY29udGV4dCkpLAogCQlNQUtFTE9ORyhESV9yZWcoY29udGV4dCksU0lfcmVnKGNvbnRleHQpKSkgOwotCSAgaWYgKCFMb2NrRmlsZShCWF9yZWcoY29udGV4dCksCisJICBpZiAoIUxvY2tGaWxlKERPU19UT19IQU5ETEUoQlhfcmVnKGNvbnRleHQpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKERYX3JlZyhjb250ZXh0KSxDWF9yZWcoY29udGV4dCkpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgTUFLRUxPTkcoRElfcmVnKGNvbnRleHQpLFNJX3JlZyhjb250ZXh0KSksIDApKSB7CiAJICAgIEFYX3JlZyhjb250ZXh0KSA9IERPU19FeHRlbmRlZEVycm9yOwpAQCAtODM5LDcgKzg1Nyw3IEBACiAJCUJYX3JlZyhjb250ZXh0KSwKIAkJTUFLRUxPTkcoRFhfcmVnKGNvbnRleHQpLENYX3JlZyhjb250ZXh0KSksCiAJCU1BS0VMT05HKERJX3JlZyhjb250ZXh0KSxTSV9yZWcoY29udGV4dCkpKSA7Ci0JICBpZiAoIVVubG9ja0ZpbGUoQlhfcmVnKGNvbnRleHQpLAorCSAgaWYgKCFVbmxvY2tGaWxlKERPU19UT19IQU5ETEUoQlhfcmVnKGNvbnRleHQpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFLRUxPTkcoRFhfcmVnKGNvbnRleHQpLENYX3JlZyhjb250ZXh0KSksIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKERJX3JlZyhjb250ZXh0KSxTSV9yZWcoY29udGV4dCkpLCAwKSkgewogCSAgICBBWF9yZWcoY29udGV4dCkgPSBET1NfRXh0ZW5kZWRFcnJvcjsKQEAgLTg1OSw3ICs4NzcsNyBAQAogICAgICBzd2l0Y2ggKEFMX3JlZyhjb250ZXh0KSkgewogICAgICBjYXNlIDB4MDA6IC8qIEdldCBtYWNoaW5lIG5hbWUuICovCiAgICAgIHsKLQkgIGNoYXIgKmRzdCA9IFBUUl9TRUdfT0ZGX1RPX0xJTiAoRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSk7CisJICBjaGFyICpkc3QgPSBDVFhfU0VHX09GRl9UT19MSU4gKGNvbnRleHQsRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSk7CiAJICBUUkFDRShpbnQyMSwgImdldHRpbmcgbWFjaGluZSBuYW1lIHRvICVwXG4iLCBkc3QpOwogCSAgaWYgKGdldGhvc3RuYW1lIChkc3QsIDE1KSkKIAkgIHsKQEAgLTk2OSw2ICs5ODcsMTMgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIGlmIChBSF9yZWcoY29udGV4dCkgPT0gMHgwQykgIC8qIEZsdXNoIGJ1ZmZlciBhbmQgcmVhZCBzdGFuZGFyZCBpbnB1dCAqLworICAgIHsKKwlUUkFDRShpbnQyMSwgIkZMVVNIIEJVRkZFUiBBTkQgUkVBRCBTVEFOREFSRCBJTlBVVFxuIik7CisJLyogbm8gZmx1c2ggaGVyZSB5ZXQgKi8KKwlBSF9yZWcoY29udGV4dCkgPSBBTF9yZWcoY29udGV4dCk7CisgICAgfQorCiAgICAgRE9TX0VSUk9SKCAwLCAwLCAwLCAwICk7CiAgICAgUkVTRVRfQ0ZMQUcoY29udGV4dCk7ICAvKiBOb3Qgc3VyZSBpZiB0aGlzIGlzIGEgZ29vZCBpZGVhICovCiAKQEAgLTk4NSwxMiArMTAxMCw4IEBACiAgICAgY2FzZSAweDA0OiAvKiBXUklURSBDSEFSQUNURVIgVE8gU1REQVVYICovCiAgICAgY2FzZSAweDA1OiAvKiBXUklURSBDSEFSQUNURVIgVE8gUFJJTlRFUiAqLwogICAgIGNhc2UgMHgwNjogLyogRElSRUNUIENPTlNPTEUgSU4vT1VUUFVUICovCi0gICAgY2FzZSAweDA3OiAvKiBESVJFQ1QgQ0hBUkFDVEVSIElOUFVULCBXSVRIT1VUIEVDSE8gKi8KLSAgICBjYXNlIDB4MDg6IC8qIENIQVJBQ1RFUiBJTlBVVCBXSVRIT1VUIEVDSE8gKi8KLSAgICBjYXNlIDB4MDk6IC8qIFdSSVRFIFNUUklORyBUTyBTVEFOREFSRCBPVVRQVVQgKi8KICAgICBjYXNlIDB4MGE6IC8qIEJVRkZFUkVEIElOUFVUICovCiAgICAgY2FzZSAweDBiOiAvKiBHRVQgU1RESU4gU1RBVFVTICovCi0gICAgY2FzZSAweDBjOiAvKiBGTFVTSCBCVUZGRVIgQU5EIFJFQUQgU1RBTkRBUkQgSU5QVVQgKi8KICAgICBjYXNlIDB4MGY6IC8qIE9QRU4gRklMRSBVU0lORyBGQ0IgKi8KICAgICBjYXNlIDB4MTA6IC8qIENMT1NFIEZJTEUgVVNJTkcgRkNCICovCiAgICAgY2FzZSAweDE0OiAvKiBTRVFVRU5USUFMIFJFQUQgRlJPTSBGQ0IgRklMRSAqLwkJCkBAIC0xMDA4LDExICsxMDI5LDI5IEBACiAgICAgICAgICAgICAgICAgICAiU1dJVENIQVIiIC0gU0VUIFNXSVRDSCBDSEFSQUNURVIKICAgICAgICAgICAgICAgICAgICJBVkFJTERFViIgLSBTUEVDSUZZIFxERVZcIFBSRUZJWCBVU0UgKi8KICAgICBjYXNlIDB4NTQ6IC8qIEdFVCBWRVJJRlkgRkxBRyAqLwotICAgIGNhc2UgMHg0ODogLyogQUxMT0NBVEUgTUVNT1JZICovCi0gICAgY2FzZSAweDQ5OiAvKiBGUkVFIE1FTU9SWSAqLwotICAgIGNhc2UgMHg0YTogLyogUkVTSVpFIE1FTU9SWSBCTE9DSyAqLwogICAgICAgICBJTlRfQkFSRiggY29udGV4dCwgMHgyMSApOwogICAgICAgICBicmVhazsKKworICAgIGNhc2UgMHgwNzogLyogRElSRUNUIENIQVJBQ1RFUiBJTlBVVCBXSVRIT1VUIEVDSE8gKi8KKyAgICAgICAgVFJBQ0UoaW50MjEsIkRJUkVDVCBDSEFSQUNURVIgSU5QVVQgV0lUSE9VVCBFQ0hPXG4iKTsKKwlfbHJlYWQxNiggRE9TX1RPX0hBTkRMRSgwKSwgJkFMX3JlZyhjb250ZXh0KSwgMSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAweDA4OiAvKiBDSEFSQUNURVIgSU5QVVQgV0lUSE9VVCBFQ0hPICovCisgICAgICAgIFRSQUNFKGludDIxLCJDSEFSQUNURVIgSU5QVVQgV0lUSE9VVCBFQ0hPXG4iKTsKKwlfbHJlYWQxNiggRE9TX1RPX0hBTkRMRSgwKSwgJkFMX3JlZyhjb250ZXh0KSwgMSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAweDA5OiAvKiBXUklURSBTVFJJTkcgVE8gU1RBTkRBUkQgT1VUUFVUICovCisgICAgICAgIFRSQUNFKGludDIxLCJXUklURSAnJCctdGVybWluYXRlZCBzdHJpbmcgZnJvbSAlMDRsWDolMDRYIHRvIHN0ZG91dFxuIiwKKwkgICAgICBEU19yZWcoY29udGV4dCksRFhfcmVnKGNvbnRleHQpICk7CisgICAgICAgIHsKKyAgICAgICAgICAgIExQU1RSIGRhdGEgPSBDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCxEU19yZWcoY29udGV4dCksRFhfcmVnKGNvbnRleHQpKTsKKyAgICAgICAgICAgIExPTkcgbGVuZ3RoID0gc3RyY2hyKGRhdGEsJyQnKS1kYXRhOworICAgICAgICAgICAgX2h3cml0ZTE2KCBET1NfVE9fSEFORExFKDEpLCBkYXRhLCBsZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCiAgICAgY2FzZSAweDJlOiAvKiBTRVQgVkVSSUZZIEZMQUcgKi8KICAgICAgICAgVFJBQ0UoaW50MjEsIlNFVCBWRVJJRlkgRkxBRyBpZ25vcmVkXG4iKTsKICAgICAJLyogd2UgY2Fubm90IGNoYW5nZSB0aGUgYmVoYXZpb3VyIGFueXdheSwgc28ganVzdCBpZ25vcmUgaXQgKi8KQEAgLTEwNDMsNyArMTA4Miw3IEBACiAKICAgICBjYXNlIDB4MTE6IC8qIEZJTkQgRklSU1QgTUFUQ0hJTkcgRklMRSBVU0lORyBGQ0IgKi8KIAlUUkFDRShpbnQyMSwiRklORCBGSVJTVCBNQVRDSElORyBGSUxFIFVTSU5HIEZDQiAlcFxuIiwgCi0JICAgICAgUFRSX1NFR19PRkZfVE9fTElOKERTX3JlZyhjb250ZXh0KSwgRFhfcmVnKGNvbnRleHQpKSk7CisJICAgICAgQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsIERTX3JlZyhjb250ZXh0KSwgRFhfcmVnKGNvbnRleHQpKSk7CiAgICAgICAgIGlmICghSU5UMjFfRmluZEZpcnN0RkNCKGNvbnRleHQpKQogICAgICAgICB7CiAgICAgICAgICAgICBBTF9yZWcoY29udGV4dCkgPSAweGZmOwpAQCAtMTIxMSw2MyArMTI1MCw2NyBAQAogCiAgICAgY2FzZSAweDM5OiAvKiAiTUtESVIiIC0gQ1JFQVRFIFNVQkRJUkVDVE9SWSAqLwogICAgICAgICBUUkFDRShpbnQyMSwiTUtESVIgJXNcbiIsCi0JICAgICAgKExQQ1NUUilQVFJfU0VHX09GRl9UT19MSU4oIERTX3JlZyhjb250ZXh0KSwgRFhfcmVnKGNvbnRleHQpKSk7Ci0gICAgICAgIGJTZXRET1NFeHRlbmRlZEVycm9yID0gKCFDcmVhdGVEaXJlY3RvcnkxNiggUFRSX1NFR19PRkZfVE9fTElOKCBEU19yZWcoY29udGV4dCksCisJICAgICAgKExQQ1NUUilDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgIERTX3JlZyhjb250ZXh0KSwgRFhfcmVnKGNvbnRleHQpKSk7CisgICAgICAgIGJTZXRET1NFeHRlbmRlZEVycm9yID0gKCFDcmVhdGVEaXJlY3RvcnkxNiggQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsICBEU19yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSApLCBOVUxMKSk7CiAgICAgICAgIGJyZWFrOwogCQogICAgIGNhc2UgMHgzYTogLyogIlJNRElSIiAtIFJFTU9WRSBTVUJESVJFQ1RPUlkgKi8KICAgICAgICAgVFJBQ0UoaW50MjEsIlJNRElSICVzXG4iLAotCSAgICAgIChMUENTVFIpUFRSX1NFR19PRkZfVE9fTElOKCBEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSkpOwotICAgICAgICBiU2V0RE9TRXh0ZW5kZWRFcnJvciA9ICghUmVtb3ZlRGlyZWN0b3J5MTYoIFBUUl9TRUdfT0ZGX1RPX0xJTiggRFNfcmVnKGNvbnRleHQpLAorCSAgICAgIChMUENTVFIpQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsICBEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSkpOworICAgICAgICBiU2V0RE9TRXh0ZW5kZWRFcnJvciA9ICghUmVtb3ZlRGlyZWN0b3J5MTYoIENUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LCAgRFNfcmVnKGNvbnRleHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWF9yZWcoY29udGV4dCkgKSkpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHgzYjogLyogIkNIRElSIiAtIFNFVCBDVVJSRU5UIERJUkVDVE9SWSAqLwogICAgICAgICBUUkFDRShpbnQyMSwiQ0hESVIgJXNcbiIsCi0JICAgICAgKExQQ1NUUilQVFJfU0VHX09GRl9UT19MSU4oIERTX3JlZyhjb250ZXh0KSwgRFhfcmVnKGNvbnRleHQpKSk7CisJICAgICAgKExQQ1NUUilDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgIERTX3JlZyhjb250ZXh0KSwgRFhfcmVnKGNvbnRleHQpKSk7CiAgICAgICAgIGJTZXRET1NFeHRlbmRlZEVycm9yID0gIUlOVDIxX0NoYW5nZURpcihjb250ZXh0KTsKICAgICAgICAgYnJlYWs7CiAJCiAgICAgY2FzZSAweDNjOiAvKiAiQ1JFQVQiIC0gQ1JFQVRFIE9SIFRSVU5DQVRFIEZJTEUgKi8KICAgICAgICAgVFJBQ0UoaW50MjEsIkNSRUFUIGZsYWcgMHglMDJ4ICVzXG4iLENYX3JlZyhjb250ZXh0KSwKLQkgICAgICAoTFBDU1RSKVBUUl9TRUdfT0ZGX1RPX0xJTiggRFNfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkpKTsKLSAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gX2xjcmVhdDE2KCBQVFJfU0VHX09GRl9UT19MSU4oIERTX3JlZyhjb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSApLCBDWF9yZWcoY29udGV4dCkgKTsKKwkgICAgICAoTFBDU1RSKUNUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LCAgRFNfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkpKTsKKyAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gSEFORExFX1RPX0RPUyhfbGNyZWF0MTYoIENUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LCAgRFNfcmVnKGNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhfcmVnKGNvbnRleHQpICksIENYX3JlZyhjb250ZXh0KSApKTsKICAgICAgICAgYlNldERPU0V4dGVuZGVkRXJyb3IgPSAoQVhfcmVnKGNvbnRleHQpID09IChXT1JEKUhGSUxFX0VSUk9SMTYpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHgzZDogLyogIk9QRU4iIC0gT1BFTiBFWElTVElORyBGSUxFICovCiAgICAgICAgIFRSQUNFKGludDIxLCJPUEVOIG1vZGUgMHglMDJ4ICVzXG4iLEFMX3JlZyhjb250ZXh0KSwKLQkgICAgICAoTFBDU1RSKVBUUl9TRUdfT0ZGX1RPX0xJTiggRFNfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkpKTsKKwkgICAgICAoTFBDU1RSKUNUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LCAgRFNfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkpKTsKICAgICAgICAgT3BlbkV4aXN0aW5nRmlsZShjb250ZXh0KTsKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4M2U6IC8qICJDTE9TRSIgLSBDTE9TRSBGSUxFICovCiAgICAgICAgIFRSQUNFKGludDIxLCJDTE9TRSBoYW5kbGUgJWRcbiIsQlhfcmVnKGNvbnRleHQpKTsKLSAgICAgICAgYlNldERPU0V4dGVuZGVkRXJyb3IgPSAoKEFYX3JlZyhjb250ZXh0KSA9IF9sY2xvc2UxNiggQlhfcmVnKGNvbnRleHQpICkpICE9IDApOworCWlmIChCWF9yZWcoY29udGV4dCk8NSkgeworCSAgICAvKiBoYWNrIHRvIG1ha2Ugc3VyZSBzdGRpbyBpc24ndCBjbG9zZWQgKi8KKwkgICAgRE9TX0V4dGVuZGVkRXJyb3IgPSAweDA2OworCSAgICBiU2V0RE9TRXh0ZW5kZWRFcnJvciA9IFRSVUU7CisJfSBlbHNlCisgICAgICAgIGJTZXRET1NFeHRlbmRlZEVycm9yID0gKChBWF9yZWcoY29udGV4dCkgPSBfbGNsb3NlMTYoIERPU19UT19IQU5ETEUoQlhfcmVnKGNvbnRleHQpKSApKSAhPSAwKTsKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4M2Y6IC8qICJSRUFEIiAtIFJFQUQgRlJPTSBGSUxFIE9SIERFVklDRSAqLwotICAgICAgICBUUkFDRShpbnQyMSwiUkVBRCBmcm9tICVkIHRvICVsZCBmb3IgJWQgYnl0ZVxuIixCWF9yZWcoY29udGV4dCksCi0JICAgICAgUFRSX1NFR19PRkZfVE9fU0VHUFRSKCBEU19yZWcoY29udGV4dCksRFhfcmVnKGNvbnRleHQpKSxDWF9yZWcoY29udGV4dCkgKTsKKyAgICAgICAgVFJBQ0UoaW50MjEsIlJFQUQgZnJvbSAlZCB0byAlMDRsWDolMDRYIGZvciAlZCBieXRlXG4iLEJYX3JlZyhjb250ZXh0KSwKKwkgICAgICBEU19yZWcoY29udGV4dCksRFhfcmVnKGNvbnRleHQpLENYX3JlZyhjb250ZXh0KSApOwogICAgICAgICB7Ci0gICAgICAgICAgICBMT05HIHJlc3VsdCA9IFdJTjE2X2hyZWFkKCBCWF9yZWcoY29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVFJfU0VHX09GRl9UT19TRUdQVFIoIERTX3JlZyhjb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhfcmVnKGNvbnRleHQpICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWF9yZWcoY29udGV4dCkgKTsKKyAgICAgICAgICAgIExPTkcgcmVzdWx0ID0gX2hyZWFkMTYoIERPU19UT19IQU5ETEUoQlhfcmVnKGNvbnRleHQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LCBEU19yZWcoY29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhfcmVnKGNvbnRleHQpICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWF9yZWcoY29udGV4dCkgKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gLTEpIGJTZXRET1NFeHRlbmRlZEVycm9yID0gVFJVRTsKICAgICAgICAgICAgIGVsc2UgQVhfcmVnKGNvbnRleHQpID0gKFdPUkQpcmVzdWx0OwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDQwOiAvKiAiV1JJVEUiIC0gV1JJVEUgVE8gRklMRSBPUiBERVZJQ0UgKi8KLSAgICAgICAgVFJBQ0UoaW50MjEsIldSSVRFIGZyb20gJWxkIHRvIGhhbmRsZSAlZCBmb3IgJWQgYnl0ZVxuIiwKLQkgICAgICBQVFJfU0VHX09GRl9UT19TRUdQVFIoIERTX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkpLAotCSAgICAgIEJYX3JlZyhjb250ZXh0KSxDWF9yZWcoY29udGV4dCkgKTsKKyAgICAgICAgVFJBQ0UoaW50MjEsIldSSVRFIGZyb20gJTA0bFg6JTA0WCB0byBoYW5kbGUgJWQgZm9yICVkIGJ5dGVcbiIsCisJICAgICAgRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSxCWF9yZWcoY29udGV4dCksQ1hfcmVnKGNvbnRleHQpICk7CiAgICAgICAgIHsKLSAgICAgICAgICAgIExPTkcgcmVzdWx0ID0gX2h3cml0ZTE2KCBCWF9yZWcoY29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRSX1NFR19PRkZfVE9fTElOKCBEU19yZWcoY29udGV4dCksCisgICAgICAgICAgICBMT05HIHJlc3VsdCA9IF9od3JpdGUxNiggRE9TX1RPX0hBTkRMRShCWF9yZWcoY29udGV4dCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LCAgRFNfcmVnKGNvbnRleHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhfcmVnKGNvbnRleHQpICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hfcmVnKGNvbnRleHQpICk7CiAgICAgICAgICAgICBpZiAocmVzdWx0ID09IC0xKSBiU2V0RE9TRXh0ZW5kZWRFcnJvciA9IFRSVUU7CkBAIC0xMjc3LDggKzEzMjAsOCBAQAogCiAgICAgY2FzZSAweDQxOiAvKiAiVU5MSU5LIiAtIERFTEVURSBGSUxFICovCiAgICAgICAgIFRSQUNFKGludDIxLCJVTkxJTkslc1xuIiwKLQkgICAgICAoTFBDU1RSKVBUUl9TRUdfT0ZGX1RPX0xJTiggRFNfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkpKTsKLSAgICAgICAgYlNldERPU0V4dGVuZGVkRXJyb3IgPSAoIURlbGV0ZUZpbGUzMkEoIFBUUl9TRUdfT0ZGX1RPX0xJTiggRFNfcmVnKGNvbnRleHQpLAorCSAgICAgIChMUENTVFIpQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsICBEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSkpOworICAgICAgICBiU2V0RE9TRXh0ZW5kZWRFcnJvciA9ICghRGVsZXRlRmlsZTMyQSggQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsICBEU19yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhfcmVnKGNvbnRleHQpICkpKTsKICAgICAgICAgYnJlYWs7CiAKQEAgLTEyODgsNyArMTMzMSw3IEBACiAJICAgICAgKEFMX3JlZyhjb250ZXh0KT09MCk/InN0YXJ0IG9mIGZpbGUiOihBTF9yZWcoY29udGV4dCk9PTEpPwogCSAgICAgICJjdXJyZW50IGZpbGUgcG9zaXRpb24iOiJlbmQgb2YgZmlsZSIpOwogICAgICAgICB7Ci0gICAgICAgICAgICBMT05HIHN0YXR1cyA9IF9sbHNlZWsxNiggQlhfcmVnKGNvbnRleHQpLAorICAgICAgICAgICAgTE9ORyBzdGF0dXMgPSBfbGxzZWVrMTYoIERPU19UT19IQU5ETEUoQlhfcmVnKGNvbnRleHQpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyhEWF9yZWcoY29udGV4dCksQ1hfcmVnKGNvbnRleHQpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTF9yZWcoY29udGV4dCkgKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gLTEpIGJTZXRET1NFeHRlbmRlZEVycm9yID0gVFJVRTsKQEAgLTEzMDUsOSArMTM0OCw5IEBACiAgICAgICAgIHsKICAgICAgICAgY2FzZSAweDAwOgogICAgICAgICAgICAgVFJBQ0UoaW50MjEsIkdFVCBGSUxFIEFUVFJJQlVURVMgZm9yICVzXG4iLCAKLQkJICAoTFBDU1RSKVBUUl9TRUdfT0ZGX1RPX0xJTiggRFNfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkpKTsKKwkJICAoTFBDU1RSKUNUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LCAgRFNfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkpKTsKICAgICAgICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IChXT1JEKUdldEZpbGVBdHRyaWJ1dGVzMzJBKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRSX1NFR19PRkZfVE9fTElOKERTX3JlZyhjb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LCBEU19yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhfcmVnKGNvbnRleHQpKSk7CiAgICAgICAgICAgICBpZiAoQVhfcmVnKGNvbnRleHQpID09IDB4ZmZmZikgYlNldERPU0V4dGVuZGVkRXJyb3IgPSBUUlVFOwogICAgICAgICAgICAgZWxzZSBDWF9yZWcoY29udGV4dCkgPSBBWF9yZWcoY29udGV4dCk7CkBAIC0xMzE1LDE1ICsxMzU4LDE1IEBACiAKICAgICAgICAgY2FzZSAweDAxOgogICAgICAgICAgICAgVFJBQ0UoaW50MjEsIlNFVCBGSUxFIEFUVFJJQlVURVMgMHglMDJ4IGZvciAlc1xuIiwgQ1hfcmVnKGNvbnRleHQpLAotCQkgIChMUENTVFIpUFRSX1NFR19PRkZfVE9fTElOKCBEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSkpOworCQkgIChMUENTVFIpQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsICBEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSkpOwogICAgICAgICAgICAgYlNldERPU0V4dGVuZGVkRXJyb3IgPSAKLQkJKCFTZXRGaWxlQXR0cmlidXRlczMyQSggUFRSX1NFR19PRkZfVE9fTElOKERTX3JlZyhjb250ZXh0KSwgCisJCSghU2V0RmlsZUF0dHJpYnV0ZXMzMkEoIENUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LCBEU19yZWcoY29udGV4dCksIAogCQkJCQkJCSAgIERYX3JlZyhjb250ZXh0KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkgICBDWF9yZWcoY29udGV4dCkgKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAweDAyOgogICAgICAgICAgICAgVFJBQ0UoaW50MjEsIkdFVCBDT01QUkVTU0VEIEZJTEUgU0laRSBmb3IgJXMgc3R1YlxuIiwKLQkJICAoTFBDU1RSKVBUUl9TRUdfT0ZGX1RPX0xJTiggRFNfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkpKTsKKwkJICAoTFBDU1RSKUNUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LCAgRFNfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkpKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKIAkKQEAgLTEzMzgsMTQgKzEzODEsMTQgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDB4MDI6ewogICAgICAgICAgICBGSUxFX09CSkVDVCAqZmlsZTsKLSAgICAgICAgICAgZmlsZSA9IEZJTEVfR2V0RmlsZShCWF9yZWcoY29udGV4dCkpOworICAgICAgICAgICBmaWxlID0gRklMRV9HZXRGaWxlKERPU19UT19IQU5ETEUoQlhfcmVnKGNvbnRleHQpKSk7CiAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChmaWxlLT51bml4X25hbWUsICJTQ1NJTUdSJCIpKQogICAgICAgICAgICAgICAgICAgICAgICAgQVNQSV9ET1NfSGFuZGxlSW50KGNvbnRleHQpOwogICAgICAgICAgICBGSUxFX1JlbGVhc2VGaWxlKCBmaWxlICk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KIAljYXNlIDB4MDU6ewkvKiBJT0NUTCAtIFdSSVRFIFRPIEJMT0NLIERFVklDRSBDT05UUk9MIENIQU5ORUwgKi8KLQkgICAgLypCWVRFICpkYXRhcHRyID0gUFRSX1NFR19PRkZfVE9fTElOKERTX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkpOyovCisJICAgIC8qQllURSAqZGF0YXB0ciA9IENUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LCBEU19yZWcoY29udGV4dCksRFhfcmVnKGNvbnRleHQpKTsqLwogCSAgICBpbnQJZHJpdmUgPSBET1NfR0VUX0RSSVZFKEJMX3JlZyhjb250ZXh0KSk7CiAKIAkgICAgRklYTUUoaW50MjEsInByb2dyYW0gdHJpZWQgdG8gd3JpdGUgdG8gYmxvY2sgZGV2aWNlIGNvbnRyb2wgY2hhbm5lbCBvZiBkcml2ZSAlZDpcbiIsZHJpdmUpOwpAQCAtMTQ1MCwxMyArMTQ5MywxMyBAQAogCiAgICAgY2FzZSAweDQ1OiAvKiAiRFVQIiAtIERVUExJQ0FURSBGSUxFIEhBTkRMRSAqLwogICAgICAgICBUUkFDRShpbnQyMSwiRFVQIC0gRFVQTElDQVRFIEZJTEUgSEFORExFICVkXG4iLEJYX3JlZyhjb250ZXh0KSk7Ci0gICAgICAgIGJTZXRET1NFeHRlbmRlZEVycm9yID0gKChBWF9yZWcoY29udGV4dCkgPSBGSUxFX0R1cChCWF9yZWcoY29udGV4dCkpKSA9PSAoV09SRClIRklMRV9FUlJPUjE2KTsKKyAgICAgICAgYlNldERPU0V4dGVuZGVkRXJyb3IgPSAoKEFYX3JlZyhjb250ZXh0KSA9IEhBTkRMRV9UT19ET1MoRklMRV9EdXAoRE9TX1RPX0hBTkRMRShCWF9yZWcoY29udGV4dCkpKSkpID09IChXT1JEKUhGSUxFX0VSUk9SMTYpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHg0NjogLyogIkRVUDIiLCAiRk9SQ0VEVVAiIC0gRk9SQ0UgRFVQTElDQVRFIEZJTEUgSEFORExFICovCiAgICAgICAgIFRSQUNFKGludDIxLCJGT1JDRURVUCAtIEZPUkNFIERVUExJQ0FURSBGSUxFIEhBTkRMRSAlZCB0byAlZFxuIiwKIAkgICAgICBCWF9yZWcoY29udGV4dCksQ1hfcmVnKGNvbnRleHQpKTsKLSAgICAgICAgYlNldERPU0V4dGVuZGVkRXJyb3IgPSAoRklMRV9EdXAyKCBCWF9yZWcoY29udGV4dCksIENYX3JlZyhjb250ZXh0KSApID09IEhGSUxFX0VSUk9SMzIpOworICAgICAgICBiU2V0RE9TRXh0ZW5kZWRFcnJvciA9IChGSUxFX0R1cDIoIERPU19UT19IQU5ETEUoQlhfcmVnKGNvbnRleHQpKSwgRE9TX1RPX0hBTkRMRShDWF9yZWcoY29udGV4dCkpICkgPT0gSEZJTEVfRVJST1IzMik7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDQ3OiAvKiAiQ1dEIiAtIEdFVCBDVVJSRU5UIERJUkVDVE9SWSAqLwpAQCAtMTQ2NSwxMCArMTUwOCw0OCBAQAogICAgICAgICBiU2V0RE9TRXh0ZW5kZWRFcnJvciA9ICFJTlQyMV9HZXRDdXJyZW50RGlyZWN0b3J5KGNvbnRleHQpOwogICAgICAgICBicmVhazsKIAorICAgIGNhc2UgMHg0ODogLyogQUxMT0NBVEUgTUVNT1JZICovCisgICAgICAgIFRSQUNFKGludDIxLCJBTExPQ0FURSBNRU1PUlkgZm9yICVkIHBhcmFncmFwaHNcbiIsIEJYX3JlZyhjb250ZXh0KSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIExQVk9JRCAqbWVtID0gRE9TTUVNX0dldEJsb2NrKDAsQlhfcmVnKGNvbnRleHQpPDw0LE5VTEwpOworICAgICAgICAgICAgaWYgKG1lbSkKKyAgICAgICAgICAgICAgICBBWF9yZWcoY29udGV4dCkgPSBET1NNRU1fTWFwTGluZWFyVG9Eb3MobWVtKT4+NDsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKKyAgICAgICAgICAgICAgICBBWF9yZWcoY29udGV4dCkgPSAweDAwMDg7IC8qIGluc3VmZmljaWVudCBtZW1vcnkgKi8KKyAgICAgICAgICAgICAgICBCWF9yZWcoY29udGV4dCkgPSBET1NNRU1fQXZhaWxhYmxlKDApPj40OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAweDQ5OiAvKiBGUkVFIE1FTU9SWSAqLworICAgICAgICBUUkFDRShpbnQyMSwiRlJFRSBNRU1PUlkgc2VnbWVudCAlMDRsWFxuIiwgRVNfcmVnKGNvbnRleHQpKTsKKyAgICAgICAgaWYgKCFET1NNRU1fRnJlZUJsb2NrKDAsRE9TTUVNX01hcERvc1RvTGluZWFyKEVTX3JlZyhjb250ZXh0KTw8NCkpKQorICAgICAgICB7CisgICAgICAgICAgICBTRVRfQ0ZMQUcoY29udGV4dCk7CisgICAgICAgICAgICBBWF9yZWcoY29udGV4dCkgPSAweDAwMDk7IC8qIG1lbW9yeSBibG9jayBhZGRyZXNzIGludmFsaWQgKi8KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgMHg0YTogLyogUkVTSVpFIE1FTU9SWSBCTE9DSyAqLworICAgICAgICBUUkFDRShpbnQyMSwiUkVTSVpFIE1FTU9SWSBzZWdtZW50ICUwNGxYIHRvICVkIHBhcmFncmFwaHNcbiIsIEVTX3JlZyhjb250ZXh0KSwgQlhfcmVnKGNvbnRleHQpKTsKKwl7CisJICAgIExQVk9JRCAqbWVtID0gRE9TTUVNX1Jlc2l6ZUJsb2NrKDAsRE9TTUVNX01hcERvc1RvTGluZWFyKEVTX3JlZyhjb250ZXh0KTw8NCksCisJCQkJCSAgICAgICBCWF9yZWcoY29udGV4dCk8PDQsTlVMTCk7CisJICAgIGlmIChtZW0pCisJCUFYX3JlZyhjb250ZXh0KSA9IERPU01FTV9NYXBMaW5lYXJUb0RvcyhtZW0pPj40OworCSAgICBlbHNlIHsKKwkJU0VUX0NGTEFHKGNvbnRleHQpOworCQlBWF9yZWcoY29udGV4dCkgPSAweDAwMDg7IC8qIGluc3VmZmljaWVudCBtZW1vcnkgKi8KKwkJQlhfcmVnKGNvbnRleHQpID0gRE9TTUVNX0F2YWlsYWJsZSgwKT4+NDsgLyogbm90IHF1aXRlIHJpZ2h0ICovCisJICAgIH0KKwl9CisgICAgICAgIGJyZWFrOworCiAgICAgY2FzZSAweDRiOiAvKiAiRVhFQyIgLSBMT0FEIEFORC9PUiBFWEVDVVRFIFBST0dSQU0gKi8KICAgICAgICAgVFJBQ0UoaW50MjEsIkVYRUMgJXNcbiIsCi0JICAgICAgKExQQ1NUUilQVFJfU0VHX09GRl9UT19MSU4oIERTX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkgKSk7Ci0gICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IFdpbkV4ZWMxNiggUFRSX1NFR19PRkZfVE9fTElOKCBEU19yZWcoY29udGV4dCksCisJICAgICAgKExQQ1NUUilDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgIERTX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkgKSk7CisgICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IFdpbkV4ZWMxNiggQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsICBEU19yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWF9yZWcoY29udGV4dCkgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV19OT1JNQUwgKTsKICAgICAgICAgaWYgKEFYX3JlZyhjb250ZXh0KSA8IDMyKSBTRVRfQ0ZMQUcoY29udGV4dCk7CkBAIC0xNDg2LDcgKzE1NjcsNyBAQAogCiAgICAgY2FzZSAweDRlOiAvKiAiRklOREZJUlNUIiAtIEZJTkQgRklSU1QgTUFUQ0hJTkcgRklMRSAqLwogICAgICAgICBUUkFDRShpbnQyMSwiRklOREZJUlNUIG1hc2sgMHglMDR4IHNwZWMgJXNcbiIsQ1hfcmVnKGNvbnRleHQpLAotCSAgICAgIChMUENTVFIpUFRSX1NFR19PRkZfVE9fTElOKCBEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSkpOworCSAgICAgIChMUENTVFIpQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsICBEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSkpOwogICAgICAgICBpZiAoIUlOVDIxX0ZpbmRGaXJzdChjb250ZXh0KSkgYnJlYWs7CiAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogCkBAIC0xNTI2LDExICsxNjA3LDExIEBACiAKICAgICBjYXNlIDB4NTY6IC8qICJSRU5BTUUiIC0gUkVOQU1FIEZJTEUgKi8KICAgICAgICAgVFJBQ0UoaW50MjEsIlJFTkFNRSAlcyB0byAlc1xuIiwKLQkgICAgICAoTFBDU1RSKVBUUl9TRUdfT0ZGX1RPX0xJTihEU19yZWcoY29udGV4dCksRFhfcmVnKGNvbnRleHQpKSwKLQkgICAgICAoTFBDU1RSKVBUUl9TRUdfT0ZGX1RPX0xJTihFU19yZWcoY29udGV4dCksRElfcmVnKGNvbnRleHQpKSk7CisJICAgICAgKExQQ1NUUilDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSksCisJICAgICAgKExQQ1NUUilDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgRVNfcmVnKGNvbnRleHQpLERJX3JlZyhjb250ZXh0KSkpOwogICAgICAgICBiU2V0RE9TRXh0ZW5kZWRFcnJvciA9IAotCQkoIU1vdmVGaWxlMzJBKCBQVFJfU0VHX09GRl9UT19MSU4oRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSksCi0JCQkgICAgICAgUFRSX1NFR19PRkZfVE9fTElOKEVTX3JlZyhjb250ZXh0KSxESV9yZWcoY29udGV4dCkpKSk7CisJCSghTW92ZUZpbGUzMkEoIENUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LCBEU19yZWcoY29udGV4dCksRFhfcmVnKGNvbnRleHQpKSwKKwkJCSAgICAgICBDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgRVNfcmVnKGNvbnRleHQpLERJX3JlZyhjb250ZXh0KSkpKTsKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4NTc6IC8qIEZJTEUgREFURSBBTkQgVElNRSAqLwpAQCAtMTU4Nyw5ICsxNjY4LDkgQEAKIAogICAgIGNhc2UgMHg1YjogLyogQ1JFQVRFIE5FVyBGSUxFICovCiAgICAgICAgIFRSQUNFKGludDIxLCJDUkVBVEUgTkVXIEZJTEUgMHglMDJ4IGZvciAlc1xuIiwgQ1hfcmVnKGNvbnRleHQpLAotCSAgICAgIChMUENTVFIpUFRSX1NFR19PRkZfVE9fTElOKCBEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSkpOworCSAgICAgIChMUENTVFIpQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsICBEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSkpOwogICAgICAgICBiU2V0RE9TRXh0ZW5kZWRFcnJvciA9ICgoQVhfcmVnKGNvbnRleHQpID0gCi0JCV9sY3JlYXRfdW5pcSggUFRSX1NFR19PRkZfVE9fTElOKERTX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkpLCAwICkpIAorCQlIQU5ETEVfVE9fRE9TKF9sY3JlYXRfdW5pcSggQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsIERTX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkpLCAwICkpKSAKIAkJCQkJCQkJPT0gKFdPUkQpSEZJTEVfRVJST1IxNik7CiAgICAgICAgIGJyZWFrOwogCkBAIC0xNjM2LDExICsxNzE3LDExIEBACiAKICAgICBjYXNlIDB4NjA6IC8qICJUUlVFTkFNRSIgLSBDQU5PTklDQUxJWkUgRklMRU5BTUUgT1IgUEFUSCAqLwogICAgICAgICBUUkFDRShpbnQyMSwiVFJVRU5BTUUgJXNcbiIsCi0JICAgICAgKExQQ1NUUilQVFJfU0VHX09GRl9UT19MSU4oRFNfcmVnKGNvbnRleHQpLFNJX3JlZyhjb250ZXh0KSkpOworCSAgICAgIChMUENTVFIpQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsIERTX3JlZyhjb250ZXh0KSxTSV9yZWcoY29udGV4dCkpKTsKICAgICAgICAgewotICAgICAgICAgICAgaWYgKCFHZXRGdWxsUGF0aE5hbWUzMkEoIFBUUl9TRUdfT0ZGX1RPX0xJTihEU19yZWcoY29udGV4dCksCisgICAgICAgICAgICBpZiAoIUdldEZ1bGxQYXRoTmFtZTMyQSggQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsIERTX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lfcmVnKGNvbnRleHQpKSwgMTI4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUUl9TRUdfT0ZGX1RPX0xJTihFU19yZWcoY29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsIEVTX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElfcmVnKGNvbnRleHQpKSxOVUxMKSkKIAkJYlNldERPU0V4dGVuZGVkRXJyb3IgPSBUUlVFOwogICAgICAgICAgICAgZWxzZSBBWF9yZWcoY29udGV4dCkgPSAwOwpAQCAtMTY1Niw3ICsxNzM3LDcgQEAKIAogICAgIGNhc2UgMHg2NTp7LyogR0VUIEVYVEVOREVEIENPVU5UUlkgSU5GT1JNQVRJT04gKi8KICAgICAJZXh0ZXJuIFdPUkQgV0lORV9MYW5ndWFnZUlkOwotCUJZVEUgICAgKmRhdGFwdHI9UFRSX1NFR19PRkZfVE9fTElOKEVTX3JlZyhjb250ZXh0KSxESV9yZWcoY29udGV4dCkpOworCUJZVEUgICAgKmRhdGFwdHI9Q1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsIEVTX3JlZyhjb250ZXh0KSxESV9yZWcoY29udGV4dCkpOwogCVRSQUNFKGludDIxLCJHRVQgRVhURU5ERUQgQ09VTlRSWSBJTkZPUk1BVElPTiBjb2RlIHBhZ2UgJWQgY291bnRyeSAlZFxuIiwKIAkgICAgICBCWF9yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSk7CiAgICAgCXN3aXRjaCAoQUxfcmVnKGNvbnRleHQpKSB7CkBAIC0xNzA4LDcgKzE3ODksNyBAQAogICAgIGNhc2UgMHg2ODogLyogIkZGTFVTSCIgLSBDT01NSVQgRklMRSAqLwogICAgIGNhc2UgMHg2YTogLyogQ09NTUlUIEZJTEUgKi8KICAgICAgICAgVFJBQ0UoaW50MjEsIkZGTFVTSC9DT01NSVQgaGFuZGxlICVkXG4iLEJYX3JlZyhjb250ZXh0KSk7Ci0gICAgICAgIGJTZXRET1NFeHRlbmRlZEVycm9yID0gKCFGbHVzaEZpbGVCdWZmZXJzKCBCWF9yZWcoY29udGV4dCkgKSk7CisgICAgICAgIGJTZXRET1NFeHRlbmRlZEVycm9yID0gKCFGbHVzaEZpbGVCdWZmZXJzKCBET1NfVE9fSEFORExFKEJYX3JlZyhjb250ZXh0KSkgKSk7CiAgICAgICAgIGJyZWFrOwkJCiAJCiAgICAgY2FzZSAweDY5OiAvKiBESVNLIFNFUklBTCBOVU1CRVIgKi8KQEAgLTE3MzIsNDMgKzE4MTMsNDkgQEAKICAgICAKICAgICBjYXNlIDB4NkM6IC8qIEV4dGVuZGVkIE9wZW4vQ3JlYXRlKi8KICAgICAgICAgVFJBQ0UoaW50MjEsIkVYVEVOREVEIE9QRU4vQ1JFQVRFICVzXG4iLAotCSAgICAgIChMUENTVFIpUFRSX1NFR19PRkZfVE9fTElOKCBEU19yZWcoY29udGV4dCksIERJX3JlZyhjb250ZXh0KSkpOworCSAgICAgIChMUENTVFIpQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsICBEU19yZWcoY29udGV4dCksIERJX3JlZyhjb250ZXh0KSkpOwogICAgICAgICBiU2V0RE9TRXh0ZW5kZWRFcnJvciA9IElOVDIxX0V4dGVuZGVkT3BlbkNyZWF0ZUZpbGUoY29udGV4dCk7CiAgICAgICAgIGJyZWFrOwogCQogICAgIGNhc2UgMHg3MTogLyogTVMtRE9TIDcgKFdpbmRvd3M5NSkgLSBMT05HIEZJTEVOQU1FIEZVTkNUSU9OUyAqLworCWlmICgoR2V0VmVyc2lvbjMyKCkmMHhDMDAwMDAwNCkhPTB4QzAwMDAwMDQpIHsKKwkgICAgLyogbm90IHN1cHBvcnRlZCBvbiBhbnl0aGluZyBidXQgV2luOTUgKi8KKwkgICAgVFJBQ0UoaW50MjEsIkxPTkcgRklMRU5BTUUgZnVuY3Rpb25zIHN1cHBvcnRlZCBvbmx5IGJ5IHdpbjk1XG4iKTsKKwkgICAgU0VUX0NGTEFHKGNvbnRleHQpOworCSAgICBBTF9yZWcoY29udGV4dCkgPSAwOworCX0gZWxzZQogICAgICAgICBzd2l0Y2goQUxfcmVnKGNvbnRleHQpKQogICAgICAgICB7CiAgICAgICAgIGNhc2UgMHgzOTogIC8qIENyZWF0ZSBkaXJlY3RvcnkgKi8KIAkgICAgVFJBQ0UoaW50MjEsIkxPTkcgRklMRU5BTUUgLSBNQUtFIERJUkVDVE9SWSAlc1xuIiwKLQkJICAoTFBDU1RSKVBUUl9TRUdfT0ZGX1RPX0xJTiggRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSkpOworCQkgIChMUENTVFIpQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsICBEU19yZWcoY29udGV4dCksRFhfcmVnKGNvbnRleHQpKSk7CiAgICAgICAgICAgICBiU2V0RE9TRXh0ZW5kZWRFcnJvciA9ICghQ3JlYXRlRGlyZWN0b3J5MzJBKCAKLQkJCQkJUFRSX1NFR19PRkZfVE9fTElOKCBEU19yZWcoY29udGV4dCksCisJCQkJCUNUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LCAgRFNfcmVnKGNvbnRleHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWF9yZWcoY29udGV4dCkgKSwgTlVMTCkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMHgzYTogIC8qIFJlbW92ZSBkaXJlY3RvcnkgKi8KIAkgICAgVFJBQ0UoaW50MjEsIkxPTkcgRklMRU5BTUUgLSBSRU1PVkUgRElSRUNUT1JZICVzXG4iLAotCQkgIChMUENTVFIpUFRSX1NFR19PRkZfVE9fTElOKCBEU19yZWcoY29udGV4dCksRFhfcmVnKGNvbnRleHQpKSk7CisJCSAgKExQQ1NUUilDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgIERTX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkpKTsKICAgICAgICAgICAgIGJTZXRET1NFeHRlbmRlZEVycm9yID0gKCFSZW1vdmVEaXJlY3RvcnkzMkEoIAotCQkJCQlQVFJfU0VHX09GRl9UT19MSU4oIERTX3JlZyhjb250ZXh0KSwKKwkJCQkJQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsICBEU19yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSApKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAweDQzOiAgLyogR2V0L1NldCBmaWxlIGF0dHJpYnV0ZXMgKi8KIAkgIFRSQUNFKGludDIxLCJMT05HIEZJTEVOQU1FIC1FWFRFTkRFRCBHRVQvU0VUIEZJTEUgQVRUUklCVVRFUyAlc1xuIiwKLQkJKExQQ1NUUilQVFJfU0VHX09GRl9UT19MSU4oIERTX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkpKTsKKwkJKExQQ1NUUilDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgIERTX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkpKTsKICAgICAgICAgc3dpdGNoIChCTF9yZWcoY29udGV4dCkpCiAgICAgICAgIHsKICAgICAgICAgY2FzZSAweDAwOiAvKiBHZXQgZmlsZSBhdHRyaWJ1dGVzICovCiAgICAgICAgICAgICBUUkFDRShpbnQyMSwiXHRyZXRyaWV2ZSBhdHRyaWJ1dGVzXG4iKTsKICAgICAgICAgICAgIENYX3JlZyhjb250ZXh0KSA9IChXT1JEKUdldEZpbGVBdHRyaWJ1dGVzMzJBKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRSX1NFR19PRkZfVE9fTElOKERTX3JlZyhjb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LCBEU19yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhfcmVnKGNvbnRleHQpKSk7CiAgICAgICAgICAgICBpZiAoQ1hfcmVnKGNvbnRleHQpID09IDB4ZmZmZikgYlNldERPU0V4dGVuZGVkRXJyb3IgPSBUUlVFOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMHgwMToKICAgICAgICAgICAgIFRSQUNFKGludDIxLCJcdHNldCBhdHRyaWJ1dGVzIDB4JTA0eFxuIixDWF9yZWcoY29udGV4dCkpOwogICAgICAgICAgICAgYlNldERPU0V4dGVuZGVkRXJyb3IgPSAoIVNldEZpbGVBdHRyaWJ1dGVzMzJBKCAKLQkJCQkgIAlQVFJfU0VHX09GRl9UT19MSU4oRFNfcmVnKGNvbnRleHQpLAorCQkJCSAgCUNUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LCBEU19yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hfcmVnKGNvbnRleHQpICApICk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTE3ODgsMTEgKzE4NzUsMTEgQEAKIAogICAgICAgICBjYXNlIDB4NGU6ICAvKiBGaW5kIGZpcnN0IGZpbGUgKi8KIAkgICAgVFJBQ0UoaW50MjEsIiBMT05HIEZJTEVOQU1FIC0gRklORCBGSVJTVCBNQVRDSElORyBGSUxFIGZvciAlc1xuIiwKLQkJICAoTFBDU1RSKVBUUl9TRUdfT0ZGX1RPX0xJTihEU19yZWcoY29udGV4dCksRFhfcmVnKGNvbnRleHQpKSk7CisJCSAgKExQQ1NUUilDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSkpOwogICAgICAgICAgICAgLyogRklYTUU6IHVzZSBhdHRyaWJ1dGVzIGluIENYICovCiAgICAgICAgICAgICBpZiAoKEFYX3JlZyhjb250ZXh0KSA9IEZpbmRGaXJzdEZpbGUxNigKLSAgICAgICAgICAgICAgICAgICBQVFJfU0VHX09GRl9UT19MSU4oRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSksCi0gICAgICAgICAgICAgICAgICAgKFdJTjMyX0ZJTkRfREFUQTMyQSAqKVBUUl9TRUdfT0ZGX1RPX0xJTihFU19yZWcoY29udGV4dCksCisgICAgICAgICAgICAgICAgICAgQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsIERTX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkpLAorICAgICAgICAgICAgICAgICAgIChXSU4zMl9GSU5EX0RBVEEzMkEgKilDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgRVNfcmVnKGNvbnRleHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElfcmVnKGNvbnRleHQpKSkpCiAJCT09IElOVkFMSURfSEFORExFX1ZBTFVFMTYpCiAJCWJTZXRET1NFeHRlbmRlZEVycm9yID0gVFJVRTsKQEAgLTE4MDEsNyArMTg4OCw3IEBACiAJICAgIFRSQUNFKGludDIxLCJMT05HIEZJTEVOQU1FIC0gRklORCBORVhUIE1BVENISU5HIEZJTEUgZm9yIGhhbmRsZSAlZFxuIiwKIAkJICBCWF9yZWcoY29udGV4dCkpOwogICAgICAgICAgICAgaWYgKCFGaW5kTmV4dEZpbGUxNiggQlhfcmVnKGNvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICAoV0lOMzJfRklORF9EQVRBMzJBICopUFRSX1NFR19PRkZfVE9fTElOKEVTX3JlZyhjb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgKFdJTjMyX0ZJTkRfREFUQTMyQSAqKUNUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LCBFU19yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElfcmVnKGNvbnRleHQpKSkpCiAJCWJTZXRET1NFeHRlbmRlZEVycm9yID0gVFJVRTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTgxMiwxNiArMTg5OSwyNSBAQAogICAgICAgICAgICAgYnJlYWs7CiAJY2FzZSAweGEwOgogCSAgICBUUkFDRShpbnQyMSwiTE9ORyBGSUxFTkFNRSAtIEdFVCBWT0xVTUUgSU5GT1JNQVRJT04gZm9yIGRyaXZlICVzIHN0dWJcbiIsCi0JCSAgKExQQ1NUUilQVFJfU0VHX09GRl9UT19MSU4oIERTX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkpKTsKKwkJICAoTFBDU1RSKUNUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LCAgRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSkpOwogCSAgICBicmVhazsKICAgICAgICAgY2FzZSAweDYwOiAgCiAJICBzd2l0Y2goQ0xfcmVnKGNvbnRleHQpKQogCSAgeworCSAgICBjYXNlIDB4MDE6ICAvKkdldCBzaG9ydCBmaWxlbmFtZSBvciBwYXRoICovCisJICAgICAgaWYgKCFHZXRTaG9ydFBhdGhOYW1lMzJBCisJCSAgKCBDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgRFNfcmVnKGNvbnRleHQpLAorCQkJCSAgICAgICBTSV9yZWcoY29udGV4dCkpLAorCQkgICAgQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsIEVTX3JlZyhjb250ZXh0KSwKKwkJCQkgICAgICAgRElfcmVnKGNvbnRleHQpKSwgNjcpKQorCQliU2V0RE9TRXh0ZW5kZWRFcnJvciA9IFRSVUU7CisJICAgICAgZWxzZSBBWF9yZWcoY29udGV4dCkgPSAwOworCSAgICAgIGJyZWFrOwogCSAgICBjYXNlIDB4MDI6ICAvKkdldCBjYW5vbmljYWwgbG9uZyBmaWxlbmFtZSBvciBwYXRoICovCiAJICAgICAgaWYgKCFHZXRGdWxsUGF0aE5hbWUzMkEKLQkJICAoIFBUUl9TRUdfT0ZGX1RPX0xJTihEU19yZWcoY29udGV4dCksCisJCSAgKCBDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgRFNfcmVnKGNvbnRleHQpLAogCQkJCSAgICAgICBTSV9yZWcoY29udGV4dCkpLCAxMjgsCi0JCSAgICBQVFJfU0VHX09GRl9UT19MSU4oRVNfcmVnKGNvbnRleHQpLAorCQkgICAgQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsIEVTX3JlZyhjb250ZXh0KSwKIAkJCQkgICAgICAgRElfcmVnKGNvbnRleHQpKSxOVUxMKSkKIAkJYlNldERPU0V4dGVuZGVkRXJyb3IgPSBUUlVFOwogCSAgICAgIGVsc2UgQVhfcmVnKGNvbnRleHQpID0gMDsKQEAgLTE4MzYsMTUgKzE5MzIsMTUgQEAKIAkgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMHg2YzogIC8qIENyZWF0ZSBvciBvcGVuIGZpbGUgKi8KICAgICAgICAgICAgIFRSQUNFKGludDIxLCJMT05HIEZJTEVOQU1FIC0gQ1JFQVRFIE9SIE9QRU4gRklMRSAlc1xuIiwKLQkJIChMUENTVFIpUFRSX1NFR19PRkZfVE9fTElOKCBEU19yZWcoY29udGV4dCksIFNJX3JlZyhjb250ZXh0KSkpOyAKKwkJIChMUENTVFIpQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsICBEU19yZWcoY29udGV4dCksIFNJX3JlZyhjb250ZXh0KSkpOyAKIAkgIC8qIHRyYW5zbGF0ZSBEb3MgNyBhY3Rpb24gdG8gRG9zIDYgYWN0aW9uICovCiAJICAgIGJTZXRET1NFeHRlbmRlZEVycm9yID0gSU5UMjFfRXh0ZW5kZWRPcGVuQ3JlYXRlRmlsZShjb250ZXh0KTsKIAkgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAweDNiOiAgLyogQ2hhbmdlIGRpcmVjdG9yeSAqLwogICAgICAgICAgICAgVFJBQ0UoaW50MjEsIkxPTkcgRklMRU5BTUUgLSBDSEFOR0UgRElSRUNUT1JZICVzXG4iLAotCQkgKExQQ1NUUilQVFJfU0VHX09GRl9UT19MSU4oIERTX3JlZyhjb250ZXh0KSwgRFhfcmVnKGNvbnRleHQpKSk7IAotCSAgICBpZiAoIVNldEN1cnJlbnREaXJlY3RvcnkzMkEoUFRSX1NFR19PRkZfVE9fTElOKAorCQkgKExQQ1NUUilDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgIERTX3JlZyhjb250ZXh0KSwgRFhfcmVnKGNvbnRleHQpKSk7IAorCSAgICBpZiAoIVNldEN1cnJlbnREaXJlY3RvcnkzMkEoQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsIAogCSAgICAJCQkJCURTX3JlZyhjb250ZXh0KSwKIAkJCQkgICAgICAgIAlEWF9yZWcoY29udGV4dCkKIAkJCQkJKSkKQEAgLTE4NTUsOCArMTk1MSw4IEBACiAJICAgIGJyZWFrOwogICAgICAgICBjYXNlIDB4NDE6ICAvKiBEZWxldGUgZmlsZSAqLwogICAgICAgICAgICAgVFJBQ0UoaW50MjEsIkxPTkcgRklMRU5BTUUgLSBERUxFVEUgRklMRSAlc1xuIiwKLQkJIChMUENTVFIpUFRSX1NFR19PRkZfVE9fTElOKCBEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSkpOyAKLQkgICAgaWYgKCFEZWxldGVGaWxlMzJBKFBUUl9TRUdfT0ZGX1RPX0xJTigKKwkJIChMUENTVFIpQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsICBEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSkpOyAKKwkgICAgaWYgKCFEZWxldGVGaWxlMzJBKENUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LCAKIAkgICAgCQkJCURTX3JlZyhjb250ZXh0KSwKIAkJCQkJRFhfcmVnKGNvbnRleHQpKQogCSAgICApKSB7CkBAIC0xODY2LDggKzE5NjIsOCBAQAogCSAgICBicmVhazsKICAgICAgICAgY2FzZSAweDU2OiAgLyogTW92ZSAocmVuYW1lKSBmaWxlICovCiAgICAgICAgICAgICBUUkFDRShpbnQyMSwiTE9ORyBGSUxFTkFNRSAtIFJFTkFNRSBGSUxFICVzIHRvICVzIHN0dWJcbiIsCi0JCSAgKExQQ1NUUilQVFJfU0VHX09GRl9UT19MSU4oIERTX3JlZyhjb250ZXh0KSwgRFhfcmVnKGNvbnRleHQpKSwKLQkJICAoTFBDU1RSKVBUUl9TRUdfT0ZGX1RPX0xJTiggRVNfcmVnKGNvbnRleHQpLCBESV9yZWcoY29udGV4dCkpKTsgCisJCSAgKExQQ1NUUilDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgIERTX3JlZyhjb250ZXh0KSwgRFhfcmVnKGNvbnRleHQpKSwKKwkJICAoTFBDU1RSKUNUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LCAgRVNfcmVnKGNvbnRleHQpLCBESV9yZWcoY29udGV4dCkpKTsgCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBGSVhNRShpbnQyMSwgIlVuaW1wbGVtZW50ZWQgbG9uZyBmaWxlIG5hbWUgZnVuY3Rpb246XG4iKTsKICAgICAgICAgICAgIElOVF9CQVJGKCBjb250ZXh0LCAweDIxICk7CmRpZmYgLS1naXQgYS9tc2Rvcy92eGQuYyBiL21zZG9zL3Z4ZC5jCmluZGV4IDE4NmJkYjMuLjNmMDhhYzggMTAwNjQ0Ci0tLSBhL21zZG9zL3Z4ZC5jCisrKyBiL21zZG9zL3Z4ZC5jCkBAIC05MjQsNyArOTI0LDcgQEAKICAgICAgICAgVFJBQ0UodnhkLCAiTnREdXBTZWN0aW9uKCVseClcbiIsIChEV09SRCloYW5kbGUpOwogIAogICAgICAgICAvKiBIYW5kbGUgaXMgJ2R1cGxpY2F0ZWQnIGJ5IGluY3JlbWVudGluZyBSZWZDb3VudCAqLwotICAgICAgICBIQU5ETEVfR2V0T2JqUHRyKFBST0NFU1NfQ3VycmVudCgpLCBoYW5kbGUsIEszMk9CSl9NRU1fTUFQUEVEX0ZJTEUsIDApOworICAgICAgICBIQU5ETEVfR2V0T2JqUHRyKFBST0NFU1NfQ3VycmVudCgpLCBoYW5kbGUsIEszMk9CSl9NRU1fTUFQUEVEX0ZJTEUsIDAsTlVMTCk7CiAKICAgICAgICAgRUFYX3JlZyhjb250ZXh0KSA9IFNUQVRVU19TVUNDRVNTOwogICAgIH0KZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvTWFrZWZpbGUuaW4gYi9tdWx0aW1lZGlhL01ha2VmaWxlLmluCmluZGV4IDM0N2IwZDYuLjg3NjJkMjUgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvTWFrZWZpbGUuaW4KKysrIGIvbXVsdGltZWRpYS9NYWtlZmlsZS5pbgpAQCAtMTksNiArMTksNyBAQAogCW1tYXV4LmMgXAogCW1taW8uYyBcCiAJbW1zeXN0ZW0uYyBcCisJbXN2aWRlby5jIFwKIAl0aW1lLmMKIAogYWxsOiAkKE1PRFVMRSkubwpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9hdWRpby5jIGIvbXVsdGltZWRpYS9hdWRpby5jCmluZGV4IDdhZTAyNTEuLjA3Y2ZjMTMgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvYXVkaW8uYworKysgYi9tdWx0aW1lZGlhL2F1ZGlvLmMKQEAgLTExOTUsNyArMTE5NSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQl3b2RNZXNzYWdlCQkJW3NhbXBsZSBkcml2ZXJdCiAgKi8KLURXT1JEIHdvZE1lc3NhZ2UoV09SRCB3RGV2SUQsIFdPUkQgd01zZywgRFdPUkQgZHdVc2VyLCAKK0RXT1JEIFdJTkFQSSB3b2RNZXNzYWdlKFdPUkQgd0RldklELCBXT1JEIHdNc2csIERXT1JEIGR3VXNlciwgCiAJCQkJCURXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKIHsKICAgaW50IGF1ZGlvOwpAQCAtMTY2MCw3ICsxNjYwLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCXdpZE1lc3NhZ2UJCQlbc2FtcGxlIGRyaXZlcl0KICAqLwotRFdPUkQgd2lkTWVzc2FnZShXT1JEIHdEZXZJRCwgV09SRCB3TXNnLCBEV09SRCBkd1VzZXIsIAorRFdPUkQgV0lOQVBJIHdpZE1lc3NhZ2UoV09SRCB3RGV2SUQsIFdPUkQgd01zZywgRFdPUkQgZHdVc2VyLCAKIAkJCQkJRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewogICBpbnQgYXVkaW87CkBAIC0xODEwLDcgKzE4MTAsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJd29kTWVzc2FnZQkJCVtzYW1wbGUgZHJpdmVyXQogICovCi1EV09SRCB3b2RNZXNzYWdlKFdPUkQgd0RldklELCBXT1JEIHdNc2csIERXT1JEIGR3VXNlciwgCitEV09SRCBXSU5BUEkgd29kTWVzc2FnZShXT1JEIHdEZXZJRCwgV09SRCB3TXNnLCBEV09SRCBkd1VzZXIsIAogCQkJCQlEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCiB7CiAJRklYTUUobWNpd2F2ZSwiKCV1LCAlMDRYLCAlMDhsWCwgJTA4bFgsICUwOGxYKTpzdHViXG4iLApAQCAtMTgyMSw3ICsxODIxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCXdpZE1lc3NhZ2UJCQlbc2FtcGxlIGRyaXZlcl0KICAqLwotRFdPUkQgd2lkTWVzc2FnZShXT1JEIHdEZXZJRCwgV09SRCB3TXNnLCBEV09SRCBkd1VzZXIsIAorRFdPUkQgV0lOQVBJIHdpZE1lc3NhZ2UoV09SRCB3RGV2SUQsIFdPUkQgd01zZywgRFdPUkQgZHdVc2VyLCAKIAkJCQkJRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewogCUZJWE1FKG1jaXdhdmUsIigldSwgJTA0WCwgJTA4bFgsICUwOGxYLCAlMDhsWCk6c3R1YlxuIiwKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvaW5pdC5jIGIvbXVsdGltZWRpYS9pbml0LmMKaW5kZXggNjNkZjFiZi4uN2QxMzhjOCAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9pbml0LmMKKysrIGIvbXVsdGltZWRpYS9pbml0LmMKQEAgLTgxLDYgKzgxLDcgQEAKICAgCiAgIGlmIChzdGF0dXMgPT0gLTEpIHsKICAgICBFUlIgKG1pZGksICJpb2N0bCBmYWlsZWQuXG4iKTsKKyAgICBjbG9zZShmZCk7CiAgICAgcmV0dXJuIFRSVUU7CiAgIH0KIApAQCAtOTEsNiArOTIsNyBAQAogICAgIHN0YXR1cyA9IGlvY3RsKGZkLCBTTkRDVExfU1lOVEhfSU5GTywgJnNpbmZvKTsKICAgICBpZiAoc3RhdHVzID09IC0xKSB7CiAgICAgICBFUlIobWlkaSwgImlvY3RsIGZhaWxlZC5cbiIpOworICAgICAgY2xvc2UoZmQpOwogICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQogCkBAIC0xMzMsNiArMTM1LDcgQEAKICAgc3RhdHVzID0gaW9jdGwoZmQsIFNORENUTF9TRVFfTlJNSURJUywgJm51bW1pZGlkZXZzKTsKICAgaWYgKHN0YXR1cyA9PSAtMSkgewogICAgIEVSUihtaWRpLCAiaW9jdGwgZmFpbGVkLlxuIik7CisgICAgY2xvc2UoZmQpOwogICAgIHJldHVybiBUUlVFOwogICB9CiAKQEAgLTE1MSw2ICsxNTQsNyBAQAogICAgIHN0YXR1cyA9IGlvY3RsKGZkLCBTTkRDVExfTUlESV9JTkZPLCAmbWluZm8pOwogICAgIGlmIChzdGF0dXMgPT0gLTEpIHsKICAgICAgIEVSUihtaWRpLCAiaW9jdGwgZmFpbGVkLlxuIik7CisgICAgICBjbG9zZShmZCk7CiAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbWlkaS5jIGIvbXVsdGltZWRpYS9taWRpLmMKaW5kZXggYWJjY2NiNS4uYzdjYWU1YSAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9taWRpLmMKKysrIGIvbXVsdGltZWRpYS9taWRpLmMKQEAgLTg5NCw3ICs4OTQsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQltaWRNZXNzYWdlCQkJCVtzYW1wbGUgZHJpdmVyXQogICovCi1EV09SRCBtaWRNZXNzYWdlKFdPUkQgd0RldklELCBXT1JEIHdNc2csIERXT1JEIGR3VXNlciwgCitEV09SRCBXSU5BUEkgbWlkTWVzc2FnZShXT1JEIHdEZXZJRCwgV09SRCB3TXNnLCBEV09SRCBkd1VzZXIsIAogCQkJCQlEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCiB7CiAJVFJBQ0UobWlkaSwgIiglMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgsICUwOGxYKTtcbiIsIApAQCAtMTE1MCw3ICsxMTUwLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCW1vZE1lc3NhZ2UJCQlbc2FtcGxlIGRyaXZlcl0KICAqLwotRFdPUkQgbW9kTWVzc2FnZShXT1JEIHdEZXZJRCwgV09SRCB3TXNnLCBEV09SRCBkd1VzZXIsIAorRFdPUkQgV0lOQVBJIG1vZE1lc3NhZ2UoV09SRCB3RGV2SUQsIFdPUkQgd01zZywgRFdPUkQgZHdVc2VyLCAKIAkJCQkJRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewogCVRSQUNFKG1pZGksICIoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLCAKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbWl4ZXIuYyBiL211bHRpbWVkaWEvbWl4ZXIuYwppbmRleCAxYzI5ZTQ3Li45MjFkMWY5IDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21peGVyLmMKKysrIGIvbXVsdGltZWRpYS9taXhlci5jCkBAIC0xOTAsNyArMTkwLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCW1peE1lc3NhZ2UJCQlbc2FtcGxlIGRyaXZlcl0KICAqLwotRFdPUkQgbWl4TWVzc2FnZShXT1JEIHdEZXZJRCwgV09SRCB3TXNnLCBEV09SRCBkd1VzZXIsIAorRFdPUkQgV0lOQVBJIG1peE1lc3NhZ2UoV09SRCB3RGV2SUQsIFdPUkQgd01zZywgRFdPUkQgZHdVc2VyLCAKIAkJCQkJRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewogCVRSQUNFKG1tYXV4LCIoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLCAKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbW1hdXguYyBiL211bHRpbWVkaWEvbW1hdXguYwppbmRleCA1YmJiZjgxLi40MjcyZGI0IDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21tYXV4LmMKKysrIGIvbXVsdGltZWRpYS9tbWF1eC5jCkBAIC0yMjYsNyArMjI2LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCWF1eE1lc3NhZ2UJCQlbc2FtcGxlIGRyaXZlcl0KICAqLwotRFdPUkQgYXV4TWVzc2FnZShXT1JEIHdEZXZJRCwgV09SRCB3TXNnLCBEV09SRCBkd1VzZXIsIAorRFdPUkQgV0lOQVBJIGF1eE1lc3NhZ2UoV09SRCB3RGV2SUQsIFdPUkQgd01zZywgRFdPUkQgZHdVc2VyLCAKIAkJCQkJRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewogCVRSQUNFKG1tYXV4LCIoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLCAKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbW1pby5jIGIvbXVsdGltZWRpYS9tbWlvLmMKaW5kZXggNWQ4ODU0Mi4uZjZiZGM3NyAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9tbWlvLmMKKysrIGIvbXVsdGltZWRpYS9tbWlvLmMKQEAgLTIsOSArMiw5IEBACiAgKiBNTUlPIGZ1bmN0aW9ucwogICoKICAqIENvcHlyaWdodCAxOTk4IEFuZHJldyBUYXlsb3IKKyAqIENvcHlyaWdodCAxOTk4IE92ZSBL5XZlbgogICoKLSAqIE5PVEVTOiAgSS9PIGlzIHN0aWxsIHVuYnVmZmVyZWQ7ICBtbWlvU2V0QnVmZmVyIG11c3QgYmUgaW1wbGVtZW50ZWQKLSAqIGFuZCBtbWlve1JlYWQsV3JpdGUsU2VlayxvdGhlcnM/fSBuZWVkIGJ1ZmZlciBzdXBwb3J0LgorICogQnVmZmVyaW5nIGlzIG5vdCBndWFyYW50ZWVkIHRvIHdvcmsgcHJvcGVybHkgeWV0LCBidXQgaWYgaXQgZG9lcy4uLgogICogQnVmZmVyaW5nIHNob3VsZCBhbG1vc3QgZ2l2ZSB1cyBtZW1vcnkgZmlsZXMgZm9yIGZyZWUuCiAgKi8KIApAQCAtMjMyLDYgKzIzMiw3IEBACiAJCX0KIAl9CiAKKwlscG1taW5mby0+ZHdGbGFncyA9IGR3T3BlbkZsYWdzOwogCWxwbW1pbmZvLT5obW1pbyA9IGhtbWlvOwogCiAJLyogY2FsbCBJTyBwcm9jIHRvIGFjdHVhbGx5IG9wZW4gZmlsZSAqLwpAQCAtMzAxLDcgKzMwMiwzNyBAQAogCWlmIChscG1taW5mbyA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CiAKLQljb3VudCA9IG1taW9TZW5kTWVzc2FnZShobW1pbywgTU1JT01fUkVBRCwgKExQQVJBTSkgcGNoLCAoTFBBUkFNKSBjY2gpOworCWlmIChscG1taW5mby0+cGNoTmV4dCAhPSBscG1taW5mby0+cGNoRW5kUmVhZCkgeworCQljb3VudCA9IGxwbW1pbmZvLT5wY2hFbmRSZWFkIC0gbHBtbWluZm8tPnBjaE5leHQ7CisJCWlmIChjb3VudCA+IGNjaCkgY291bnQgPSBjY2g7CisJCW1lbWNweShwY2gsIGxwbW1pbmZvLT5wY2hOZXh0LCBjb3VudCk7CisJCWxwbW1pbmZvLT5wY2hOZXh0ICs9IGNvdW50OworCQlwY2ggKz0gY291bnQ7CisJCWNjaCAtPSBjb3VudDsKKwl9IGVsc2UKKwkJY291bnQgPSAwOworCisJaWYgKGNjaCkgeworCQlpZiAobHBtbWluZm8tPmNjaEJ1ZmZlcikgeworCQkJbW1pb0ZsdXNoMzIoaG1taW8sIE1NSU9fRU1QVFlCVUYpOworCisJCQl3aGlsZSAoY2NoKSB7CisJCQkJTE9ORyBzaXplID0gbW1pb1NlbmRNZXNzYWdlKGhtbWlvLCBNTUlPTV9SRUFELAorCQkJCQkJKExQQVJBTSkgbHBtbWluZm8tPnBjaEJ1ZmZlciwKKwkJCQkJCShMUEFSQU0pIGxwbW1pbmZvLT5jY2hCdWZmZXIpOworCQkJCWxwbW1pbmZvLT5wY2hOZXh0ID0gbHBtbWluZm8tPnBjaEJ1ZmZlcjsKKwkJCQlscG1taW5mby0+cGNoRW5kUmVhZCA9IGxwbW1pbmZvLT5wY2hCdWZmZXIgKyBzaXplOworCQkJCWlmIChzaXplID4gY2NoKSBzaXplID0gY2NoOworCQkJCW1lbWNweShwY2gsIGxwbW1pbmZvLT5wY2hOZXh0LCBzaXplKTsKKwkJCQlscG1taW5mby0+cGNoTmV4dCArPSBzaXplOworCQkJCXBjaCArPSBzaXplOworCQkJCWNjaCAtPSBzaXplOworCQkJCWNvdW50ICs9IHNpemU7CisJCQl9CisJCX0gZWxzZSB7CisJCQljb3VudCArPSBtbWlvU2VuZE1lc3NhZ2UoaG1taW8sIE1NSU9NX1JFQUQsIChMUEFSQU0pIHBjaCwgKExQQVJBTSkgY2NoKTsKKwkJfQorCX0KIAogCUdsb2JhbFVubG9jazE2KGhtbWlvKTsKIAlUUkFDRShtbWlvLCAiY291bnQ9JWxkXG4iLCBjb3VudCk7CkBAIC0zMzAsNyArMzYxLDI1IEBACiAJaWYgKGxwbW1pbmZvID09IE5VTEwpCiAJCXJldHVybiAtMTsKIAotCWNvdW50ID0gbW1pb1NlbmRNZXNzYWdlKGhtbWlvLCBNTUlPTV9XUklURSwgKExQQVJBTSkgcGNoLCAoTFBBUkFNKSBjY2gpOworCWlmIChscG1taW5mby0+Y2NoQnVmZmVyKSB7CisJCWNvdW50ID0gMDsKKwkJd2hpbGUgKGNjaCkgeworCQkJaWYgKGxwbW1pbmZvLT5wY2hOZXh0ICE9IGxwbW1pbmZvLT5wY2hFbmRXcml0ZSkgeworCQkJCWNvdW50ID0gbHBtbWluZm8tPnBjaEVuZFdyaXRlIC0gbHBtbWluZm8tPnBjaE5leHQ7CisJCQkJaWYgKGNvdW50ID4gY2NoKSBjb3VudCA9IGNjaDsKKwkJCQltZW1jcHkobHBtbWluZm8tPnBjaE5leHQsIHBjaCwgY291bnQpOworCQkJCWxwbW1pbmZvLT5wY2hOZXh0ICs9IGNvdW50OworCQkJCXBjaCArPSBjb3VudDsKKwkJCQljY2ggLT0gY291bnQ7CisJCQkJbHBtbWluZm8tPmR3RmxhZ3MgfD0gTU1JT19ESVJUWTsKKwkJCX0KKworCQkJaWYgKGxwbW1pbmZvLT5wY2hOZXh0ID09IGxwbW1pbmZvLT5wY2hFbmRXcml0ZQorCQkJCSYmIG1taW9GbHVzaDMyKGhtbWlvLCBNTUlPX0VNUFRZQlVGKSkgYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQljb3VudCA9IG1taW9TZW5kTWVzc2FnZShobW1pbywgTU1JT01fV1JJVEUsIChMUEFSQU0pIHBjaCwgKExQQVJBTSkgY2NoKTsKKwl9CiAKIAlHbG9iYWxVbmxvY2sxNihobW1pbyk7CiAJVFJBQ0UobW1pbywgImNvdW50PSVsZFxuIiwgY291bnQpOwpAQCAtMzU1LDExICs0MDQsMTQgQEAKIAogCVRSQUNFKG1taW8sICIoJTA0WCwgJTA4bFgsICVkKTtcbiIsIGhtbWlvLCBsT2Zmc2V0LCBpT3JpZ2luKTsKIAorCWlmIChtbWlvRmx1c2gzMihobW1pbywgTU1JT19FTVBUWUJVRikpCisJCXJldHVybiAtMTsKKwogCWxwbW1pbmZvID0gKExQTU1JT0lORk8xNilHbG9iYWxMb2NrMTYoaG1taW8pOwogCWlmIChscG1taW5mbyA9PSBOVUxMKQogCQlyZXR1cm4gMDsKIAotICAgIG9mZnNldCA9IG1taW9TZW5kTWVzc2FnZShobW1pbywgTU1JT01fU0VFSywgKExQQVJBTSkgbE9mZnNldCwgKExQQVJBTSkgaU9yaWdpbik7CisJb2Zmc2V0ID0gbW1pb1NlbmRNZXNzYWdlKGhtbWlvLCBNTUlPTV9TRUVLLCAoTFBBUkFNKSBsT2Zmc2V0LCAoTFBBUkFNKSBpT3JpZ2luKTsKIAogCUdsb2JhbFVubG9jazE2KGhtbWlvKTsKIAlyZXR1cm4gb2Zmc2V0OwpAQCAtNDI4LDYgKzQ4MCw4IEBACiAJVFJBQ0UobW1pbywgIm1taW9TZXRJbmZvXG4iKTsKIAlscG1taW5mbyA9IChMUE1NSU9JTkZPMTYpR2xvYmFsTG9jazE2KGhtbWlvKTsKIAlpZiAobHBtbWluZm8gPT0gTlVMTCkgcmV0dXJuIDA7CisJbHBtbWluZm8tPnBjaE5leHQJPSBscG1taW9pbmZvLT5wY2hOZXh0OworCWxwbW1pbmZvLT5wY2hFbmRSZWFkCT0gbHBtbWlvaW5mby0+cGNoRW5kUmVhZDsKIAlHbG9iYWxVbmxvY2sxNihobW1pbyk7CiAJcmV0dXJuIDA7CiB9CkBAIC00MzgsMTIgKzQ5Miw1NiBAQAogVUlOVDE2IFdJTkFQSSBtbWlvU2V0QnVmZmVyKEhNTUlPMTYgaG1taW8sIExQU1RSIHBjaEJ1ZmZlciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9ORyBjY2hCdWZmZXIsIFVJTlQxNiB1RmxhZ3MpCiB7Ci0JRklYTUUobW1pbywgIihobW1pbz0lZCwgcGNoQnVmPSVwLCBjY2hCdWY9JWxkLCB1RmxhZ3M9JSMwOHgpOiBzdHViXG4iLAorCUxQTU1JT0lORk8xNglscG1taW5mbzsKKworCWlmIChtbWlvRmx1c2gzMihobW1pbywgTU1JT19FTVBUWUJVRikgIT0gMCkKKwkJcmV0dXJuIE1NSU9FUlJfQ0FOTk9UV1JJVEU7CisKKwlUUkFDRShtbWlvLCAiKGhtbWlvPSUwNHgsIHBjaEJ1Zj0lcCwgY2NoQnVmPSVsZCwgdUZsYWdzPSUjMDh4KVxuIiwKIAkgICAgICBobW1pbywgcGNoQnVmZmVyLCBjY2hCdWZmZXIsIHVGbGFncyk7CisKKwlscG1taW5mbyA9IChMUE1NSU9JTkZPMTYpR2xvYmFsTG9jazE2KGhtbWlvKTsKKwlpZiAobHBtbWluZm8gPT0gTlVMTCkgcmV0dXJuIDA7CisJaWYgKCghY2NoQnVmZmVyIHx8IHBjaEJ1ZmZlcikgJiYgbHBtbWluZm8tPmR3RmxhZ3MmTU1JT19BTExPQ0JVRikgeworCQlHbG9iYWxVbmxvY2sxNihscG1taW5mby0+ZHdSZXNlcnZlZDEpOworCQlHbG9iYWxGcmVlMTYobHBtbWluZm8tPmR3UmVzZXJ2ZWQxKTsKKwkJbHBtbWluZm8tPmR3RmxhZ3MgJj0gfk1NSU9fQUxMT0NCVUY7CisJfQorCWlmIChwY2hCdWZmZXIpIHsKKwkJbHBtbWluZm8tPnBjaEJ1ZmZlciA9IHBjaEJ1ZmZlcjsKKwl9IGVsc2UKKwlpZiAobHBtbWluZm8tPmR3RmxhZ3MmTU1JT19BTExPQ0JVRikgeworCQlIR0xPQkFMMTYgaE5ld0J1ZjsKKwkJR2xvYmFsVW5sb2NrMTYobHBtbWluZm8tPmR3UmVzZXJ2ZWQxKTsKKwkJaE5ld0J1ZiA9IEdsb2JhbFJlQWxsb2MxNihscG1taW5mby0+ZHdSZXNlcnZlZDEsIGNjaEJ1ZmZlciwgMCk7CisJCWlmICghaE5ld0J1ZikgeworCQkJLyogRklYTUU6IHRoaXMgYXNzdW1lcyB0aGUgbWVtb3J5IGJsb2NrIGRpZG4ndCBtb3ZlICovCisJCQlHbG9iYWxMb2NrMTYobHBtbWluZm8tPmR3UmVzZXJ2ZWQxKTsKKwkJCUdsb2JhbFVubG9jazE2KGhtbWlvKTsKKwkJCXJldHVybiBNTUlPRVJSX09VVE9GTUVNT1JZOworCQl9CisJCWxwbW1pbmZvLT5kd1Jlc2VydmVkMSA9IGhOZXdCdWY7CisJCWxwbW1pbmZvLT5wY2hCdWZmZXIgPSBHbG9iYWxMb2NrMTYoaE5ld0J1Zik7CisJfSBlbHNlCisJaWYgKGNjaEJ1ZmZlcikgeworCQlIR0xPQkFMMTYgaE5ld0J1ZiA9IEdsb2JhbEFsbG9jMTYoR01FTV9NT1ZFQUJMRSwgY2NoQnVmZmVyKTsKKwkJaWYgKCFoTmV3QnVmKSB7CisJCQlHbG9iYWxVbmxvY2sxNihobW1pbyk7CisJCQlyZXR1cm4gTU1JT0VSUl9PVVRPRk1FTU9SWTsKKwkJfQorCQlscG1taW5mby0+ZHdSZXNlcnZlZDEgPSBoTmV3QnVmOworCQlscG1taW5mby0+cGNoQnVmZmVyID0gR2xvYmFsTG9jazE2KGhOZXdCdWYpOworCQlscG1taW5mby0+ZHdGbGFncyB8PSBNTUlPX0FMTE9DQlVGOworCX0gZWxzZQorCQlscG1taW5mby0+cGNoQnVmZmVyID0gTlVMTDsKKwlscG1taW5mby0+Y2NoQnVmZmVyID0gY2NoQnVmZmVyOworCWxwbW1pbmZvLT5wY2hOZXh0ID0gbHBtbWluZm8tPnBjaEJ1ZmZlcjsKKwlscG1taW5mby0+cGNoRW5kUmVhZCA9IGxwbW1pbmZvLT5wY2hCdWZmZXI7CisJbHBtbWluZm8tPnBjaEVuZFdyaXRlID0gbHBtbWluZm8tPnBjaEJ1ZmZlciArIGNjaEJ1ZmZlcjsKKwlscG1taW5mby0+bEJ1Zk9mZnNldCA9IDA7CisKKwlHbG9iYWxVbmxvY2sxNihobW1pbyk7CiAJcmV0dXJuIChVSU5UMTYpIDA7Ci0vKglzdG9wcyBDb3JlbCBEcmF3IDQgKDE2IGJpdCkgZnJvbSB3b3JraW5nCi0JcmV0dXJuIE1NSU9FUlJfT1VUT0ZNRU1PUlk7Ci0qLwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQ1NSw2ICs1NTMsMjcgQEAKIAlUUkFDRShtbWlvLCAiKCUwNFgsICUwNFgpXG4iLCBobW1pbywgdUZsYWdzKTsKIAlscG1taW5mbyA9IChMUE1NSU9JTkZPMTYpR2xvYmFsTG9jazE2KGhtbWlvKTsKIAlpZiAobHBtbWluZm8gPT0gTlVMTCkgcmV0dXJuIDA7CisKKwkvKiBub3QgcXVpdGUgc3VyZSB3aGF0IHRvIGRvIGhlcmUsIGJ1dCBJJ2xsIGd1ZXNzICovCisJaWYgKGxwbW1pbmZvLT5kd0ZsYWdzJk1NSU9fRElSVFkpIHsKKwkJaWYgKGxwbW1pbmZvLT5wY2hOZXh0ICE9IChscG1taW5mby0+cGNoQnVmZmVyICsgbHBtbWluZm8tPmxCdWZPZmZzZXQpKSB7CisJCQlpZiAobHBtbWluZm8tPmR3RmxhZ3MmTU1JT19SRUFEV1JJVEUpCisJCQkJbW1pb1NlbmRNZXNzYWdlKGhtbWlvLCBNTUlPTV9TRUVLLAorCQkJCQkoTFBBUkFNKSAobHBtbWluZm8tPnBjaEJ1ZmZlciAtIGxwbW1pbmZvLT5wY2hFbmRSZWFkKSArIGxwbW1pbmZvLT5sQnVmT2Zmc2V0LAorCQkJCQkoTFBBUkFNKSBTRUVLX0NVUiApOworCQkJbW1pb1NlbmRNZXNzYWdlKGhtbWlvLCBNTUlPTV9XUklURSwKKwkJCQkoTFBBUkFNKSBscG1taW5mby0+cGNoQnVmZmVyICsgbHBtbWluZm8tPmxCdWZPZmZzZXQsCisJCQkJKExQQVJBTSkgKGxwbW1pbmZvLT5wY2hOZXh0IC0gbHBtbWluZm8tPnBjaEJ1ZmZlcikgLSBscG1taW5mby0+bEJ1Zk9mZnNldCApOworCQl9CisJCWxwbW1pbmZvLT5sQnVmT2Zmc2V0ID0gbHBtbWluZm8tPnBjaE5leHQgLSBscG1taW5mby0+cGNoQnVmZmVyOworCQlscG1taW5mby0+ZHdGbGFncyAmPSB+TU1JT19ESVJUWTsKKwl9CisJaWYgKHVGbGFncyAmIE1NSU9fRU1QVFlCVUYpIHsKKwkJbHBtbWluZm8tPnBjaE5leHQgPSBscG1taW5mby0+cGNoQnVmZmVyOworCQlscG1taW5mby0+cGNoRW5kUmVhZCA9IGxwbW1pbmZvLT5wY2hCdWZmZXI7CisJCWxwbW1pbmZvLT5sQnVmT2Zmc2V0ID0gMDsKKwl9CisKIAlHbG9iYWxVbmxvY2sxNihobW1pbyk7CiAJcmV0dXJuIDA7CiB9CkBAIC00NzIsMjAgKzU5MSwyMSBAQAogICovCiBVSU5UMzIgV0lOQVBJIG1taW9BZHZhbmNlMzIoSE1NSU8zMiBobW1pbyxNTUlPSU5GTzMyKmxwbW1pb2luZm8sVUlOVDMyIHVGbGFncykKIHsKLQlpbnQJCWNvdW50ID0gMDsKIAlMUE1NSU9JTkZPMTYJbHBtbWluZm87CiAJVFJBQ0UobW1pbywgIm1taW9BZHZhbmNlXG4iKTsKIAlscG1taW5mbyA9IChMUE1NSU9JTkZPMTYpR2xvYmFsTG9jazE2KGhtbWlvKTsKIAlpZiAobHBtbWluZm8gPT0gTlVMTCkgcmV0dXJuIDA7CiAJaWYgKHVGbGFncyA9PSBNTUlPX1JFQUQpCi0JCWNvdW50ID0gX2xyZWFkMzIoTE9XT1JEKGxwbW1pbmZvLT5hZHdJbmZvWzBdKSwgCi0JCQlscG1taW9pbmZvLT5wY2hCdWZmZXIsIGxwbW1pb2luZm8tPmNjaEJ1ZmZlcik7CisJICAgICAgICBscG1taW9pbmZvLT5wY2hFbmRSZWFkID0gbHBtbWlvaW5mby0+cGNoQnVmZmVyICsKKwkgICAgICAgICAgICBtbWlvU2VuZE1lc3NhZ2UoaG1taW8sIE1NSU9NX1JFQUQsCisJICAgICAgICAgICAgICAgIChMUEFSQU0pIGxwbW1pb2luZm8tPnBjaEJ1ZmZlciwKKwkgICAgICAgICAgICAgICAgKExQQVJBTSkgbHBtbWlvaW5mby0+Y2NoQnVmZmVyKTsKIAlpZiAodUZsYWdzID09IE1NSU9fV1JJVEUpCi0JCWNvdW50ID0gX2x3cml0ZTMyKExPV09SRChscG1taW5mby0+YWR3SW5mb1swXSksCi0JCQlscG1taW9pbmZvLT5wY2hCdWZmZXIsIGxwbW1pb2luZm8tPmNjaEJ1ZmZlcik7Ci0JbHBtbWlvaW5mby0+cGNoTmV4dAkrPSBjb3VudDsKKwkgICAgICAgICAgICBtbWlvU2VuZE1lc3NhZ2UoaG1taW8sIE1NSU9NX1dSSVRFLAorCSAgICAgICAgICAgICAgICAoTFBBUkFNKSBscG1taW9pbmZvLT5wY2hCdWZmZXIsCisJICAgICAgICAgICAgICAgIChMUEFSQU0pIGxwbW1pb2luZm8tPmNjaEJ1ZmZlcik7CisJbHBtbWlvaW5mby0+cGNoTmV4dCA9IGxwbW1pb2luZm8tPnBjaEJ1ZmZlcjsKIAlHbG9iYWxVbmxvY2sxNihobW1pbyk7Ci0JbHBtbWluZm8tPmxEaXNrT2Zmc2V0ID0gX2xsc2VlazMyKChIRklMRTMyKWxwbW1pbmZvLT5hZHdJbmZvWzBdLCAwLCBTRUVLX0NVUik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ5NCwyMCArNjE0LDIxIEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgbW1pb0FkdmFuY2UxNihITU1JTzE2IGhtbWlvLE1NSU9JTkZPMTYqbHBtbWlvaW5mbyxVSU5UMTYgdUZsYWdzKQogewotCWludAkJY291bnQgPSAwOwogCUxQTU1JT0lORk8xNglscG1taW5mbzsKIAlUUkFDRShtbWlvLCAibW1pb0FkdmFuY2VcbiIpOwogCWxwbW1pbmZvID0gKExQTU1JT0lORk8xNilHbG9iYWxMb2NrMTYoaG1taW8pOwogCWlmIChscG1taW5mbyA9PSBOVUxMKSByZXR1cm4gMDsKIAlpZiAodUZsYWdzID09IE1NSU9fUkVBRCkKLQkJY291bnQgPSBfbHJlYWQzMihMT1dPUkQobHBtbWluZm8tPmFkd0luZm9bMF0pLCAKLQkJCWxwbW1pb2luZm8tPnBjaEJ1ZmZlciwgbHBtbWlvaW5mby0+Y2NoQnVmZmVyKTsKKwkgICAgICAgIGxwbW1pb2luZm8tPnBjaEVuZFJlYWQgPSBscG1taW9pbmZvLT5wY2hCdWZmZXIgKworCSAgICAgICAgICAgIG1taW9TZW5kTWVzc2FnZShobW1pbywgTU1JT01fUkVBRCwKKwkgICAgICAgICAgICAgICAgKExQQVJBTSkgbHBtbWlvaW5mby0+cGNoQnVmZmVyLAorCSAgICAgICAgICAgICAgICAoTFBBUkFNKSBscG1taW9pbmZvLT5jY2hCdWZmZXIpOwogCWlmICh1RmxhZ3MgPT0gTU1JT19XUklURSkKLQkJY291bnQgPSBfbHdyaXRlMzIoTE9XT1JEKGxwbW1pbmZvLT5hZHdJbmZvWzBdKSwKLQkJCWxwbW1pb2luZm8tPnBjaEJ1ZmZlciwgbHBtbWlvaW5mby0+Y2NoQnVmZmVyKTsKLQlscG1taW9pbmZvLT5wY2hOZXh0CSs9IGNvdW50OworCSAgICAgICAgICAgIG1taW9TZW5kTWVzc2FnZShobW1pbywgTU1JT01fV1JJVEUsCisJICAgICAgICAgICAgICAgIChMUEFSQU0pIGxwbW1pb2luZm8tPnBjaEJ1ZmZlciwKKwkgICAgICAgICAgICAgICAgKExQQVJBTSkgbHBtbWlvaW5mby0+Y2NoQnVmZmVyKTsKKwlscG1taW9pbmZvLT5wY2hOZXh0ID0gbHBtbWlvaW5mby0+cGNoQnVmZmVyOwogCUdsb2JhbFVubG9jazE2KGhtbWlvKTsKLQlscG1taW5mby0+bERpc2tPZmZzZXQgPSBfbGxzZWVrMzIoKEhGSUxFMzIpbHBtbWluZm8tPmFkd0luZm9bMF0sIDAsIFNFRUtfQ1VSKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzA4LDcgKzgyOSwyOSBAQAogICovCiBVSU5UMzIgV0lOQVBJIG1taW9Bc2NlbmQzMihITU1JTzMyIGhtbWlvLCBNTUNLSU5GTyAqIGxwY2ssIFVJTlQzMiB1RmxhZ3MpCiB7Ci0JRklYTUUobW1pbywgImVtcHR5IHN0dWIgIVxuIik7CisJVFJBQ0UobW1pbywgIiglMDRYLCAlcCwgJTA0WCk7XG4iLCAKKwkJCQlobW1pbywgbHBjaywgdUZsYWdzKTsKKwlpZiAobHBjay0+ZHdGbGFncyZNTUlPX0RJUlRZKSB7CisJCURXT1JECWR3T2xkUG9zLCBkd05ld1NpemUsIGR3U2l6ZVBvczsKKwkJCisJCWR3T2xkUG9zID0gbW1pb1NlZWszMihobW1pbywgMCwgU0VFS19DVVIpOworCQlUUkFDRShtbWlvLCAiZHdPbGRQb3M9JWxkXG4iLCBkd09sZFBvcyk7CisJCWR3TmV3U2l6ZSA9IGR3T2xkUG9zIC0gbHBjay0+ZHdEYXRhT2Zmc2V0OworCQlpZiAoZHdOZXdTaXplICE9IGxwY2stPmNrc2l6ZSkgeworCQkJVFJBQ0UobW1pbywgImR3TmV3U2l6ZT0lbGRcbiIsIGR3TmV3U2l6ZSk7CisJCQlscGNrLT5ja3NpemUgPSBkd05ld1NpemU7CisKKwkJCWR3U2l6ZVBvcyA9IGxwY2stPmR3RGF0YU9mZnNldCAtIHNpemVvZihEV09SRCk7CisJCQlpZiAobHBjay0+Y2tpZCA9PSBGT1VSQ0NfUklGRiB8fCBscGNrLT5ja2lkID09IEZPVVJDQ19MSVNUKSAKKwkJCQlkd1NpemVQb3MgLT0gc2l6ZW9mKERXT1JEKTsKKwkJCVRSQUNFKG1taW8sICJkd1NpemVQb3M9JWxkXG4iLCBkd1NpemVQb3MpOworCisJCQltbWlvU2VlazMyKGhtbWlvLCBkd1NpemVQb3MsIFNFRUtfU0VUKTsKKwkJCW1taW9Xcml0ZTMyKGhtbWlvLCAoTFBTVFIpJmR3TmV3U2l6ZSwgc2l6ZW9mKERXT1JEKSk7CisJCX0KKwl9CisJbW1pb1NlZWszMihobW1pbyxscGNrLT5kd0RhdGFPZmZzZXQrbHBjay0+Y2tzaXplLFNFRUtfU0VUKTsKKwogCXJldHVybiAwOwogfQogCkBAIC03MjUsNyArODY4LDM0IEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgbW1pb0NyZWF0ZUNodW5rKEhNTUlPMTYgaG1taW8sIE1NQ0tJTkZPICogbHBjaywgVUlOVDE2IHVGbGFncykKIHsKLQlGSVhNRShtbWlvLCAiZW1wdHkgc3R1YiBcbiIpOworCURXT1JECWR3T2xkUG9zOworCUxPTkcgaXg7CisKKwlUUkFDRShtbWlvLCAiKCUwNFgsICVwLCAlMDRYKTtcbiIsIAorCQkJCWhtbWlvLCBscGNrLCB1RmxhZ3MpOworCisJZHdPbGRQb3MgPSBtbWlvU2VlazMyKGhtbWlvLCAwLCBTRUVLX0NVUik7CisJVFJBQ0UobW1pbywgImR3T2xkUG9zPSVsZFxuIiwgZHdPbGRQb3MpOworCisJaWYgKHVGbGFncyA9PSBNTUlPX0NSRUFURUxJU1QpCisJCWxwY2stPmNraWQgPSBGT1VSQ0NfTElTVDsKKwllbHNlIGlmICh1RmxhZ3MgPT0gTU1JT19DUkVBVEVSSUZGKQorCQlscGNrLT5ja2lkID0gRk9VUkNDX1JJRkY7CisKKwlscGNrLT5kd0RhdGFPZmZzZXQgPSBkd09sZFBvcyArIDIgKiBzaXplb2YoRFdPUkQpOworCWlmIChscGNrLT5ja2lkID09IEZPVVJDQ19SSUZGIHx8IGxwY2stPmNraWQgPT0gRk9VUkNDX0xJU1QpIAorCQlscGNrLT5kd0RhdGFPZmZzZXQgKz0gc2l6ZW9mKERXT1JEKTsKKwlscGNrLT5kd0ZsYWdzID0gTU1JT19ESVJUWTsKKworCWl4ID0gbW1pb1dyaXRlMzIoaG1taW8sIChMUFNUUilscGNrLCBscGNrLT5kd0RhdGFPZmZzZXQgLSBkd09sZFBvcyk7CisJVFJBQ0UobW1pbywgImFmdGVyIF9sd3JpdGUzMiBpeCA9ICVsZCByZXEgPSAlbGQsIGVycm5vID0gJWRcbiIsaXgsbHBjay0+ZHdEYXRhT2Zmc2V0IC0gZHdPbGRQb3MsZXJybm8pOworCWlmIChpeCA8IGxwY2stPmR3RGF0YU9mZnNldCAtIGR3T2xkUG9zKSB7CisKKwkJbW1pb1NlZWszMihobW1pbywgZHdPbGRQb3MsIFNFRUtfU0VUKTsKKwkJV0FSTihtbWlvLCAicmV0dXJuIENhbm5vdFdyaXRlXG4iKTsKKwkJcmV0dXJuIE1NSU9FUlJfQ0FOTk9UV1JJVEU7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbW1zeXN0ZW0uYyBiL211bHRpbWVkaWEvbW1zeXN0ZW0uYwppbmRleCAzZGJjN2MxLi40NThhNWJlIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21tc3lzdGVtLmMKKysrIGIvbXVsdGltZWRpYS9tbXN5c3RlbS5jCkBAIC0zMyw3ICszMyw3IEBACiAKIHN0cnVjdCBMSU5VWF9NQ0lEUklWRVIgbWNpRHJ2W01BWE1DSURSSVZFUlNdOwogCi1VSU5UMTYgbWlkaUdldEVycm9yVGV4dChVSU5UMTYgdUVycm9yLCBMUFNUUiBscFRleHQsIFVJTlQxNiB1U2l6ZSk7CitVSU5UMTYgV0lOQVBJIG1pZGlHZXRFcnJvclRleHQoVUlOVDE2IHVFcnJvciwgTFBTVFIgbHBUZXh0LCBVSU5UMTYgdVNpemUpOwogc3RhdGljIFVJTlQxNiB3YXZlR2V0RXJyb3JUZXh0KFVJTlQxNiB1RXJyb3IsIExQU1RSIGxwVGV4dCwgVUlOVDE2IHVTaXplKTsKIExPTkcgV0lOQVBJIERydkRlZkRyaXZlclByb2MoRFdPUkQgZHdEZXZJRCwgSERSVlIxNiBoRHJpdiwgV09SRCB3TXNnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKTsKQEAgLTMzMyw2ICszMzMsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRGV2LCB3TXNnLCBkd1VzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdQYXJhbTEsIGR3UGFyYW0yICk7CiAJCQlicmVhazsKKwkJY2FzZSBEQ0JfRlVOQzMyOgorCQkJVFJBQ0UobW1zeXMsICJDQUxMQkFDS19GVU5DVElPTiAhXG4iKTsKKwkJCSgoTFBEUlZDQUxMQkFDSzMyKWR3Q2FsbEJhY2spKCBoRGV2LCB3TXNnLCBkd1VzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdQYXJhbTEsIGR3UGFyYW0yICk7CisJCQlicmVhazsKIAkJfQogCXJldHVybiBUUlVFOwogfQpAQCAtNDk5LDcgKzUwNCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQltaXhlckdldENvbnRyb2xEZXRhaWxzQQlbV0lOTU0uOTldCiAgKi8KLVVJTlQzMiBtaXhlckdldENvbnRyb2xEZXRhaWxzMzJBKEhNSVhFUk9CSjMyIGhtaXgsTFBNSVhFUkNPTlRST0xERVRBSUxTMzIgbHBtY2QsRFdPUkQgZmR3RGV0YWlscykgeworVUlOVDMyIFdJTkFQSSBtaXhlckdldENvbnRyb2xEZXRhaWxzMzJBKEhNSVhFUk9CSjMyIGhtaXgsTFBNSVhFUkNPTlRST0xERVRBSUxTMzIgbHBtY2QsRFdPUkQgZmR3RGV0YWlscykgewogCUZJWE1FKG1tc3lzLCIoJTA0eCwlcCwlMDhseCk6IHN0dWIhXG4iLGhtaXgsbHBtY2QsZmR3RGV0YWlscyk7CiAJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiB9CkBAIC01MDcsNyArNTEyLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCW1peGVyR2V0Q29udHJvbERldGFpbHNXCVtXSU5NTS4xMDBdCiAgKi8KLVVJTlQzMiBtaXhlckdldENvbnRyb2xEZXRhaWxzMzJXKEhNSVhFUk9CSjMyIGhtaXgsTFBNSVhFUkNPTlRST0xERVRBSUxTMzIgbHBtY2QsRFdPUkQgZmR3RGV0YWlscykgeworVUlOVDMyIFdJTkFQSSBtaXhlckdldENvbnRyb2xEZXRhaWxzMzJXKEhNSVhFUk9CSjMyIGhtaXgsTFBNSVhFUkNPTlRST0xERVRBSUxTMzIgbHBtY2QsRFdPUkQgZmR3RGV0YWlscykgewogCUZJWE1FKG1tc3lzLCIoJTA0eCwlcCwlMDhseCk6IHN0dWIhXG4iLAlobWl4LGxwbWNkLGZkd0RldGFpbHMpOwogCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogfQpAQCAtNTE1LDcgKzUyMCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQltaXhlckdldENvbnRyb2xEZXRhaWxzCVtNTVNZU1RFTS44MDhdCiAgKi8KLVVJTlQxNiBtaXhlckdldENvbnRyb2xEZXRhaWxzMTYoSE1JWEVST0JKMTYgaG1peCxMUE1JWEVSQ09OVFJPTERFVEFJTFMxNiBscG1jZCxEV09SRCBmZHdEZXRhaWxzKSB7CitVSU5UMTYgV0lOQVBJIG1peGVyR2V0Q29udHJvbERldGFpbHMxNihITUlYRVJPQkoxNiBobWl4LExQTUlYRVJDT05UUk9MREVUQUlMUzE2IGxwbWNkLERXT1JEIGZkd0RldGFpbHMpIHsKIAlGSVhNRShtbXN5cywiKCUwNHgsJXAsJTA4bHgpOiBzdHViIVxuIixobWl4LGxwbWNkLGZkd0RldGFpbHMpOwogCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogfQpAQCAtMTMxNiw2ICsxMzIxLDEwIEBACiAJRFdPUkQJZHdSZXQgPSBNQ0lFUlJfSU5URVJOQUw7CiAKIAlUUkFDRShtbXN5cywgIiglMDR4LCAlMDhsWCwgJXApXG4iLCB3RGV2SUQsIGR3UGFyYW0sIGxwUGFybXMpOworCWlmKHdEZXZJRD09TUNJX0FMTF9ERVZJQ0VfSUQpIHsKKwkgIEZJWE1FKG1tc3lzLCAidW5oYW5kbGVkIE1DSV9BTExfREVWSUNFX0lEXG4iKTsKKwkgIHJldHVybiBNQ0lFUlJfQ0FOTk9UX1VTRV9BTEw7CisJfQogCXN3aXRjaChHZXREcnYod0RldklEKS0+bW9kcC53VHlwZSkgewogCWNhc2UgTUNJX0RFVlRZUEVfQ0RfQVVESU86CiAJCWR3UmV0ID0gQ0RBVURJT19Ecml2ZXJQcm9jKEdldERydih3RGV2SUQpLT5tb2RwLndEZXZpY2VJRCwwLApAQCAtMTc5OSw3ICsxODA4LDggQEAKIAlITUlESU9VVDE2CWhtbzE2OwogCVVJTlQzMgkJcmV0OwogCi0JcmV0ID0gbWlkaU91dE9wZW4xNigmaG1vMTYsdURldmljZUlELGR3Q2FsbGJhY2ssZHdJbnN0YW5jZSxkd0ZsYWdzKTsKKwlyZXQgPSBtaWRpT3V0T3BlbjE2KCZobW8xNix1RGV2aWNlSUQsZHdDYWxsYmFjayxkd0luc3RhbmNlLAorCQkJICAgIENBTExCQUNLMzJDT05WKGR3RmxhZ3MpKTsKIAlpZiAobHBoTWlkaU91dCkgKmxwaE1pZGlPdXQgPSBobW8xNjsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjY4OCw3ICsyNjk4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0luc3RhbmNlLCBEV09SRCBkd0ZsYWdzKQogewogCUhXQVZFT1VUMTYJaHdvMTY7Ci0JVUlOVDMyCXJldD13YXZlT3V0T3BlbjE2KCZod28xNix1RGV2aWNlSUQsbHBGb3JtYXQsZHdDYWxsYmFjayxkd0luc3RhbmNlLGR3RmxhZ3MpOworCVVJTlQzMglyZXQ9d2F2ZU91dE9wZW4xNigmaHdvMTYsdURldmljZUlELGxwRm9ybWF0LGR3Q2FsbGJhY2ssZHdJbnN0YW5jZSwKKwkJCQkgIENBTExCQUNLMzJDT05WKGR3RmxhZ3MpKTsKIAlpZiAobHBoV2F2ZU91dCkgKmxwaFdhdmVPdXQ9aHdvMTY7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbXN2aWRlby5jIGIvbXVsdGltZWRpYS9tc3ZpZGVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg3Zjg1YgotLS0gL2Rldi9udWxsCisrKyBiL211bHRpbWVkaWEvbXN2aWRlby5jCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBNU1ZJREVPIHByb2NlZHVyZXMKKyAqCisgKiBDb3B5cmlnaHQgMTk5OCBMdWl6IE90YXZpbyBMLiBab3J6ZWxsYQorICovCisKKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVmlkZW9Gb3JXaW5kb3dzVmVyc2lvbiAgICAgW01TVklERU8uMl0KKyAqLworRFdPUkQgV0lOQVBJIFZpZGVvRm9yV2luZG93c1ZlcnNpb24gKCkKK3sKKworICBGSVhNRSAobXN2aWRlbywgIih2b2lkKTogc3R1YlxuIik7CisKKyAgLyogV2hhdCBzaG91bGQgYmUgcmV0dXJuZWQ/ICovCisgIHJldHVybiAxOworICAKK30KZGlmZiAtLWdpdCBhL29iamVjdHMvY3Vyc29yaWNvbi5jIGIvb2JqZWN0cy9jdXJzb3JpY29uLmMKaW5kZXggNDVkMWNjNi4uYjc5NjljMSAxMDA2NDQKLS0tIGEvb2JqZWN0cy9jdXJzb3JpY29uLmMKKysrIGIvb2JqZWN0cy9jdXJzb3JpY29uLmMKQEAgLTg3NCw3ICs4NzQsOSBAQAogewogICAgIFRSQUNFKGljb24sICIlMDR4XG4iLCBoSWNvbiApOwogICAgIC8qIEZJWE1FOiBzaG91bGQgY2hlY2sgZm9yIE9FTS9nbG9iYWwgaGVhcCBpY29uIGhlcmUgKi8KLSAgICByZXR1cm4gKEZyZWVSZXNvdXJjZTMyKCBoSWNvbiApID09IDApOworICAgIC8qIFVubGlrZSBEZXN0cm95SWNvbjE2LCBvbmx5IGljb25zIGNyZWF0ZWQgd2l0aCBDcmVhdGVJY29uMzIKKyAgICAgICBhcmUgdmFsaWQgZm9yIERlc3Ryb3lJY29uMzIsIHNvIGRvbid0IHVzZSBGcmVlUmVzb3VyY2UzMiAqLworICAgIHJldHVybiAoR2xvYmFsRnJlZTE2KCBoSWNvbiApID09IDApOwogfQogCiAKQEAgLTg4NCw4ICs4ODYsMjEgQEAKIEJPT0wxNiBXSU5BUEkgRGVzdHJveUN1cnNvcjE2KCBIQ1VSU09SMTYgaEN1cnNvciApCiB7CiAgICAgVFJBQ0UoY3Vyc29yLCAiJTA0eFxuIiwgaEN1cnNvciApOwotICAgIC8qIEZJWE1FOiBzaG91bGQgY2hlY2sgZm9yIE9FTS9nbG9iYWwgaGVhcCBjdXJzb3IgaGVyZSAqLwotICAgIHJldHVybiAoRnJlZVJlc291cmNlMTYoIGhDdXJzb3IgKSA9PSAwKTsKKyAgICBpZiAoRnJlZVJlc291cmNlMTYoIGhDdXJzb3IgKSA9PSAwKQorICAgICAgcmV0dXJuIFRSVUU7CisgICAgZWxzZQorICAgICAgLyogSSBiZWxpZXZlIHRoaXMgdmVyeSBzYW1lIGxpbmUgc2hvdWxkIGJlIGFkZGVkIGZvciBldmVyeSBmdW5jdGlvbgorCSB3aGVyZSBhcHBlYXJzIHRoZSBjb21tZW50OgorCisJICJGSVhNRTogc2hvdWxkIGNoZWNrIGZvciBPRU0vZ2xvYmFsIGhlYXAgY3Vyc29yIGhlcmUiCisKKwkgd2hpY2ggYXJlIG1vc3QgKGFsbD8pIHRoZSBvbmVzIHRoYXQgY2FsbCBGcmVlUmVzb3VyY2UsIGF0IGxlYXN0CisJIGluIHRoaXMgbW9kdWxlLiBNYXliZSB0aGlzIHNob3VsZCBnbyB0byBhIHdyYXBwZXIgdG8gYXZvaWQKKwkgcmVwZXRpdGlvbi4gT3I6IGNvdWxkbid0IGl0IGdvIHRvIEZyZWVSZXNvdXRjZSBpdHNlbGY/CisJIAorCSBJJ2xsIGxldCB0aGlzIHRvIHNvbWVvbmUgc2F2dnkgb24gdGhlIHN1YmplY3QuCisJICovCisgICAgICByZXR1cm4gKEdsb2JhbEZyZWUxNiAoaEN1cnNvcikgPT0gMCk7CiB9CiAKIApAQCAtODk2LDcgKzkxMSw5IEBACiB7CiAgICAgVFJBQ0UoY3Vyc29yLCAiJTA0eFxuIiwgaEN1cnNvciApOwogICAgIC8qIEZJWE1FOiBzaG91bGQgY2hlY2sgZm9yIE9FTS9nbG9iYWwgaGVhcCBjdXJzb3IgaGVyZSAqLwotICAgIHJldHVybiAoRnJlZVJlc291cmNlMzIoIGhDdXJzb3IgKSA9PSAwKTsKKyAgICAvKiBVbmxpa2UgRGVzdHJveUN1cnNvcjE2LCBvbmx5IGN1cnNvcnMgY3JlYXRlZCB3aXRoIENyZWF0ZUN1cnNvcjMyCisgICAgICAgYXJlIHZhbGlkIGZvciBEZXN0cm95Q3Vyc29yMzIsIHNvIGRvbid0IHVzZSBGcmVlUmVzb3VyY2UzMiAqLworICAgIHJldHVybiAoR2xvYmFsRnJlZTE2KCBoQ3Vyc29yICkgPT0gMCk7CiB9CiAKIApAQCAtMTU0MCw3ICsxNTU3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ljb25pbmZvLT5iUGxhbmVzLCBjaWNvbmluZm8tPmJCaXRzUGVyUGl4ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopKGNpY29uaW5mbyArIDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2ljb25pbmZvLT5uSGVpZ2h0ICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUTUFQX1dJRFRIX0JZVEVTKGNpY29uaW5mby0+bldpZHRoLDEpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVE1BUF9HZXRCaXRzV2lkdGggKGNpY29uaW5mby0+bldpZHRoLDEpICk7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUTUFQX1dJRFRIX0JZVEVTKGNpY29uaW5mby0+bldpZHRoLDEpICk7CiAgICAgaWNvbmluZm8tPmhibU1hc2sgPSBDcmVhdGVCaXRtYXAzMiAoIGNpY29uaW5mby0+bldpZHRoLCBjaWNvbmluZm8tPm5IZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDEsIChjaGFyICopKGNpY29uaW5mbyArIDEpKTsKIApkaWZmIC0tZ2l0IGEvb2JqZWN0cy9kaWIuYyBiL29iamVjdHMvZGliLmMKaW5kZXggNDEzZTIzMy4uM2IxYTgxYSAxMDA2NDQKLS0tIGEvb2JqZWN0cy9kaWIuYworKysgYi9vYmplY3RzL2RpYi5jCkBAIC0xOTc3LDEyICsxOTc3LDYgQEAKIAkgIGJpLT5iaVdpZHRoLCBiaS0+YmlIZWlnaHQsIGJpLT5iaVBsYW5lcywgYmktPmJpQml0Q291bnQsCiAJICBiaS0+YmlTaXplSW1hZ2UsIGJpLT5iaUNsclVzZWQsIHVzYWdlID09IERJQl9QQUxfQ09MT1JTPyAiUEFMIiA6ICJSR0IiKTsKIAotICAgIGlmIChiaS0+YmlDb21wcmVzc2lvbikKLSAgICB7Ci0JRklYTUUoYml0bWFwLCAiQ29tcHJlc3Npb24gbm90IGltcGxlbWVudGVkIVxuIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCiAgICAgYm0uYm1UeXBlID0gMDsKICAgICBibS5ibVdpZHRoID0gYmktPmJpV2lkdGg7CiAgICAgYm0uYm1IZWlnaHQgPSBiaS0+YmlIZWlnaHQ7CkBAIC0yMDA1LDExICsxOTk5LDEyIEBACiAgICAgLyogQ3JlYXRlIENvbG9yIE1hcCAqLwogICAgIGlmIChibS5ibUJpdHMgJiYgYm0uYm1CaXRzUGl4ZWwgPD0gOCkKICAgICB7Ci0gICAgICAgIERDICpkYyA9IChEQyAqKUdESV9HZXRPYmpQdHIoaGRjLCBEQ19NQUdJQyk7Ci0gICAgICAgIGlmICghZGMpIGRjID0gKERDICopR0RJX0dldE9ialB0cihoZGMsIE1FVEFGSUxFX0RDX01BR0lDKTsKKyAgICAgICAgREMgKmRjID0gaGRjPyAoREMgKilHRElfR2V0T2JqUHRyKGhkYywgRENfTUFHSUMpIDogTlVMTDsKKyAgICAgICAgaWYgKGhkYyAmJiAhZGMpIGRjID0gKERDICopR0RJX0dldE9ialB0cihoZGMsIE1FVEFGSUxFX0RDX01BR0lDKTsKIAotICAgICAgICBpZiAoZGMpIGNvbG9yTWFwID0gRElCX0J1aWxkQ29sb3JNYXAoIGRjLCB1c2FnZSwgYm0uYm1CaXRzUGl4ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1pLCAmbkNvbG9yTWFwICk7CisgICAgICAgIGlmICghaGRjIHx8IGRjKQorICAgICAgICAgICAgY29sb3JNYXAgPSBESUJfQnVpbGRDb2xvck1hcCggZGMsIHVzYWdlLCBibS5ibUJpdHNQaXhlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtaSwgJm5Db2xvck1hcCApOwogICAgICAgICBHRElfSEVBUF9VTkxPQ0soaGRjKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL29iamVjdHMvZm9udC5jIGIvb2JqZWN0cy9mb250LmMKaW5kZXggOGRhNzA4OS4uOTE0MzRkMyAxMDA2NDQKLS0tIGEvb2JqZWN0cy9mb250LmMKKysrIGIvb2JqZWN0cy9mb250LmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlICJtZXRhZmlsZS5oIgogI2luY2x1ZGUgIm9wdGlvbnMuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCiAKICNkZWZpbmUgRU5VTV9VTklDT0RFCTB4MDAwMDAwMDEKIApAQCAtMTI2MCw2ICsxMjYxLDMwIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHZXRGb250RGF0YTMyIFtHREkzMi4xODFdIFJldHJpZXZlIGRhdGEgZm9yIFRydWVUeXBlIGZvbnQKKyAqCisgKiBSRVRVUk5TCisgKgorICogc3VjY2VzczogTnVtYmVyIG9mIGJ5dGVzIHJldHVybmVkIAorICogZmFpbHVyZTogR0RJX0VSUk9SCisgKgorICogTk9URVMKKyAqCisgKiBDYWxscyBTZXRMYXN0RXJyb3IoKSAgCisgKgorICogQlVHUworICoKKyAqIFVuaW1wbGVtZW50ZWQKKyAqLworRFdPUkQgV0lOQVBJIEdldEZvbnREYXRhMzIoSERDMzIgaGRjLCBEV09SRCB0YWJsZSwgRFdPUkQgb2Zmc2V0LCAKKyAgICBMUFZPSUQgYnVmZmVyLCBEV09SRCBsZW5ndGgpCit7CisgICAgRklYTUUoZm9udCwgIigleCwlbGQsJWxkLCVwLCVsZCk6IHN0dWJcbiIsIAorICAgICAgICBoZGMsIHRhYmxlLCBvZmZzZXQsIGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOworICAgIHJldHVybiBHRElfRVJST1I7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBHZXRDaGFyYWN0ZXJQbGFjZW1lbnQzMkEgW0dESTMyLjE2MF0KZGlmZiAtLWdpdCBhL29sZS9mb2xkZXJzLmMgYi9vbGUvZm9sZGVycy5jCmluZGV4IDdiZTQyZWQuLjNkZGRlMTEgMTAwNjQ0Ci0tLSBhL29sZS9mb2xkZXJzLmMKKysrIGIvb2xlL2ZvbGRlcnMuYwpAQCAtNSw3ICs1LDcgQEAKICAqCUNvcHlyaWdodCAxOTk4CUp1ZXJnZW4gU2NobWllZAogICoKICAqICAhISEgY3VycmVudGx5IHdvcmsgaW4gcHJvZ3Jlc3Mgb24gYWxsIGNsYXNzZXMgISEhCi0gKiAgPGNvbnRhY3QganVlcmdlbi5zY2htaWVkQG1ldHJvbmV0LmRlLCA5ODA2MjQ+CisgKiAgPGNvbnRhY3QganVlcmdlbi5zY2htaWVkQG1ldHJvbmV0LmRlLCA5ODA4MDE+CiAgKi8KIAogI2luY2x1ZGUgPGN0eXBlLmg+CkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSAic2hsb2JqLmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKICNpbmNsdWRlICJ3aW5ubHMuaCIKKyNpbmNsdWRlICJ3aW5wcm9jLmgiCiAKIC8qIEZJWE1FIHNob3VsZCBiZSBtb3ZlZCB0byBhIGhlYWRlciBmaWxlLiBJc0VxdWFsR1VJRCAKIGlzIGRlY2xhcmVkIGJ1dCBub3QgZXhwb3J0ZWQgaW4gY29tcG9iai5jICEhISovCkBAIC0yOCwxNiArMjksMjAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICBHZXROZXh0RWxlbWVudCAoaW50ZXJuYWwgZnVuY3Rpb24pCiAgKgorICogZ2V0cyBhIHBhcnQgb2YgYSBzdHJpbmcgdGlsbCB0aGUgZmlyc3QgYmFja3NsYXNoCisgKgorICogUEFSQU1FVEVSUworICogIHBzek5leHQgW0lOXSBzdHJpbmcgdG8gZ2V0IHRoZSBlbGVtZW50IGZyb20KKyAqICBwc3pPdXQgIFtJTl0gcG9pbnRlciB0byBidWZmZXIgd2hpdGNoIHJlY2VpdmVzIHN0cmluZworICogIGR3T3V0ICAgW0lOXSBsZW5ndGggb2YgcHN6T3V0CisgKgogICogIFJFVFVSTlMKICAqICAgIExQU1RSIHBvaW50ZXIgdG8gZmlyc3QsIG5vdCB5ZXQgcGFyc2VkIGNoYXIKICAqLwotTFBTVFIgR2V0TmV4dEVsZW1lbnQoCi0gICAgTFBTVFIgcHN6TmV4dCwgLypbSU5dIHN0cmluZyB0byBnZXQgdGhlIGVsZW1lbnQgZnJvbSovCi0JCUxQU1RSIHBzek91dCwgIC8qW0lOXSBwb2ludGVyIHRvIGJ1ZmZlciB3aGl0Y2ggcmVjZWl2ZXMgc3RyaW5nKi8KLQkJRFdPUkQgZHdPdXQpICAgLypbSU5dIGxlbmd0aCBvZiBwc3pPdXQqLworTFBTVFIgR2V0TmV4dEVsZW1lbnQoTFBTVFIgcHN6TmV4dCxMUFNUUiBwc3pPdXQsRFdPUkQgZHdPdXQpCiB7IExQU1RSICAgcHN6VGFpbCA9IHBzek5leHQ7CiAgIERXT1JEIGR3Q29weTsKLSAgVFJBQ0Uoc2hlbGwsIiglcyAlcCAweCUwOGx4KVxuIixwc3pOZXh0LAlwc3pPdXQsIGR3T3V0KTsKKyAgVFJBQ0Uoc2hlbGwsIiglcyAlcCAweCUwOGx4KVxuIixkZWJ1Z3N0cl9hKHBzek5leHQpLHBzek91dCxkd091dCk7CiAKICAgaWYoIXBzek5leHQgfHwgISpwc3pOZXh0KQogICAgIHJldHVybiBOVUxMOwpAQCAtNTIsNyArNTcsNyBAQAogICB7ICBwc3pUYWlsKys7CiAJfQogCi0gIFRSQUNFKHNoZWxsLCItLSglcyAlcyAweCUwOGx4KVxuIixwc3pOZXh0LAlwc3pPdXQsIGR3T3V0KTsKKyAgVFJBQ0Uoc2hlbGwsIi0tKCVzICVzIDB4JTA4bHgpXG4iLGRlYnVnc3RyX2EocHN6TmV4dCksZGVidWdzdHJfYShwc3pPdXQpLGR3T3V0KTsKICAgcmV0dXJuIHBzelRhaWw7CiB9CiAKQEAgLTYzLDE2ICs2OCwxNiBAQAogc3RhdGljIFVMT05HIFdJTkFQSSBJQ2xhc3NGYWN0b3J5X0FkZFJlZihMUENMQVNTRkFDVE9SWSk7CiBzdGF0aWMgVUxPTkcgV0lOQVBJIElDbGFzc0ZhY3RvcnlfUmVsZWFzZShMUENMQVNTRkFDVE9SWSk7CiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSUNsYXNzRmFjdG9yeV9DcmVhdGVJbnN0YW5jZSgpOwotLypzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSUNsYXNzRmFjdG9yeV9Mb2NrU2VydmVyKCk7Ki8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJQ2xhc3NGYWN0b3J5X0xvY2tTZXJ2ZXIoKTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogIElDbGFzc0ZhY3RvcnlfVlRhYmxlCiAgKi8KLXN0YXRpYyBJQ2xhc3NGYWN0b3J5X1ZUYWJsZSBjbGZ2dCA9IHsKLQlJQ2xhc3NGYWN0b3J5X1F1ZXJ5SW50ZXJmYWNlLAorc3RhdGljIElDbGFzc0ZhY3RvcnlfVlRhYmxlIGNsZnZ0ID0gCit7IElDbGFzc0ZhY3RvcnlfUXVlcnlJbnRlcmZhY2UsCiAJSUNsYXNzRmFjdG9yeV9BZGRSZWYsCiAJSUNsYXNzRmFjdG9yeV9SZWxlYXNlLAogCUlDbGFzc0ZhY3RvcnlfQ3JlYXRlSW5zdGFuY2UsCi0vKglJQ2xhc3NGYWN0b3J5X0xvY2tTZXJ2ZXIqLworICBJQ2xhc3NGYWN0b3J5X0xvY2tTZXJ2ZXIKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTQzLDcgKzE0OCw3IEBACiAJY2hhcgl4cmlpZFs1MF07CiAKICAgV0lORV9TdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpcmlpZCx4cmlpZCk7Ci0gIFRSQUNFKHNoZWxsLCIlcC0+KCVwLFxuXHRJSUQ6XHQlcylcbiIsdGhpcyxwVW5rbm93bix4cmlpZCk7CisgIFRSQUNFKHNoZWxsLCIlcC0+KCVwLFxuXHRJSUQ6XHQlcywlcClcbiIsdGhpcyxwVW5rbm93bix4cmlpZCxwcE9iamVjdCk7CiAKIAkqcHBPYmplY3QgPSBOVUxMOwogCQkKQEAgLTE1NCw2ICsxNTksMTIgQEAKIAlpZiAoSXNFcXVhbElJRChyaWlkLCAmSUlEX0lTaGVsbEZvbGRlcikpCiAgIHsgcE9iaiA9IChJVW5rbm93biAqKUlTaGVsbEZvbGRlcl9Db25zdHJ1Y3RvcihOVUxMLE5VTEwpOwogICB9IAorICBlbHNlIGlmIChJc0VxdWFsSUlEKHJpaWQsICZJSURfSVNoZWxsVmlldykpCisgIHsgcE9iaiA9IChJVW5rbm93biAqKUlTaGVsbFZpZXdfQ29uc3RydWN0b3IoKTsKKyAgfSAKKyAgZWxzZSBpZiAoSXNFcXVhbElJRChyaWlkLCAmSUlEX0lTaGVsbExpbmspKQorICB7IHBPYmogPSAoSVVua25vd24gKilJU2hlbGxMaW5rX0NvbnN0cnVjdG9yKCk7CisgIH0gCiAJZWxzZQogCXsgRVJSKHNoZWxsLCJ1bmtub3duIElJRCByZXF1ZXN0ZWRcblx0SUlEOlx0JXNcbiIseHJpaWQpOwogCSAgcmV0dXJuKEVfTk9JTlRFUkZBQ0UpOwpAQCAtMTcyLDEyICsxODMsMTEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIElDbGFzc0ZhY3RvcnlfTG9ja1NlcnZlcgogICovCi0vKnN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJQ2xhc3NGYWN0b3J5X0xvY2tTZXJ2ZXIoTFBDTEFTU0ZBQ1RPUlkgdGhpcywgQk9PTCkKLXsgVFJBQ0Uoc2hlbGwsIiVwLT4oKSwgbm90IGltcGxlbWVudGVkXG4iLHRoaXMpCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSUNsYXNzRmFjdG9yeV9Mb2NrU2VydmVyKExQQ0xBU1NGQUNUT1JZIHRoaXMsIEJPT0wzMiBmTG9jaykKK3sgVFJBQ0Uoc2hlbGwsIiVwLT4oMHgleCksIG5vdCBpbXBsZW1lbnRlZFxuIix0aGlzLCBmTG9jayk7CiAgIHJldHVybiBFX05PVElNUEw7CiB9CiAKLSovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICBJRW51bUlETGlzdCBJbXBsZW1lbnRhdGlvbgogICovCkBAIC0xOTQsOCArMjA0LDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogIElFbnVtSURMaXN0X1ZUYWJsZQogICovCi1zdGF0aWMgSUVudW1JRExpc3RfVlRhYmxlIGVpZGx2dCA9IHsKLQlJRW51bUlETGlzdF9RdWVyeUludGVyZmFjZSwKK3N0YXRpYyBJRW51bUlETGlzdF9WVGFibGUgZWlkbHZ0ID0gCit7IElFbnVtSURMaXN0X1F1ZXJ5SW50ZXJmYWNlLAogCUlFbnVtSURMaXN0X0FkZFJlZiwKIAlJRW51bUlETGlzdF9SZWxlYXNlLAogCUlFbnVtSURMaXN0X05leHQsCkBAIC0yMjEsNyArMjMxLDcgQEAKIAlscGVpZGwtPm1wTGFzdD1OVUxMOwogCWxwZWlkbC0+bXBDdXJyZW50PU5VTEw7CiAKLSAgVFJBQ0Uoc2hlbGwsIiglcCktPiglcyAweCUwOGx4ICVwKVxuIixscGVpZGwsbHBzelBhdGgsZHdGbGFncyxwUmVzdWx0KTsKKyAgVFJBQ0Uoc2hlbGwsIiglcCktPiglcyAweCUwOGx4ICVwKVxuIixscGVpZGwsZGVidWdzdHJfYShscHN6UGF0aCksZHdGbGFncyxwUmVzdWx0KTsKIAogCWxwZWlkbC0+bXBQaWRsTWdyPVBpZGxNZ3JfQ29uc3RydWN0b3IoKTsKICAgaWYgKCFscGVpZGwtPm1wUGlkbE1ncikKQEAgLTMwMCwxMSArMzEwLDE2IEBACiAJTFBFTlVNSURMSVNUIHRoaXMsVUxPTkcgY2VsdCxMUElURU1JRExJU1QgKiByZ2VsdCxVTE9ORyAqcGNlbHRGZXRjaGVkKSAKIHsgVUxPTkcgICAgaTsKICAgSFJFU1VMVCAgaHIgPSBTX09LOwotCiAgIExQSVRFTUlETElTVCAgdGVtcDsKIAogCVRSQUNFKHNoZWxsLCIoJXApLT4oJWxkLCVwLCAlcClcbiIsdGhpcyxjZWx0LHJnZWx0LHBjZWx0RmV0Y2hlZCk7CiAKKyAgLyogSXQgaXMgdmFsaWQgdG8gbGVhdmUgcGNlbHRGZXRjaGVkIE5VTEwgd2hlbiBjZWx0IGlzIDEuIFNvbWUgb2YgZXhwbG9yZXIncworICAgICBzdWJzeXN0ZW1zIGFjdHVhbGx5IHVzZSBpdCAoYW5kIHNvIG1heSBhIHRoaXJkIHBhcnR5IGJyb3dzZXIpCisgICAqLworICBpZihwY2VsdEZldGNoZWQpCisgICAgKnBjZWx0RmV0Y2hlZCA9IDA7CisKIAkqcmdlbHQ9MDsKIAkKICAgaWYoY2VsdCA+IDEgJiYgIXBjZWx0RmV0Y2hlZCkKQEAgLTMxNiw3ICszMzEsNyBAQAogICAgIHsgaHIgPSAgU19GQUxTRTsKICAgICAgIGJyZWFrOwogICAgIH0KLQkJdGVtcCA9IHRoaXMtPm1wUGlkbE1nci0+bHB2dGJsLT5mbkNvcHkodGhpcy0+bXBQaWRsTWdyLCB0aGlzLT5tcEN1cnJlbnQtPnBpZGwpOworICAgIHRlbXAgPSBJTENsb25lKHRoaXMtPm1wQ3VycmVudC0+cGlkbCk7CiAgICAgcmdlbHRbaV0gPSB0ZW1wOwogICAgIHRoaXMtPm1wQ3VycmVudCA9IHRoaXMtPm1wQ3VycmVudC0+cE5leHQ7CiAgIH0KQEAgLTM3MSw1MyArMzg2LDc4IEBACiB7IExQSVRFTUlETElTVCAgIHBpZGw9TlVMTDsKICAgV0lOMzJfRklORF9EQVRBMzJBIHN0ZmZpbGU7CQogICBIQU5ETEUzMiBoRmlsZTsKLQkKLSAgVFJBQ0Uoc2hlbGwsIiglcCktPiglcyAweCUwOGx4KSBcbiIsdGhpcyxscHN6UGF0aCxkd0ZsYWdzKTsKKyAgRFdPUkQgZHdEcml2ZW1hcDsKKyAgQ0hBUiAgc3pEcml2ZU5hbWVbNF07CisgIENIQVIgIHN6UGF0aFtNQVhfUEFUSF07CisgICAgCisgIFRSQUNFKHNoZWxsLCIoJXApLT4oJXMgMHglMDhseCkgXG4iLHRoaXMsZGVidWdzdHJfYShscHN6UGF0aCksZHdGbGFncyk7CisKKyAgaWYgKGxwc3pQYXRoICYmIGxwc3pQYXRoWzBdIT0nXDAnKQorICB7IHN0cmNweShzelBhdGgsIGxwc3pQYXRoKTsKKyAgICBQYXRoQWRkQmFja3NsYXNoKHN6UGF0aCk7CisgICAgc3RyY2F0KHN6UGF0aCwiKi4qIik7CisgIH0KIAogICAvKmVudW1lcmF0ZSB0aGUgZm9sZGVycyovCiAgIGlmKGR3RmxhZ3MgJiBTSENPTlRGX0ZPTERFUlMpCiAgIHsJLyogc3BlY2lhbCBjYXNlIC0gd2UgY2FuJ3QgZW51bWVyYXRlIHRoZSBEZXNrdG9wIGxldmVsIE9iamVjdHMgKE15Q29tcHV0ZXIsTmV0aG9vZC4uLgogICAgIHNvIHdlIG5lZWQgdG8gZmFrZSBhbiBlbnVtZXJhdGlvbiBvZiB0aG9zZS4qLwogCSAgaWYoIWxwc3pQYXRoKQotICAgIHsgVFJBQ0UgKHNoZWxsLCIoJXApLT4gZW51bWVyYXRlIHRoZSBzcGVjaWFsLWZvbGRlciBpdGVtc1xuIix0aGlzKTsKKyAgICB7IFRSQUNFIChzaGVsbCwiLS0gKCVwKS0+IGVudW1lcmF0ZSBTSENPTlRGX0ZPTERFUlMgKHNwZWNpYWwpIGl0ZW1zXG4iLHRoaXMpOwogICAJCS8vY3JlYXRlIHRoZSBwaWRsIGZvciB0aGlzIGl0ZW0KLSAgICAgIHBpZGwgPSB0aGlzLT5tcFBpZGxNZ3ItPmxwdnRibC0+Zm5DcmVhdGVEZXNrdG9wKHRoaXMtPm1wUGlkbE1ncik7CisgICAgICBwaWRsID0gdGhpcy0+bXBQaWRsTWdyLT5scHZ0YmwtPmZuQ3JlYXRlTXlDb21wdXRlcih0aGlzLT5tcFBpZGxNZ3IpOworICAgICAgaWYocGlkbCkKKyAgICAgIHsgaWYoIUlFbnVtSURMaXN0X0FkZFRvRW51bUxpc3QodGhpcywgcGlkbCkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICB9ICAgCisgICAgZWxzZSBpZiAobHBzelBhdGhbMF09PSdcMCcpIC8qIGVudW1lcmF0ZSB0aGUgZHJpdmVzKi8KKyAgICB7IFRSQUNFIChzaGVsbCwiLS0gKCVwKS0+IGVudW1lcmF0ZSBTSENPTlRGX0ZPTERFUlMgKGRyaXZlcylcbiIsdGhpcyk7CisgICAgICBkd0RyaXZlbWFwID0gR2V0TG9naWNhbERyaXZlcygpOworICAgICAgc3RyY3B5IChzekRyaXZlTmFtZSwiQTpcXCIpOworICAgICAgd2hpbGUgKHN6RHJpdmVOYW1lWzBdPD0nWicpCisgICAgICB7IGlmKGR3RHJpdmVtYXAgJiAweDAwMDAwMDAxTCkKKyAgICAgICAgeyBwaWRsID0gdGhpcy0+bXBQaWRsTWdyLT5scHZ0YmwtPmZuQ3JlYXRlRHJpdmUodGhpcy0+bXBQaWRsTWdyLHN6RHJpdmVOYW1lICk7CiAgICAgICBpZihwaWRsKQogICAgICAgeyBpZighSUVudW1JRExpc3RfQWRkVG9FbnVtTGlzdCh0aGlzLCBwaWRsKSkKICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7IHJldHVybiBGQUxTRTsKICAgICAgIH0KKyAgICAgICAgc3pEcml2ZU5hbWVbMF0rKzsKKyAgICAgICAgZHdEcml2ZW1hcCA9IGR3RHJpdmVtYXAgPj4gMTsKICAgICAgfSAgIAorICAgIH0KKyAgICAKICAgICAgZWxzZQotICAgICB7IFRSQUNFIChzaGVsbCwiKCVwKS0+IGVudW1lcmF0ZSB0aGUgZm9sZGVyIGl0ZW1zIGZvciAlc1xuIix0aGlzLGxwc3pQYXRoKTsKLQkJICAgaEZpbGUgPSBGaW5kRmlyc3RGaWxlMzJBKGxwc3pQYXRoLCZzdGZmaWxlKTsKLSAgICAgICBkbwotICAgICAgIHsgaWYgKHN0ZmZpbGUuZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkKLSAgICAgICAgIC8vY3JlYXRlIHRoZSBwaWRsIGZvciB0aGlzIGl0ZW0KLSAgICAgICAgIC8qIGZpeG1lOiB0aGUgc2hvcnRuYW1lIHNob3VsZCBiZSBnaXZlbiB0b28qLwotICAgICAgICAgcGlkbCA9IHRoaXMtPm1wUGlkbE1nci0+bHB2dGJsLT5mbkNyZWF0ZUZvbGRlcih0aGlzLT5tcFBpZGxNZ3IsIHN0ZmZpbGUuY0ZpbGVOYW1lKTsKKyAgICB7IFRSQUNFIChzaGVsbCwiLS0gKCVwKS0+IGVudW1lcmF0ZSBTSENPTlRGX0ZPTERFUlMgb2YgJXNcbiIsdGhpcyxkZWJ1Z3N0cl9hKHN6UGF0aCkpOworICAgICAgaEZpbGUgPSBGaW5kRmlyc3RGaWxlMzJBKHN6UGF0aCwmc3RmZmlsZSk7CisgICAgICBpZiAoIGhGaWxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFMzIgKQorICAgICAgeyBkbworICAgICAgICB7IGlmICggKHN0ZmZpbGUuZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkgJiYgc3RyY21wIChzdGZmaWxlLmNGaWxlTmFtZSwgIi4iKSAmJiBzdHJjbXAgKHN0ZmZpbGUuY0ZpbGVOYW1lLCAiLi4iKSkKKyAgICAgICAgICB7IHBpZGwgPSB0aGlzLT5tcFBpZGxNZ3ItPmxwdnRibC0+Zm5DcmVhdGVGb2xkZXIodGhpcy0+bXBQaWRsTWdyLCBzdGZmaWxlLmNGaWxlTmFtZSk7CiAgICAgICAgICBpZihwaWRsKQogICAgICAgICAgeyBpZighSUVudW1JRExpc3RfQWRkVG9FbnVtTGlzdCh0aGlzLCBwaWRsKSkKLSAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICB7ICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlCiAgICAgICAgICB7IHJldHVybiBGQUxTRTsKICAgICAgICAgIH0gICAKKyAgICAgICAgICAgfQogICAgICAgfSB3aGlsZSggRmluZE5leHRGaWxlMzJBKGhGaWxlLCZzdGZmaWxlKSk7CiAJCQlGaW5kQ2xvc2UzMiAoaEZpbGUpOwogICAgIH0KICAgfSAgIAorICB9ICAgCiAgIC8vZW51bWVyYXRlIHRoZSBub24tZm9sZGVyIGl0ZW1zICh2YWx1ZXMpCiAgIGlmKGR3RmxhZ3MgJiBTSENPTlRGX05PTkZPTERFUlMpCi0gIHsgVFJBQ0UgKHNoZWxsLCIoJXApLT4gZW51bWVyYXRlIHRoZSBub24tZm9sZGVyIGl0ZW1zICh2YWx1ZXMpIG9mICVzXG4iLHRoaXMsbHBzelBhdGgpOwotCSAgaEZpbGUgPSBGaW5kRmlyc3RGaWxlMzJBKGxwc3pQYXRoLCZzdGZmaWxlKTsKLSAgICBkbworICB7IGlmKGxwc3pQYXRoKQorICAgIHsgVFJBQ0UgKHNoZWxsLCItLSAoJXApLT4gZW51bWVyYXRlIFNIQ09OVEZfTk9ORk9MREVSUyBvZiAlc1xuIix0aGlzLGRlYnVnc3RyX2Eoc3pQYXRoKSk7CisgICAgICBoRmlsZSA9IEZpbmRGaXJzdEZpbGUzMkEoc3pQYXRoLCZzdGZmaWxlKTsKKyAgICAgIGlmICggaEZpbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMiApCisgICAgICB7IGRvCiAgICAgeyBpZiAoISAoc3RmZmlsZS5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSApCi0JCSAgLy9jcmVhdGUgdGhlIHBpZGwgZm9yIHRoaXMgaXRlbQotCQkJLyogZml4bWU6IHRoZSBzaG9ydG5hbWUgc2hvdWxkIGJlIGdpdmVuIHRvbyovCi0gICAgICBwaWRsID0gdGhpcy0+bXBQaWRsTWdyLT5scHZ0YmwtPmZuQ3JlYXRlRm9sZGVyKHRoaXMtPm1wUGlkbE1nciwgc3RmZmlsZS5jRmlsZU5hbWUpOworICAgICAgICAgIHsgcGlkbCA9IHRoaXMtPm1wUGlkbE1nci0+bHB2dGJsLT5mbkNyZWF0ZVZhbHVlKHRoaXMtPm1wUGlkbE1nciwgc3RmZmlsZS5jRmlsZU5hbWUpOwogICAgICAgaWYocGlkbCkKICAgICAgIHsgaWYoIUlFbnVtSURMaXN0X0FkZFRvRW51bUxpc3QodGhpcywgcGlkbCkpCiAgICAgICAgIHsgcmV0dXJuIEZBTFNFOwpAQCAtNDI2LDkgKzQ2NiwxMiBAQAogICAgICAgZWxzZQogICAgICAgeyByZXR1cm4gRkFMU0U7CiAgICAgICB9ICAgCisgICAgICAgICAgfQogICAgIH0gd2hpbGUoIEZpbmROZXh0RmlsZTMyQShoRmlsZSwmc3RmZmlsZSkpOwogCSAgRmluZENsb3NlMzIgKGhGaWxlKTsKICAgfSAKKyAgICB9CisgIH0gCiAgIHJldHVybiBUUlVFOwogfQogCkBAIC00NTgsNyArNTAxLDcgQEAKICAgIAogICAgIC8vdXBkYXRlIHRoZSBsYXN0IGl0ZW0gcG9pbnRlcgogICAgIHRoaXMtPm1wTGFzdCA9IHBOZXc7Ci0JCVRSQUNFKHNoZWxsLCIoJXApLT4oZmlyc3Q9JXAsIGxhc3Q9JXApXG4iLHRoaXMsdGhpcy0+bXBGaXJzdCx0aGlzLT5tcExhc3QpOworICAgIFRSQUNFKHNoZWxsLCItLSAoJXApLT4oZmlyc3Q9JXAsIGxhc3Q9JXApXG4iLHRoaXMsdGhpcy0+bXBGaXJzdCx0aGlzLT5tcExhc3QpOwogICAgIHJldHVybiBUUlVFOwogICB9CiAgIHJldHVybiBGQUxTRTsKQEAgLTQ3NCwyMSArNTE3LDI5MSBAQAogICB3aGlsZSh0aGlzLT5tcEZpcnN0KQogICB7IHBEZWxldGUgPSB0aGlzLT5tcEZpcnN0OwogICAgIHRoaXMtPm1wRmlyc3QgPSBwRGVsZXRlLT5wTmV4dDsKLQotICAgIC8vZnJlZSB0aGUgcGlkbAotICAgIHRoaXMtPm1wUGlkbE1nci0+bHB2dGJsLT5mbkRlbGV0ZSh0aGlzLT5tcFBpZGxNZ3IscERlbGV0ZS0+cGlkbCk7Ci0gICAKLSAgICAvL2ZyZWUgdGhlIGxpc3QgaXRlbQotCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAscERlbGV0ZSk7CisgICAgU0hGcmVlKHBEZWxldGUtPnBpZGwpOworICAgIFNIRnJlZShwRGVsZXRlKTsKICAgfQogICB0aGlzLT5tcEZpcnN0ID0gdGhpcy0+bXBMYXN0ID0gdGhpcy0+bXBDdXJyZW50ID0gTlVMTDsKICAgcmV0dXJuIFRSVUU7CiB9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBJU2hlbGxWaWV3IGltcGxlbWVudGF0aW9uCisqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfUXVlcnlJbnRlcmZhY2UoTFBTSEVMTFZJRVcsUkVGSUlEIHJpaWQsIExQVk9JRCAqcHB2T2JqKTsKK3N0YXRpYyBVTE9ORyBXSU5BUEkgSVNoZWxsVmlld19BZGRSZWYoTFBTSEVMTFZJRVcpIDsKK3N0YXRpYyBVTE9ORyBXSU5BUEkgSVNoZWxsVmlld19SZWxlYXNlKExQU0hFTExWSUVXKTsKKworICAgIC8vICoqKiBJT2xlV2luZG93IG1ldGhvZHMgKioqCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19HZXRXaW5kb3coTFBTSEVMTFZJRVcsSFdORDMyICogbHBod25kKTsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X0NvbnRleHRTZW5zaXRpdmVIZWxwKExQU0hFTExWSUVXLEJPT0wzMiBmRW50ZXJNb2RlKTsKKworICAgIC8vICoqKiBJU2hlbGxWaWV3IG1ldGhvZHMgKioqCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19UcmFuc2xhdGVBY2NlbGVyYXRvcihMUFNIRUxMVklFVyxMUE1TRzMyIGxwbXNnKTsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X0VuYWJsZU1vZGVsZXNzKExQU0hFTExWSUVXLEJPT0wzMiBmRW5hYmxlKTsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X1VJQWN0aXZhdGUoTFBTSEVMTFZJRVcsVUlOVDMyIHVTdGF0ZSk7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19SZWZyZXNoKExQU0hFTExWSUVXKTsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X0NyZWF0ZVZpZXdXaW5kb3coTFBTSEVMTFZJRVcsIElTaGVsbFZpZXcgKmxwUHJldlZpZXcsTFBDRk9MREVSU0VUVElOR1MgbHBmcywgSVNoZWxsQnJvd3NlciAqIHBzYixSRUNUMzIgKiBwcmNWaWV3LCBIV05EMzIgICpwaFduZCk7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19EZXN0cm95Vmlld1dpbmRvdyhMUFNIRUxMVklFVyk7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19HZXRDdXJyZW50SW5mbyhMUFNIRUxMVklFVywgTFBGT0xERVJTRVRUSU5HUyBscGZzKTsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X0FkZFByb3BlcnR5U2hlZXRQYWdlcyhMUFNIRUxMVklFVywgRFdPUkQgZHdSZXNlcnZlZCxMUEZOQUREUFJPUFNIRUVUUEFHRSBscGZuLCBMUEFSQU0gbHBhcmFtKTsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X1NhdmVWaWV3U3RhdGUoTFBTSEVMTFZJRVcpOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfU2VsZWN0SXRlbShMUFNIRUxMVklFVywgTFBDSVRFTUlETElTVCBwaWRsSXRlbSwgVUlOVDMyIHVGbGFncyk7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19HZXRJdGVtT2JqZWN0KExQU0hFTExWSUVXLCBVSU5UMzIgdUl0ZW0sIFJFRklJRCByaWlkLExQVk9JRCAqcHB2KTsKKworc3RhdGljIHN0cnVjdCBJU2hlbGxWaWV3X1ZUYWJsZSBzdnZ0ID0gCit7IElTaGVsbFZpZXdfUXVlcnlJbnRlcmZhY2UsCisgIElTaGVsbFZpZXdfQWRkUmVmLAorICBJU2hlbGxWaWV3X1JlbGVhc2UsCisgIElTaGVsbFZpZXdfR2V0V2luZG93LAorICBJU2hlbGxWaWV3X0NvbnRleHRTZW5zaXRpdmVIZWxwLAorICBJU2hlbGxWaWV3X1RyYW5zbGF0ZUFjY2VsZXJhdG9yLAorICBJU2hlbGxWaWV3X0VuYWJsZU1vZGVsZXNzLAorICBJU2hlbGxWaWV3X1VJQWN0aXZhdGUsCisgIElTaGVsbFZpZXdfUmVmcmVzaCwKKyAgSVNoZWxsVmlld19DcmVhdGVWaWV3V2luZG93LAorICBJU2hlbGxWaWV3X0Rlc3Ryb3lWaWV3V2luZG93LAorICBJU2hlbGxWaWV3X0dldEN1cnJlbnRJbmZvLAorICBJU2hlbGxWaWV3X0FkZFByb3BlcnR5U2hlZXRQYWdlcywKKyAgSVNoZWxsVmlld19TYXZlVmlld1N0YXRlLAorICBJU2hlbGxWaWV3X1NlbGVjdEl0ZW0sCisgIElTaGVsbFZpZXdfR2V0SXRlbU9iamVjdAorfTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgSVNoZWxsVmlld19Db25zdHJ1Y3RvcgorKi8KK0xQU0hFTExWSUVXIElTaGVsbFZpZXdfQ29uc3RydWN0b3IoTFBTSEVMTEZPTERFUiBwRm9sZGVyLCBMUENJVEVNSURMSVNUIHBpZGwpCit7IExQU0hFTExWSUVXIHN2OworICBzdj0oTFBTSEVMTFZJRVcpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoSVNoZWxsVmlldykpOworICBzdi0+cmVmPTE7CisgIHN2LT5scHZ0Ymw9JnN2dnQ7CisgIAorICBzdi0+bXBpZGwgPSBJTENsb25lKHBpZGwpOworCisgIHN2LT5wU0ZQYXJlbnQgPSBwRm9sZGVyOworICBpZihzdi0+cFNGUGFyZW50KQorICAgIHN2LT5wU0ZQYXJlbnQtPmxwdnRibC0+Zm5BZGRSZWYoc3YtPnBTRlBhcmVudCk7CisKKyAgVFJBQ0Uoc2hlbGwsIiglcCktPiglcCBwaWRsPSVwKVxuIixzdiwgcEZvbGRlciwgcGlkbCk7CisgIHJldHVybiBzdjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgU2hlbGxWaWV3X1duZFByb2MKKyovCitMUkVTVUxUIENBTExCQUNLIFNoZWxsVmlld19XbmRQcm9jKEhXTkQzMiBoV25kLCBVSU5UMzIgdU1lc3NhZ2UsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sgTFBTSEVMTFZJRVcgcFRoaXMgPSAoTFBTSEVMTFZJRVcpR2V0V2luZG93TG9uZzMyQShoV25kLCBHV0xfVVNFUkRBVEEpOworICBMUENSRUFURVNUUlVDVDMyQSBscGNzOworCisgIEZJWE1FKHNoZWxsLCIoaHduZD0leCBtc2c9JXggd3Bhcm09JXggbHBhcm09JWx4KVxuIixoV25kLCB1TWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOworICAgIAorICBzd2l0Y2ggKHVNZXNzYWdlKQorICB7IGNhc2UgV01fTkNDUkVBVEU6CisgICAgICB7IFRSQUNFKHNoZWxsLCJXTV9OQ0NSRUFURVxuIik7CisgICAgICAgIGxwY3MgPSAoTFBDUkVBVEVTVFJVQ1QzMkEpbFBhcmFtOworICAgICAgICBwVGhpcyA9IChMUFNIRUxMVklFVykobHBjcy0+bHBDcmVhdGVQYXJhbXMpOworICAgICAgICBTZXRXaW5kb3dMb25nMzJBKGhXbmQsIEdXTF9VU0VSREFUQSwgKExPTkcpcFRoaXMpOworCisgICAgICAgIC8vc2V0IHRoZSB3aW5kb3cgaGFuZGxlCisgICAgICAgIHBUaGlzLT5oV25kID0gaFduZDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgCisgICBjYXNlIFdNX1NJWkU6CisgICAgICBUUkFDRShzaGVsbCwiV01fU0laRVxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAKKyAgIGNhc2UgV01fQ1JFQVRFOgorICAgICAgVFJBQ0Uoc2hlbGwsIldNX0NSRUFURVxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAKKyAgIGNhc2UgV01fU0VURk9DVVM6CisgICAgICBUUkFDRShzaGVsbCwiV01fU0VURk9DVVNcbiIpOyAgIAorICAgICAgcmV0dXJuIEZBTFNFOworICAgCisgICBjYXNlIFdNX0tJTExGT0NVUzoKKyAgICAgIFRSQUNFKHNoZWxsLCJXTV9LSUxMRk9DVVNcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworCisgICBjYXNlIFdNX0FDVElWQVRFOgorICAgICAgVFJBQ0Uoc2hlbGwsIldNX0FDVElWQVRFXG4iKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgIAorICAgY2FzZSBXTV9DT01NQU5EOgorICAgICAgVFJBQ0Uoc2hlbGwsIldNX0NPTU1BTkRcbiIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgCisgICBjYXNlIFdNX0lOSVRNRU5VUE9QVVA6CisgICAgICBUUkFDRShzaGVsbCwiV01fSU5JVE1FTlVQT1BVUFxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAKKyAgIGNhc2UgV01fTk9USUZZOgorICAgICAgVFJBQ0Uoc2hlbGwsIldNX05PVElGWVxuIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAKKy8qICAgY2FzZSBXTV9TRVRUSU5HQ0hBTkdFOgorICAgICAgcmV0dXJuIEZBTFNFOyovCisgIH0KKworICByZXR1cm4gRGVmV2luZG93UHJvYzMyQSAoaFduZCwgdU1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIElTaGVsbFZpZXc6OlF1ZXJ5SW50ZXJmYWNlCisqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfUXVlcnlJbnRlcmZhY2UoTFBTSEVMTFZJRVcgdGhpcyxSRUZJSUQgcmlpZCwgTFBWT0lEICpwcHZPYmopCit7IGNoYXIgICAgeHJpaWRbNTBdOworICBXSU5FX1N0cmluZ0Zyb21DTFNJRCgoTFBDTFNJRClyaWlkLHhyaWlkKTsKKyAgVFJBQ0Uoc2hlbGwsIiglcCktPihcblx0SUlEOlx0JXMsJXApXG4iLHRoaXMseHJpaWQscHB2T2JqKTsKKworICAqcHB2T2JqID0gTlVMTDsKKworICBpZihJc0VxdWFsSUlEKHJpaWQsICZJSURfSVVua25vd24pKSAgICAgICAgICAvKklVbmtub3duKi8KKyAgeyAqcHB2T2JqID0gdGhpczsgCisgIH0KKyAgZWxzZSBpZihJc0VxdWFsSUlEKHJpaWQsICZJSURfSVNoZWxsVmlldykpICAvKklTaGVsbFZpZXcqLworICB7ICpwcHZPYmogPSAoSVNoZWxsVmlldyopdGhpczsKKyAgfSAgIAorCisgIGlmKCpwcHZPYmopCisgIHsgKCooTFBTSEVMTFZJRVcqKXBwdk9iaiktPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7ICAgICAgCisgICAgVFJBQ0Uoc2hlbGwsIi0tIEludGVyZmFjZTogKCVwKS0+KCVwKVxuIixwcHZPYmosKnBwdk9iaik7CisgICAgcmV0dXJuIFNfT0s7CisgIH0KKyAgVFJBQ0Uoc2hlbGwsIi0tIEludGVyZmFjZTogRV9OT0lOVEVSRkFDRVxuIik7CisgIHJldHVybiBFX05PSU5URVJGQUNFOworfSAgIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBJU2hlbGxWaWV3OjpBZGRSZWYKKyovCitzdGF0aWMgVUxPTkcgV0lOQVBJIElTaGVsbFZpZXdfQWRkUmVmKExQU0hFTExWSUVXIHRoaXMpCit7IFRSQUNFKHNoZWxsLCIoJXApLT4oY291bnQ9JWx1KVxuIix0aGlzLCh0aGlzLT5yZWYpKzEpOworICByZXR1cm4gKysodGhpcy0+cmVmKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgSVNoZWxsVmlldzo6UmVsZWFzZQorKi8KK3N0YXRpYyBVTE9ORyBXSU5BUEkgSVNoZWxsVmlld19SZWxlYXNlKExQU0hFTExWSUVXIHRoaXMpCit7IFRSQUNFKHNoZWxsLCIoJXApLT4oKVxuIix0aGlzKTsKKyAgaWYgKCEtLSh0aGlzLT5yZWYpKSAKKyAgeyBUUkFDRShzaGVsbCwiIGRlc3Ryb3lpbmcgSUVudW1JRExpc3QoJXApXG4iLHRoaXMpOworCisgICAgaWYodGhpcy0+cFNGUGFyZW50KQorICAgICAgIHRoaXMtPnBTRlBhcmVudC0+bHB2dGJsLT5mblJlbGVhc2UodGhpcy0+cFNGUGFyZW50KTsKKworICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCx0aGlzKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gdGhpcy0+cmVmOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBJU2hlbGxWaWV3OjpHZXRXaW5kb3cKKyovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19HZXRXaW5kb3coTFBTSEVMTFZJRVcgdGhpcyxIV05EMzIgKiBwaFduZCkKK3sgVFJBQ0Uoc2hlbGwsIiglcCkgc3R1YlxuIix0aGlzKTsKKyAqcGhXbmQgPSB0aGlzLT5oV25kOworCisgcmV0dXJuIFNfT0s7Cit9CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19Db250ZXh0U2Vuc2l0aXZlSGVscChMUFNIRUxMVklFVyB0aGlzLEJPT0wzMiBmRW50ZXJNb2RlKQoreyBGSVhNRShzaGVsbCwiKCVwKSBzdHViXG4iLHRoaXMpOworICByZXR1cm4gRV9OT1RJTVBMOworfQorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfVHJhbnNsYXRlQWNjZWxlcmF0b3IoTFBTSEVMTFZJRVcgdGhpcyxMUE1TRzMyIGxwbXNnKQoreyBGSVhNRShzaGVsbCwiKCVwKS0+KCVwKSBzdHViXG4iLHRoaXMsbHBtc2cpOworICByZXR1cm4gRV9OT1RJTVBMOworfQorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfRW5hYmxlTW9kZWxlc3MoTFBTSEVMTFZJRVcgdGhpcyxCT09MMzIgZkVuYWJsZSkKK3sgRklYTUUoc2hlbGwsIiglcCkgc3R1YlxuIix0aGlzKTsKKyAgcmV0dXJuIEVfTk9USU1QTDsKK30KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X1VJQWN0aXZhdGUoTFBTSEVMTFZJRVcgdGhpcyxVSU5UMzIgdVN0YXRlKQoreyBGSVhNRShzaGVsbCwiKCVwKSBzdHViXG4iLHRoaXMpOworICByZXR1cm4gRV9OT1RJTVBMOworfQorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfUmVmcmVzaChMUFNIRUxMVklFVyB0aGlzKQoreyBGSVhNRShzaGVsbCwiKCVwKSBzdHViXG4iLHRoaXMpOworICByZXR1cm4gU19PSzsKK30KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X0NyZWF0ZVZpZXdXaW5kb3coTFBTSEVMTFZJRVcgdGhpcywgSVNoZWxsVmlldyAqbHBQcmV2VmlldywKKyAgICAgICAgICAgICAgICAgICAgIExQQ0ZPTERFUlNFVFRJTkdTIGxwZnMsIElTaGVsbEJyb3dzZXIgKiBwc2IsUkVDVDMyICogcHJjVmlldywgSFdORDMyICAqcGhXbmQpCit7ICBXTkRDTEFTUzMyQSB3YzsKKyAgICpwaFduZCA9IDA7CisKKyAgIFRSQUNFKHNoZWxsLCIoJXApLT4oc2hsdmlldz0lcCBzZXQ9JXAgc2hsYnJzPSVwIHJlYz0lcCBod25kPSVwKSBpbmNvbXBsZXRlXG4iLHRoaXMsIGxwUHJldlZpZXcsbHBmcywgcHNiLCBwcmNWaWV3LCBwaFduZCk7CisKKy8vaWYgb3VyIHdpbmRvdyBjbGFzcyBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZCwgdGhlbiBkbyBzbworICBpZighR2V0Q2xhc3NJbmZvMzJBKHNoZWxsMzJfaEluc3RhbmNlLCBTVl9DTEFTU19OQU1FLCAmd2MpKQorICB7IFplcm9NZW1vcnkoJndjLCBzaXplb2Yod2MpKTsKKyAgICB3Yy5zdHlsZSAgICAgICAgICA9IENTX0hSRURSQVcgfCBDU19WUkVEUkFXOworICAgIHdjLmxwZm5XbmRQcm9jICAgID0gKFdORFBST0MzMikgU2hlbGxWaWV3X1duZFByb2M7CisgICAgd2MuY2JDbHNFeHRyYSAgICAgPSAwOworICAgIHdjLmNiV25kRXh0cmEgICAgID0gMDsKKyAgICB3Yy5oSW5zdGFuY2UgICAgICA9IHNoZWxsMzJfaEluc3RhbmNlOworICAgIHdjLmhJY29uICAgICAgICAgID0gMDsKKyAgICB3Yy5oQ3Vyc29yICAgICAgICA9IExvYWRDdXJzb3IzMkEgKDAsIElEQ19BUlJPVzMyQSk7CisgICAgd2MuaGJyQmFja2dyb3VuZCAgPSAoSEJSVVNIMzIpKENPTE9SX1dJTkRPVyArIDEpOworICAgIHdjLmxwc3pNZW51TmFtZSAgID0gTlVMTDsKKyAgICB3Yy5scHN6Q2xhc3NOYW1lICA9IFNWX0NMQVNTX05BTUU7CisgICAKKyAgICBpZighUmVnaXN0ZXJDbGFzczMyQSgmd2MpKQorICAgICAgcmV0dXJuIEVfRkFJTDsKKyAgIH0KKyAgIC8vc2V0IHVwIHRoZSBtZW1iZXIgdmFyaWFibGVzCisgICB0aGlzLT5wU2hlbGxCcm93c2VyID0gcHNiOworICAgdGhpcy0+Rm9sZGVyU2V0dGluZ3MgPSAqbHBmczsKKworICAgLy9nZXQgb3VyIHBhcmVudCB3aW5kb3cKKyAgIHRoaXMtPnBTaGVsbEJyb3dzZXItPmxwdnRibC0+Zm5HZXRXaW5kb3codGhpcy0+cFNoZWxsQnJvd3NlciwgJih0aGlzLT5oV25kUGFyZW50KSk7CisKKyAgICpwaFduZCA9IENyZWF0ZVdpbmRvd0V4MzJBKDAsIFNWX0NMQVNTX05BTUUsIE5VTEwsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0NMSVBTSUJMSU5HUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHByY1ZpZXctPmxlZnQsIHByY1ZpZXctPnRvcCwgcHJjVmlldy0+cmlnaHQgLSBwcmNWaWV3LT5sZWZ0LCBwcmNWaWV3LT5ib3R0b20gLSBwcmNWaWV3LT50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5oV25kUGFyZW50LCAwLCBzaGVsbDMyX2hJbnN0YW5jZSwgKExQVk9JRCl0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgaWYoISpwaFduZCkKKyAgICAgcmV0dXJuIEVfRkFJTDsKKworICAgdGhpcy0+cFNoZWxsQnJvd3Nlci0+bHB2dGJsLT5mbkFkZFJlZih0aGlzLT5wU2hlbGxCcm93c2VyKTsKKworICAgcmV0dXJuIFNfT0s7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X0Rlc3Ryb3lWaWV3V2luZG93KExQU0hFTExWSUVXIHRoaXMpCit7IEZJWE1FKHNoZWxsLCIoJXApIHN0dWJcbiIsdGhpcyk7CisKKyAgdGhpcy0+cFNoZWxsQnJvd3Nlci0+bHB2dGJsLT5mblJlbGVhc2UodGhpcy0+cFNoZWxsQnJvd3Nlcik7CisKKyAgcmV0dXJuIFNfT0s7Cit9CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19HZXRDdXJyZW50SW5mbyhMUFNIRUxMVklFVyB0aGlzLCBMUEZPTERFUlNFVFRJTkdTIGxwZnMpCit7IEZJWE1FKHNoZWxsLCIoJXApLT4oJXApc3R1YlxuIix0aGlzLCBscGZzKTsKKworICAqbHBmcyA9IHRoaXMtPkZvbGRlclNldHRpbmdzOworICByZXR1cm4gU19PSzsKK30KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X0FkZFByb3BlcnR5U2hlZXRQYWdlcyhMUFNIRUxMVklFVyB0aGlzLCBEV09SRCBkd1Jlc2VydmVkLExQRk5BRERQUk9QU0hFRVRQQUdFIGxwZm4sIExQQVJBTSBscGFyYW0pCit7IEZJWE1FKHNoZWxsLCIoJXApIHN0dWJcbiIsdGhpcyk7CisgIHJldHVybiBFX05PVElNUEw7Cit9CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19TYXZlVmlld1N0YXRlKExQU0hFTExWSUVXIHRoaXMpCit7IEZJWE1FKHNoZWxsLCIoJXApIHN0dWJcbiIsdGhpcyk7CisgIHJldHVybiBTX09LOworfQorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfU2VsZWN0SXRlbShMUFNIRUxMVklFVyB0aGlzLCBMUENJVEVNSURMSVNUIHBpZGxJdGVtLCBVSU5UMzIgdUZsYWdzKQoreyBGSVhNRShzaGVsbCwiKCVwKS0+KHBpZGw9JXAsIDB4JTA4eCkgc3R1YlxuIix0aGlzLCBwaWRsSXRlbSwgdUZsYWdzKTsKKyAgcmV0dXJuIEVfTk9USU1QTDsKK30KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X0dldEl0ZW1PYmplY3QoTFBTSEVMTFZJRVcgdGhpcywgVUlOVDMyIHVJdGVtLCBSRUZJSUQgcmlpZCxMUFZPSUQgKnBwdk91dCkKK3sgY2hhciAgICB4cmlpZFs1MF07CisgIFdJTkVfU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKXJpaWQseHJpaWQpOworCisgIEZJWE1FKHNoZWxsLCIoJXApLT4oMHglMDh4LFxuXHQlcywgJXApc3R1YlxuIix0aGlzLCB1SXRlbSwgeHJpaWQsIHBwdk91dCk7CisKKyAgKnBwdk91dCA9IE5VTEw7CisgIHJldHVybiBFX05PVElNUEw7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgIElTaGVsbEZvbGRlciBpbXBsZW1lbnRhdGlvbgogKi8KLS8qTFBTSEVMTEZPTERFUiBJU2hlbGxGb2xkZXJfQ29uc3RydWN0b3IoKTsqLwogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbEZvbGRlcl9RdWVyeUludGVyZmFjZShMUFNIRUxMRk9MREVSLFJFRklJRCxMUFZPSUQqKTsKIHN0YXRpYyBVTE9ORyBXSU5BUEkgSVNoZWxsRm9sZGVyX0FkZFJlZihMUFNIRUxMRk9MREVSKTsKIHN0YXRpYyBVTE9ORyBXSU5BUEkgSVNoZWxsRm9sZGVyX1JlbGVhc2UoTFBTSEVMTEZPTERFUik7CkBAIC01MDcsMTEgKzgyMCwxMCBAQAogKgogKgkgIElTaGVsbEZvbGRlcl9WVGFibGUKICovCi1zdGF0aWMgc3RydWN0IElTaGVsbEZvbGRlcl9WVGFibGUgc2Z2dCA9IHsKLSAgSVNoZWxsRm9sZGVyX1F1ZXJ5SW50ZXJmYWNlLAorc3RhdGljIHN0cnVjdCBJU2hlbGxGb2xkZXJfVlRhYmxlIHNmdnQgPSAKK3sgSVNoZWxsRm9sZGVyX1F1ZXJ5SW50ZXJmYWNlLAogCUlTaGVsbEZvbGRlcl9BZGRSZWYsCiAJSVNoZWxsRm9sZGVyX1JlbGVhc2UsCi0vKglJU2hlbGxGb2xkZXJfSW5pdGlhbGl6ZSwqLwogCUlTaGVsbEZvbGRlcl9QYXJzZURpc3BsYXlOYW1lLAogCUlTaGVsbEZvbGRlcl9FbnVtT2JqZWN0cywKIAlJU2hlbGxGb2xkZXJfQmluZFRvT2JqZWN0LApAQCAtNTIyLDE4ICs4MzQsMTggQEAKICAgSVNoZWxsRm9sZGVyX0dldFVJT2JqZWN0T2YsCiAgIElTaGVsbEZvbGRlcl9HZXREaXNwbGF5TmFtZU9mLAogICBJU2hlbGxGb2xkZXJfU2V0TmFtZU9mCisgIC8qICAgIElTaGVsbEZvbGRlcl9Jbml0aWFsaXplKi8KIH07CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJICBJU2hlbGxGb2xkZXJfQ29uc3RydWN0b3IKICovCiAKLUxQU0hFTExGT0xERVIgSVNoZWxsRm9sZGVyX0NvbnN0cnVjdG9yKExQU0hFTExGT0xERVIgcFBhcmVudCxMUElURU1JRExJU1QgcGlkbCkgewotCUxQU0hFTExGT0xERVIJc2Y7CitMUFNIRUxMRk9MREVSIElTaGVsbEZvbGRlcl9Db25zdHJ1Y3RvcihMUFNIRUxMRk9MREVSIHBQYXJlbnQsTFBJVEVNSURMSVNUIHBpZGwpIAoreyBMUFNIRUxMRk9MREVSICAgIHNmOwogCURXT1JEIGR3U2l6ZT0wOwotCVdPUkQgd0xlbjsKLQlzZiA9IChMUFNIRUxMRk9MREVSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKElTaGVsbEZvbGRlcikpOwotCXNmLT5yZWYJCT0gMTsKLQlzZi0+bHB2dGJsCT0gJnNmdnQ7CisgIHNmPShMUFNIRUxMRk9MREVSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKElTaGVsbEZvbGRlcikpOworICBzZi0+cmVmPTE7CisgIHNmLT5scHZ0Ymw9JnNmdnQ7CiAgIHNmLT5tbHBzekZvbGRlcj1OVUxMOwogCXNmLT5tcFNGUGFyZW50PXBQYXJlbnQ7CiAKQEAgLTU0OCwzOSArODYwLDM1IEBACiAJfQogCiAgIC8qIGtlZXAgYSBjb3B5IG9mIHRoZSBwaWRsIGluIHRoZSBpbnN0YW5jZSovCi0Jc2YtPm1waWRsID0gc2YtPnBQaWRsTWdyLT5scHZ0YmwtPmZuQ29weShzZi0+cFBpZGxNZ3IsIHBpZGwpOworICBzZi0+bXBpZGwgPSBJTENsb25lKHBpZGwpOwogCXNmLT5tcGlkbE5TUm9vdCA9IE5VTEw7CiAJCiAgIGlmKHNmLT5tcGlkbCkgICAgICAgIC8qIGRvIHdlIGhhdmUgYSBwaWRsPyovCi0gIHsgLyppZihzZi0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5Jc0Rlc2t0b3Aoc2YtPnBQaWRsTWdyLHNmLT5tcGlkbCkpCi0gICAgeyBzZi0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5HZXREZXNrdG9wKHNmLT5wUGlkbE1ncixzZi0+bXBpZGwpOwotICAgIH0qLwotICAgIGR3U2l6ZSA9IDA7CisgIHsgZHdTaXplID0gMDsKICAgICBpZihzZi0+bXBTRlBhcmVudC0+bWxwc3pGb2xkZXIpCiAgICAgeyBkd1NpemUgKz0gc3RybGVuKHNmLT5tcFNGUGFyZW50LT5tbHBzekZvbGRlcikgKyAxOwogICAgIH0gICAKICAgICBkd1NpemUgKz0gc2YtPnBQaWRsTWdyLT5scHZ0YmwtPmZuR2V0Rm9sZGVyVGV4dChzZi0+cFBpZGxNZ3Isc2YtPm1waWRsLE5VTEwsMCk7Ci0gICAgc2YtPm1scHN6Rm9sZGVyID0gKExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsZHdTaXplKTsKKyAgICBzZi0+bWxwc3pGb2xkZXIgPSBTSEFsbG9jKGR3U2l6ZSk7CiAgICAgaWYoc2YtPm1scHN6Rm9sZGVyKQotICAgIHsgKihzZi0+bWxwc3pGb2xkZXIpID0gMDsKKyAgICB7ICooc2YtPm1scHN6Rm9sZGVyKT0weDAwOwogICAgICAgaWYoc2YtPm1wU0ZQYXJlbnQtPm1scHN6Rm9sZGVyKQogICAgICAgeyAgc3RyY3B5KHNmLT5tbHBzekZvbGRlciwgc2YtPm1wU0ZQYXJlbnQtPm1scHN6Rm9sZGVyKTsKLSAgICAgICAgIHdMZW4gPSBzdHJsZW4oc2YtPm1scHN6Rm9sZGVyKTsKLSAgICAgICAgIGlmICh3TGVuICYmIHNmLT5tbHBzekZvbGRlclt3TGVuLTFdIT0nXFwnKQotICAgICAgICAgeyBzZi0+bWxwc3pGb2xkZXJbd0xlbiswXT0nXFwnOwotICAgICAgICAgICBzZi0+bWxwc3pGb2xkZXJbd0xlbisxXT0nXDAnOwotICAgICAgICAgfQorICAgICAgICAgUGF0aEFkZEJhY2tzbGFzaCAoc2YtPm1scHN6Rm9sZGVyKTsKICAgICAgIH0KICAgICAgIHNmLT5wUGlkbE1nci0+bHB2dGJsLT5mbkdldEZvbGRlclRleHQoc2YtPnBQaWRsTWdyLCBzZi0+bXBpZGwsIHNmLT5tbHBzekZvbGRlcitzdHJsZW4oc2YtPm1scHN6Rm9sZGVyKSwgZHdTaXplLXN0cmxlbihzZi0+bWxwc3pGb2xkZXIpKTsKICAgICB9CiAgIH0KIAkKLQlUUkFDRShzaGVsbCwiLS0gKCVwKS0+KCVwLCVwLCVzKVxuIixzZixwUGFyZW50LCBwaWRsLCBkZWJ1Z3N0cl9hKHNmLT5tbHBzekZvbGRlcikpOworICBUUkFDRShzaGVsbCwiLS0gKCVwKS0+KCVwLCVwLHBhcmVudD0lcylcbiIsc2YscFBhcmVudCwgcGlkbCwgZGVidWdzdHJfYShzZi0+bWxwc3pGb2xkZXIpKTsKIAlyZXR1cm4gc2Y7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBJU2hlbGxGb2xkZXI6OlF1ZXJ5SW50ZXJmYWNlCi0gKi8KKyogIElTaGVsbEZvbGRlcjo6UXVlcnlJbnRlcmZhY2UKKyogUEFSQU1FVEVSUworKiAgUkVGSUlEIHJpaWQsICAgICAgICAvL1tpbiBdIFJlcXVlc3RlZCBJbnRlcmZhY2VJRAorKiAgTFBWT0lEKiBwcHZPYmplY3QpICAvL1tvdXRdIEludGVyZmFjZSogdG8gaG9sZCB0aGUgcmVzdWx0CisqLwogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbEZvbGRlcl9RdWVyeUludGVyZmFjZSgKICAgTFBTSEVMTEZPTERFUiB0aGlzLCBSRUZJSUQgcmlpZCwgTFBWT0lEICpwcHZPYmopCiB7ICBjaGFyCXhyaWlkWzUwXTsKQEAgLTYxOSwxOSArOTI3LDQxIEBACiAgKi8KIHN0YXRpYyBVTE9ORyBXSU5BUEkgSVNoZWxsRm9sZGVyX1JlbGVhc2UoTFBTSEVMTEZPTERFUiB0aGlzKSAKIHsgVFJBQ0Uoc2hlbGwsIiglcCktPihjb3VudD0lbHUpXG4iLHRoaXMsdGhpcy0+cmVmKTsKLQlpZiAoIS0tKHRoaXMtPnJlZikpIHsKLQkJVFJBQ0Uoc2hlbGwsIi0tIGRlc3Ryb3lpbmcgSVNoZWxsRm9sZGVyKCVwKVxuIix0aGlzKTsKKyAgaWYgKCEtLSh0aGlzLT5yZWYpKSAKKyAgeyBUUkFDRShzaGVsbCwiLS0gZGVzdHJveWluZyBJU2hlbGxGb2xkZXIoJXApXG4iLHRoaXMpOworCiAJCWlmIChwZGVza3RvcGZvbGRlcj09dGhpcykKIAkJeyBwZGVza3RvcGZvbGRlcj1OVUxMOwogCQkgIFRSQUNFKHNoZWxsLCItLSBkZXN0cm95ZWQgSVNoZWxsRm9sZGVyKCVwKSB3YXMgRGVza3RvcGZvbGRlclxuIix0aGlzKTsKIAkJfQorICAgIGlmICh0aGlzLT5wUGlkbE1ncikKKyAgICB7IFBpZGxNZ3JfRGVzdHJ1Y3Rvcih0aGlzLT5wUGlkbE1ncik7CisgICAgfQorICAgIGlmKHRoaXMtPm1waWRsTlNSb290KQorICAgIHsgU0hGcmVlKHRoaXMtPm1waWRsTlNSb290KTsKKyAgICB9CisgICAgaWYodGhpcy0+bXBpZGwpCisgICAgeyBTSEZyZWUodGhpcy0+bXBpZGwpOworICAgIH0KKyAgICBpZih0aGlzLT5tbHBzekZvbGRlcikKKyAgICB7IFNIRnJlZSh0aGlzLT5tbHBzekZvbGRlcik7CisgICAgfQorCiAJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCx0aGlzKTsKKwogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIHRoaXMtPnJlZjsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSVNoZWxsRm9sZGVyX1BhcnNlRGlzcGxheU5hbWUKKyogUEFSQU1FVEVSUworKiAgSFdORCAgICAgICAgICBod25kT3duZXIsICAgICAgLy9baW4gXSBQYXJlbnQgd2luZG93IGZvciBhbnkgbWVzc2FnZSdzCisqICBMUEJDICAgICAgICAgIHBiYywgICAgICAgICAgICAvL1tpbiBdIHJlc2VydmVkCisqICBMUE9MRVNUUiAgICAgIGxwc3pEaXNwbGF5TmFtZSwvL1tpbiBdICJVbmljb2RlIiBkaXNwbGF5bmFtZS4KKyogIFVMT05HKiAgICAgICAgcGNoRWF0ZW4sICAgICAgIC8vW291dF0gKHVuaWNvZGUpIGNoYXJhY3RlcnMgcHJvY2Vzc2VkCisqICBMUElURU1JRExJU1QqIHBwaWRsLCAgICAgICAgICAvL1tvdXRdIGNvbXBsZXggcGlkbCB0byBpdGVtCisqICBVTE9ORyogICAgICAgIHBkd0F0dHJpYnV0ZXMgICAvL1tvdXRdIGl0ZW1zIGF0dHJpYnV0ZXMKICoKICogRklYTUU6IAogKiAgICBwZHdBdHRyaWJ1dGVzOiBub3QgdXNlZApAQCAtNjQwLDkgKzk3MCw5IEBACiAJTFBTSEVMTEZPTERFUiB0aGlzLAogCUhXTkQzMiBod25kT3duZXIsCiAJTFBCQyBwYmNSZXNlcnZlZCwKLQlMUE9MRVNUUjMyIGxwc3pEaXNwbGF5TmFtZSwgICAgLyogW2luXSAgbmFtZSBvZiBmaWxlIG9yIGZvbGRlciovCi0JRFdPUkQgKnBjaEVhdGVuLCAgICAgICAgICAgICAgIC8qIFtvdXRdIG51bWJlciBvZiBjaGFycyBwYXJzZWQqLwotCUxQSVRFTUlETElTVCAqcHBpZGwsICAgICAgICAgICAvKiBbb3V0XSB0aGUgcGlkbCovCisgICAgTFBPTEVTVFIzMiBscHN6RGlzcGxheU5hbWUsCisgICAgRFdPUkQgKnBjaEVhdGVuLAorICAgIExQSVRFTUlETElTVCAqcHBpZGwsCiAJRFdPUkQgKnBkd0F0dHJpYnV0ZXMpCiB7CUhSRVNVTFQgICAgICAgIGhyPUVfT1VUT0ZNRU1PUlk7CiAgIExQSVRFTUlETElTVCAgIHBpZGxGdWxsPU5VTEwsIHBpZGxUZW1wID0gTlVMTCwgcGlkbE9sZCA9IE5VTEw7CkBAIC02NjEsOSArOTkxLDggQEAKICAgICBXaWRlQ2hhclRvTG9jYWwzMihwc3pUZW1wLCBscHN6RGlzcGxheU5hbWUsIGR3Q2hhcnMpOwogICAgIGlmKCpwc3pUZW1wKQogICAgIHsgaWYgKHN0cmNtcChwc3pUZW1wLCJEZXNrdG9wIik9PTApCi0JCSAgeyBwaWRsRnVsbCA9IChMUElURU1JRExJU1QpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoSVRFTUlETElTVCkpOworICAgICAgeyBwaWRsRnVsbCA9IChMUElURU1JRExJU1QpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCwyKTsKIAkJCSAgcGlkbEZ1bGwtPm1raWQuY2IgPSAwOwotICAgICAgICBwaWRsRnVsbC0+bWtpZC5hYklEWzBdID0gMDsKIAkJCX0KIAkJICBlbHNlCiAJCQl7IHBpZGxGdWxsID0gdGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5DcmVhdGVNeUNvbXB1dGVyKHRoaXMtPnBQaWRsTWdyKTsKQEAgLTY3NCw4ICsxMDAzLDggQEAKICAgCiAgICAgICAgIHBpZGxUZW1wID0gdGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5DcmVhdGVEcml2ZSh0aGlzLT5wUGlkbE1ncixzekVsZW1lbnQpOwkJCQogICAgICAgICBwaWRsT2xkID0gcGlkbEZ1bGw7Ci0gICAgICAgIHBpZGxGdWxsID0gdGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5Db25jYXRlbmF0ZSh0aGlzLT5wUGlkbE1ncixwaWRsRnVsbCxwaWRsVGVtcCk7Ci0gIAkgICAgdGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5EZWxldGUodGhpcy0+cFBpZGxNZ3IscGlkbE9sZCk7CisgICAgICAgIHBpZGxGdWxsID0gSUxDb21iaW5lKHBpZGxGdWxsLHBpZGxUZW1wKTsKKyAgICAgICAgU0hGcmVlKHBpZGxPbGQpOwogICAKICAgCQkJaWYocGlkbEZ1bGwpCiAgICAgICAgIHsgd2hpbGUoKHBzek5leHQ9R2V0TmV4dEVsZW1lbnQocHN6TmV4dCwgc3pFbGVtZW50LCBNQVhfUEFUSCkpKQpAQCAtNjg2LDggKzEwMTUsOCBAQAogICAgICAgICAgICAgeyBwaWRsVGVtcCA9IHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuQ3JlYXRlRm9sZGVyKHRoaXMtPnBQaWRsTWdyLHN6RWxlbWVudCk7CiAgIAkJCQkJfQogICAgICAgICAgICAgcGlkbE9sZCA9IHBpZGxGdWxsOwotICAgICAgICAgICAgcGlkbEZ1bGwgPSB0aGlzLT5wUGlkbE1nci0+bHB2dGJsLT5mbkNvbmNhdGVuYXRlKHRoaXMtPnBQaWRsTWdyLHBpZGxGdWxsLHBpZGxUZW1wKTsKLSAgICAgICAgICAgIHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuRGVsZXRlKHRoaXMtPnBQaWRsTWdyLHBpZGxPbGQpOworICAgICAgICAgICAgcGlkbEZ1bGwgPSBJTENvbWJpbmUocGlkbEZ1bGwscGlkbFRlbXApOworICAgICAgICAgICAgU0hGcmVlKHBpZGxPbGQpOwogICAgICAgICAgIH0KICAgICAgICAgICBociA9IFNfT0s7CiAgICAgICAgIH0KQEAgLTcwMSw2ICsxMDMwLDEwIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJSVNoZWxsRm9sZGVyX0VudW1PYmplY3RzCisqIFBBUkFNRVRFUlMKKyogIEhXTkQgICAgICAgICAgaHduZE93bmVyLCAgICAvL1tpbiBdIFBhcmVudCBXaW5kb3cKKyogIERXT1JEICAgICAgICAgZ3JmRmxhZ3MsICAgICAvL1tpbiBdIFNIQ09OVEYgZW51bWVyYXRpb24gbWFzaworKiAgTFBFTlVNSURMSVNUKiBwcGVudW1JRExpc3QgIC8vW291dF0gSUVudW1JRExpc3QgaW50ZXJmYWNlCiAqLwogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbEZvbGRlcl9FbnVtT2JqZWN0cygKIAlMUFNIRUxMRk9MREVSIHRoaXMsCkBAIC03MjcsMTUgKzEwNjAsMjAgQEAKIAlMUENJVEVNSURMSVNUIHBpZGwpCiB7IFRSQUNFKHNoZWxsLCIoJXApLT4ocGlkbD0lcClcbiIsdGhpcyxwaWRsKTsKICAgaWYodGhpcy0+bXBpZGxOU1Jvb3QpCi0gIHsgdGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5EZWxldGUodGhpcy0+cFBpZGxNZ3IsIHRoaXMtPm1waWRsTlNSb290KTsKKyAgeyBTSEZyZWUodGhpcy0+bXBpZGxOU1Jvb3QpOwogICAgIHRoaXMtPm1waWRsTlNSb290ID0gTlVMTDsKICAgfQotICB0aGlzLT5tcGlkbE5TUm9vdCA9IHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuQ29weSh0aGlzLT5wUGlkbE1nciwgcGlkbCk7CisgIHRoaXMtPm1waWRsTlNSb290PUlMQ2xvbmUocGlkbCk7CiAgIHJldHVybiBTX09LOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlTaGVsbEZvbGRlcl9CaW5kVG9PYmplY3QKKyogUEFSQU1FVEVSUworKiAgTFBDSVRFTUlETElTVCBwaWRsLCAgICAgICAvL1tpbiBdIGNvbXBsZXggcGlkbCB0byBvcGVuCisqICBMUEJDICAgICAgICAgIHBiYywgICAgICAgIC8vW2luIF0gcmVzZXJ2ZWQKKyogIFJFRklJRCAgICAgICAgcmlpZCwgICAgICAgLy9baW4gXSBJbml0aWFsIEludGVyZmFjZQorKiAgTFBWT0lEKiAgICAgICBwcHZPYmplY3QgICAvL1tvdXRdIEludGVyZmFjZSoKICovCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsRm9sZGVyX0JpbmRUb09iamVjdCgKIAlMUFNIRUxMRk9MREVSIHRoaXMsCkBAIC03NTUsNyArMTA5Myw3IEBACiAgIHBTaGVsbEZvbGRlciA9IElTaGVsbEZvbGRlcl9Db25zdHJ1Y3Rvcih0aGlzLCBwaWRsKTsKICAgaWYoIXBTaGVsbEZvbGRlcikKICAgICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKLS8qICBwU2hlbGxGb2xkZXItPmxwdnRibC0+Zm5Jbml0aWFsaXplKHBTaGVsbEZvbGRlciwgdGhpcy0+bXBpZGxOU1Jvb3QpOyovCisgIC8qICBwU2hlbGxGb2xkZXItPmxwdnRibC0+Zm5Jbml0aWFsaXplKHBTaGVsbEZvbGRlciwgdGhpcy0+bXBpZGxOU1Jvb3QpOyovCiAgIElTaGVsbEZvbGRlcl9Jbml0aWFsaXplKHBTaGVsbEZvbGRlciwgdGhpcy0+bXBpZGxOU1Jvb3QpOwogICBociA9IHBTaGVsbEZvbGRlci0+bHB2dGJsLT5mblF1ZXJ5SW50ZXJmYWNlKHBTaGVsbEZvbGRlciwgcmlpZCwgcHB2T3V0KTsKICAgcFNoZWxsRm9sZGVyLT5scHZ0YmwtPmZuUmVsZWFzZShwU2hlbGxGb2xkZXIpOwpAQCAtNzY1LDEwICsxMTAzLDE1IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgSVNoZWxsRm9sZGVyX0JpbmRUb1N0b3JhZ2UKKyogUEFSQU1FVEVSUworKiAgTFBDSVRFTUlETElTVCBwaWRsLCAgICAgICAvL1tpbiBdIGNvbXBsZXggcGlkbCB0byBzdG9yZQorKiAgTFBCQyAgICAgICAgICBwYmMsICAgICAgICAvL1tpbiBdIHJlc2VydmVkCisqICBSRUZJSUQgICAgICAgIHJpaWQsICAgICAgIC8vW2luIF0gSW5pdGlhbCBzdG9yYWdlIGludGVyZmFjZSAKKyogIExQVk9JRCogICAgICAgcHB2T2JqZWN0ICAgLy9bb3V0XSBJbnRlcmZhY2UqIHJldHVybmVkCiAqLwogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbEZvbGRlcl9CaW5kVG9TdG9yYWdlKAogICAJTFBTSEVMTEZPTERFUiB0aGlzLAotICAgIExQQ0lURU1JRExJU1QgcGlkbCwgCisgICAgTFBDSVRFTUlETElTVCBwaWRsLCAvKnNpbXBsZS9jb21wbGV4IHBpZGwqLwogICAgIExQQkMgcGJjUmVzZXJ2ZWQsIAogICAgIFJFRklJRCByaWlkLCAKICAgICBMUFZPSUQgKnBwdk91dCkKQEAgLTc4MywyOSArMTEyNiwzNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIElTaGVsbEZvbGRlcl9Db21wYXJlSURzCisqCisqIFBBUk1FVEVSUworKiAgTFBBUkFNICAgICAgICBsUGFyYW0sIC8vW2luIF0gQ29sdW1uPworKiAgTFBDSVRFTUlETElTVCBwaWRsMSwgIC8vW2luIF0gc2ltcGxlIHBpZGwKKyogIExQQ0lURU1JRExJU1QgcGlkbDIpICAvL1tpbiBdIHNpbXBsZSBwaWRsCisqIEZJWE1FCisqICB3ZSBoYXZlIHRvIGhhbmRsZSBzaW1wbGUgcGlkbCdzIG9ubHkKICovCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgIElTaGVsbEZvbGRlcl9Db21wYXJlSURzKAogICAJTFBTSEVMTEZPTERFUiB0aGlzLAogCQlMUEFSQU0gbFBhcmFtLCAKLSAgICBMUENJVEVNSURMSVNUIHBpZGwxLCAKLSAgICBMUENJVEVNSURMSVNUIHBpZGwyKQorICAgIExQQ0lURU1JRExJU1QgcGlkbDEsIC8qc2ltcGxlIHBpZGwqLworICAgIExQQ0lURU1JRExJU1QgcGlkbDIpIC8qc2ltcGxlIHBpZGwqLwogeyBDSEFSIHN6U3RyaW5nMVtNQVhfUEFUSF0gPSAiIjsKICAgQ0hBUiBzelN0cmluZzJbTUFYX1BBVEhdID0gIiI7CiAgIGludCAgIG5SZXR1cm47CiAgIExQQ0lURU1JRExJU1QgIHBpZGxUZW1wMSA9IHBpZGwxLCBwaWRsVGVtcDIgPSBwaWRsMjsKIAotICBUUkFDRShzaGVsbCwiKCVwKS0+KDB4JTA4bHgscGlkbDE9JXAscGlkbDI9JXApIHN0dWJcbiIsdGhpcyxsUGFyYW0scGlkbDEscGlkbDIpOworICBUUkFDRShzaGVsbCwiKCVwKS0+KDB4JTA4bHgscGlkbDE9JXAscGlkbDI9JXApXG4iLHRoaXMsbFBhcmFtLHBpZGwxLHBpZGwyKTsKIAogICAvKlNwZWNpYWwgY2FzZSAtIElmIG9uZSBvZiB0aGUgaXRlbXMgaXMgYSBQYXRoIGFuZCB0aGUgb3RoZXIgaXMgYSBGaWxlLCBhbHdheXMgCiAgIG1ha2UgdGhlIFBhdGggY29tZSBiZWZvcmUgdGhlIEZpbGUuKi8KIAotICAvL2dldCB0aGUgbGFzdCBpdGVtIGluIGVhY2ggbGlzdAorICAvKiBnZXQgdGhlIGxhc3QgaXRlbSBpbiBlYWNoIGxpc3QgKi8KICAgd2hpbGUoKHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuR2V0TmV4dEl0ZW0odGhpcy0+cFBpZGxNZ3IscGlkbFRlbXAxKSktPm1raWQuY2IpCiAgICAgcGlkbFRlbXAxID0gdGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5HZXROZXh0SXRlbSh0aGlzLT5wUGlkbE1ncixwaWRsVGVtcDEpOwogICB3aGlsZSgodGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5HZXROZXh0SXRlbSh0aGlzLT5wUGlkbE1ncixwaWRsVGVtcDIpKS0+bWtpZC5jYikKICAgICBwaWRsVGVtcDIgPSB0aGlzLT5wUGlkbE1nci0+bHB2dGJsLT5mbkdldE5leHRJdGVtKHRoaXMtPnBQaWRsTWdyLHBpZGxUZW1wMik7CiAKLSAgLy9hdCB0aGlzIHBvaW50LCBib3RoIHBpZGxUZW1wMSBhbmQgcGlkbFRlbXAyIHBvaW50IHRvIHRoZSBsYXN0IGl0ZW0gaW4gdGhlIGxpc3QKKyAgLyogYXQgdGhpcyBwb2ludCwgYm90aCBwaWRsVGVtcDEgYW5kIHBpZGxUZW1wMiBwb2ludCB0byB0aGUgbGFzdCBpdGVtIGluIHRoZSBsaXN0ICovCiAgIGlmKHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuSXNWYWx1ZSh0aGlzLT5wUGlkbE1ncixwaWRsVGVtcDEpICE9IHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuSXNWYWx1ZSh0aGlzLT5wUGlkbE1ncixwaWRsVGVtcDIpKQogICB7IGlmKHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuSXNWYWx1ZSh0aGlzLT5wUGlkbE1ncixwaWRsVGVtcDEpKQogICAgICAgcmV0dXJuIDE7CkBAIC04MzEsNiArMTE4MSwxNCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJICBJU2hlbGxGb2xkZXJfQ3JlYXRlVmlld09iamVjdAorKiBDcmVhdGVzIGFuIFZpZXcgT2JqZWN0IHJlcHJlc2VudGluZyB0aGUgU2hlbGxGb2xkZXIKKyogIElTaGVsbFZpZXcgLyBJU2hlbGxCcm93c2VyIC8gSUNvbnRleHRNZW51CisqCisqIFBBUkFNRVRFUlMKKyogIEhXTkQgICAgaHduZE93bmVyLCAgLy8gSGFuZGxlIG9mIG93bmVyIHdpbmRvdworKiAgUkVGSUlEICByaWlkLCAgICAgICAvLyBSZXF1ZXN0ZWQgaW5pdGlhbCBpbnRlcmZhY2UKKyogIExQVk9JRCogcHB2T2JqZWN0KSAgLy8gUmVzdWx0YW50IGludGVyZmFjZSoKKyoKICogTk9URVMKICogIHRoZSBzYW1lIGFzIFNIQ3JlYXRlU2hlbGxGb2xkZXJWaWV3RXggPz8/CiAqLwpAQCAtODM5LDM0ICsxMTk3LDEwNCBAQAogCUhXTkQzMiBod25kT3duZXIsCiAJUkVGSUlEIHJpaWQsCiAJTFBWT0lEICpwcHZPdXQpCi17CWNoYXIJeHJpaWRbNTBdOworeyBMUFNIRUxMVklFVyBwU2hlbGxWaWV3OworICBjaGFyICAgIHhyaWlkWzUwXTsKKyAgSFJFU1VMVCAgICAgICBocjsKIAogCVdJTkVfU3RyaW5nRnJvbUNMU0lEKHJpaWQseHJpaWQpOwotCUZJWE1FKHNoZWxsLCIoJXApLT4oMHglMDR4LFxuXHRJSUQ6XHQlcywlcCksc3R1YiFcbiIsdGhpcyxod25kT3duZXIseHJpaWQscHB2T3V0KTsKKyAgVFJBQ0Uoc2hlbGwsIiglcCktPihod25kPTB4JXgsXG5cdElJRDpcdCVzLCVwKVxuIix0aGlzLGh3bmRPd25lcix4cmlpZCxwcHZPdXQpOwogCQogCSpwcHZPdXQgPSBOVUxMOwotCXJldHVybiBFX05PVElNUEw7CisKKyAgcFNoZWxsVmlldyA9IElTaGVsbFZpZXdfQ29uc3RydWN0b3IodGhpcywgdGhpcy0+bXBpZGwpOworICBpZighcFNoZWxsVmlldykKKyAgICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKKyAgaHIgPSBwU2hlbGxWaWV3LT5scHZ0YmwtPmZuUXVlcnlJbnRlcmZhY2UocFNoZWxsVmlldywgcmlpZCwgcHB2T3V0KTsKKyAgcFNoZWxsVmlldy0+bHB2dGJsLT5mblJlbGVhc2UocFNoZWxsVmlldyk7CisgIFRSQUNFKHNoZWxsLCItLSAoJXApLT4oaW50ZXJmYWNlPSVwKVxuIix0aGlzLCBwcHZPdXQpOworICByZXR1cm4gaHI7IAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIElTaGVsbEZvbGRlcl9HZXRBdHRyaWJ1dGVzT2YKKyoKKyogUEFSQU1FVEVSUworKiAgVUlOVCAgICAgICAgICAgIGNpZGwsICAgICAvL1tpbiBdIG51bSBlbGVtZW50cyBpbiBwaWRsIGFycmF5CisrICBMUENJVEVNSURMSVNUKiAgYXBpZGwsICAgIC8vW2luIF0gc2ltcGxlIHBpZGwgYXJyYXkgCisqICBVTE9ORyogICAgICAgICAgcmdmSW5PdXQpIC8vW291dF0gcmVzdWx0IGFycmF5ICAKKyoKKyogRklYTUU6IHF1aWNrIGhhY2sKKyogIE5vdGU6IHJnZkluT3V0IGlzIGRvY3VtZW50ZWQgYXMgYmVpbmcgYW4gYXJyYXkgb2YgVUxPTkdTLgorKiAgVGhpcyBkb2VzIG5vdCBzZWVtIHRvIGJlIHRoZSBjYXNlLiBUZXN0aW5nIHRoaXMgZnVuY3Rpb24gdXNpbmcgdGhlIHNoZWxsIHRvIAorKiAgY2FsbCBpdCB3aXRoIGNpZGwgPiAxIChieSBkZWxldGluZyBtdWx0aXBsZSBpdGVtcykgcmV2ZWFscyB0aGF0IHRoZSBzaGVsbAorKiAgcGFzc2VzIE9ORSBlbGVtZW50IGluIHRoZSBhcnJheSBhbmQgd3JpdGluZyB0byBmdXJ0aGVyIGVsZW1lbnRzIHdpbGwKKyogIGNhdXNlIHRoZSBzaGVsbCB0byBmYWlsIGxhdGVyLgogKi8KIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxGb2xkZXJfR2V0QXR0cmlidXRlc09mKAogCUxQU0hFTExGT0xERVIgdGhpcywKIAlVSU5UMzIgY2lkbCwKLQlMUENJVEVNSURMSVNUICphcGlkbCwKKyAgICBMUENJVEVNSURMSVNUICphcGlkbCwgLypzaW1wbGUgcGlkbCdzKi8KIAlEV09SRCAqcmdmSW5PdXQpCi17IEZJWE1FKHNoZWxsLCIoJXApLT4oJWQsJXAsJXApLHN0dWIhXG4iLHRoaXMsY2lkbCxhcGlkbCxyZ2ZJbk91dCk7Ci0JcmV0dXJuIEVfTk9USU1QTDsKK3sgTFBDSVRFTUlETElTVCAqIHBpZGx0ZW1wOworICBEV09SRCBpOworICBUUkFDRShzaGVsbCwiKCVwKS0+KCVkLCVwLCVwKVxuIix0aGlzLGNpZGwsYXBpZGwscmdmSW5PdXQpOworCisgIHBpZGx0ZW1wPWFwaWRsOworICAqcmdmSW5PdXQgPSAweDAwOworICBpPWNpZGw7CisgIGlmICgoISBjaWRsICl8ICghYXBpZGwpIHwgKCFyZ2ZJbk91dCkpCisgICAgcmV0dXJuIEVfSU5WQUxJREFSRzsKKyAgCisgIGRvCisgIHsgaWYgKCpwaWRsdGVtcCkKKyAgICB7IGlmICh0aGlzLT5wUGlkbE1nci0+bHB2dGJsLT5mbklzRGVza3RvcCh0aGlzLT5wUGlkbE1nciwgKnBpZGx0ZW1wKSkKKyAgICAgIHsgKnJnZkluT3V0IHw9IChTRkdBT19GT0xERVIgfCBTRkdBT19IQVNTVUJGT0xERVIgfCBTRkdBT19GSUxFU1lTQU5DRVNUT1IpOworICAgICAgfQorICAgICAgZWxzZSBpZiAodGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5Jc015Q29tcHV0ZXIodGhpcy0+cFBpZGxNZ3IsICpwaWRsdGVtcCkpCisgICAgICB7ICpyZ2ZJbk91dCB8PSAoU0ZHQU9fRk9MREVSIHwgU0ZHQU9fSEFTU1VCRk9MREVSKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuSXNEcml2ZSh0aGlzLT5wUGlkbE1nciwgKnBpZGx0ZW1wKSkKKyAgICAgIHsgKnJnZkluT3V0IHw9IChTRkdBT19GT0xERVIgfCBTRkdBT19IQVNTVUJGT0xERVIgfCBTRkdBT19GSUxFU1lTQU5DRVNUT1IgfCBTRkdBT19GSUxFU1lTVEVNKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuSXNGb2xkZXIodGhpcy0+cFBpZGxNZ3IsICpwaWRsdGVtcCkpCisgICAgICB7ICpyZ2ZJbk91dCB8PSAoU0ZHQU9fRk9MREVSIHwgU0ZHQU9fRklMRVNZU1RFTSB8IFNGR0FPX0hBU1NVQkZPTERFUik7CisgICAgICB9CisgICAgICBlbHNlIGlmICh0aGlzLT5wUGlkbE1nci0+bHB2dGJsLT5mbklzVmFsdWUodGhpcy0+cFBpZGxNZ3IsICpwaWRsdGVtcCkpCisgICAgICB7ICpyZ2ZJbk91dCB8PSAoU0ZHQU9fRklMRVNZU1RFTSk7CisgICAgICB9CisgICAgfQorICAgIHBpZGx0ZW1wKys7CisgICAgY2lkbC0tOworICB9IHdoaWxlIChjaWRsID4gMCAmJiAqcGlkbHRlbXApOworCisgIHJldHVybiBTX09LOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBJU2hlbGxGb2xkZXJfR2V0VUlPYmplY3RPZgorKgorKiBQQVJBTUVURVJTCisqICBIV05EICAgICAgICAgICBod25kT3duZXIsIC8vW2luIF0gUGFyZW50IHdpbmRvdyBmb3IgYW55IG91dHB1dAorKiAgVUlOVCAgICAgICAgICAgY2lkbCwgICAgICAvL1tpbiBdIGFycmF5IHNpemUKKyogIExQQ0lURU1JRExJU1QqIGFwaWRsLCAgICAgLy9baW4gXSBzaW1wbGUgcGlkbCBhcnJheQorKiAgUkVGSUlEICAgICAgICAgcmlpZCwgICAgICAvL1tpbiBdIFJlcXVlc3RlZCBJbnRlcmZhY2UKKyogIFVJTlQqICAgICAgICAgIHByZ2ZJbk91dCwgLy9bICAgXSByZXNlcnZlZCAKKyogIExQVk9JRCogICAgICAgIHBwdk9iamVjdCkgLy9bb3V0XSBSZXN1bHRpbmcgSW50ZXJmYWNlCisqCisqIE5PVEVTCisqICBUaGlzIGZ1bmN0aW9uIGdldHMgYXNrZWQgdG8gcmV0dXJuICJ2aWV3IG9iamVjdHMiIGZvciBvbmUgb3IgbW9yZSAobXVsdGlwbGUgc2VsZWN0KQorKiAgaXRlbXM6CisqICBUaGUgdmlld29iamVjdCB0eXBpY2FsbHkgaXMgYW4gQ09NIG9iamVjdCB3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nIGludGVyZmFjZXM6CisqICBJRXh0cmFjdEljb24sSURhdGFPYmplY3QsSUNvbnRleHRNZW51CisqICBJbiBvcmRlciB0byBzdXBwb3J0IGljb24gcG9zaXRpb25zIGluIHRoZSBkZWZhdWx0IExpc3R2aWV3IHlvdXIgRGF0YU9iamVjdAorKiAgbXVzdCBpbXBsZW1lbnQgdGhlIFNldERhdGEgbWV0aG9kIChpbiBhZGRpdGlvbiB0byBHZXREYXRhIDopIC0gdGhlIHNoZWxsIHBhc3NlcworKiAgYSBiYXJlbHkgZG9jdW1lbnRlZCAiSWNvbiBwb3NpdGlvbnMiIHN0cnVjdHVyZSB0byBTZXREYXRhIHdoZW4gdGhlIGRyYWcgc3RhcnRzLAorKiAgYW5kIEdldERhdGEncyBpdCBpZiB0aGUgZHJvcCBpcyBpbiBhbm90aGVyIGV4cGxvcmVyIHdpbmRvdyB0aGF0IG5lZWRzIHRoZSBwb3NpdGlvbnMuCiAqLwogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbEZvbGRlcl9HZXRVSU9iamVjdE9mKAogCUxQU0hFTExGT0xERVIgdGhpcywKIAlIV05EMzIgaHduZE93bmVyLAogCVVJTlQzMiBjaWRsLCAKLQlMUENJVEVNSURMSVNUICogYXBpZGwsCisgIExQQ0lURU1JRExJU1QgKiBhcGlkbCwgLyogc2ltcGxlIHBpZGwncyovCiAgIFJFRklJRCByaWlkLAogCVVJTlQzMiAqIHByZ2ZJbk91dCwKIAlMUFZPSUQgKiBwcHZPdXQpCkBAIC04ODIsNiArMTMxMCwxMiBAQAogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBJU2hlbGxGb2xkZXJfR2V0RGlzcGxheU5hbWVPZgorKiAgUmV0cmlldmVzIHRoZSBkaXNwbGF5IG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZSBvYmplY3Qgb3Igc3ViZm9sZGVyCisqCisqIFBBUkFNRVRFUlMKKyogIExQQ0lURU1JRExJU1QgcGlkbCwgICAgLy9baW4gXSBjb21wbGV4IHBpZGwgdG8gaXRlbQorKiAgRFdPUkQgICAgICAgICBkd0ZsYWdzLCAvL1tpbiBdIFNIR05PIGZvcm1hdHRpbmcgZmxhZ3MKKyogIExQU1RSUkVUICAgICAgbHBOYW1lKSAgLy9bb3V0XSBSZXR1cm5lZCBkaXNwbGF5IG5hbWUKICoKICogRklYTUUKICogIGlmIHRoZSBuYW1lIGlzIGluIHRoZSBwaWRsIHRoZSByZXQgdmFsdWUgc2hvdWxkIGJlIGEgU1RSUkVUX09GRlNFVApAQCAtODkxLDcgKzEzMjUsNyBAQAogCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsRm9sZGVyX0dldERpc3BsYXlOYW1lT2YoIAogICAJTFBTSEVMTEZPTERFUiB0aGlzLAotICAgIExQQ0lURU1JRExJU1QgcGlkbCwgCisgICAgTFBDSVRFTUlETElTVCBwaWRsLCAvKiBzaW1wbGUvY29tcGxleCBwaWRsKi8KICAgICBEV09SRCBkd0ZsYWdzLCAKICAgICBMUFNUUlJFVCBscE5hbWUpCiB7IENIQVIgICAgICAgICAgIHN6VGV4dFtNQVhfUEFUSF07CkBAIC05MDQsNiArMTMzOCwxMyBAQAogCQkKICAgVFJBQ0Uoc2hlbGwsIiglcCktPihwaWRsPSVwLDB4JTA4bHgsJXApXG4iLHRoaXMscGlkbCxkd0ZsYWdzLGxwTmFtZSk7CiAKKyAgaWYgKCFwaWRsKQorICB7ICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKKyAgfSAKKworICBzelNwZWNpYWxbMF09MHgwMDsgCisgIHN6RHJpdmVbMF09MHgwMDsKKwogICAvKiB0ZXN0IGlmIHNpbXBsZShyZWxhdGl2ZSkgb3IgY29tcGxleChhYnNvbHV0ZSkgcGlkbCAqLwogICBwaWRsVGVtcCA9IHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuR2V0TmV4dEl0ZW0odGhpcy0+cFBpZGxNZ3IscGlkbCk7CiAJaWYgKHBpZGxUZW1wLT5ta2lkLmNiPT0weDAwKQpAQCAtOTEzLDExICsxMzU0LDkgQEAKIAl7IHN0cmNweSAoc3pUZXh0LCJEZXNrdG9wIik7CiAJfQogCWVsc2UKLQl7CXN6U3BlY2lhbFswXT0weDAwOwotCSAgaWYgKHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuSXNNeUNvbXB1dGVyKHRoaXMtPnBQaWRsTWdyLCBwaWRsKSkKKyAgeyBpZiAodGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5Jc015Q29tcHV0ZXIodGhpcy0+cFBpZGxNZ3IsIHBpZGwpKQogICAgIHsgdGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5HZXRJdGVtVGV4dCh0aGlzLT5wUGlkbE1nciwgcGlkbCwgc3pTcGVjaWFsLCBNQVhfUEFUSCk7CiAgICAgfQotCQlzekRyaXZlWzBdPTB4MDA7CiAJICBpZiAodGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5Jc0RyaXZlKHRoaXMtPnBQaWRsTWdyLCBwaWRsKSkKIAkJeyBwaWRsVGVtcCA9IHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuR2V0TGFzdEl0ZW0odGhpcy0+cFBpZGxNZ3IscGlkbCk7CiAgIAkJaWYgKHBpZGxUZW1wKQpAQCAtOTI2LDcgKzEzNjUsNyBAQAogCQkgIGlmICggZHdGbGFncz09U0hHRE5fTk9STUFMIHx8IGR3RmxhZ3M9PVNIR0ROX0lORk9MREVSKQogICAJCXsgR2V0Vm9sdW1lSW5mb3JtYXRpb24zMkEoc3pUZW1wLHN6RHJpdmUsTUFYX1BBVEgsJmR3Vm9sdW1lU2VyaWFsTnVtYmVyLCZkd01heGltdW1Db21wb25ldExlbmd0aCwmZHdGaWxlU3lzdGVtRmxhZ3MsTlVMTCwwKTsKIAkJCQlpZiAoc3pUZW1wWzJdPT0nXFwnKQotCQkJCXsgc3pUZW1wWzJdPSdcMCc7CisgICAgICAgIHsgc3pUZW1wWzJdPTB4MDA7CiAJCQkJfQogICAgICAgICBzdHJjYXQgKHN6RHJpdmUsIiAoIik7CiAJCQkJc3RyY2F0IChzekRyaXZlLHN6VGVtcCk7CkBAIC05NTIsMTIgKzEzOTEsMTIgQEAKIAkJCSAgaWYgKGJTaW1wbGVQaWRsKQogCQkJCXsgLyogaWYgdGhlIElTaGVsbEZvbGRlciBoYXMgcGFyZW50cywgZ2V0IHRoZSBwYXRoIGZyb20gdGhlCiAJCQkJICBwYXJlbnQgYW5kIGFkZCB0aGUgSXRlbU5hbWUqLworICAgICAgICAgIHN6VGV4dFswXT0weDAwOwogCQkJCSAgaWYgKHRoaXMtPm1scHN6Rm9sZGVyICYmIHN0cmxlbiAodGhpcy0+bWxwc3pGb2xkZXIpKQorICAgICAgICAgIHsgaWYgKHN0cmNtcCh0aGlzLT5tbHBzekZvbGRlciwiTXkgQ29tcHV0ZXIiKSkKICAgCQkJICB7IHN0cmNweSAoc3pUZXh0LHRoaXMtPm1scHN6Rm9sZGVyKTsKICAgCQkJICAgIFBhdGhBZGRCYWNrc2xhc2ggKHN6VGV4dCk7CiAgIAkJCSAgfQotICAgIAkJCWVsc2UKLSAgICAJCQl7IHN0cmNweShzelRleHQsIiIpOwogICAJCSAgCX0KICAgICAgICAgICBwaWRsVGVtcCA9IHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuR2V0TGFzdEl0ZW0odGhpcy0+cFBpZGxNZ3IscGlkbCk7CiAgICAgICAgIAlpZiAocGlkbFRlbXApCkBAIC05NzgsNyArMTQxNyw2IEBACiAJCWlmIChzelRleHRbMF09PTB4MDAgJiYgc3pTcGVjaWFsWzBdIT0weDAwKQogCQl7IHN0cmNweShzelRleHQsc3pTcGVjaWFsKTsKIAkJfQotIAogICB9CiAgIAogICBUUkFDRShzaGVsbCwiLS0gKCVwKS0+KCVzLCVzLCVzKVxuIix0aGlzLHN6U3BlY2lhbCxzekRyaXZlLHN6VGV4dCk7CkBAIC05OTMsMTEgKzE0MzEsMjAgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBJU2hlbGxGb2xkZXJfU2V0TmFtZU9mCisqICBDaGFuZ2VzIHRoZSBuYW1lIG9mIGEgZmlsZSBvYmplY3Qgb3Igc3ViZm9sZGVyLCBwb3NzaWJseSBjaGFuZ2luZyBpdHMgaXRlbQorKiAgaWRlbnRpZmllciBpbiB0aGUgcHJvY2Vzcy4KKyoKKyogUEFSQU1FVEVSUworKiAgSFdORCAgICAgICAgICBod25kT3duZXIsICAvL1tpbiBdIE93bmVyIHdpbmRvdyBmb3Igb3V0cHV0CisqICBMUENJVEVNSURMSVNUIHBpZGwsICAgICAgIC8vW2luIF0gc2ltcGxlIHBpZGwgb2YgaXRlbSB0byBjaGFuZ2UKKyogIExQQ09MRVNUUiAgICAgbHBzek5hbWUsICAgLy9baW4gXSB0aGUgaXRlbXMgbmV3IGRpc3BsYXkgbmFtZQorKiAgRFdPUkQgICAgICAgICBkd0ZsYWdzLCAgICAvL1tpbiBdIFNIR05PIGZvcm1hdHRpbmcgZmxhZ3MKKyogIExQSVRFTUlETElTVCogcHBpZGxPdXQpICAgLy9bb3V0XSBzaW1wbGUgcGlkbCByZXR1cm5lZAogKi8KIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxGb2xkZXJfU2V0TmFtZU9mKAogICAJTFBTSEVMTEZPTERFUiB0aGlzLAogCQlIV05EMzIgaHduZE93bmVyLCAKLSAgICBMUENJVEVNSURMSVNUIHBpZGwsIAorICAgIExQQ0lURU1JRExJU1QgcGlkbCwgLypzaW1wbGUgcGlkbCovCiAgICAgTFBDT0xFU1RSMzIgbHBOYW1lLCAKICAgICBEV09SRCBkdywgCiAgICAgTFBJVEVNSURMSVNUICpwUGlkbE91dCkKQEAgLTEwMDcsMzAgKzE0NTQsMzcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIElTaGVsbExpbmsgSW1wbGVtZW50YXRpb24KKyovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsTGlua19RdWVyeUludGVyZmFjZShMUFNIRUxMTElOSyxSRUZJSUQsTFBWT0lEKik7CitzdGF0aWMgVUxPTkcgV0lOQVBJIElTaGVsbExpbmtfQWRkUmVmKExQU0hFTExMSU5LKTsKK3N0YXRpYyBVTE9ORyBXSU5BUEkgSVNoZWxsTGlua19SZWxlYXNlKExQU0hFTExMSU5LKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCSAgSVNoZWxsTGlua19WVGFibGUKICovCiBzdGF0aWMgc3RydWN0IElTaGVsbExpbmtfVlRhYmxlIHNsdnQgPSB7Ci0gICAgKHZvaWQgKikxLAotICAgICh2b2lkICopMiwKLSAgICAodm9pZCAqKTMsCi0gICAgKHZvaWQgKik0LAotICAgICh2b2lkICopNSwKLSAgICAodm9pZCAqKTYsCi0gICAgKHZvaWQgKik3LAotICAgICh2b2lkICopOCwKLSAgICAodm9pZCAqKTksCi0gICAgKHZvaWQgKikxMCwKLSAgICAodm9pZCAqKTExLAotICAgICh2b2lkICopMTIsCi0gICAgKHZvaWQgKikxMywKLSAgICAodm9pZCAqKTE0LAotICAgICh2b2lkICopMTUsCi0gICAgKHZvaWQgKikxNiwKLSAgICAodm9pZCAqKTE3LAotICAgICh2b2lkICopMTgsCi0gICAgKHZvaWQgKikxOSwKLSAgICAodm9pZCAqKTIwLAotICAgICh2b2lkICopMjEKKyAgSVNoZWxsTGlua19RdWVyeUludGVyZmFjZSwKKyAgSVNoZWxsTGlua19BZGRSZWYsCisgIElTaGVsbExpbmtfUmVsZWFzZSwKKyAgICAodm9pZCAqKTB4Y2FmZTAwMDQsCisgICAgKHZvaWQgKikweGNhZmUwMDA1LAorICAgICh2b2lkICopMHhjYWZlMDAwNiwKKyAgICAodm9pZCAqKTB4Y2FmZTAwMDcsCisgICAgKHZvaWQgKikweGNhZmUwMDA4LAorICAgICh2b2lkICopMHhjYWZlMDAwOSwKKyAgICAodm9pZCAqKTB4Y2FmZTAwMTAsCisgICAgKHZvaWQgKikweGNhZmUwMDExLAorICAgICh2b2lkICopMHhjYWZlMDAxMiwKKyAgICAodm9pZCAqKTB4Y2FmZTAwMTMsCisgICAgKHZvaWQgKikweGNhZmUwMDE0LAorICAgICh2b2lkICopMHhjYWZlMDAxNSwKKyAgICAodm9pZCAqKTB4Y2FmZTAwMTYsCisgICAgKHZvaWQgKikweGNhZmUwMDE3LAorICAgICh2b2lkICopMHhjYWZlMDAxOCwKKyAgICAodm9pZCAqKTB4Y2FmZTAwMTksCisgICAgKHZvaWQgKikweGNhZmUwMDIwLAorICAgICh2b2lkICopMHhjYWZlMDAyMQogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMDQ3LDYgKzE1MDEsNTMgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgSVNoZWxsTGluazo6UXVlcnlJbnRlcmZhY2UKKyAqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbExpbmtfUXVlcnlJbnRlcmZhY2UoCisgIExQU0hFTExMSU5LIHRoaXMsIFJFRklJRCByaWlkLCBMUFZPSUQgKnBwdk9iaikKK3sgIGNoYXIgICAgeHJpaWRbNTBdOworICAgV0lORV9TdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpcmlpZCx4cmlpZCk7CisgICBUUkFDRShzaGVsbCwiKCVwKS0+KFxuXHRJSUQ6XHQlcylcbiIsdGhpcyx4cmlpZCk7CisKKyAgKnBwdk9iaiA9IE5VTEw7CisKKyAgaWYoSXNFcXVhbElJRChyaWlkLCAmSUlEX0lVbmtub3duKSkgICAgICAgICAgLypJVW5rbm93biovCisgIHsgKnBwdk9iaiA9IHRoaXM7IAorICB9CisgIGVsc2UgaWYoSXNFcXVhbElJRChyaWlkLCAmSUlEX0lTaGVsbExpbmspKSAgLypJU2hlbGxMaW5rKi8KKyAgeyAgICAqcHB2T2JqID0gKExQU0hFTExMSU5LKXRoaXM7CisgIH0gICAKKworICBpZigqcHB2T2JqKQorICB7ICgqKExQU0hFTExMSU5LKilwcHZPYmopLT5scHZ0YmwtPmZuQWRkUmVmKHRoaXMpOyAgICAgIAorICAgIFRSQUNFKHNoZWxsLCItLSBJbnRlcmZhY2U6ICglcCktPiglcClcbiIscHB2T2JqLCpwcHZPYmopOworICAgIHJldHVybiBTX09LOworICB9CisgICAgVFJBQ0Uoc2hlbGwsIi0tIEludGVyZmFjZTogRV9OT0lOVEVSRkFDRVxuIik7CisgIHJldHVybiBFX05PSU5URVJGQUNFOworfSAgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJU2hlbGxMaW5rX0FkZFJlZgorICovCitzdGF0aWMgVUxPTkcgV0lOQVBJIElTaGVsbExpbmtfQWRkUmVmKExQU0hFTExMSU5LIHRoaXMpCit7IFRSQUNFKHNoZWxsLCIoJXApLT4oY291bnQ9JWx1KVxuIix0aGlzLHRoaXMtPnJlZik7CisgICAgcmV0dXJuICsrKHRoaXMtPnJlZik7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJQ2xhc3NGYWN0b3J5X1JlbGVhc2UKKyAqLworc3RhdGljIFVMT05HIFdJTkFQSSBJU2hlbGxMaW5rX1JlbGVhc2UoTFBTSEVMTExJTksgdGhpcykKK3sgVFJBQ0Uoc2hlbGwsIiglcCktPihjb3VudD0lbHUpXG4iLHRoaXMsdGhpcy0+cmVmKTsKKyAgaWYgKCEtLSh0aGlzLT5yZWYpKSAKKyAgeyBUUkFDRShzaGVsbCwiLS0gZGVzdHJveWluZyBJU2hlbGxMaW5rKCVwKVxuIix0aGlzKTsKKyAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsdGhpcyk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIHRoaXMtPnJlZjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJICBJTlRFUk5BTCBDTEFTUyBwaWRsbWdyCiAqLwogTFBJVEVNSURMSVNUIFBpZGxNZ3JfQ3JlYXRlRGVza3RvcChMUFBJRExNR1IpOwpAQCAtMTA1NCwxMCArMTU1NSw4IEBACiBMUElURU1JRExJU1QgUGlkbE1ncl9DcmVhdGVEcml2ZShMUFBJRExNR1IsTFBDU1RSKTsKIExQSVRFTUlETElTVCBQaWRsTWdyX0NyZWF0ZUZvbGRlcihMUFBJRExNR1IsTFBDU1RSKTsKIExQSVRFTUlETElTVCBQaWRsTWdyX0NyZWF0ZVZhbHVlKExQUElETE1HUixMUENTVFIpOwotdm9pZCBQaWRsTWdyX0RlbGV0ZShMUFBJRExNR1IsTFBJVEVNSURMSVNUKTsKKy8qdm9pZCBQaWRsTWdyX0RlbGV0ZShMUFBJRExNR1IsTFBJVEVNSURMSVNUKTsqLwogTFBJVEVNSURMSVNUIFBpZGxNZ3JfR2V0TmV4dEl0ZW0oTFBQSURMTUdSLExQSVRFTUlETElTVCk7Ci1MUElURU1JRExJU1QgUGlkbE1ncl9Db3B5KExQUElETE1HUixMUElURU1JRExJU1QpOwotVUlOVDE2IFBpZGxNZ3JfR2V0U2l6ZShMUFBJRExNR1IsTFBJVEVNSURMSVNUKTsKIEJPT0wzMiBQaWRsTWdyX0dldERlc2t0b3AoTFBQSURMTUdSLExQQ0lURU1JRExJU1QsTFBTVFIpOwogQk9PTDMyIFBpZGxNZ3JfR2V0RHJpdmUoTFBQSURMTUdSLExQQ0lURU1JRExJU1QsTFBTVFIsVUlOVDE2KTsKIExQSVRFTUlETElTVCBQaWRsTWdyX0dldExhc3RJdGVtKExQUElETE1HUixMUENJVEVNSURMSVNUKTsKQEAgLTEwNzMsNyArMTU3Miw2IEBACiBCT09MMzIgUGlkbE1ncl9HZXRWYWx1ZVR5cGUoTFBQSURMTUdSLExQQ0lURU1JRExJU1QsTFBDSVRFTUlETElTVCxMUERXT1JEKTsKIERXT1JEIFBpZGxNZ3JfR2V0RGF0YVRleHQoTFBQSURMTUdSLExQQ0lURU1JRExJU1QsTFBDSVRFTUlETElTVCxMUFNUUixEV09SRCk7CiBEV09SRCBQaWRsTWdyX0dldFBpZGxQYXRoKExQUElETE1HUixMUENJVEVNSURMSVNULExQU1RSLERXT1JEKTsKLUxQSVRFTUlETElTVCBQaWRsTWdyX0NvbmNhdGVuYXRlKExQUElETE1HUixMUElURU1JRExJU1QsTFBJVEVNSURMSVNUKTsKIExQSVRFTUlETElTVCBQaWRsTWdyX0NyZWF0ZShMUFBJRExNR1IsUElETFRZUEUsTFBWT0lELFVJTlQxNik7CiBEV09SRCBQaWRsTWdyX0dldERhdGEoTFBQSURMTUdSLFBJRExUWVBFLExQQ0lURU1JRExJU1QsTFBWT0lELFVJTlQxNik7CiBMUFBJRExEQVRBIFBpZGxNZ3JfR2V0RGF0YVBvaW50ZXIoTFBQSURMTUdSLExQQ0lURU1JRExJU1QpOwpAQCAtMTA4NSwxMCArMTU4Myw4IEBACiAJCVBpZGxNZ3JfQ3JlYXRlRHJpdmUsCiAgICAgUGlkbE1ncl9DcmVhdGVGb2xkZXIsCiAgICAgUGlkbE1ncl9DcmVhdGVWYWx1ZSwKLQkJUGlkbE1ncl9EZWxldGUsCisgIC8qICBQaWRsTWdyX0RlbGV0ZSwqLwogICAgIFBpZGxNZ3JfR2V0TmV4dEl0ZW0sCi0gICAgUGlkbE1ncl9Db3B5LAotICAgIFBpZGxNZ3JfR2V0U2l6ZSwKICAgICBQaWRsTWdyX0dldERlc2t0b3AsCiAJCVBpZGxNZ3JfR2V0RHJpdmUsCiAgICAgUGlkbE1ncl9HZXRMYXN0SXRlbSwKQEAgLTExMDQsNyArMTYwMCw2IEBACiAgICAgUGlkbE1ncl9HZXRWYWx1ZVR5cGUsCiAgICAgUGlkbE1ncl9HZXREYXRhVGV4dCwKICAgICBQaWRsTWdyX0dldFBpZGxQYXRoLAotCQlQaWRsTWdyX0NvbmNhdGVuYXRlLAogICAgIFBpZGxNZ3JfQ3JlYXRlLAogICAgIFBpZGxNZ3JfR2V0RGF0YSwKICAgICBQaWRsTWdyX0dldERhdGFQb2ludGVyLApAQCAtMTEzMiw2ICsxNjI3LDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgUGlkbE1ncl9DcmVhdGVEZXNrdG9wKCkKKyAqICBQaWRsTWdyX0NyZWF0ZU15Q29tcHV0ZXIoKQogICogIFBpZGxNZ3JfQ3JlYXRlRHJpdmUoKQogICogIFBpZGxNZ3JfQ3JlYXRlRm9sZGVyKCkgCiAgKiAgUGlkbE1ncl9DcmVhdGVWYWx1ZSgpCkBAIC0xMTQyLDcgKzE2MzgsNyBAQAogfQogTFBJVEVNSURMSVNUIFBpZGxNZ3JfQ3JlYXRlTXlDb21wdXRlcihMUFBJRExNR1IgdGhpcykKIHsgVFJBQ0Uoc2hlbGwsIiglcCktPigpXG4iLHRoaXMpOwotICByZXR1cm4gUGlkbE1ncl9DcmVhdGUodGhpcyxQVF9NWUNPTVAsICh2b2lkICopIk15IENvbXB1dGVyIiwgc2l6ZW9mKCJNeSBDb21wdXRlciIpKTsKKyAgcmV0dXJuIFBpZGxNZ3JfQ3JlYXRlKHRoaXMsUFRfTVlDT01QLCAodm9pZCAqKSJNeSBDb21wdXRlciIsIHN0cmxlbiAoIk15IENvbXB1dGVyIikrMSk7CiB9CiBMUElURU1JRExJU1QgUGlkbE1ncl9DcmVhdGVEcml2ZShMUFBJRExNR1IgdGhpcywgTFBDU1RSIGxwc3pOZXcpCiB7IGNoYXIgc1RlbXBbNF07CkBAIC0xMTY0LDExICsxNjYwLDExIEBACiAgKiAgUGlkbE1ncl9EZWxldGUoKQogICogIERlbGV0ZXMgYSBQSURMCiAgKi8KLXZvaWQgUGlkbE1ncl9EZWxldGUoTFBQSURMTUdSIHRoaXMsTFBJVEVNSURMSVNUIHBpZGwpCisvKnZvaWQgUGlkbE1ncl9EZWxldGUoTFBQSURMTUdSIHRoaXMsTFBJVEVNSURMSVNUIHBpZGwpCiB7IFRSQUNFKHNoZWxsLCIoJXApLT4ocGlkbD0lcClcbiIsdGhpcyxwaWRsKTsKICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHBpZGwpOwogfQotCisqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgUGlkbE1ncl9HZXROZXh0SXRlbSgpCiAgKi8KQEAgLTExODUsNTIgKzE2ODEsNiBAQAogICB7ICByZXR1cm4gKE5VTEwpOwogCX0KIH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgUGlkbE1ncl9Db3B5KCkKLSAqLwotTFBJVEVNSURMSVNUIFBpZGxNZ3JfQ29weShMUFBJRExNR1IgdGhpcywgTFBJVEVNSURMSVNUIHBpZGxTb3VyY2UpCi17IExQSVRFTUlETElTVCBwaWRsVGFyZ2V0ID0gTlVMTDsKLSAgVUlOVDE2IGNiU291cmNlID0gMDsKLQotCVRSQUNFKHNoZWxsLCIoJXApLT4ocGlkbD0lcClcbiIsdGhpcyxwaWRsU291cmNlKTsKLQotICBpZihOVUxMID09IHBpZGxTb3VyY2UpCi0gCXsgIFRSQUNFKHNoZWxsLCItLSAoJXApLT4oJXApXG4iLHRoaXMscGlkbFNvdXJjZSk7Ci0gICAgIHJldHVybiAoTlVMTCk7Ci0JfQotCi0gIGNiU291cmNlID0gUGlkbE1ncl9HZXRTaXplKHRoaXMsIHBpZGxTb3VyY2UpOwotICBwaWRsVGFyZ2V0ID0gKExQSVRFTUlETElTVClIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLGNiU291cmNlKTsKLSAgaWYoIXBpZGxUYXJnZXQpCi0gIHsgcmV0dXJuIChOVUxMKTsKLQl9Ci0KLSAgbWVtY3B5KHBpZGxUYXJnZXQsIHBpZGxTb3VyY2UsIGNiU291cmNlKTsKLQotCVRSQUNFKHNoZWxsLCItLSAoJXApLT4ocGlkbD0lcCB0byBuZXcgcGlkbD0lcClcbiIsdGhpcyxwaWRsU291cmNlLHBpZGxUYXJnZXQpOwotICByZXR1cm4gcGlkbFRhcmdldDsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFBpZGxNZ3JfR2V0U2l6ZSgpCi0gKiAgY2FsY3VsYXRlcyB0aGUgc2l6ZSBvZiB0aGUgY29tcGxldGUgcGlkbAotICovCi1VSU5UMTYgUGlkbE1ncl9HZXRTaXplKExQUElETE1HUiB0aGlzLCBMUElURU1JRExJU1QgcGlkbCkKLXsgVUlOVDE2IGNiVG90YWwgPSAwOwotICBMUElURU1JRExJU1QgcGlkbFRlbXAgPSBwaWRsOwotCi0gIFRSQUNFKHNoZWxsLCIoJXApLT4ocGlkbD0lcClcbiIsdGhpcyxwaWRsKTsKLSAgaWYocGlkbFRlbXApCi0gIHsgd2hpbGUocGlkbFRlbXAtPm1raWQuY2IpCi0gICAgeyBjYlRvdGFsICs9IHBpZGxUZW1wLT5ta2lkLmNiOwotICAgICAgcGlkbFRlbXAgPSBQaWRsTWdyX0dldE5leHRJdGVtKHRoaXMsIHBpZGxUZW1wKTsKLSAgICB9ICAKLSAgICAvL2FkZCB0aGUgc2l6ZSBvZiB0aGUgTlVMTCB0ZXJtaW5hdGluZyBJVEVNSURMSVNUCi0gICAgY2JUb3RhbCArPSBzaXplb2YoSVRFTUlETElTVCk7Ci0gIH0KLQlUUkFDRShzaGVsbCwiLS0gc2l6ZSAldVxuIixjYlRvdGFsKTsKLSAgcmV0dXJuIChjYlRvdGFsKTsKLX0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogIFBpZGxNZ3JfR2V0RGVza3RvcCgpCiAgKiAKQEAgLTEyNTIsNyArMTcwMiw3IEBACiAgIGlmKFBpZGxNZ3JfSXNNeUNvbXB1dGVyKHRoaXMscGlkbCkpCiAgIHsgcGlkbFRlbXAgPSBQaWRsTWdyX0dldE5leHRJdGVtKHRoaXMscGlkbCk7CiAJfQotCWVsc2UgaWYgKFBpZGxNZ3JfSXNEcml2ZSh0aGlzLHBpZGxUZW1wKSkKKyAgZWxzZSBpZiAocGlkbFRlbXAgJiYgUGlkbE1ncl9Jc0RyaXZlKHRoaXMscGlkbFRlbXApKQogICB7IHJldHVybiAoQk9PTDMyKVBpZGxNZ3JfR2V0RGF0YSh0aGlzLFBUX0RSSVZFLCBwaWRsVGVtcCwgKExQVk9JRClwT3V0LCB1U2l6ZSk7CiAJfQogCXJldHVybiBGQUxTRTsKQEAgLTEyOTYsMTIgKzE3NDYsMjAgQEAKICovCiBCT09MMzIgUGlkbE1ncl9Jc0Rlc2t0b3AoTFBQSURMTUdSIHRoaXMsTFBDSVRFTUlETElTVCBwaWRsKQogeyBUUkFDRShzaGVsbCwiJXAtPiglcClcbiIsdGhpcyxwaWRsKTsKKworICBpZiAoISBwaWRsKQorICAgIHJldHVybiBGQUxTRTsKKwogICByZXR1cm4gKCAgcGlkbC0+bWtpZC5jYiA9PSAweDAwICk7CiB9CiAKIEJPT0wzMiBQaWRsTWdyX0lzTXlDb21wdXRlcihMUFBJRExNR1IgdGhpcyxMUENJVEVNSURMSVNUIHBpZGwpCiB7IExQUElETERBVEEgIHBEYXRhOwogICBUUkFDRShzaGVsbCwiJXAtPiglcClcbiIsdGhpcyxwaWRsKTsKKworICBpZiAoISBwaWRsKQorICAgIHJldHVybiBGQUxTRTsKKwogICBwRGF0YSA9IFBpZGxNZ3JfR2V0RGF0YVBvaW50ZXIodGhpcyxwaWRsKTsKICAgcmV0dXJuIChQVF9NWUNPTVAgPT0gcERhdGEtPnR5cGUpOwogfQpAQCAtMTMwOSw2ICsxNzY3LDEwIEBACiBCT09MMzIgUGlkbE1ncl9Jc0RyaXZlKExQUElETE1HUiB0aGlzLExQQ0lURU1JRExJU1QgcGlkbCkKIHsgTFBQSURMREFUQSAgcERhdGE7CiAgIFRSQUNFKHNoZWxsLCIlcC0+KCVwKVxuIix0aGlzLHBpZGwpOworCisgIGlmICghIHBpZGwpCisgICAgcmV0dXJuIEZBTFNFOworCiAgIHBEYXRhID0gUGlkbE1ncl9HZXREYXRhUG9pbnRlcih0aGlzLHBpZGwpOwogICByZXR1cm4gKFBUX0RSSVZFID09IHBEYXRhLT50eXBlKTsKIH0KQEAgLTEzMTYsNiArMTc3OCwxMCBAQAogQk9PTDMyIFBpZGxNZ3JfSXNGb2xkZXIoTFBQSURMTUdSIHRoaXMsTFBDSVRFTUlETElTVCBwaWRsKQogeyBMUFBJRExEQVRBICBwRGF0YTsKICAgVFJBQ0Uoc2hlbGwsIiVwLT4oJXApXG4iLHRoaXMscGlkbCk7CisKKyAgaWYgKCEgcGlkbCkKKyAgICByZXR1cm4gRkFMU0U7CisKICAgcERhdGEgPSBQaWRsTWdyX0dldERhdGFQb2ludGVyKHRoaXMscGlkbCk7CiAgIHJldHVybiAoUFRfRk9MREVSID09IHBEYXRhLT50eXBlKTsKIH0KQEAgLTEzMjMsNiArMTc4OSwxMCBAQAogQk9PTDMyIFBpZGxNZ3JfSXNWYWx1ZShMUFBJRExNR1IgdGhpcyxMUENJVEVNSURMSVNUIHBpZGwpCiB7IExQUElETERBVEEgIHBEYXRhOwogICBUUkFDRShzaGVsbCwiJXAtPiglcClcbiIsdGhpcyxwaWRsKTsKKworICBpZiAoISBwaWRsKQorICAgIHJldHVybiBGQUxTRTsKKwogICBwRGF0YSA9IFBpZGxNZ3JfR2V0RGF0YVBvaW50ZXIodGhpcyxwaWRsKTsKICAgcmV0dXJuIChQVF9WQUxVRSA9PSBwRGF0YS0+dHlwZSk7CiB9CkBAIC0xMzY2LDYgKzE4MzYsNyBAQAogCiAgIGlmKFBpZGxNZ3JfSXNNeUNvbXB1dGVyKHRoaXMscGlkbCkpCiAgIHsgcGlkbFRlbXAgPSBQaWRsTWdyX0dldE5leHRJdGVtKHRoaXMscGlkbCk7CisgICAgVFJBQ0Uoc2hlbGwsIi0tICglcCktPnNraXAgTXkgQ29tcHV0ZXJcbiIsdGhpcyk7CiAJfQogICBlbHNlCiAgIHsgcGlkbFRlbXAgPSAoTFBJVEVNSURMSVNUKXBpZGw7CkBAIC0xNTE2LDE1ICsxOTg3LDcgQEAKIAogICBGSVhNRShzaGVsbCwiKCVwKS0+KHBpZGw9JXAgcGlkbD0lcCkgc3R1YlxuIix0aGlzLHBpZGxQYXRoLHBpZGxWYWx1ZSk7CiAKLSAgaWYoIWxwc3pPdXQpCi0gIHsgcmV0dXJuIEZBTFNFOwotCX0KLQotICBpZighcGlkbFBhdGgpCi0gIHsgcmV0dXJuIEZBTFNFOwotCX0KLQotICBpZighcGlkbFZhbHVlKQorICBpZighbHBzek91dCB8fCAhcGlkbFBhdGggfHwgIXBpZGxWYWx1ZSkKICAgeyByZXR1cm4gRkFMU0U7CiAJfQogCkBAIC0xNjAxLDQ1ICsyMDY0LDcgQEAKICAgcmV0dXJuIHN0cmxlbihscHN6T3V0KTsKIAogfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBQaWRsTWdyX0NvbmNhdGVuYXRlKCkKLSAqIENyZWF0ZSBhIG5ldyBQSURMIGJ5IGNvbWJpbmluZyB0d28gZXhpc3RpbmcgUElETHMuCi0gKi8gIAotTFBJVEVNSURMSVNUIFBpZGxNZ3JfQ29uY2F0ZW5hdGUoCi0gICAgTFBQSURMTUdSIHRoaXMsCi0JCUxQSVRFTUlETElTVCBwaWRsMSwKLQkJTFBJVEVNSURMSVNUIHBpZGwyKQoteyBMUElURU1JRExJU1QgICBwaWRsTmV3OwotICBVSU5UMzIgICAgICAgICBjYjEgPSAwLCBjYjIgPSAwOwogCi0gIFRSQUNFKHNoZWxsLCIoJXApLT4oJXAsJXApXG4iLHRoaXMscGlkbDEscGlkbDIpOwotCi0gIGlmKCFwaWRsMSAmJiAhcGlkbDIpCi0gIHsgIHJldHVybiBOVUxMOwotCX0KLQotICBpZighcGlkbDEpCi0gIHsgcGlkbE5ldyA9IFBpZGxNZ3JfQ29weSh0aGlzLHBpZGwyKTsKLSAgICByZXR1cm4gcGlkbE5ldzsKLSAgfQotCi0gIGlmKCFwaWRsMikKLSAgeyBwaWRsTmV3ID0gUGlkbE1ncl9Db3B5KHRoaXMscGlkbDEpOwotICAgIHJldHVybiBwaWRsTmV3OwotICB9Ci0KLSAgY2IxID0gUGlkbE1ncl9HZXRTaXplKHRoaXMscGlkbDEpIC0gc2l6ZW9mKElURU1JRExJU1QpOwotICBjYjIgPSBQaWRsTWdyX0dldFNpemUodGhpcyxwaWRsMik7Ci0KLSAgcGlkbE5ldyA9IChMUElURU1JRExJU1QpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxjYjErY2IyKTsKLQotICBpZihwaWRsTmV3KQotICB7IG1lbWNweShwaWRsTmV3LCBwaWRsMSwgY2IxKTsKLSAgICBtZW1jcHkoKChMUEJZVEUpcGlkbE5ldykgKyBjYjEsIHBpZGwyLCBjYjIpOwotICB9Ci0gIFRSQUNFKHNoZWxsLCItLSAoJXApLT4gKG5ldyBwaWRsPSVwKVxuIix0aGlzLHBpZGxOZXcpOwotCXJldHVybiBwaWRsTmV3OwotfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgUGlkbE1ncl9DcmVhdGUoKQogICogIENyZWF0ZXMgYSBuZXcgUElETApAQCAtMTY1Nyw0NCArMjA4Miw0NSBAQAogICBUUkFDRShzaGVsbCwiKCVwKS0+KCV4ICVwICV4KVxuIix0aGlzLHR5cGUscEluLHVJblNpemUpOwogCiAgIGlmICggdHlwZSA9PSBQVF9ERVNLVE9QKQotCXsgICBwaWRsT3V0ID0gKExQSVRFTUlETElTVClIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZihJVEVNSURMSVNUKSk7Ci0gIAkJbWVtc2V0KHBpZGxPdXQsIDB4MDAsIHNpemVvZihJVEVNSURMSVNUKSk7CisgIHsgICBwaWRsT3V0ID0gU0hBbGxvYygyKTsKKyAgICAgIHBpZGxPdXQtPm1raWQuY2I9MHgwMDAwOworICAgICAgcmV0dXJuIHBpZGxPdXQ7CiAJfQogCiAgIGlmICghIHBJbikKIAl7IHJldHVybiBOVUxMOwogCX0JCi0gIHVTaXplID0gc2l6ZW9mKElURU1JRExJU1QpICsgKHNpemVvZihQSURMVFlQRSkpICsgdUluU2l6ZTsKIAotICAvKiBBbGxvY2F0ZSB0aGUgbWVtb3J5LCBhZGRpbmcgYW4gYWRkaXRpb25hbCBJVEVNSURMSVNUIGZvciB0aGUgTlVMTCB0ZXJtaW5hdGluZyAKLSAgSUQgTGlzdC4gKi8KLSAgcGlkbE91dCA9IChMUElURU1JRExJU1QpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCx1U2l6ZSArIHNpemVvZihJVEVNSURMSVNUKSk7Ci0JbWVtc2V0KHBpZGxPdXQsIDB4QUEsIHVTaXplKTsKKyAgdVNpemUgPSAyICsgKHNpemVvZihQSURMVFlQRSkpICsgdUluU2l6ZSArIDI7ICAvKiBjYiArIFBJRExUWVBFICsgdUluU2l6ZSArMiAqLworICBwaWRsT3V0ID0gU0hBbGxvYyh1U2l6ZSk7CiAgIHBpZGxUZW1wID0gcGlkbE91dDsKICAgaWYocGlkbE91dCkKLSAgeyBwaWRsVGVtcC0+bWtpZC5jYiA9IHVTaXplOwotICAgIHBEYXRhID0gUGlkbE1ncl9HZXREYXRhUG9pbnRlcih0aGlzLHBpZGxUZW1wKTsKKyAgeyBwaWRsVGVtcC0+bWtpZC5jYiA9IHVTaXplIC0gMjsKKyAgICBwRGF0YSA9KExQUElETERBVEEpICYocGlkbFRlbXAtPm1raWQuYWJJRFswXSk7CiAgICAgcERhdGEtPnR5cGUgPSB0eXBlOwogICAgIHN3aXRjaCh0eXBlKQotICAgIHsgY2FzZSBQVF9NWUNPTVA6ICBtZW1jcHkocERhdGEtPnN6VGV4dCwgcEluLCB1SW5TaXplKTsKKyAgICB7IGNhc2UgUFRfTVlDT01QOgorICAgICAgICBtZW1jcHkocERhdGEtPnN6VGV4dCwgcEluLCB1SW5TaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0Uoc2hlbGwsIi0gKCVwKS0+Y3JlYXRlIE15IENvbXB1dGVyOiAlc1xuIix0aGlzLGRlYnVnc3RyX2EocERhdGEtPnN6VGV4dCkpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkJCWNhc2UgUFRfRFJJVkU6CSBtZW1jcHkocERhdGEtPnN6VGV4dCwgcEluLCB1SW5TaXplKTsKKyAgICAgIGNhc2UgUFRfRFJJVkU6CisgICAgICAgIG1lbWNweShwRGF0YS0+c3pUZXh0LCBwSW4sIHVJblNpemUpOwogICAgICAgICAgICAgICAgICAgICAgICBUUkFDRShzaGVsbCwiLSAoJXApLT5jcmVhdGUgRHJpdmU6ICVzXG4iLHRoaXMsZGVidWdzdHJfYShwRGF0YS0+c3pUZXh0KSk7CiAJCQkJCQkJCQkJCSBicmVhazsKICAgICAgIGNhc2UgUFRfRk9MREVSOgotICAgICAgY2FzZSBQVF9WQUxVRTogICBtZW1jcHkocERhdGEtPnN6VGV4dCwgcEluLCB1SW5TaXplKTsKKyAgICAgIGNhc2UgUFRfVkFMVUU6ICAgCisgICAgICAgIG1lbWNweShwRGF0YS0+c3pUZXh0LCBwSW4sIHVJblNpemUpOwogICAgICAgICAgICAgICAgICAgICAgICBUUkFDRShzaGVsbCwiLSAoJXApLT5jcmVhdGUgVmFsdWU6ICVzXG4iLHRoaXMsZGVidWdzdHJfYShwRGF0YS0+c3pUZXh0KSk7CiAJCQkJCQkJCQkJCSBicmVhazsKLQkJICBkZWZhdWx0OiAgICAgICAgIEZJWE1FKHNoZWxsLCItICglcCkgd3JvbmcgYXJndW1lbnRcbiIsdGhpcyk7CisgICAgICBkZWZhdWx0OiAKKyAgICAgICAgRklYTUUoc2hlbGwsIi0gKCVwKSB3cm9uZyBhcmd1bWVudFxuIix0aGlzKTsKIAkJCSAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgCiAgICAgcGlkbFRlbXAgPSBQaWRsTWdyX0dldE5leHRJdGVtKHRoaXMscGlkbFRlbXApOwotICAgIHBpZGxUZW1wLT5ta2lkLmNiID0gMDsKLSAgICBwaWRsVGVtcC0+bWtpZC5hYklEWzBdID0gMDsKKyAgcGlkbFRlbXAtPm1raWQuY2IgPSAweDAwOwogICB9Ci0JVFJBQ0Uoc2hlbGwsIi0tICglcCktPihwaWRsPSVwKVxuIix0aGlzLHBpZGxPdXQpOworICBUUkFDRShzaGVsbCwiLS0gKCVwKS0+KHBpZGw9JXAsIHNpemU9JXUpXG4iLHRoaXMscGlkbE91dCx1U2l6ZS0yKTsKICAgcmV0dXJuIHBpZGxPdXQ7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE3NzksMTIgKzIyMDUsMTEgQEAKICAgeyByZXR1cm4gRkFMU0U7CiAJfQogCi0gICpwcGlkbFZhbHVlID0gUGlkbE1ncl9Db3B5KHRoaXMsKnBwaWRsVmFsdWUpOwotICAqcHBpZGxQYXRoID0gUGlkbE1ncl9Db3B5KHRoaXMscGlkbEZRKTsKKyAgKnBwaWRsVmFsdWUgPSBJTENsb25lKCpwcGlkbFZhbHVlKTsKKyAgKnBwaWRsUGF0aCA9IElMQ2xvbmUocGlkbEZRKTsKIAogICBwaWRsVGVtcCA9IFBpZGxNZ3JfR2V0TGFzdEl0ZW0odGhpcywqcHBpZGxQYXRoKTsKLSAgcGlkbFRlbXAtPm1raWQuY2IgPSAwOwotICBwaWRsVGVtcC0+bWtpZC5hYklEWzBdID0gMDsKKyAgcGlkbFRlbXAtPm1raWQuY2IgPSAweDAwOwogCiAgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvb2xlL25scy9kZXUubmxzIGIvb2xlL25scy9kZXUubmxzCmluZGV4IDIxYmY3MWUuLjdiOTlkZTcgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvZGV1Lm5scworKysgYi9vbGUvbmxzL2RldS5ubHMKQEAgLTk5LDggKzk5LDggQEAKIExPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEyLCJEZXoiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTMsIiIpCiAKLS8qIExPQ1ZBTChMT0NBTEVfU1BPU0lUSVZFU0lHTikgKi8KLS8qIExPQ1ZBTChMT0NBTEVfU05FR0FUSVZFU0lHTikgKi8KK0xPQ1ZBTChMT0NBTEVfU1BPU0lUSVZFU0lHTiwgIiIpCitMT0NWQUwoTE9DQUxFX1NORUdBVElWRVNJR04sICItIikKIC8qIExPQ1ZBTChMT0NBTEVfSVBPU1NJR05QT1NOKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTkVHU0lHTlBPU04pICovCiAvKiBMT0NWQUwoTE9DQUxFX0lQT1NTWU1QUkVDRURFUykgKi8KZGlmZiAtLWdpdCBhL29sZS9vbGUybmxzLmMgYi9vbGUvb2xlMm5scy5jCmluZGV4IDdkMThlOTkuLmUxNjg0ZWEgMTAwNjQ0Ci0tLSBhL29sZS9vbGUybmxzLmMKKysrIGIvb2xlL29sZTJubHMuYwpAQCAtMTYxMSw3ICsxNjExLDcgQEAKICAxOSwgIC8qIP8gLSAyNTUgKi8KIH0gOwogCi1zdGF0aWMgaW50IGlzX3B1bmN0dWF0aW9uKHVuc2lnbmVkIGNoYXIgYykgCitzdGF0aWMgaW50IE9MRTJOTFNfaXNQdW5jdHVhdGlvbih1bnNpZ25lZCBjaGFyIGMpIAogewogICAvKiAicHVuY3R1YXRpb24gY2hhcmFjdGVyIiBpbiB0aGlzIGNvbnRleHQgaXMgYSBjaGFyYWN0ZXIgd2hpY2ggaXMgCiAgICAgIGNvbnNpZGVyZWQgImxlc3MgaW1wb3J0YW50IiBkdXJpbmcgd29yZCBzb3J0IGNvbXBhcmlzb24uCkBAIC0xNjM5LDE3ICsxNjM5LDI0IEBACiAgKiAgICBFcnJvciA6IDAuCiAgKiAgICBTdWNjZXNzIDogbGVuZ3RoIG9mIHRoZSByZXN1bHQgc3RyaW5nLgogICoKLSAqIFJFTUFSS1MKKyAqIE5PVEVTCiAgKiAgICBJZiBjYWxsZWQgd2l0aCBzY3JsZW4gPSAtMSwgdGhlIGZ1bmN0aW9uIHdpbGwgY29tcHV0ZSB0aGUgbGVuZ3RoCiAgKiAgICAgIG9mIHRoZSAwLXRlcm1pbmF0ZWQgc3RyaW5nIHN0cnNyYyBieSBpdHNlbGYuICAgICAgCiAgKiAKICAqICAgIElmIGNhbGxlZCB3aXRoIGRzdGxlbiA9IDAsIHJldHVybnMgdGhlIGJ1ZmZlciBsZW5ndGggdGhhdCAKICAqICAgICAgd291bGQgYmUgcmVxdWlyZWQuCisgKgorICogICAgTk9STV9JR05PUkVXSURUSCBtZWFucyB0byBjb21wYXJlIEFTQ0lJIGFuZCBVbmljb2RlIGNoYXJhY3RlcnMKKyAqICAgIGFzIGlmIHRoZXkgYXJlIGVxdWFsLiAgU2luY2UgV2luZSBzZXBhcmF0ZXMgQVNDSUkgYW5kIFVuaWNvZGUgaW50bworICogICAgc2VwYXJhdGUgZnVuY3Rpb25zLCB3ZSBzaG91bGRuJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBmb3IgdGhpcyBmbGFnLgorICogICAgSSBhZGRlZCBpdCB0byB0aGUgbGlzdCBvZiBmbGFncyB0aGF0IGRvbid0IG5lZWQgYSBmaXhtZSBtZXNzYWdlCisgKiAgICB0byBtYWtlIE1TIFdvcmQgOTUgbm90IHByaW50IHNldmVyYWwgdGhvdXNhbmQgZml4bWUgbWVzc2FnZXMgZm9yIAorICogICAgdGhpcyBmdW5jdGlvbi4KICAqLwogSU5UMzIgV0lOQVBJIExDTWFwU3RyaW5nMzJBKAogCUxDSUQgbGNpZCAvKiBsb2NhbGUgaWRlbnRpZmllciBjcmVhdGVkIHdpdGggTUFLRUxDSUQ7IAotCQkgICAgIExPQ0FMRV9TWVNURU1fREVGQVVMVCBhbmQgTE9DQUxFX1VTRVJfREVGQVVMVCBhcmUgcHJlZGVmaW5lZAotCQkgICAgIHZhbHVlcy4gKi8sCisJCSAgICAgTE9DQUxFX1NZU1RFTV9ERUZBVUxUIGFuZCBMT0NBTEVfVVNFUl9ERUZBVUxUIGFyZSAKKyAgICAgICAgICAgICAgICAgICAgIHByZWRlZmluZWQgdmFsdWVzLiAqLywKIAlEV09SRCBtYXBmbGFncyAvKiBmbGFncyAqLywKIAlMUENTVFIgc3Jjc3RyICAvKiBzb3VyY2UgYnVmZmVyICovLAogCUlOVDMyIHNyY2xlbiAgIC8qIHNvdXJjZSBsZW5ndGggKi8sCkBAIC0xNjYzLDIwICsxNjcwLDIyIEBACiAKICAgaWYgKCAoKGRzdGxlbiE9MCkgJiYgKGRzdHN0cj09TlVMTCkpIHx8IChzcmNzdHI9PU5VTEwpICkKICAgeworICAgIEVSUihvbGUsICIoc3JjPSVzLGRlc3Q9JXMpOiBJbnZhbGlkIE5VTEwgc3RyaW5nXG4iLCBzcmNzdHIsIGRzdHN0cik7CiAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICByZXR1cm4gMDsKICAgfQotICBpZiAoc3JjbGVuPT0tMSkgCisgIGlmIChzcmNsZW4gPT0gLTEpIAogICAgIHNyY2xlbiA9IGxzdHJsZW4zMkEoc3Jjc3RyKSArIDEgOyAgICAvKiAoaW5jbHVkZSBmaW5hbCAnXDAnKSAqLwogCiAgIGlmIChtYXBmbGFncyAmIH4gKCBMQ01BUF9VUFBFUkNBU0UgfCBMQ01BUF9MT1dFUkNBU0UgfCBMQ01BUF9TT1JUS0VZIHwKLQkJICAgICBOT1JNX0lHTk9SRUNBU0UgfCBOT1JNX0lHTk9SRU5PTlNQQUNFIHwgU09SVF9TVFJJTkdTT1JUKSApCisJCSAgICAgTk9STV9JR05PUkVDQVNFIHwgTk9STV9JR05PUkVOT05TUEFDRSB8IFNPUlRfU1RSSU5HU09SVCB8CisJCSAgICAgTk9STV9JR05PUkVXSURUSCkgKQogICB7CiAgICAgRklYTUUoc3RyaW5nLCIoMHglMDRseCwweCUwOGx4LCVwLCVkLCVwLCVkKTogIgogCSAgInVuaW1wbGVtZW50ZWQgZmxhZ3M6IDB4JTA4bHhcbiIsCiAJICBsY2lkLG1hcGZsYWdzLHNyY3N0cixzcmNsZW4sZHN0c3RyLGRzdGxlbixtYXBmbGFncyk7CiAgIH0KLSAgCisKICAgaWYgKCAhKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSkgKQogICB7CiAgICAgaW50ICgqZikoaW50KT1pZGVudGl0eTsgCkBAIC0xNzE0LDcgKzE3MjMsNyBAQAogICAgICAgdW5zaWduZWQgY2hhciBzb3VyY2VfY2hhciA9IHNyY3N0cltpXTsKICAgICAgIGlmIChzb3VyY2VfY2hhciE9J1wwJykgCiAgICAgICB7Ci0JaWYgKGZsYWdfc3RyaW5nc29ydCB8fCAhaXNfcHVuY3R1YXRpb24oc291cmNlX2NoYXIpKQorCWlmIChmbGFnX3N0cmluZ3NvcnQgfHwgIU9MRTJOTFNfaXNQdW5jdHVhdGlvbihzb3VyY2VfY2hhcikpCiAJewogCSAgdW5pY29kZV9sZW4rKzsKIAkgIGlmICggTENNX1VuaWNvZGVfTFVUWy0yKzIqc291cmNlX2NoYXJdICYgfjE1ICkKQEAgLTE3ODAsNyArMTc4OSw3IEBACiAJdHlwZSA9IExDTV9Vbmljb2RlX0xVVFstMisyKnNvdXJjZV9jaGFyXTsKIAlsb25nY29kZSA9IHR5cGUgPj4gNDsKIAl0eXBlICY9IDE1OwotCWlmICghZmxhZ19zdHJpbmdzb3J0ICYmIGlzX3B1bmN0dWF0aW9uKHNvdXJjZV9jaGFyKSkgCisJaWYgKCFmbGFnX3N0cmluZ3NvcnQgJiYgT0xFMk5MU19pc1B1bmN0dWF0aW9uKHNvdXJjZV9jaGFyKSkgCiAJewogCSAgVUlOVDE2IGVuY3J5cHRlZF9sb2NhdGlvbiA9ICgxPDwxNSkgKyA3ICsgNCpjb3VudDsKIAkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gKHVuc2lnbmVkIGNoYXIpIChlbmNyeXB0ZWRfbG9jYXRpb24+PjgpOwpAQCAtMTgyOSw2ICsxODM4LDE1IEBACiAgIH0KIH0KIAkJICAgICAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgTENNYXBTdHJpbmczMlcgICAgICAgICAgICAgICAgW0tFUk5FTDMyLjQ5M10KKyAqCisgKiBDb252ZXJ0IGEgc3RyaW5nLCBvciBnZW5lcmF0ZSBhIHNvcnQga2V5IGZyb20gaXQuCisgKgorICogTk9URQorICoKKyAqIFNlZSBMQ01hcFN0cmluZzMyQSBmb3IgZG9jdW1lbnRhdGlvbgorICovCiBJTlQzMiBXSU5BUEkgTENNYXBTdHJpbmczMlcoCiAJTENJRCBsY2lkLERXT1JEIG1hcGZsYWdzLExQQ1dTVFIgc3Jjc3RyLElOVDMyIHNyY2xlbixMUFdTVFIgZHN0c3RyLAogCUlOVDMyIGRzdGxlbikKQEAgLTE4NDAsNiArMTg1OCw3IEBACiAKICAgaWYgKCAoKGRzdGxlbiE9MCkgJiYgKGRzdHN0cj09TlVMTCkpIHx8IChzcmNzdHI9PU5VTEwpICkKICAgeworICAgIEVSUihvbGUsICIoc3JjPSVwLGRzdD0lcCk6IEludmFsaWQgTlVMTCBzdHJpbmdcbiIsIHNyY3N0ciwgZHN0c3RyKTsKICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgIHJldHVybiAwOwogICB9CkBAIC0xODgwLDEzICsxODk5LDM0IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENvbXBhcmVTdHJpbmczMkEgICAoS0VSTkVMMzIuMjkpCisgKiBDb21wYXJlU3RyaW5nMzJBIFtLRVJORUwzMi4yOV0gQ29tcGFyZXMgdHdvIHN0cmluZ3MgdXNpbmcgbG9jYWxlCisgKgorICogUkVUVVJOUworICoKKyAqIHN1Y2Nlc3M6IENTVFJfTEVTU19USEFOLCBDU1RSX0VRVUFMLCBDU1RSX0dSRUFURVJfVEhBTgorICogZmFpbHVyZTogMAorICoKKyAqIE5PVEVTCisgKgorICogRGVmYXVsdHMgdG8gYSB3b3JkIHNvcnQsIGJ1dCB1c2VzIGEgc3RyaW5nIHNvcnQgaWYKKyAqIFNPUlRfU1RSSU5HU09SVCBpcyBzZXQuCisgKiBDYWxscyBTZXRMYXN0RXJyb3IgZm9yIEVSUk9SX0lOVkFMSURfRkxBR1MsIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSLgorICogCisgKiBCVUdTCisgKgogICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpZ25vcmVzIHRoZSBsb2NhbGUKKyAqCiAgKiBGSVhNRQotICogTW9yZW92ZXIgaXQgaXMgcXVpdGUgaW5lZmZpY2llbnQuIEZJWE1FIHRvbyEKKyAqIAorICogUXVpdGUgaW5lZmZpY2llbnQuCiAgKi8KLVVJTlQzMiBXSU5BUEkgQ29tcGFyZVN0cmluZzMyQShEV09SRCBsY2lkLCBEV09SRCBmZHdTdHlsZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIHMxLCBEV09SRCBsMSwgTFBDU1RSIHMyLERXT1JEIGwyKQorVUlOVDMyIFdJTkFQSSBDb21wYXJlU3RyaW5nMzJBKAorICAgIERXT1JEIGxjaWQsICAgICAvKiBsb2NhbGUgSUQgKi8KKyAgICBEV09SRCBmZHdTdHlsZSwgLyogY29tcGFyaXNvbi1zdHlsZSBvcHRpb25zICovCisgICAgTFBDU1RSIHMxLCAgICAgIC8qIGZpcnN0IHN0cmluZyAqLworICAgIERXT1JEIGwxLCAgICAgICAvKiBsZW5ndGggb2YgZmlyc3Qgc3RyaW5nICovCisgICAgTFBDU1RSIHMyLCAgICAgIC8qIHNlY29uZCBzdHJpbmcgKi8KKyAgICBEV09SRCBsMikgICAgICAgLyogbGVuZ3RoIG9mIHNlY29uZCBzdHJpbmcgKi8KIHsKICAgaW50IG1hcHN0cmluZ19mbGFnczsKICAgaW50IGxlbjEsbGVuMjsKQEAgLTE4OTcsNiArMTkzNyw3IEBACiAKICAgaWYgKCAoczE9PU5VTEwpIHx8IChzMj09TlVMTCkgKQogICB7ICAgIAorICAgIEVSUihvbGUsICIoczE9JXMsczI9JXMpOiBJbnZhbGlkIE5VTEwgc3RyaW5nXG4iLCBzMSwgczIpOwogICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgcmV0dXJuIDA7CiAgIH0KQEAgLTE5MTUsMTUgKzE5NTYsMjUgQEAKICAgc2syID0gKExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsbGVuMik7CiAgIGlmICggKCFMQ01hcFN0cmluZzMyQShsY2lkLG1hcHN0cmluZ19mbGFncyxzMSxsMSxzazEsbGVuMSkpCiAJIHx8ICghTENNYXBTdHJpbmczMkEobGNpZCxtYXBzdHJpbmdfZmxhZ3MsczIsbDIsc2syLGxlbjIpKSApCi0gIHsgRVJSKG9sZSwiQnVnIGluIExDbWFwU3RyaW5nMzJBLlxuIik7CisgIHsKKyAgICBFUlIob2xlLCJCdWcgaW4gTENtYXBTdHJpbmczMkEuXG4iKTsKICAgICByZXN1bHQgPSAwOwogICB9CiAgIGVsc2UKLSAgeyByZXN1bHQgPSBzdHJjbXAoc2sxLHNrMikrMjsKKyAgeworICAgIC8qIHN0cmNtcCBkb2Vzbid0IG5lY2Vzc2FyaWx5IHJldHVybiAtMSwgMCwgb3IgMSAqLworICAgIHJlc3VsdCA9IHN0cmNtcChzazEsc2syKTsKICAgfQogICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc2sxKTsKICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHNrMik7Ci0gIHJldHVybiByZXN1bHQ7CisKKyAgaWYgKHJlc3VsdCA8IDApCisgICAgcmV0dXJuIDE7CisgIGlmIChyZXN1bHQgPT0gMCkKKyAgICByZXR1cm4gMjsKKworICAvKiBtdXN0IGJlIGdyZWF0ZXIsIGlmIHdlIHJlYWNoIHRoaXMgcG9pbnQgKi8KKyAgcmV0dXJuIDM7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9idWlsdGluMzIuYyBiL3JlbGF5MzIvYnVpbHRpbjMyLmMKaW5kZXggZTVmOTY5NS4uNWVhNDZiNCAxMDA2NDQKLS0tIGEvcmVsYXkzMi9idWlsdGluMzIuYworKysgYi9yZWxheTMyL2J1aWx0aW4zMi5jCkBAIC0xNzAsNyArMTcwLDkgQEAKICAgICBudC0+T3B0aW9uYWxIZWFkZXIuU2l6ZU9mSW1hZ2UgICAgICAgICAgICAgICAgID0gc2l6ZTsKICAgICBudC0+T3B0aW9uYWxIZWFkZXIuU2l6ZU9mSGVhZGVycyAgICAgICAgICAgICAgID0gKEJZVEUgKilleHAgLSBhZGRyOwogICAgIG50LT5PcHRpb25hbEhlYWRlci5OdW1iZXJPZlJ2YUFuZFNpemVzID0gSU1BR0VfTlVNQkVST0ZfRElSRUNUT1JZX0VOVFJJRVM7Ci0KKyAgICBpZiAoZGxsLT5kZXNjci0+ZGxsZW50cnlwb2ludCkgCisgICAgICAgIG50LT5PcHRpb25hbEhlYWRlci5BZGRyZXNzT2ZFbnRyeVBvaW50ID0gKERXT1JEKWRsbC0+ZGVzY3ItPmRsbGVudHJ5cG9pbnQgLSAoRFdPUkQpYWRkcjsKKyAgICAKICAgICAvKiBCdWlsZCB0aGUgZXhwb3J0IGRpcmVjdG9yeSAqLwogCiAgICAgZGlyID0gJm50LT5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5W0lNQUdFX0ZJTEVfRVhQT1JUX0RJUkVDVE9SWV07CmRpZmYgLS1naXQgYS9yZWxheTMyL2NvbWN0bDMyLnNwZWMgYi9yZWxheTMyL2NvbWN0bDMyLnNwZWMKaW5kZXggODdlNDQzOS4uOGM3YWE4MiAxMDA2NDQKLS0tIGEvcmVsYXkzMi9jb21jdGwzMi5zcGVjCisrKyBiL3JlbGF5MzIvY29tY3RsMzIuc3BlYwpAQCAtMSw1ICsxLDYgQEAKIG5hbWUJY29tY3RsMzIKIHR5cGUJd2luMzIKK2luaXQJQ29tQ3RsMzJMaWJNYWluCiAKICMgRnVuY3Rpb25zIGV4cG9ydGVkIGJ5IHRoZSBXaW45NSBjb21jdGwzMi5kbGwgCiAjICh0aGVzZSBuZWVkIHRvIGhhdmUgdGhlc2UgZXhhY3Qgb3JkaW5hbHMsIGJlY2F1c2Ugc29tZSB3aW45NSBkbGxzIApkaWZmIC0tZ2l0IGEvcmVsYXkzMi9jcnRkbGwuc3BlYyBiL3JlbGF5MzIvY3J0ZGxsLnNwZWMKaW5kZXggOTVhNTU1NS4uOGQxNWZjNyAxMDA2NDQKLS0tIGEvcmVsYXkzMi9jcnRkbGwuc3BlYworKysgYi9yZWxheTMyL2NydGRsbC5zcGVjCkBAIC0xMDAsOCArMTAwLDggQEAKICA5NiBzdHViIF9maWxlbGVuZ3RoCiAgOTcgc3R1YiBfZmlsZW5vCiAgOTggc3R1YiBfZmluZGNsb3NlCi0gOTkgc3R1YiBfZmluZGZpcnN0Ci0xMDAgc3R1YiBfZmluZG5leHQKKyA5OSBjZGVjbCBfZmluZGZpcnN0KHN0ciBwdHIpIENSVERMTF9fZmluZGZpcnN0CisxMDAgY2RlY2wgX2ZpbmRuZXh0KGxvbmcgcHRyKSBDUlRETExfX2ZpbmRuZXh0CiAxMDEgc3R1YiBfZmluaXRlCiAxMDIgc3R1YiBfZmxzYnVmCiAxMDMgc3R1YiBfZmx1c2hhbGwKQEAgLTExMiw3ICsxMTIsNyBAQAogMTA4IHN0dWIgX2ZwdXRjaGFyCiAxMDkgc3R1YiBfZnB1dHdjaGFyCiAxMTAgc3R1YiBfZnNvcGVuCi0xMTEgc3R1YiBfZnN0YXQKKzExMSBjZGVjbCBfZnN0YXQobG9uZyBwdHIpIENSVERMTF9fZnN0YXQKIDExMiBzdHViIF9mdGltZQogMTEzIGNkZWNsIF9mdG9sKGRvdWJsZSkgQ1JURExMX19mdG9sCiAxMTQgY2RlY2wgX2Z1bGxwYXRoKHB0ciBzdHIgbG9uZykgQ1JURExMX19mdWxscGF0aApAQCAtMjU3LDcgKzI1Nyw3IEBACiAyNTMgc3R1YiBfcHV0ZW52CiAyNTQgc3R1YiBfcHV0dwogMjU1IHN0dWIgX3B3Y3R5cGVfZGxsCi0yNTYgc3R1YiBfcmVhZAorMjU2IGNkZWNsIF9yZWFkKGxvbmcgcHRyIGxvbmcpIENSVERMTF9fcmVhZAogMjU3IHN0dWIgX3JtZGlyCiAyNTggc3R1YiBfcm10bXAKIDI1OSBjZGVjbCBfcm90bCAobG9uZyBsb25nKSBDUlRETExfX3JvdGwKQEAgLTM4MCw3ICszODAsNyBAQAogMzc2IHN0dWIgZnB1dHdjCiAzNzcgY2RlY2wgZnJlYWQocHRyIGxvbmcgbG9uZyBwdHIpIENSVERMTF9mcmVhZAogMzc4IGNkZWNsIGZyZWUocHRyKSBDUlRETExfZnJlZQotMzc5IHN0dWIgZnJlb3BlbgorMzc5IGNkZWNsIGZyZW9wZW4oc3RyIHN0ciBwdHIpIENSVERMTF9mcmVvcGVuCiAzODAgY2RlY2wgZnJleHAoZG91YmxlIHB0cikgZnJleHAKIDM4MSB2YXJhcmdzIGZzY2FuZigpIENSVERMTF9mc2NhbmYKIDM4MiBjZGVjbCBmc2VlayhwdHIgbG9uZyBsb25nKSBDUlRETExfZnNlZWsKZGlmZiAtLWdpdCBhL3JlbGF5MzIvZ2RpMzIuc3BlYyBiL3JlbGF5MzIvZ2RpMzIuc3BlYwppbmRleCA4ZjExYzljLi4wODdlMDliIDEwMDY0NAotLS0gYS9yZWxheTMyL2dkaTMyLnNwZWMKKysrIGIvcmVsYXkzMi9nZGkzMi5zcGVjCkBAIC0xODIsNyArMTgyLDcgQEAKIDE3OCBzdGRjYWxsIEdldEVuaE1ldGFGaWxlSGVhZGVyKGxvbmcgbG9uZyBwdHIpIEdldEVuaE1ldGFGaWxlSGVhZGVyCiAxNzkgc3R1YiBHZXRFbmhNZXRhRmlsZVBhbGV0dGVFbnRyaWVzCiAxODAgc3R1YiBHZXRFbmhNZXRhRmlsZVcKLTE4MSBzdHViIEdldEZvbnREYXRhCisxODEgc3RkY2FsbCBHZXRGb250RGF0YShsb25nIGxvbmcgbG9uZyBwdHIgbG9uZykgR2V0Rm9udERhdGEzMgogMTgyIHN0ZGNhbGwgR2V0Rm9udExhbmd1YWdlSW5mbyhsb25nKSBHZXRGb250TGFuZ3VhZ2VJbmZvMzIKIDE4MyBzdHViIEdldEZvbnRSZXNvdXJjZUluZm8KIDE4NCBzdHViIEdldEZvbnRSZXNvdXJjZUluZm9XCmRpZmYgLS1naXQgYS9yZWxheTMyL2tlcm5lbDMyLnNwZWMgYi9yZWxheTMyL2tlcm5lbDMyLnNwZWMKaW5kZXggNjVmMmRkOC4uODU3NjU3NyAxMDA2NDQKLS0tIGEvcmVsYXkzMi9rZXJuZWwzMi5zcGVjCisrKyBiL3JlbGF5MzIva2VybmVsMzIuc3BlYwpAQCAtOTcsMTYgKzk3LDE2IEBACiAgODMgc3R1YiBLMzJSdGxMYXJnZUludGVnZXJTdWJ0cmFjdAogIDg0IHN0dWIgSzMyUnRsQ29udmVydExvbmdUb0xhcmdlSW50ZWdlcgogIDg1IHN0dWIgSzMyUnRsQ29udmVydFVsb25nVG9MYXJnZUludGVnZXIKLSA4NiBzdHViIF9LRVJORUwzMl84NgorIDg2IHN0ZGNhbGwgX0tFUk5FTDMyXzg2KHB0cikgX0tFUk5FTDMyXzg2CiAgODcgc3RkY2FsbCBTU09uQmlnU3RhY2soKSBTU09uQmlnU3RhY2sKICA4OCB2YXJhcmdzIFNTQ2FsbCgpIFNTQ2FsbAogIDg5IHJlZ2lzdGVyIEZUX1Byb2xvZ1ByaW1lKCkgRlRfUHJvbG9nUHJpbWUKICA5MCByZWdpc3RlciBRVF9UaHVua1ByaW1lKCkgUVRfVGh1bmtQcmltZQogIDkxIHN0dWIgUEsxNkZORgogIDkyIHN0ZGNhbGwgR2V0UEsxNlN5c1ZhcigpIEdldFBLMTZTeXNWYXIKLSA5MyBzdGRjYWxsIEdldHBXaW4xNkxvY2socHRyKSBHZXRwV2luMTZMb2NrCi0gOTQgc3R1YiBfQ2hlY2tOb3RTeXNMZXZlbAotIDk1IHN0dWIgX0NvbmZpcm1TeXNMZXZlbAorIDkzIHN0ZGNhbGwgR2V0cFdpbjE2TG9jayhwdHIpIEdldHBXaW4xNkxvY2szMgorIDk0IHN0ZGNhbGwgX0NoZWNrTm90U3lzTGV2ZWwocHRyKSBfQ2hlY2tOb3RTeXNMZXZlbAorIDk1IHN0ZGNhbGwgX0NvbmZpcm1TeXNMZXZlbChwdHIpIF9Db25maXJtU3lzTGV2ZWwKICA5NiBzdGRjYWxsIF9Db25maXJtV2luMTZMb2NrKCkgX0NvbmZpcm1XaW4xNkxvY2sKICA5NyBzdGRjYWxsIF9FbnRlclN5c0xldmVsKHB0cikgX0VudGVyU3lzTGV2ZWwKICA5OCBzdGRjYWxsIF9MZWF2ZVN5c0xldmVsKHB0cikgX0xlYXZlU3lzTGV2ZWwKZGlmZiAtLWdpdCBhL3JlbGF5MzIvbXByLnNwZWMgYi9yZWxheTMyL21wci5zcGVjCmluZGV4IDc2MGYxZGUuLmQxNzY4YjUgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvbXByLnNwZWMKKysrIGIvcmVsYXkzMi9tcHIuc3BlYwpAQCAtOSw5ICs5LDkgQEAKIDAwMDYgc3R1YiBNUFJfNgogMDAwNyBzdHViIE1QUl83CiAwMDA4IHN0dWIgTVBSXzgKLTAwMDkgc3R1YiBNUFJfOQotMDAxMCBzdHViIERsbENhblVubG9hZE5vdwotMDAxMSBzdHViIERsbEdldENsYXNzT2JqZWN0CiswMDA5IHN0dWIgRGxsQ2FuVW5sb2FkTm93CiswMDEwIHN0dWIgRGxsR2V0Q2xhc3NPYmplY3QKKzAwMTEgc3R1YiBNUFJfMTEKIDAwMTIgc3R1YiBNUFJfMTIKIDAwMTMgc3R1YiBNUFJfMTMKIDAwMTQgc3R1YiBNUFJfMTQKQEAgLTI1LDg5ICsyNSw4OSBAQAogMDAyMiBzdGRjYWxsIE1QUl8yMihsb25nKSBfTVBSXzIyCiAwMDIzIHN0dWIgTVBSXzIzCiAwMDI0IHN0dWIgTVBSXzI0Ci0wMDI1IHN0ZGNhbGwgTVBSXzI1KHN0ciBsb25nKSBfTVBSXzI1Ci0JMDAyNiBzdGRjYWxsIE11bHRpbmV0R2V0Q29ubmVjdGlvblBlcmZvcm1hbmNlQShwdHIgcHRyKSBNdWx0aW5ldEdldENvbm5lY3Rpb25QZXJmb3JtYW5jZTMyQQotMDAyNyBzdHViIE11bHRpbmV0R2V0Q29ubmVjdGlvblBlcmZvcm1hbmNlVwotMDAyOCBzdGRjYWxsIE11bHRpbmV0R2V0RXJyb3JUZXh0QShsb25nIHB0ciBsb25nKU11bHRpbmV0R2V0RXJyb3JUZXh0MzJBCi0wMDI5IHN0ZGNhbGwgTXVsdGluZXRHZXRFcnJvclRleHRXKGxvbmcgcHRyIGxvbmcpTXVsdGluZXRHZXRFcnJvclRleHQzMlcKLTAwMzAgc3R1YiBOUFNBdXRoZW50aWNhdGlvbkRpYWxvZ0EKLTAwMzEgc3R1YiBOUFNDb3B5U3RyaW5nQQotMDAzMiBzdHViIE5QU0RldmljZUdldE51bWJlckEKLTAwMzMgc3R1YiBOUFNEZXZpY2VHZXRTdHJpbmdBCi0wMDM0IHN0dWIgTlBTR2V0UHJvdmlkZXJIYW5kbGVBCi0wMDM1IHN0dWIgTlBTR2V0UHJvdmlkZXJOYW1lQQotMDAzNiBzdHViIE5QU0dldFNlY3Rpb25OYW1lQQotMDAzNyBzdHViIE5QU05vdGlmeUdldENvbnRleHRBCi0wMDM4IHN0dWIgTlBTTm90aWZ5UmVnaXN0ZXJBCi0wMDM5IHN0dWIgTlBTU2V0Q3VzdG9tVGV4dEEKLTAwNDAgc3R1YiBOUFNTZXRFeHRlbmRlZEVycm9yQQotMDA0MSBzdHViIFB3ZENoYW5nZVBhc3N3b3JkQQotMDA0MiBzdHViIFB3ZENoYW5nZVBhc3N3b3JkVwotMDA0MyBzdHViIFB3ZEdldFBhc3N3b3JkU3RhdHVzQQotMDA0NCBzdHViIFB3ZEdldFBhc3N3b3JkU3RhdHVzVwotMDA0NSBzdHViIFB3ZFNldFBhc3N3b3JkU3RhdHVzQQotMDA0NiBzdHViIFB3ZFNldFBhc3N3b3JkU3RhdHVzVwotMDA0NyBzdGRjYWxsIFdOZXRBZGRDb25uZWN0aW9uMkEocHRyIHN0ciBzdHIgbG9uZykgV05ldEFkZENvbm5lY3Rpb24yXzMyQQotMDA0OCBzdGRjYWxsIFdOZXRBZGRDb25uZWN0aW9uMlcocHRyIHdzdHIgd3N0ciBsb25nKSBXTmV0QWRkQ29ubmVjdGlvbjJfMzJXCi0wMDQ5IHN0ZGNhbGwgV05ldEFkZENvbm5lY3Rpb24zQShsb25nIHB0ciBzdHIgc3RyIGxvbmcpIFdOZXRBZGRDb25uZWN0aW9uM18zMkEKLTAwNTAgc3RkY2FsbCBXTmV0QWRkQ29ubmVjdGlvbjNXKGxvbmcgcHRyIHdzdHIgd3N0ciBsb25nKSBXTmV0QWRkQ29ubmVjdGlvbjNfMzJXCi0wMDUxIHN0ZGNhbGwgV05ldEFkZENvbm5lY3Rpb25BKHN0ciBzdHIgc3RyKSBXTmV0QWRkQ29ubmVjdGlvbjMyQQotMDA1MiBzdGRjYWxsIFdOZXRBZGRDb25uZWN0aW9uVyh3c3RyIHdzdHIgd3N0cikgV05ldEFkZENvbm5lY3Rpb24zMlcKLTAwNTMgc3RkY2FsbCBXTmV0Q2FjaGVQYXNzd29yZChzdHIgbG9uZyBzdHIgbG9uZyBsb25nKSBXTmV0Q2FjaGVQYXNzd29yZAotMDA1NCBzdHViIFdOZXRDYW5jZWxDb25uZWN0aW9uMkEKLTAwNTUgc3R1YiBXTmV0Q2FuY2VsQ29ubmVjdGlvbjJXCi0wMDU2IHN0dWIgV05ldENhbmNlbENvbm5lY3Rpb25BCi0wMDU3IHN0dWIgV05ldENhbmNlbENvbm5lY3Rpb25XCi0wMDU4IHN0dWIgV05ldENsb3NlRW51bQotMDA1OSBzdGRjYWxsIFdOZXRDb25uZWN0aW9uRGlhbG9nMUEocHRyKSBXTmV0Q29ubmVjdGlvbkRpYWxvZzFfMzJBCi0wMDYwIHN0ZGNhbGwgV05ldENvbm5lY3Rpb25EaWFsb2cxVyhwdHIpIFdOZXRDb25uZWN0aW9uRGlhbG9nMV8zMlcKLTAwNjEgc3RkY2FsbCBXTmV0Q29ubmVjdGlvbkRpYWxvZzEobG9uZyBsb25nKSBXTmV0Q29ubmVjdGlvbkRpYWxvZzFfMzIKLTAwNjIgc3R1YiBXTmV0RGlzY29ubmVjdERpYWxvZzFBCi0wMDYzIHN0dWIgV05ldERpc2Nvbm5lY3REaWFsb2cxVwotMDA2NCBzdHViIFdOZXREaXNjb25uZWN0RGlhbG9nCi0wMDY1IHN0dWIgV05ldEVudW1DYWNoZWRQYXNzd29yZHMKLTAwNjYgc3R1YiBXTmV0RW51bVJlc291cmNlQQotMDA2NyBzdHViIFdOZXRFbnVtUmVzb3VyY2VXCi0wMDY4IHN0dWIgV05ldEZvcm1hdE5ldHdvcmtOYW1lQQotMDA2OSBzdHViIFdOZXRGb3JtYXROZXR3b3JrTmFtZVcKLTAwNzAgc3RkY2FsbCBXTmV0R2V0Q2FjaGVkUGFzc3dvcmQocHRyIGxvbmcgcHRyIHB0ciBsb25nKSBXTmV0R2V0Q2FjaGVkUGFzc3dvcmQKLTAwNzEgc3RkY2FsbCBXTmV0R2V0Q29ubmVjdGlvbkEoc3RyIHB0ciBwdHIpIFdOZXRHZXRDb25uZWN0aW9uMzJBCi0wMDcyIHN0ZGNhbGwgV05ldEdldENvbm5lY3Rpb25XKHdzdHIgcHRyIHB0cikgV05ldEdldENvbm5lY3Rpb24zMlcKLTAwNzMgc3R1YiBXTmV0R2V0SG9tZURpcmVjdG9yeUEKLTAwNzQgc3R1YiBXTmV0R2V0SG9tZURpcmVjdG9yeVcKLTAwNzUgc3R1YiBXTmV0R2V0TGFzdEVycm9yQQotMDA3NiBzdHViIFdOZXRHZXRMYXN0RXJyb3JXCi0wMDc3IHN0dWIgV05ldEdldE5ldHdvcmtJbmZvcm1hdGlvbkEKLTAwNzggc3R1YiBXTmV0R2V0TmV0d29ya0luZm9ybWF0aW9uVwotMDA3OSBzdHViIFdOZXRHZXRQcm92aWRlck5hbWVBCi0wMDgwIHN0dWIgV05ldEdldFByb3ZpZGVyTmFtZVcKLTAwODEgc3RkY2FsbCBXTmV0R2V0UmVzb3VyY2VJbmZvcm1hdGlvbkEocHRyIHB0ciBwdHIgcHRyKSBXTmV0R2V0UmVzb3VyY2VJbmZvcm1hdGlvbjMyQQotMDA4MiBzdHViIFdOZXRHZXRSZXNvdXJjZUluZm9ybWF0aW9uVwotMDA4MyBzdHViIFdOZXRHZXRSZXNvdXJjZVBhcmVudEEKLTAwODQgc3R1YiBXTmV0R2V0UmVzb3VyY2VQYXJlbnRXCi0wMDg1IHN0dWIgV05ldEdldFVuaXZlcnNhbE5hbWVBCi0wMDg2IHN0dWIgV05ldEdldFVuaXZlcnNhbE5hbWVXCi0wMDg3IHN0dWIgV05ldEdldFVzZXJBCi0wMDg4IHN0dWIgV05ldEdldFVzZXJXCi0wMDg5IHN0dWIgV05ldExvZ29mZkEKLTAwOTAgc3R1YiBXTmV0TG9nb2ZmVwotMDA5MSBzdHViIFdOZXRMb2dvbkEKLTAwOTIgc3R1YiBXTmV0TG9nb25XCi0wMDkzIHN0ZGNhbGwgV05ldE9wZW5FbnVtQShsb25nIGxvbmcgbG9uZyBwdHIgcHRyKSBXTmV0T3BlbkVudW0zMkEKLTAwOTQgc3R1YiBXTmV0T3BlbkVudW1XCi0wMDk1IHN0dWIgV05ldFJlbW92ZUNhY2hlZFBhc3N3b3JkCi0wMDk2IHN0dWIgV05ldFJlc3RvcmVDb25uZWN0aW9uQQotMDA5NyBzdHViIFdOZXRSZXN0b3JlQ29ubmVjdGlvblcKLTAwOTggc3R1YiBXTmV0U2V0Q29ubmVjdGlvbkEKLTAwOTkgc3R1YiBXTmV0U2V0Q29ubmVjdGlvblcKLTAxMDAgc3R1YiBXTmV0VXNlQ29ubmVjdGlvbkEKLTAxMDEgc3R1YiBXTmV0VXNlQ29ubmVjdGlvblcKLTAxMDIgc3R1YiBXTmV0VmVyaWZ5UGFzc3dvcmRBCi0wMTAzIHN0dWIgV05ldFZlcmlmeVBhc3N3b3JkVyAKLSNhZGRpdGlvbnMKLTAxMDQgc3R1YiBXTmV0UmVzdG9yZUNvbm5lY3Rpb24KLTAxMDUgc3R1YiBXTmV0TG9nb25Ob3RpZnkKLTAxMDYgc3R1YiBXTmV0UGFzc3dvcmRDaGFuZ2VOb3RpZnkKLTAxMDcgc3R1YiBXTmV0R2V0UHJvcGVydHlUZXh0QQotMDEwOCBzdHViIFdOZXRQcm9wZXJ0eURpYWxvZ0EKLTAxMDkgc3R1YiBXTmV0R2V0RGlyZWN0b3J5VHlwZUEKKzAwMjUgc3RkY2FsbCBNdWx0aW5ldEdldENvbm5lY3Rpb25QZXJmb3JtYW5jZUEocHRyIHB0cikgTXVsdGluZXRHZXRDb25uZWN0aW9uUGVyZm9ybWFuY2UzMkEKKzAwMjYgc3R1YiBNdWx0aW5ldEdldENvbm5lY3Rpb25QZXJmb3JtYW5jZVcKKzAwMjcgc3RkY2FsbCBNdWx0aW5ldEdldEVycm9yVGV4dEEobG9uZyBwdHIgbG9uZylNdWx0aW5ldEdldEVycm9yVGV4dDMyQQorMDAyOCBzdGRjYWxsIE11bHRpbmV0R2V0RXJyb3JUZXh0Vyhsb25nIHB0ciBsb25nKU11bHRpbmV0R2V0RXJyb3JUZXh0MzJXCiswMDI5IHN0dWIgTlBTQXV0aGVudGljYXRpb25EaWFsb2dBCiswMDMwIHN0dWIgTlBTQ29weVN0cmluZ0EKKzAwMzEgc3R1YiBOUFNEZXZpY2VHZXROdW1iZXJBCiswMDMyIHN0dWIgTlBTRGV2aWNlR2V0U3RyaW5nQQorMDAzMyBzdHViIE5QU0dldFByb3ZpZGVySGFuZGxlQQorMDAzNCBzdHViIE5QU0dldFByb3ZpZGVyTmFtZUEKKzAwMzUgc3R1YiBOUFNHZXRTZWN0aW9uTmFtZUEKKzAwMzYgc3R1YiBOUFNOb3RpZnlHZXRDb250ZXh0QQorMDAzNyBzdHViIE5QU05vdGlmeVJlZ2lzdGVyQQorMDAzOCBzdHViIE5QU1NldEN1c3RvbVRleHRBCiswMDM5IHN0dWIgTlBTU2V0RXh0ZW5kZWRFcnJvckEKKzAwNDAgc3R1YiBQd2RDaGFuZ2VQYXNzd29yZEEKKzAwNDEgc3R1YiBQd2RDaGFuZ2VQYXNzd29yZFcKKzAwNDIgc3R1YiBQd2RHZXRQYXNzd29yZFN0YXR1c0EKKzAwNDMgc3R1YiBQd2RHZXRQYXNzd29yZFN0YXR1c1cKKzAwNDQgc3R1YiBQd2RTZXRQYXNzd29yZFN0YXR1c0EKKzAwNDUgc3R1YiBQd2RTZXRQYXNzd29yZFN0YXR1c1cKKzAwNDYgc3RkY2FsbCBXTmV0QWRkQ29ubmVjdGlvbjJBKHB0ciBzdHIgc3RyIGxvbmcpIFdOZXRBZGRDb25uZWN0aW9uMl8zMkEKKzAwNDcgc3RkY2FsbCBXTmV0QWRkQ29ubmVjdGlvbjJXKHB0ciB3c3RyIHdzdHIgbG9uZykgV05ldEFkZENvbm5lY3Rpb24yXzMyVworMDA0OCBzdGRjYWxsIFdOZXRBZGRDb25uZWN0aW9uM0EobG9uZyBwdHIgc3RyIHN0ciBsb25nKSBXTmV0QWRkQ29ubmVjdGlvbjNfMzJBCiswMDQ5IHN0ZGNhbGwgV05ldEFkZENvbm5lY3Rpb24zVyhsb25nIHB0ciB3c3RyIHdzdHIgbG9uZykgV05ldEFkZENvbm5lY3Rpb24zXzMyVworMDA1MCBzdGRjYWxsIFdOZXRBZGRDb25uZWN0aW9uQShzdHIgc3RyIHN0cikgV05ldEFkZENvbm5lY3Rpb24zMkEKKzAwNTEgc3RkY2FsbCBXTmV0QWRkQ29ubmVjdGlvblcod3N0ciB3c3RyIHdzdHIpIFdOZXRBZGRDb25uZWN0aW9uMzJXCiswMDUyIHN0ZGNhbGwgV05ldENhY2hlUGFzc3dvcmQoc3RyIGxvbmcgc3RyIGxvbmcgbG9uZykgV05ldENhY2hlUGFzc3dvcmQKKzAwNTMgc3R1YiBXTmV0Q2FuY2VsQ29ubmVjdGlvbjJBCiswMDU0IHN0dWIgV05ldENhbmNlbENvbm5lY3Rpb24yVworMDA1NSBzdHViIFdOZXRDYW5jZWxDb25uZWN0aW9uQQorMDA1NiBzdHViIFdOZXRDYW5jZWxDb25uZWN0aW9uVworMDA1NyBzdHViIFdOZXRDbG9zZUVudW0KKzAwNTggc3RkY2FsbCBXTmV0Q29ubmVjdGlvbkRpYWxvZzFBKHB0cikgV05ldENvbm5lY3Rpb25EaWFsb2cxXzMyQQorMDA1OSBzdGRjYWxsIFdOZXRDb25uZWN0aW9uRGlhbG9nMVcocHRyKSBXTmV0Q29ubmVjdGlvbkRpYWxvZzFfMzJXCiswMDYwIHN0ZGNhbGwgV05ldENvbm5lY3Rpb25EaWFsb2cobG9uZyBsb25nKSBXTmV0Q29ubmVjdGlvbkRpYWxvZ18zMgorMDA2MSBzdHViIFdOZXREaXNjb25uZWN0RGlhbG9nMUEKKzAwNjIgc3R1YiBXTmV0RGlzY29ubmVjdERpYWxvZzFXCiswMDYzIHN0dWIgV05ldERpc2Nvbm5lY3REaWFsb2cKKzAwNjQgc3R1YiBXTmV0RW51bUNhY2hlZFBhc3N3b3JkcworMDA2NSBzdHViIFdOZXRFbnVtUmVzb3VyY2VBCiswMDY2IHN0dWIgV05ldEVudW1SZXNvdXJjZVcKKzAwNjcgc3R1YiBXTmV0Rm9ybWF0TmV0d29ya05hbWVBCiswMDY4IHN0dWIgV05ldEZvcm1hdE5ldHdvcmtOYW1lVworMDA2OSBzdGRjYWxsIFdOZXRHZXRDYWNoZWRQYXNzd29yZChwdHIgbG9uZyBwdHIgcHRyIGxvbmcpIFdOZXRHZXRDYWNoZWRQYXNzd29yZAorMDA3MCBzdGRjYWxsIFdOZXRHZXRDb25uZWN0aW9uQShzdHIgcHRyIHB0cikgV05ldEdldENvbm5lY3Rpb24zMkEKKzAwNzEgc3RkY2FsbCBXTmV0R2V0Q29ubmVjdGlvblcod3N0ciBwdHIgcHRyKSBXTmV0R2V0Q29ubmVjdGlvbjMyVworMDA3MiBzdHViIFdOZXRHZXRIb21lRGlyZWN0b3J5QQorMDA3MyBzdHViIFdOZXRHZXRIb21lRGlyZWN0b3J5VworMDA3NCBzdHViIFdOZXRHZXRMYXN0RXJyb3JBCiswMDc1IHN0dWIgV05ldEdldExhc3RFcnJvclcKKzAwNzYgc3R1YiBXTmV0R2V0TmV0d29ya0luZm9ybWF0aW9uQQorMDA3NyBzdHViIFdOZXRHZXROZXR3b3JrSW5mb3JtYXRpb25XCiswMDc4IHN0dWIgV05ldEdldFByb3ZpZGVyTmFtZUEKKzAwNzkgc3R1YiBXTmV0R2V0UHJvdmlkZXJOYW1lVworMDA4MCBzdGRjYWxsIFdOZXRHZXRSZXNvdXJjZUluZm9ybWF0aW9uQShwdHIgcHRyIHB0ciBwdHIpIFdOZXRHZXRSZXNvdXJjZUluZm9ybWF0aW9uMzJBCiswMDgxIHN0dWIgV05ldEdldFJlc291cmNlSW5mb3JtYXRpb25XCiswMDgyIHN0dWIgV05ldEdldFJlc291cmNlUGFyZW50QQorMDA4MyBzdHViIFdOZXRHZXRSZXNvdXJjZVBhcmVudFcKKzAwODQgc3R1YiBXTmV0R2V0VW5pdmVyc2FsTmFtZUEKKzAwODUgc3R1YiBXTmV0R2V0VW5pdmVyc2FsTmFtZVcKKzAwODYgc3R1YiBXTmV0R2V0VXNlckEKKzAwODcgc3R1YiBXTmV0R2V0VXNlclcKKzAwODggc3R1YiBXTmV0TG9nb2ZmQQorMDA4OSBzdHViIFdOZXRMb2dvZmZXCiswMDkwIHN0dWIgV05ldExvZ29uQQorMDA5MSBzdHViIFdOZXRMb2dvblcKKzAwOTIgc3RkY2FsbCBXTmV0T3BlbkVudW1BKGxvbmcgbG9uZyBsb25nIHB0ciBwdHIpIFdOZXRPcGVuRW51bTMyQQorMDA5MyBzdHViIFdOZXRPcGVuRW51bVcKKzAwOTQgc3R1YiBXTmV0UmVtb3ZlQ2FjaGVkUGFzc3dvcmQKKzAwOTUgc3R1YiBXTmV0UmVzdG9yZUNvbm5lY3Rpb25BCiswMDk2IHN0dWIgV05ldFJlc3RvcmVDb25uZWN0aW9uVworMDA5NyBzdHViIFdOZXRTZXRDb25uZWN0aW9uQQorMDA5OCBzdHViIFdOZXRTZXRDb25uZWN0aW9uVworMDA5OSBzdHViIFdOZXRVc2VDb25uZWN0aW9uQQorMDEwMCBzdHViIFdOZXRVc2VDb25uZWN0aW9uVworMDEwMSBzdHViIFdOZXRWZXJpZnlQYXNzd29yZEEKKzAxMDIgc3R1YiBXTmV0VmVyaWZ5UGFzc3dvcmRXIAorCisjYWRkaXRpb25zLCBub3QgaW4gd2luOTUgbXByLmRsbAorMDEwMyBzdHViIFdOZXRSZXN0b3JlQ29ubmVjdGlvbgorMDEwNCBzdHViIFdOZXRMb2dvbk5vdGlmeQorMDEwNSBzdHViIFdOZXRQYXNzd29yZENoYW5nZU5vdGlmeQorMDEwNiBzdHViIFdOZXRHZXRQcm9wZXJ0eVRleHRBCiswMTA3IHN0dWIgV05ldFByb3BlcnR5RGlhbG9nQQorMDEwOCBzdHViIFdOZXRHZXREaXJlY3RvcnlUeXBlQQpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9udGRsbC5zcGVjIGIvcmVsYXkzMi9udGRsbC5zcGVjCmluZGV4IGNkNWRhYWEuLjBmYmFmNzYgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvbnRkbGwuc3BlYworKysgYi9yZWxheTMyL250ZGxsLnNwZWMKQEAgLTk3MiwzICs5NzIsMTYgQEAKIDk2NyBzdHViIFJ0bExvb2t1cEF0b21JbkF0b21UYWJsZQogOTY4IHN0dWIgUnRsUXVlcnlBdG9tSW5BdG9tVGFibGUKIDk2OSBzdGRjYWxsIFJ0bFRyeUVudGVyQ3JpdGljYWxTZWN0aW9uKHB0cikgVHJ5RW50ZXJDcml0aWNhbFNlY3Rpb24KKzk3MCBzdHViIFJ0bEVudW1lcmF0ZVByb3BlcnRpZXMKKzk3MSBzdHViIFJ0bFNldFByb3BlcnR5Q2xhc3NJZAorOTcyIHN0dWIgUnRsU2V0UHJvcGVydHlOYW1lcworOTczIHN0dWIgUnRsUXVlcnlQcm9wZXJ0eU5hbWVzCis5NzQgc3R1YiBSdGxGbHVzaFByb3BlcnR5U2V0Cis5NzUgc3R1YiBSdGxTZXRQcm9wZXJ0aWVzCis5NzYgc3R1YiBSdGxRdWVyeVByb3BlcnRpZXMKKzk3NyBzdHViIFJ0bFF1ZXJ5UHJvcGVydHlTZXQKKzk3OCBzdHViIFJ0bFNldFVuaWNvZGVDYWxsb3V0cworOTc5IHN0dWIgUnRsUHJvcGVydHlTZXROYW1lVG9HdWlkCis5ODAgc3R1YiBSdGxHdWlkVG9Qcm9wZXJ0eVNldE5hbWUKKzk4MSBzdHViIFJ0bENsb3NlUHJvcGVydHlTZXQKKzk4MiBzdHViIFJ0bENyZWF0ZVByb3BlcnR5U2V0CmRpZmYgLS1naXQgYS9yZWxheTMyL3NoZWxsMzIuc3BlYyBiL3JlbGF5MzIvc2hlbGwzMi5zcGVjCmluZGV4IDUyNDA2M2EuLmVjZmVmYWIgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvc2hlbGwzMi5zcGVjCisrKyBiL3JlbGF5MzIvc2hlbGwzMi5zcGVjCkBAIC0xLDUgKzEsNiBAQAogbmFtZQlzaGVsbDMyCiB0eXBlCXdpbjMyCitpbml0CVNoZWxsMzJMaWJNYWluCiAKICMgRnVuY3Rpb25zIGV4cG9ydGVkIGJ5IHRoZSBXaW45NSBzaGVsbDMyLmRsbCAKICMgKHRoZXNlIG5lZWQgdG8gaGF2ZSB0aGVzZSBleGFjdCBvcmRpbmFscywgZm9yIHNvbWUgCkBAIC03LDEwICs4LDEwIEBACiAjIFRoaXMgbGlzdCB3YXMgdXBkYXRlZCB0byBkbGwgdmVyc2lvbiA0LjcyCiAKICAgIDIgc3RkY2FsbCBTSENoYW5nZU5vdGlmeVJlZ2lzdGVyKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBTSENoYW5nZU5vdGlmeVJlZ2lzdGVyCi0gICAzIHN0dWIgQ2hlY2tFc2NhcGVzQUA4ICAgIyBleHBvcnRlZCBieSBuYW1lCisgICAzIHN0dWIgQ2hlY2tFc2NhcGVzQSAgICMgZXhwb3J0ZWQgYnkgbmFtZQogICAgNCBzdGRjYWxsIFNIQ2hhbmdlTm90aWZ5RGVyZWdpc3RlciAobG9uZyBsb25nKSBTSENoYW5nZU5vdGlmeURlcmVnaXN0ZXIKICAgIDUgc3R1YiBTSENoYW5nZU5vdGlmeVVwZGF0ZUVudHJ5TGlzdEAxNgotICAgNiBzdHViIENoZWNrRXNjYXBlc1dAOCAgICMgZXhwb3J0ZWQgYnkgbmFtZQorICAgNiBzdHViIENoZWNrRXNjYXBlc1cgICAjIGV4cG9ydGVkIGJ5IG5hbWUKICAgIDcgc3RkY2FsbCBDb21tYW5kTGluZVRvQXJndlcod3N0ciBwdHIpIENvbW1hbmRMaW5lVG9Bcmd2VyAgICMgZXhwb3J0ZWQgYnkgbmFtZQogICAgOCBzdHViIENvbnRyb2xfRmlsbENhY2hlX1J1bkRMTEAxNiAgICMgZXhwb3J0ZWQgYnkgbmFtZQogICAgOSBzdHViIFBpZk1ncl9PcGVuUHJvcGVydGllc0AxNgpAQCAtMTE4LDE2ICsxMTksMTYgQEAKICAxMTEgc3R1YiBGaWxlTWVudV9JbnZhbGlkYXRlCiAgMTEyIHN0dWIgRmlsZU1lbnVfTWVhc3VyZUl0ZW0KICAxMTMgc3R1YiBGaWxlTWVudV9SZXBsYWNlVXNpbmdQaWRsCi0gMTE0IHN0dWIgRmlsZU1lbnVfQ3JlYXRlCisgMTE0IHN0ZGNhbGwgRmlsZU1lbnVfQ3JlYXRlIChsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIEZpbGVNZW51X0NyZWF0ZQogIDExNSBzdHViIEZpbGVNZW51X0FwcGVuZEl0ZW0KICAxMTYgc3R1YiBGaWxlTWVudV9UcmFja1BvcHVwTWVudUV4CiAgMTE3IHN0dWIgRmlsZU1lbnVfRGVsZXRlSXRlbUJ5Q21kCiAgMTE4IHN0dWIgRmlsZU1lbnVfRGVzdHJveQotIDExOSBzdGRjYWxsIElzTEZORHJpdmUocHRyKSBJc0xGTkRyaXZlCisgMTE5IHN0ZGNhbGwgSXNMRk5Ecml2ZShzdHIpIElzTEZORHJpdmUKICAxMjAgc3R1YiBGaWxlTWVudV9BYm9ydEluaXRNZW51CiAgMTIxIHN0dWIgU0hGbHVzaENsaXBib2FyZAogIDEyMiBzdHViIFJ1bkRMTF9DYWxsRW50cnkxNgotIDEyMyBzdHViIFNIRnJlZVVudXNlZExpYnJhcmllcworIDEyMyBzdGRjYWxsIFNIRnJlZVVudXNlZExpYnJhcmllcyAobG9uZykgU0hGcmVlVW51c2VkTGlicmFyaWVzCiAgMTI0IHN0dWIgRmlsZU1lbnVfQXBwZW5kRmlsZXNGb3JQaWRsCiAgMTI1IHN0dWIgRmlsZU1lbnVfQWRkRmlsZXNGb3JQaWRsCiAgMTI2IHN0dWIgU0hPdXRPZk1lbW9yeU1lc3NhZ2VCb3gKQEAgLTE1Myw3ICsxNTQsNyBAQAogIDE0NiBzdHViIFJMQnVpbGRMaXN0T2ZQYXRocwogIDE0NyBzdGRjYWxsIFNIQ0xTSURGcm9tU3RyaW5nKGxvbmcgbG9uZykgU0hDTFNJREZyb21TdHJpbmcKICAxNDggc3RkY2FsbCBFeHRyYWN0QXNzb2NpYXRlZEljb25BKGxvbmcgcHRyIGxvbmcpIEV4dHJhY3RBc3NvY2lhdGVkSWNvbjMyQSAgICMgZXhwb3J0ZWQgYnkgbmFtZQotIDE0OSBzdHViIFNIRmluZF9Jbml0TWVudVBvcHVwCisgMTQ5IHN0ZGNhbGwgU0hGaW5kX0luaXRNZW51UG9wdXAobG9uZyBsb25nIGxvbmcgbG9uZykgU0hGaW5kX0luaXRNZW51UG9wdXAKICAxNTAgc3R1YiBFeHRyYWN0QXNzb2NpYXRlZEljb25FeEEgICAjIGV4cG9ydGVkIGJ5IG5hbWUKICAxNTEgc3R1YiBTSExvYWRPTEUKICAxNTIgc3RkY2FsbCBJTEdldFNpemUocHRyKSBJTEdldFNpemUKQEAgLTE4MCwxNCArMTgxLDE0IEBACiAgMTczIHN0dWIgU0hWYWxpZGF0ZVVOQwogIDE3NCBzdGRjYWxsIFNIQ3JlYXRlU2hlbGxGb2xkZXJWaWV3RXggKHB0ciBwdHIpIFNIQ3JlYXRlU2hlbGxGb2xkZXJWaWV3RXgzMgogIDE3NSBzdGRjYWxsIFNIR2V0U3BlY2lhbEZvbGRlclBhdGgobG9uZyBsb25nIGxvbmcgbG9uZykgU0hHZXRTcGVjaWFsRm9sZGVyUGF0aAotIDE3NiBzdHViIFNIU2V0SW5zdGFuY2VFeHBsb3JlcgorIDE3NiBzdGRjYWxsIFNIU2V0SW5zdGFuY2VFeHBsb3JlciAobG9uZykgU0hTZXRJbnN0YW5jZUV4cGxvcmVyCiAgMTc3IHN0dWIgREFEX1NldERyYWdJbWFnZUZyb21MaXN0VmlldwogIDE3OCBzdHViIFNIT2JqZWN0UHJvcGVydGllcwogIDE3OSBzdHViIFNIR2V0TmV3TGlua0luZm9BCiAgMTgwIHN0dWIgU0hHZXROZXdMaW5rSW5mb1cKICAxODEgc3RkY2FsbCBSZWdpc3RlclNoZWxsSG9vayhsb25nIGxvbmcpIFJlZ2lzdGVyU2hlbGxIb29rMzIKICAxODIgc3R1YiBTaGVsbE1lc3NhZ2VCb3hXCi0gMTgzIGNkZWNsIFNoZWxsTWVzc2FnZUJveEEobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIFNoZWxsTWVzc2FnZUJveEEKKyAxODMgY2RlY2wgU2hlbGxNZXNzYWdlQm94QShsb25nIGxvbmcgbG9uZyBzdHIgbG9uZyBsb25nKSBTaGVsbE1lc3NhZ2VCb3hBCiAgMTg0IHN0ZGNhbGwgQXJyYW5nZVdpbmRvd3MobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBBcnJhbmdlV2luZG93cwogIDE4NSBzdHViIFNISGFuZGxlRGlza0Z1bGwKICAxODYgc3R1YiBFeHRyYWN0QXNzb2NpYXRlZEljb25FeFcgICAjIGV4cG9ydGVkIGJ5IG5hbWUKQEAgLTIzNyw3ICsyMzgsNyBAQAogIDIzMCBzdHViIFJlYWxTaGVsbEV4ZWN1dGVFeEEgICAjIGV4cG9ydGVkIGJ5IG5hbWUKICAyMzEgc3R1YiBSZWFsU2hlbGxFeGVjdXRlRXhXICAgIyBleHBvcnRlZCBieSBuYW1lCiAgMjMyIHN0dWIgUmVhbFNoZWxsRXhlY3V0ZVcgICAjIGV4cG9ydGVkIGJ5IG5hbWUKLSAyMzMgc3R1YiBSZWdlbmVyYXRlVXNlckVudmlyb25tZW50QDggICAjIGV4cG9ydGVkIGJ5IG5hbWUKKyAyMzMgc3R1YiBSZWdlbmVyYXRlVXNlckVudmlyb25tZW50ICAgIyBleHBvcnRlZCBieSBuYW1lCiAgMjM0IHN0ZGNhbGwgU0hBZGRUb1JlY2VudERvY3MgKGxvbmcgcHRyKSBTSEFkZFRvUmVjZW50RG9jczMyICAjIGV4cG9ydGVkIGJ5IG5hbWUKICAyMzUgc3RkY2FsbCBTSEFwcEJhck1lc3NhZ2UobG9uZyBwdHIpIFNIQXBwQmFyTWVzc2FnZTMyICAgIyBleHBvcnRlZCBieSBuYW1lCiAgMjM2IHN0ZGNhbGwgU0hCcm93c2VGb3JGb2xkZXIocHRyKSBTSEJyb3dzZUZvckZvbGRlcjMyQSAgICMgZXhwb3J0ZWQgYnkgbmFtZQpAQCAtMjYwLDEwICsyNjEsMTAgQEAKICAyNTMgc3RkY2FsbCBTSEdldEZpbGVJbmZvKHB0ciBsb25nIHB0ciBsb25nIGxvbmcpIFNIR2V0RmlsZUluZm8zMkEgICAjIGV4cG9ydGVkIGJ5IG5hbWUKICAyNTQgc3RkY2FsbCBTSEdldEZpbGVJbmZvQShwdHIgbG9uZyBwdHIgbG9uZyBsb25nKSBTSEdldEZpbGVJbmZvMzJBICAgIyBleHBvcnRlZCBieSBuYW1lCiAgMjU1IHN0dWIgU0hHZXRGaWxlSW5mb1dAMjAgIyBleHBvcnRlZCBieSBuYW1lCi0gMjU2IHN0dWIgU0hHZXRJbnN0YW5jZUV4cGxvcmVyICAgIyBleHBvcnRlZCBieSBuYW1lCisgMjU2IHN0ZGNhbGwgU0hHZXRJbnN0YW5jZUV4cGxvcmVyIChsb25nKSBTSEdldEluc3RhbmNlRXhwbG9yZXIKICAyNTcgc3RkY2FsbCBTSEdldE1hbGxvYyhwdHIpIFNIR2V0TWFsbG9jICAgIyBleHBvcnRlZCBieSBuYW1lCiAgMjU4IHN0dWIgU0hHZXROZXdMaW5rSW5mb0AyMCAgICMgZXhwb3J0ZWQgYnkgbmFtZQotIDI1OSBzdGRjYWxsIFNIR2V0UGF0aEZyb21JRExpc3QocHRyIHB0cikgU0hHZXRQYXRoRnJvbUlETGlzdCAgICMgZXhwb3J0ZWQgYnkgbmFtZQorIDI1OSBzdGRjYWxsIFNIR2V0UGF0aEZyb21JRExpc3QocHRyIHB0cikgU0hHZXRQYXRoRnJvbUlETGlzdDMyICAgIyBleHBvcnRlZCBieSBuYW1lCiAgMjYwIHN0dWIgU0hHZXRQYXRoRnJvbUlETGlzdEA4ICMgZXhwb3J0ZWQgYnkgbmFtZQogIDI2MSBzdGRjYWxsIFNIR2V0UGF0aEZyb21JRExpc3RBIChsb25nIGxvbmcpIFNIR2V0UGF0aEZyb21JRExpc3QzMkEgIyBleHBvcnRlZCBieSBuYW1lCiAgMjYyIHN0ZGNhbGwgU0hHZXRQYXRoRnJvbUlETGlzdFcgKGxvbmcgbG9uZykgU0hHZXRQYXRoRnJvbUlETGlzdDMyVyAjIGV4cG9ydGVkIGJ5IG5hbWUKQEAgLTI5Niw3ICsyOTcsNyBAQAogIDI4OCBzdGRjYWxsIFNoZWxsQWJvdXRBKGxvbmcgc3RyIHN0ciBsb25nKSBTaGVsbEFib3V0MzJBCiAgMjg5IHN0ZGNhbGwgU2hlbGxBYm91dFcobG9uZyB3c3RyIHdzdHIgbG9uZykgU2hlbGxBYm91dDMyVwogIDI5MCBzdGRjYWxsIFNoZWxsRXhlY3V0ZUEobG9uZyBzdHIgc3RyIHN0ciBzdHIgbG9uZykgU2hlbGxFeGVjdXRlMzJBCi0gMjkxIHN0dWIgU2hlbGxFeGVjdXRlRXgKKyAyOTEgc3RkY2FsbCBTaGVsbEV4ZWN1dGVFeCAobG9uZykgU2hlbGxFeGVjdXRlRXgKICAyOTIgc3R1YiBTaGVsbEV4ZWN1dGVFeEEKICAyOTMgc3R1YiBTaGVsbEV4ZWN1dGVFeFcKICAyOTQgc3R1YiBTaGVsbEV4ZWN1dGVXCmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvTWFrZWZpbGUuaW4gYi9zY2hlZHVsZXIvTWFrZWZpbGUuaW4KaW5kZXggYzI3M2RiNi4uMjZiOTFlMCAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL01ha2VmaWxlLmluCisrKyBiL3NjaGVkdWxlci9NYWtlZmlsZS5pbgpAQCAtMTYsNiArMTYsNyBAQAogCXNlbWFwaG9yZS5jIFwKIAlzeW5jaHJvLmMgXAogCXN5c2RlcHMuYyBcCisJc3lzbGV2ZWwuYyBcCiAJdGhyZWFkLmMKIAogYWxsOiAkKE1PRFVMRSkubwpkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL2NsaWVudC5jIGIvc2NoZWR1bGVyL2NsaWVudC5jCmluZGV4IDk4ZjRmNzUuLjRhMzViY2YgMTAwNjQ0Ci0tLSBhL3NjaGVkdWxlci9jbGllbnQuYworKysgYi9zY2hlZHVsZXIvY2xpZW50LmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlICJwcm9jZXNzLmgiCiAjaW5jbHVkZSAidGhyZWFkLmgiCiAjaW5jbHVkZSAic2VydmVyLmgiCisjaW5jbHVkZSAic2VydmVyL3JlcXVlc3QuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgogCiAvKiBTb21lIHZlcnNpb25zIG9mIGdsaWJjIGRvbid0IGRlZmluZSB0aGlzICovCkBAIC0yMyw2ICsyNCwyNiBAQAogI2RlZmluZSBTQ01fUklHSFRTIDEKICNlbmRpZgogCisjZGVmaW5lIENIRUNLX0xFTihsZW4sd2FudGVkKSBcCisgIGlmICgobGVuKSA9PSAod2FudGVkKSkgOyBcCisgIGVsc2UgQ0xJRU5UX1Byb3RvY29sRXJyb3IoIF9fRlVOQ1RJT05fXyAiOiBsZW4gJWQgIT0gJWRcbiIsIChsZW4pLCAod2FudGVkKSApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDTElFTlRfUHJvdG9jb2xFcnJvcgorICovCitzdGF0aWMgdm9pZCBDTElFTlRfUHJvdG9jb2xFcnJvciggY29uc3QgY2hhciAqZXJyLCAuLi4gKQoreworICAgIFRIREIgKnRoZGIgPSBUSFJFQURfQ3VycmVudCgpOworICAgIHZhX2xpc3QgYXJnczsKKworICAgIHZhX3N0YXJ0KCBhcmdzLCBlcnIgKTsKKyAgICBmcHJpbnRmKCBzdGRlcnIsICJDbGllbnQgcHJvdG9jb2wgZXJyb3I6JXA6ICIsIHRoZGItPnNlcnZlcl90aWQgKTsKKyAgICB2ZnByaW50Ziggc3RkZXJyLCBlcnIsIGFyZ3MgKTsKKyAgICB2YV9lbmQoIGFyZ3MgKTsKKyAgICBFeGl0VGhyZWFkKDEpOworfQorCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENMSUVOVF9TZW5kUmVxdWVzdF92CiAgKgpAQCAtNjIsMTAgKzgzLDggQEAKIAogICAgIGlmICgocmV0ID0gc2VuZG1zZyggdGhkYi0+c29ja2V0LCAmbXNnaGRyLCAwICkpIDwgbGVuKQogICAgIHsKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiRmF0YWwgcHJvdG9jb2wgZXJyb3I6ICIgKTsKICAgICAgICAgaWYgKHJldCA9PSAtMSkgcGVycm9yKCAic2VuZG1zZyIgKTsKLSAgICAgICAgZWxzZSBmcHJpbnRmKCBzdGRlcnIsICJwYXJ0aWFsIG1zZyBzZW50ICVkLyVkXG4iLCByZXQsIGxlbiApOwotICAgICAgICBFeGl0VGhyZWFkKDEpOworICAgICAgICBDTElFTlRfUHJvdG9jb2xFcnJvciggInBhcnRpYWwgbXNnIHNlbnQgJWQvJWRcbiIsIHJldCwgbGVuICk7CiAgICAgfQogICAgIC8qIHdlIHBhc3NlZCB0aGUgZmQgbm93IHdlIGNhbiBjbG9zZSBpdCAqLwogICAgIGlmIChwYXNzX2ZkICE9IC0xKSBjbG9zZSggcGFzc19mZCApOwpAQCAtMTIzLDMwICsxNDIsMjEgQEAKIAogICAgIGlmICgocmV0ID0gcmVjdm1zZyggdGhkYi0+c29ja2V0LCAmbXNnaGRyLCAwICkpID09IC0xKQogICAgIHsKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiRmF0YWwgcHJvdG9jb2wgZXJyb3I6ICIgKTsKICAgICAgICAgcGVycm9yKCJyZWN2bXNnIik7Ci0gICAgICAgIEV4aXRUaHJlYWQoMSk7CisgICAgICAgIENMSUVOVF9Qcm90b2NvbEVycm9yKCAicmVjdm1zZ1xuIiApOwogICAgIH0KKyAgICBpZiAoIXJldCkgRXhpdFRocmVhZCgxKTsgLyogdGhlIHNlcnZlciBjbG9zZWQgdGhlIGNvbm5lY3Rpb247IHRpbWUgdG8gZGllLi4uICovCisKKyAgICAvKiBzYW5pdHkgY2hlY2tzICovCisKICAgICBpZiAocmV0IDwgc2l6ZW9mKGhlYWQpKQotICAgIHsKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLAotICAgICAgICAgICAgICAgICAiRmF0YWwgcHJvdG9jb2wgZXJyb3I6IHBhcnRpYWwgaGVhZGVyIHJlY2VpdmVkICVkLyVkXG4iLAotICAgICAgICAgICAgICAgICByZXQsIHNpemVvZihoZWFkKSk7Ci0gICAgICAgIEV4aXRUaHJlYWQoMSk7Ci0gICAgfQorICAgICAgICBDTElFTlRfUHJvdG9jb2xFcnJvciggInBhcnRpYWwgaGVhZGVyIHJlY2VpdmVkICVkLyVkXG4iLCByZXQsIHNpemVvZihoZWFkKSApOworCiAgICAgaWYgKChoZWFkLmxlbiA8IHNpemVvZihoZWFkKSkgfHwgKGhlYWQubGVuID4gTUFYX01TR19MRU5HVEgpKQotICAgIHsKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiRmF0YWwgcHJvdG9jb2wgZXJyb3I6IGhlYWRlciBsZW5ndGggJWRcbiIsCi0gICAgICAgICAgICAgICAgIGhlYWQubGVuICk7Ci0gICAgICAgIEV4aXRUaHJlYWQoMSk7Ci0gICAgfQorICAgICAgICBDTElFTlRfUHJvdG9jb2xFcnJvciggImhlYWRlciBsZW5ndGggJWRcbiIsIGhlYWQubGVuICk7CisKICAgICBpZiAoaGVhZC5zZXEgIT0gdGhkYi0+c2VxKyspCi0gICAgewotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsCi0gICAgICAgICAgICAgICAgICJGYXRhbCBwcm90b2NvbCBlcnJvcjogc2VxdWVuY2UgJTA4eCBpbnN0ZWFkIG9mICUwOHhcbiIsCi0gICAgICAgICAgICAgICAgIGhlYWQuc2VxLCB0aGRiLT5zZXEgLSAxICk7Ci0gICAgICAgIEV4aXRUaHJlYWQoMSk7Ci0gICAgfQorICAgICAgICBDTElFTlRfUHJvdG9jb2xFcnJvciggInNlcXVlbmNlICUwOHggaW5zdGVhZCBvZiAlMDh4XG4iLCBoZWFkLnNlcSwgdGhkYi0+c2VxIC0gMSApOwogCiAjaWZuZGVmIEhBVkVfTVNHSERSX0FDQ1JJR0hUUwogICAgIHBhc3NfZmQgPSBjbXNnLmZkOwpAQCAtMTcxLDEwICsxODEsMTAgQEAKICAgICAgICAgaW50IGxlbiA9IHJlbWFpbmluZyA8IHNpemVvZihidWZmZXIpID8gcmVtYWluaW5nIDogc2l6ZW9mKGJ1ZmZlcik7CiAgICAgICAgIGlmICgobGVuID0gcmVjdiggdGhkYi0+c29ja2V0LCBidWZmZXIsIGxlbiwgMCApKSA9PSAtMSkKICAgICAgICAgewotICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiRmF0YWwgcHJvdG9jb2wgZXJyb3I6ICIgKTsKICAgICAgICAgICAgIHBlcnJvciggInJlY3YiICk7Ci0gICAgICAgICAgICBFeGl0VGhyZWFkKDEpOworICAgICAgICAgICAgQ0xJRU5UX1Byb3RvY29sRXJyb3IoICJyZWN2XG4iICk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKCFsZW4pIEV4aXRUaHJlYWQoMSk7IC8qIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uOyB0aW1lIHRvIGRpZS4uLiAqLwogICAgICAgICByZW1haW5pbmcgLT0gbGVuOwogICAgIH0KIApAQCAtMjA4LDQ4ICsyMTgsMTcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBzZW5kX25ld190aHJlYWQKLSAqCi0gKiBTZW5kIGEgbmV3IHRocmVhZCByZXF1ZXN0LiBIZWxwZXIgZnVuY3Rpb24gZm9yIENMSUVOVF9OZXdUaHJlYWQuCi0gKi8KLXN0YXRpYyBpbnQgc2VuZF9uZXdfdGhyZWFkKCBUSERCICp0aGRiICkKLXsKLSAgICBzdHJ1Y3QgbmV3X3RocmVhZF9yZXF1ZXN0IHJlcXVlc3Q7Ci0gICAgc3RydWN0IG5ld190aHJlYWRfcmVwbHkgcmVwbHk7Ci0gICAgaW50IGxlbiwgZmRbMl07Ci0KLSAgICBpZiAoc29ja2V0cGFpciggQUZfVU5JWCwgU09DS19TVFJFQU0sIDAsIGZkICkgPT0gLTEpCi0gICAgewotICAgICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX1RPT19NQU5ZX09QRU5fRklMRVMgKTsgIC8qIEZJWE1FICovCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICByZXF1ZXN0LnBpZCA9IHRoZGItPnByb2Nlc3MtPnNlcnZlcl9waWQ7Ci0gICAgQ0xJRU5UX1NlbmRSZXF1ZXN0KCBSRVFfTkVXX1RIUkVBRCwgZmRbMV0sIDEsICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCkgKTsKLQotICAgIGlmIChDTElFTlRfV2FpdFJlcGx5KCAmbGVuLCBOVUxMLCAxLCAmcmVwbHksIHNpemVvZihyZXBseSkgKSkgZ290byBlcnJvcjsKLSAgICBpZiAobGVuIDwgc2l6ZW9mKHJlcGx5KSkgZ290byBlcnJvcjsKLSAgICB0aGRiLT5zZXJ2ZXJfdGlkID0gcmVwbHkudGlkOwotICAgIHRoZGItPnByb2Nlc3MtPnNlcnZlcl9waWQgPSByZXBseS5waWQ7Ci0gICAgaWYgKHRoZGItPnNvY2tldCAhPSAtMSkgY2xvc2UoIHRoZGItPnNvY2tldCApOwotICAgIHRoZGItPnNvY2tldCA9IGZkWzBdOwotICAgIHRoZGItPnNlcSA9IDA7ICAvKiByZXNldCB0aGUgc2VxdWVuY2UgbnVtYmVyIGZvciB0aGUgbmV3IGZkICovCi0gICAgcmV0dXJuIDA7Ci0KLSBlcnJvcjoKLSAgICBjbG9zZSggZmRbMF0gKTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ0xJRU5UX05ld1RocmVhZAogICoKICAqIFNlbmQgYSBuZXcgdGhyZWFkIHJlcXVlc3QuCiAgKi8KLWludCBDTElFTlRfTmV3VGhyZWFkKCBUSERCICp0aGRiICkKK2ludCBDTElFTlRfTmV3VGhyZWFkKCBUSERCICp0aGRiLCBpbnQgKnRoYW5kbGUsIGludCAqcGhhbmRsZSApCiB7CisgICAgc3RydWN0IG5ld190aHJlYWRfcmVxdWVzdCByZXF1ZXN0OworICAgIHN0cnVjdCBuZXdfdGhyZWFkX3JlcGx5IHJlcGx5OworICAgIGludCBsZW4sIGZkWzJdOwogICAgIGV4dGVybiBCT09MMzIgVEhSRUFEX0luaXREb25lOworICAgIGV4dGVybiB2b2lkIHNlcnZlcl9tYWluX2xvb3AoIGludCBmZCApOwogCiAgICAgaWYgKCFUSFJFQURfSW5pdERvbmUpICAvKiBmaXJzdCB0aHJlYWQgLT4gc3RhcnQgdGhlIHNlcnZlciAqLwogICAgIHsKQEAgLTI4NSw3ICsyNjQsMzMgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBzZW5kX25ld190aHJlYWQoIHRoZGIgKTsKKyAgICBpZiAoc29ja2V0cGFpciggQUZfVU5JWCwgU09DS19TVFJFQU0sIDAsIGZkICkgPT0gLTEpCisgICAgeworICAgICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX1RPT19NQU5ZX09QRU5fRklMRVMgKTsgIC8qIEZJWE1FICovCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXF1ZXN0LnBpZCA9IHRoZGItPnByb2Nlc3MtPnNlcnZlcl9waWQ7CisgICAgQ0xJRU5UX1NlbmRSZXF1ZXN0KCBSRVFfTkVXX1RIUkVBRCwgZmRbMV0sIDEsICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCkgKTsKKworICAgIGlmIChDTElFTlRfV2FpdFJlcGx5KCAmbGVuLCBOVUxMLCAxLCAmcmVwbHksIHNpemVvZihyZXBseSkgKSkgZ290byBlcnJvcjsKKyAgICBpZiAobGVuIDwgc2l6ZW9mKHJlcGx5KSkgZ290byBlcnJvcjsKKyAgICB0aGRiLT5zZXJ2ZXJfdGlkID0gcmVwbHkudGlkOworICAgIHRoZGItPnByb2Nlc3MtPnNlcnZlcl9waWQgPSByZXBseS5waWQ7CisgICAgaWYgKHRoZGItPnNvY2tldCAhPSAtMSkgY2xvc2UoIHRoZGItPnNvY2tldCApOworICAgIHRoZGItPnNvY2tldCA9IGZkWzBdOworICAgIHRoZGItPnNlcSA9IDA7ICAvKiByZXNldCB0aGUgc2VxdWVuY2UgbnVtYmVyIGZvciB0aGUgbmV3IGZkICovCisKKyAgICAvKiB3ZSBkb24ndCBuZWVkIHRoZSBoYW5kbGVzIGZvciBub3cgKi8KKyAgICBpZiAodGhhbmRsZSkgKnRoYW5kbGUgPSByZXBseS50aGFuZGxlOworICAgIGVsc2UgaWYgKHJlcGx5LnRoYW5kbGUgIT0gLTEpIENMSUVOVF9DbG9zZUhhbmRsZSggcmVwbHkudGhhbmRsZSApOworICAgIGlmIChwaGFuZGxlKSAqcGhhbmRsZSA9IHJlcGx5LnBoYW5kbGU7CisgICAgZWxzZSBpZiAocmVwbHkucGhhbmRsZSAhPSAtMSkgQ0xJRU5UX0Nsb3NlSGFuZGxlKCByZXBseS5waGFuZGxlICk7CisgICAgcmV0dXJuIDA7CisKKyBlcnJvcjoKKyAgICBjbG9zZSggZmRbMF0gKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIApAQCAtMzAwLDExICszMDUsMTEyIEBACiAgICAgc3RydWN0IGluaXRfdGhyZWFkX3JlcXVlc3QgaW5pdDsKICAgICBpbnQgbGVuID0gc3RybGVuKCB0aGRiLT5wcm9jZXNzLT5lbnZfZGItPmNtZF9saW5lICk7CiAKLSAgICBpbml0LnBpZCA9IGdldHBpZCgpOworICAgIGluaXQudW5peF9waWQgPSBnZXRwaWQoKTsKICAgICBsZW4gPSBNSU4oIGxlbiwgTUFYX01TR19MRU5HVEggLSBzaXplb2YoaW5pdCkgKTsKIAogICAgIENMSUVOVF9TZW5kUmVxdWVzdCggUkVRX0lOSVRfVEhSRUFELCAtMSwgMiwKICAgICAgICAgICAgICAgICAgICAgICAgICZpbml0LCBzaXplb2YoaW5pdCksCiAgICAgICAgICAgICAgICAgICAgICAgICB0aGRiLT5wcm9jZXNzLT5lbnZfZGItPmNtZF9saW5lLCBsZW4gKTsKLSAgICByZXR1cm4gQ0xJRU5UX1dhaXRSZXBseSggTlVMTCwgTlVMTCwgTlVMTCwgMCApOworICAgIHJldHVybiBDTElFTlRfV2FpdFJlcGx5KCBOVUxMLCBOVUxMLCAwICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0xJRU5UX1Rlcm1pbmF0ZVByb2Nlc3MKKyAqCisgKiBTZW5kIGEgdGVybWluYXRlIHByb2Nlc3MgcmVxdWVzdC4gUmV0dXJuIDAgaWYgT0suCisgKi8KK2ludCBDTElFTlRfVGVybWluYXRlUHJvY2VzcyggaW50IGhhbmRsZSwgaW50IGV4aXRfY29kZSApCit7CisgICAgQ0xJRU5UX1NlbmRSZXF1ZXN0KCBSRVFfVEVSTUlOQVRFX1BST0NFU1MsIC0xLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgJmhhbmRsZSwgc2l6ZW9mKGhhbmRsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAmZXhpdF9jb2RlLCBzaXplb2YoZXhpdF9jb2RlKSApOworICAgIHJldHVybiBDTElFTlRfV2FpdFJlcGx5KCBOVUxMLCBOVUxMLCAwICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENMSUVOVF9UZXJtaW5hdGVUaHJlYWQKKyAqCisgKiBTZW5kIGEgdGVybWluYXRlIHRocmVhZCByZXF1ZXN0LiBSZXR1cm4gMCBpZiBPSy4KKyAqLworaW50IENMSUVOVF9UZXJtaW5hdGVUaHJlYWQoIGludCBoYW5kbGUsIGludCBleGl0X2NvZGUgKQoreworICAgIENMSUVOVF9TZW5kUmVxdWVzdCggUkVRX1RFUk1JTkFURV9USFJFQUQsIC0xLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgJmhhbmRsZSwgc2l6ZW9mKGhhbmRsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAmZXhpdF9jb2RlLCBzaXplb2YoZXhpdF9jb2RlKSApOworICAgIHJldHVybiBDTElFTlRfV2FpdFJlcGx5KCBOVUxMLCBOVUxMLCAwICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENMSUVOVF9DbG9zZUhhbmRsZQorICoKKyAqIFNlbmQgYSBjbG9zZSBoYW5kbGUgcmVxdWVzdC4gUmV0dXJuIDAgaWYgT0suCisgKi8KK2ludCBDTElFTlRfQ2xvc2VIYW5kbGUoIGludCBoYW5kbGUgKQoreworICAgIENMSUVOVF9TZW5kUmVxdWVzdCggUkVRX0NMT1NFX0hBTkRMRSwgLTEsIDEsICZoYW5kbGUsIHNpemVvZihoYW5kbGUpICk7CisgICAgcmV0dXJuIENMSUVOVF9XYWl0UmVwbHkoIE5VTEwsIE5VTEwsIDAgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0xJRU5UX0R1cGxpY2F0ZUhhbmRsZQorICoKKyAqIFNlbmQgYSBkdXBsaWNhdGUgaGFuZGxlIHJlcXVlc3QuIFJldHVybiAwIGlmIE9LLgorICovCitpbnQgQ0xJRU5UX0R1cGxpY2F0ZUhhbmRsZSggaW50IHNyY19wcm9jZXNzLCBpbnQgc3JjX2hhbmRsZSwgaW50IGRzdF9wcm9jZXNzLCBpbnQgZHN0X2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBhY2Nlc3MsIEJPT0wzMiBpbmhlcml0LCBEV09SRCBvcHRpb25zICkKK3sKKyAgICBzdHJ1Y3QgZHVwX2hhbmRsZV9yZXF1ZXN0IHJlcTsKKyAgICBzdHJ1Y3QgZHVwX2hhbmRsZV9yZXBseSByZXBseTsKKyAgICBpbnQgbGVuOworCisgICAgcmVxLnNyY19wcm9jZXNzID0gc3JjX3Byb2Nlc3M7CisgICAgcmVxLnNyY19oYW5kbGUgID0gc3JjX2hhbmRsZTsKKyAgICByZXEuZHN0X3Byb2Nlc3MgPSBkc3RfcHJvY2VzczsKKyAgICByZXEuZHN0X2hhbmRsZSAgPSBkc3RfaGFuZGxlOworICAgIHJlcS5hY2Nlc3MgICAgICA9IGFjY2VzczsKKyAgICByZXEuaW5oZXJpdCAgICAgPSBpbmhlcml0OworICAgIHJlcS5vcHRpb25zICAgICA9IG9wdGlvbnM7CisKKyAgICBDTElFTlRfU2VuZFJlcXVlc3QoIFJFUV9EVVBfSEFORExFLCAtMSwgMSwgJnJlcSwgc2l6ZW9mKHJlcSkgKTsKKyAgICBDTElFTlRfV2FpdFJlcGx5KCAmbGVuLCBOVUxMLCAxLCAmcmVwbHksIHNpemVvZihyZXBseSkgKTsKKyAgICBDSEVDS19MRU4oIGxlbiwgc2l6ZW9mKHJlcGx5KSApOworICAgIHJldHVybiByZXBseS5oYW5kbGU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENMSUVOVF9HZXRQcm9jZXNzSW5mbworICoKKyAqIFNlbmQgYSBnZXQgcHJvY2VzcyBpbmZvIHJlcXVlc3QuIFJldHVybiAwIGlmIE9LLgorICovCitpbnQgQ0xJRU5UX0dldFByb2Nlc3NJbmZvKCBpbnQgaGFuZGxlLCBzdHJ1Y3QgZ2V0X3Byb2Nlc3NfaW5mb19yZXBseSAqcmVwbHkgKQoreworICAgIGludCBsZW4sIGVycjsKKworICAgIENMSUVOVF9TZW5kUmVxdWVzdCggUkVRX0dFVF9QUk9DRVNTX0lORk8sIC0xLCAxLCAmaGFuZGxlLCBzaXplb2YoaGFuZGxlKSApOworICAgIGVyciA9IENMSUVOVF9XYWl0UmVwbHkoICZsZW4sIE5VTEwsIDEsIHJlcGx5LCBzaXplb2YoKnJlcGx5KSApOworICAgIENIRUNLX0xFTiggbGVuLCBzaXplb2YoKnJlcGx5KSApOworICAgIHJldHVybiBlcnI7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0xJRU5UX09wZW5Qcm9jZXNzCisgKgorICogT3BlbiBhIGhhbmRsZSB0byBhIHByb2Nlc3MuCisgKi8KK2ludCBDTElFTlRfT3BlblByb2Nlc3MoIHZvaWQgKnBpZCwgRFdPUkQgYWNjZXNzLCBCT09MMzIgaW5oZXJpdCApCit7CisgICAgc3RydWN0IG9wZW5fcHJvY2Vzc19yZXF1ZXN0IHJlcTsKKyAgICBzdHJ1Y3Qgb3Blbl9wcm9jZXNzX3JlcGx5IHJlcGx5OworICAgIGludCBsZW47CisKKyAgICByZXEucGlkICAgICA9IHBpZDsKKyAgICByZXEuYWNjZXNzICA9IGFjY2VzczsKKyAgICByZXEuaW5oZXJpdCA9IGluaGVyaXQ7CisKKyAgICBDTElFTlRfU2VuZFJlcXVlc3QoIFJFUV9PUEVOX1BST0NFU1MsIC0xLCAxLCAmcmVxLCBzaXplb2YocmVxKSApOworICAgIENMSUVOVF9XYWl0UmVwbHkoICZsZW4sIE5VTEwsIDEsICZyZXBseSwgc2l6ZW9mKHJlcGx5KSApOworICAgIENIRUNLX0xFTiggbGVuLCBzaXplb2YocmVwbHkpICk7CisgICAgcmV0dXJuIHJlcGx5LmhhbmRsZTsKIH0KZGlmZiAtLWdpdCBhL3NjaGVkdWxlci9ldmVudC5jIGIvc2NoZWR1bGVyL2V2ZW50LmMKaW5kZXggZDVhZDljOC4uMWNhOWQxNiAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL2V2ZW50LmMKKysrIGIvc2NoZWR1bGVyL2V2ZW50LmMKQEAgLTEyNSw3ICsxMjUsNyBAQAogICAgIFNZU1RFTV9MT0NLKCk7CiAgICAgaWYgKChvYmogPSBLMzJPQkpfRmluZE5hbWVUeXBlKCBuYW1lLCBLMzJPQkpfRVZFTlQgKSkgIT0gTlVMTCkKICAgICB7Ci0gICAgICAgIGhhbmRsZSA9IEhBTkRMRV9BbGxvYyggUFJPQ0VTU19DdXJyZW50KCksIG9iaiwgYWNjZXNzLCBpbmhlcml0ICk7CisgICAgICAgIGhhbmRsZSA9IEhBTkRMRV9BbGxvYyggUFJPQ0VTU19DdXJyZW50KCksIG9iaiwgYWNjZXNzLCBpbmhlcml0LCAtMSApOwogICAgICAgICBLMzJPQkpfRGVjQ291bnQoIG9iaiApOwogICAgIH0KICAgICBTWVNURU1fVU5MT0NLKCk7CkBAIC0xNTMsNyArMTUzLDcgQEAKICAgICBFVkVOVCAqZXZlbnQ7CiAgICAgU1lTVEVNX0xPQ0soKTsKICAgICBpZiAoIShldmVudCA9IChFVkVOVCAqKUhBTkRMRV9HZXRPYmpQdHIoUFJPQ0VTU19DdXJyZW50KCksIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzMyT0JKX0VWRU5ULCBFVkVOVF9NT0RJRllfU1RBVEUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzMyT0JKX0VWRU5ULCBFVkVOVF9NT0RJRllfU1RBVEUsIE5VTEwpKSkKICAgICB7CiAgICAgICAgIFNZU1RFTV9VTkxPQ0soKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwpAQCAtMTc1LDcgKzE3NSw3IEBACiAgICAgRVZFTlQgKmV2ZW50OwogICAgIFNZU1RFTV9MT0NLKCk7CiAgICAgaWYgKCEoZXZlbnQgPSAoRVZFTlQgKilIQU5ETEVfR2V0T2JqUHRyKFBST0NFU1NfQ3VycmVudCgpLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEszMk9CSl9FVkVOVCwgRVZFTlRfTU9ESUZZX1NUQVRFKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEszMk9CSl9FVkVOVCwgRVZFTlRfTU9ESUZZX1NUQVRFLCBOVUxMKSkpCiAgICAgewogICAgICAgICBTWVNURU1fVU5MT0NLKCk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKQEAgLTE5Niw3ICsxOTYsNyBAQAogICAgIEVWRU5UICpldmVudDsKICAgICBTWVNURU1fTE9DSygpOwogICAgIGlmICghKGV2ZW50ID0gKEVWRU5UICopSEFORExFX0dldE9ialB0cihQUk9DRVNTX0N1cnJlbnQoKSwgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLMzJPQkpfRVZFTlQsIEVWRU5UX01PRElGWV9TVEFURSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLMzJPQkpfRVZFTlQsIEVWRU5UX01PRElGWV9TVEFURSwgTlVMTCkpKQogICAgIHsKICAgICAgICAgU1lTVEVNX1VOTE9DSygpOwogICAgICAgICByZXR1cm4gRkFMU0U7CmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvaGFuZGxlLmMgYi9zY2hlZHVsZXIvaGFuZGxlLmMKaW5kZXggNzJiMzAxZC4uNGQ1OTU3ZCAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL2hhbmRsZS5jCisrKyBiL3NjaGVkdWxlci9oYW5kbGUuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgIndpbmVycm9yLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgInByb2Nlc3MuaCIKKyNpbmNsdWRlICJzZXJ2ZXIuaCIKIAogI2RlZmluZSBIVEFCTEVfU0laRSAgMHgzMCAgLyogSGFuZGxlIHRhYmxlIGluaXRpYWwgc2l6ZSAqLwogI2RlZmluZSBIVEFCTEVfSU5DICAgMHgxMCAgLyogSGFuZGxlIHRhYmxlIGluY3JlbWVudCAqLwpAQCAtODEsNiArODIsNyBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgZHN0LT5hY2Nlc3MgPSBzcmMtPmFjY2VzczsKICAgICAgICAgICAgICAgICAgICAgZHN0LT5wdHIgICAgPSBzcmMtPnB0cjsKKyAgICAgICAgICAgICAgICAgICAgZHN0LT5zZXJ2ZXIgPSBzcmMtPnNlcnZlcjsKICAgICAgICAgICAgICAgICAgICAgSzMyT0JKX0luY0NvdW50KCBkc3QtPnB0ciApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTkwLDYgKzkyLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgcGRiLT5oYW5kbGVfdGFibGUtPmVudHJpZXNbMV0ucHRyICAgID0gJnBkYi0+aGVhZGVyOwogICAgICAgICAgICAgcGRiLT5oYW5kbGVfdGFibGUtPmVudHJpZXNbMV0uYWNjZXNzID0gUFJPQ0VTU19BTExfQUNDRVNTOworICAgICAgICAgICAgcGRiLT5oYW5kbGVfdGFibGUtPmVudHJpZXNbMV0uc2VydmVyID0gLTE7ICAvKiBGSVhNRSAqLwogICAgICAgICAgICAgSzMyT0JKX0luY0NvdW50KCAmcGRiLT5oZWFkZXIgKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEwMyw3ICsxMDYsOCBAQAogICoKICAqIEFsbG9jYXRlIGEgaGFuZGxlIGZvciBhIGtlcm5lbCBvYmplY3QgYW5kIGluY3JlbWVudCBpdHMgcmVmY291bnQuCiAgKi8KLUhBTkRMRTMyIEhBTkRMRV9BbGxvYyggUERCMzIgKnBkYiwgSzMyT0JKICpwdHIsIERXT1JEIGFjY2VzcywgQk9PTDMyIGluaGVyaXQgKQorSEFORExFMzIgSEFORExFX0FsbG9jKCBQREIzMiAqcGRiLCBLMzJPQkogKnB0ciwgRFdPUkQgYWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgaW5oZXJpdCwgaW50IHNlcnZlcl9oYW5kbGUgKQogewogICAgIEhBTkRMRTMyIGg7CiAgICAgSEFORExFX0VOVFJZICplbnRyeTsKQEAgLTEyNSwxMSArMTI5LDEzIEBACiAgICAgICAgIGVudHJ5ID0gJnBkYi0+aGFuZGxlX3RhYmxlLT5lbnRyaWVzW2hdOwogICAgICAgICBlbnRyeS0+YWNjZXNzID0gYWNjZXNzOwogICAgICAgICBlbnRyeS0+cHRyICAgID0gcHRyOworICAgICAgICBlbnRyeS0+c2VydmVyID0gc2VydmVyX2hhbmRsZTsKICAgICAgICAgU1lTVEVNX1VOTE9DSygpOwogICAgICAgICByZXR1cm4gaDsKICAgICB9CiAgICAgSzMyT0JKX0RlY0NvdW50KCBwdHIgKTsKICAgICBTWVNURU1fVU5MT0NLKCk7CisgICAgaWYgKHNlcnZlcl9oYW5kbGUgIT0gLTEpIENMSUVOVF9DbG9zZUhhbmRsZSggc2VydmVyX2hhbmRsZSApOwogICAgIFNldExhc3RFcnJvciggRVJST1JfT1VUT0ZNRU1PUlkgKTsKICAgICByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMjsKIH0KQEAgLTE0Miw3ICsxNDgsOCBAQAogICogVGhlIHJlZmNvdW50IG11c3QgYmUgZGVjcmVtZW50ZWQgd2hlbiB0aGUgcG9pbnRlciBpcyBubyBsb25nZXIgdXNlZC4KICAqLwogSzMyT0JKICpIQU5ETEVfR2V0T2JqUHRyKCBQREIzMiAqcGRiLCBIQU5ETEUzMiBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEszMk9CSl9UWVBFIHR5cGUsIERXT1JEIGFjY2VzcyApCisgICAgICAgICAgICAgICAgICAgICAgICAgIEszMk9CSl9UWVBFIHR5cGUsIERXT1JEIGFjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZXJ2ZXJfaGFuZGxlICkKIHsKICAgICBLMzJPQkogKnB0ciA9IE5VTEw7CiAKQEAgLTE1NCw2ICsxNjEsNyBAQAogICAgICAgICAgICAgV0FSTih3aW4zMiwgIkhhbmRsZSAlMDh4IGJhZCBhY2Nlc3MgKGFjYz0lMDhseCByZXE9JTA4bHgpXG4iLAogICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLCBlbnRyeS0+YWNjZXNzLCBhY2Nlc3MgKTsKICAgICAgICAgcHRyID0gZW50cnktPnB0cjsKKyAgICAgICAgaWYgKHNlcnZlcl9oYW5kbGUpICpzZXJ2ZXJfaGFuZGxlID0gZW50cnktPnNlcnZlcjsKICAgICAgICAgaWYgKHB0ciAmJiAoKHR5cGUgPT0gSzMyT0JKX1VOS05PV04pIHx8IChwdHItPnR5cGUgPT0gdHlwZSkpKQogICAgICAgICAgICAgSzMyT0JKX0luY0NvdW50KCBwdHIgKTsKICAgICAgICAgZWxzZQpAQCAtMjM0LDYgKzI0Miw4IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZW50cnktPmFjY2VzcyA9IDA7CiAgICAgICAgICAgICAgICAgZW50cnktPnB0ciAgICA9IE5VTEw7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LT5zZXJ2ZXIgIT0gLTEpCisgICAgICAgICAgICAgICAgICAgIENMSUVOVF9DbG9zZUhhbmRsZSggZW50cnktPnNlcnZlciApOwogICAgICAgICAgICAgICAgIEszMk9CSl9EZWNDb3VudCggcHRyICk7CiAgICAgICAgICAgICAgICAgcmV0ID0gVFJVRTsKICAgICAgICAgICAgIH0KQEAgLTI2Niw2ICsyNzYsNyBAQAogICAgICAgICBpZiAob2JqICYmIChwdHIgIT0gb2JqKSkgY29udGludWU7ICAvKiBub3QgdGhlIHJpZ2h0IG9iamVjdCAqLwogICAgICAgICBlbnRyeS0+YWNjZXNzID0gMDsKICAgICAgICAgZW50cnktPnB0ciAgICA9IE5VTEw7CisgICAgICAgIGlmIChlbnRyeS0+c2VydmVyICE9IC0xKSBDTElFTlRfQ2xvc2VIYW5kbGUoIGVudHJ5LT5zZXJ2ZXIgKTsKICAgICAgICAgSzMyT0JKX0RlY0NvdW50KCBwdHIgKTsKICAgICB9CiAgICAgU1lTVEVNX1VOTE9DSygpOwpAQCAtMzQzLDI3ICszNTQsMzUgQEAKICAgICBLMzJPQkogKm9iaiA9IE5VTEw7CiAgICAgQk9PTDMyIHJldCA9IEZBTFNFOwogICAgIEhBTkRMRTMyIGhhbmRsZTsKKyAgICBpbnQgc3JjX3Byb2Nlc3MsIHNyY19oYW5kbGUsIGRzdF9wcm9jZXNzLCBkc3RfaGFuZGxlOwogCiAgICAgU1lTVEVNX0xPQ0soKTsKIAotICAgIGlmICghKHNyY19wZGIgPSBQUk9DRVNTX0dldFB0ciggc291cmNlX3Byb2Nlc3MsIFBST0NFU1NfRFVQX0hBTkRMRSApKSkKKyAgICBpZiAoIShzcmNfcGRiID0gUFJPQ0VTU19HZXRQdHIoIHNvdXJjZV9wcm9jZXNzLCBQUk9DRVNTX0RVUF9IQU5ETEUsICZzcmNfcHJvY2VzcyApKSkKICAgICAgICAgZ290byBkb25lOwotICAgIGlmICghKG9iaiA9IEhBTkRMRV9HZXRPYmpQdHIoIHNyY19wZGIsIHNvdXJjZSwgSzMyT0JKX1VOS05PV04sIDAgKSkpCisgICAgaWYgKCEob2JqID0gSEFORExFX0dldE9ialB0ciggc3JjX3BkYiwgc291cmNlLCBLMzJPQkpfVU5LTk9XTiwgMCwgJnNyY19oYW5kbGUgKSkpCiAgICAgICAgIGdvdG8gZG9uZTsKIAogICAgIC8qIE5vdyB0aGF0IHdlIGFyZSBzdXJlIHRoZSBzb3VyY2UgaXMgdmFsaWQsIGhhbmRsZSB0aGUgb3B0aW9ucyAqLwogCi0gICAgaWYgKG9wdGlvbnMgJiBEVVBMSUNBVEVfQ0xPU0VfU09VUkNFKQotICAgICAgICBIQU5ETEVfQ2xvc2UoIHNyY19wZGIsIHNvdXJjZSApOwogICAgIGlmIChvcHRpb25zICYgRFVQTElDQVRFX1NBTUVfQUNDRVNTKQogICAgICAgICBIQU5ETEVfR2V0QWNjZXNzKCBzcmNfcGRiLCBzb3VyY2UsICZhY2Nlc3MgKTsKKyAgICBpZiAob3B0aW9ucyAmIERVUExJQ0FURV9DTE9TRV9TT1VSQ0UpCisgICAgICAgIEhBTkRMRV9DbG9zZSggc3JjX3BkYiwgc291cmNlICk7CiAKICAgICAvKiBBbmQgZHVwbGljYXRlIHRoZSBoYW5kbGUgaW4gdGhlIGRlc3QgcHJvY2VzcyAqLwogCi0gICAgaWYgKCEoZHN0X3BkYiA9IFBST0NFU1NfR2V0UHRyKCBkZXN0X3Byb2Nlc3MsIFBST0NFU1NfRFVQX0hBTkRMRSApKSkKKyAgICBpZiAoIShkc3RfcGRiID0gUFJPQ0VTU19HZXRQdHIoIGRlc3RfcHJvY2VzcywgUFJPQ0VTU19EVVBfSEFORExFLCAmZHN0X3Byb2Nlc3MgKSkpCiAgICAgICAgIGdvdG8gZG9uZTsKLSAgICBpZiAoKGhhbmRsZSA9IEhBTkRMRV9BbGxvYyggZHN0X3BkYiwgb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3MsIGluaGVyaXQgKSkgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMikKKworICAgIGlmICgoc3JjX3Byb2Nlc3MgIT0gLTEpICYmIChzcmNfaGFuZGxlICE9IC0xKSAmJiAoZHN0X3Byb2Nlc3MgIT0gLTEpKQorICAgICAgICBkc3RfaGFuZGxlID0gQ0xJRU5UX0R1cGxpY2F0ZUhhbmRsZSggc3JjX3Byb2Nlc3MsIHNyY19oYW5kbGUsIGRzdF9wcm9jZXNzLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VzcywgaW5oZXJpdCwgb3B0aW9ucyApOworICAgIGVsc2UKKyAgICAgICAgZHN0X2hhbmRsZSA9IC0xOworCisgICAgaWYgKChoYW5kbGUgPSBIQU5ETEVfQWxsb2MoIGRzdF9wZGIsIG9iaiwgYWNjZXNzLCBpbmhlcml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfaGFuZGxlICkpICE9IElOVkFMSURfSEFORExFX1ZBTFVFMzIpCiAgICAgewogICAgICAgICBpZiAoZGVzdCkgKmRlc3QgPSBoYW5kbGU7CiAgICAgICAgIHJldCA9IFRSVUU7CmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvazMyb2JqLmMgYi9zY2hlZHVsZXIvazMyb2JqLmMKaW5kZXggOTg5ZDMxOS4uOTYwZTk2MiAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL2szMm9iai5jCisrKyBiL3NjaGVkdWxlci9rMzJvYmouYwpAQCAtMTksNiArMTksNyBAQAogZXh0ZXJuIGNvbnN0IEszMk9CSl9PUFMgUFJPQ0VTU19PcHM7CiBleHRlcm4gY29uc3QgSzMyT0JKX09QUyBUSFJFQURfT3BzOwogZXh0ZXJuIGNvbnN0IEszMk9CSl9PUFMgRklMRV9PcHM7CitleHRlcm4gY29uc3QgSzMyT0JKX09QUyBDSEFOR0VfT3BzOwogZXh0ZXJuIGNvbnN0IEszMk9CSl9PUFMgTUVNX01BUFBFRF9GSUxFX09wczsKIGV4dGVybiBjb25zdCBLMzJPQkpfT1BTIENPTlNPTEVfT3BzOwogCkBAIC00Myw3ICs0NCw3IEBACiAgICAgJlBST0NFU1NfT3BzLCAgICAgICAgICAgLyogSzMyT0JKX1BST0NFU1MgKi8KICAgICAmVEhSRUFEX09wcywgICAgICAgICAgICAvKiBLMzJPQkpfVEhSRUFEICovCiAgICAgJkZJTEVfT3BzLCAgICAgICAgICAgICAgLyogSzMyT0JKX0ZJTEUgKi8KLSAgICAmSzMyT0JKX051bGxPcHMsICAgICAgICAvKiBLMzJPQkpfQ0hBTkdFICovCisgICAgJkNIQU5HRV9PcHMsICAgICAgICAgICAgLyogSzMyT0JKX0NIQU5HRSAqLwogICAgICZDT05TT0xFX09wcywgICAgICAgICAgIC8qIEszMk9CSl9DT05TT0xFICovCiAgICAgJkszMk9CSl9OdWxsT3BzLCAgICAgICAgLyogSzMyT0JKX1NDUkVFTl9CVUZGRVIgKi8KICAgICAmTUVNX01BUFBFRF9GSUxFX09wcywgICAvKiBLMzJPQkpfTUVNX01BUFBFRF9GSUxFICovCkBAIC0xNzUsNyArMTc2LDcgQEAKICAgICAgICAgaWYgKG9iai0+dHlwZSA9PSB0eXBlKQogICAgICAgICB7CiAgICAgICAgICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX0FMUkVBRFlfRVhJU1RTICk7Ci0gICAgICAgICAgICAqaGFuZGxlID0gSEFORExFX0FsbG9jKCBQUk9DRVNTX0N1cnJlbnQoKSwgb2JqLCBhY2Nlc3MsIGluaGVyaXQgKTsKKyAgICAgICAgICAgICpoYW5kbGUgPSBIQU5ETEVfQWxsb2MoIFBST0NFU1NfQ3VycmVudCgpLCBvYmosIGFjY2VzcywgaW5oZXJpdCwgLTEgKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKQEAgLTIxMiw3ICsyMTMsNyBAQAogCiAgICAgLyogQWxsb2NhdGUgYSBoYW5kbGUgKi8KIAotICAgICpoYW5kbGUgPSBIQU5ETEVfQWxsb2MoIFBST0NFU1NfQ3VycmVudCgpLCBvYmosIGFjY2VzcywgaW5oZXJpdCApOworICAgICpoYW5kbGUgPSBIQU5ETEVfQWxsb2MoIFBST0NFU1NfQ3VycmVudCgpLCBvYmosIGFjY2VzcywgaW5oZXJpdCwgLTEgKTsKICAgICBTWVNURU1fVU5MT0NLKCk7CiAgICAgcmV0dXJuIG9iajsKIH0KZGlmZiAtLWdpdCBhL3NjaGVkdWxlci9tdXRleC5jIGIvc2NoZWR1bGVyL211dGV4LmMKaW5kZXggNDA3ZTUwZS4uMDg0ZmFlMCAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL211dGV4LmMKKysrIGIvc2NoZWR1bGVyL211dGV4LmMKQEAgLTE0MCw3ICsxNDAsNyBAQAogICAgIFNZU1RFTV9MT0NLKCk7CiAgICAgaWYgKChvYmogPSBLMzJPQkpfRmluZE5hbWVUeXBlKCBuYW1lLCBLMzJPQkpfTVVURVggKSkgIT0gTlVMTCkKICAgICB7Ci0gICAgICAgIGhhbmRsZSA9IEhBTkRMRV9BbGxvYyggUFJPQ0VTU19DdXJyZW50KCksIG9iaiwgYWNjZXNzLCBpbmhlcml0ICk7CisgICAgICAgIGhhbmRsZSA9IEhBTkRMRV9BbGxvYyggUFJPQ0VTU19DdXJyZW50KCksIG9iaiwgYWNjZXNzLCBpbmhlcml0LCAtMSApOwogICAgICAgICBLMzJPQkpfRGVjQ291bnQoIG9iaiApOwogICAgIH0KICAgICBTWVNURU1fVU5MT0NLKCk7CkBAIC0xNjgsNyArMTY4LDcgQEAKICAgICBNVVRFWCAqbXV0ZXg7CiAgICAgU1lTVEVNX0xPQ0soKTsKICAgICBpZiAoIShtdXRleCA9IChNVVRFWCAqKUhBTkRMRV9HZXRPYmpQdHIoUFJPQ0VTU19DdXJyZW50KCksIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzMyT0JKX01VVEVYLCBNVVRFWF9NT0RJRllfU1RBVEUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzMyT0JKX01VVEVYLCBNVVRFWF9NT0RJRllfU1RBVEUsIE5VTEwpKSkKICAgICB7CiAgICAgICAgIFNZU1RFTV9VTkxPQ0soKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwpkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL3Byb2Nlc3MuYyBiL3NjaGVkdWxlci9wcm9jZXNzLmMKaW5kZXggYzIxM2QyYS4uM2NjZDNkMiAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL3Byb2Nlc3MuYworKysgYi9zY2hlZHVsZXIvcHJvY2Vzcy5jCkBAIC01NywxNiArNTcsMTggQEAKICAqCiAgKiBHZXQgYSBwcm9jZXNzIGZyb20gYSBoYW5kbGUsIGluY3JlbWVudGluZyB0aGUgUERCIHJlZmNvdW50LgogICovCi1QREIzMiAqUFJPQ0VTU19HZXRQdHIoIEhBTkRMRTMyIGhhbmRsZSwgRFdPUkQgYWNjZXNzICkKK1BEQjMyICpQUk9DRVNTX0dldFB0ciggSEFORExFMzIgaGFuZGxlLCBEV09SRCBhY2Nlc3MsIGludCAqc2VydmVyX2hhbmRsZSApCiB7CiAgICAgUERCMzIgKnBkYiA9IFBST0NFU1NfQ3VycmVudCgpOwogCiAgICAgaWYgKGhhbmRsZSA9PSBQUk9DRVNTX1NFTEYpCiAgICAgeworICAgICAgICBpZiAoc2VydmVyX2hhbmRsZSkgKnNlcnZlcl9oYW5kbGUgPSBQUk9DRVNTX1NFTEY7CiAgICAgICAgIEszMk9CSl9JbmNDb3VudCggJnBkYi0+aGVhZGVyICk7CiAgICAgICAgIHJldHVybiBwZGI7CiAgICAgfQotICAgIHJldHVybiAoUERCMzIgKilIQU5ETEVfR2V0T2JqUHRyKCBwZGIsIGhhbmRsZSwgSzMyT0JKX1BST0NFU1MsIGFjY2VzcyApOworICAgIHJldHVybiAoUERCMzIgKilIQU5ETEVfR2V0T2JqUHRyKCBwZGIsIGhhbmRsZSwgSzMyT0JKX1BST0NFU1MsIGFjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX2hhbmRsZSApOwogfQogCiAKQEAgLTIyNyw3ICsyMjksNyBAQAogCiAgICAgLyogQ3JlYXRlIHRoZSBpbml0aWFsIHByb2Nlc3MgYW5kIHRocmVhZCBzdHJ1Y3R1cmVzICovCiAgICAgaWYgKCEocGRiID0gUFJPQ0VTU19DcmVhdGVQREIoIE5VTEwgKSkpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoISh0aGRiID0gVEhSRUFEX0NyZWF0ZSggcGRiLCAwLCBGQUxTRSwgTlVMTCwgTlVMTCApKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghKHRoZGIgPSBUSFJFQURfQ3JlYXRlKCBwZGIsIDAsIEZBTFNFLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMICkpKSByZXR1cm4gRkFMU0U7CiAgICAgdGhkYi0+dW5peF9waWQgPSBnZXRwaWQoKTsKIAogICAgIC8qIENyZWF0ZSB0aGUgZW52aXJvbm1lbnQgREIgb2YgdGhlIGZpcnN0IHByb2Nlc3MgKi8KQEAgLTI0NywxNCArMjQ5LDE2IEBACiAgKi8KIFBEQjMyICpQUk9DRVNTX0NyZWF0ZSggTkVfTU9EVUxFICpwTW9kdWxlLCBMUENTVFIgY21kX2xpbmUsIExQQ1NUUiBlbnYsCiAgICAgICAgICAgICAgICAgICAgICAgIEhJTlNUQU5DRTE2IGhJbnN0YW5jZSwgSElOU1RBTkNFMTYgaFByZXZJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGNtZFNob3cgKQorICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgY21kU2hvdywgUFJPQ0VTU19JTkZPUk1BVElPTiAqaW5mbyApCiB7CiAgICAgRFdPUkQgc2l6ZSwgY29tbWl0OworICAgIGludCBzZXJ2ZXJfdGhhbmRsZSwgc2VydmVyX3BoYW5kbGU7CiAgICAgVEhEQiAqdGhkYiA9IE5VTEw7CiAgICAgUERCMzIgKnBhcmVudCA9IFBST0NFU1NfQ3VycmVudCgpOwogICAgIFBEQjMyICpwZGIgPSBQUk9DRVNTX0NyZWF0ZVBEQiggcGFyZW50ICk7CiAKICAgICBpZiAoIXBkYikgcmV0dXJuIE5VTEw7CisgICAgaW5mby0+aFRocmVhZCA9IGluZm8tPmhQcm9jZXNzID0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMjsKIAogICAgIC8qIENyZWF0ZSB0aGUgaGVhcCAqLwogCkBAIC0yODIsNyArMjg2LDE2IEBACiAgICAgICAgIHNpemUgPSBQRV9IRUFERVIocE1vZHVsZS0+bW9kdWxlMzIpLT5PcHRpb25hbEhlYWRlci5TaXplT2ZTdGFja1Jlc2VydmU7CiAgICAgZWxzZQogICAgICAgICBzaXplID0gMDsKLSAgICBpZiAoISh0aGRiID0gVEhSRUFEX0NyZWF0ZSggcGRiLCBzaXplLCBGQUxTRSwgTlVMTCwgTlVMTCApKSkgZ290byBlcnJvcjsKKyAgICBpZiAoISh0aGRiID0gVEhSRUFEX0NyZWF0ZSggcGRiLCBzaXplLCBGQUxTRSwgJnNlcnZlcl90aGFuZGxlLCAmc2VydmVyX3BoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwgKSkpIGdvdG8gZXJyb3I7CisgICAgaWYgKChpbmZvLT5oVGhyZWFkID0gSEFORExFX0FsbG9jKCBwYXJlbnQsICZ0aGRiLT5oZWFkZXIsIFRIUkVBRF9BTExfQUNDRVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIHNlcnZlcl90aGFuZGxlICkpID09IElOVkFMSURfSEFORExFX1ZBTFVFMzIpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgaWYgKChpbmZvLT5oUHJvY2VzcyA9IEhBTkRMRV9BbGxvYyggcGFyZW50LCAmcGRiLT5oZWFkZXIsIFBST0NFU1NfQUxMX0FDQ0VTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgc2VydmVyX3BoYW5kbGUgKSkgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMikKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBpbmZvLT5kd1Byb2Nlc3NJZCA9IFBEQl9UT19QUk9DRVNTX0lEKHBkYik7CisgICAgaW5mby0+ZHdQcm9jZXNzSWQgPSBUSERCX1RPX1RIUkVBRF9JRCh0aGRiKTsKIAogICAgIHRoZGItPnVuaXhfcGlkID0gZ2V0cGlkKCk7IC8qIEZJWE1FOiB3cm9uZyBoZXJlIC4uLiAqLwogCkBAIC0yOTQsNiArMzA3LDggQEAKICAgICByZXR1cm4gcGRiOwogCiBlcnJvcjoKKyAgICBpZiAoaW5mby0+aFRocmVhZCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRTMyKSBDbG9zZUhhbmRsZSggaW5mby0+aFRocmVhZCApOworICAgIGlmIChpbmZvLT5oUHJvY2VzcyAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRTMyKSBDbG9zZUhhbmRsZSggaW5mby0+aFByb2Nlc3MgKTsKICAgICBpZiAodGhkYikgSzMyT0JKX0RlY0NvdW50KCAmdGhkYi0+aGVhZGVyICk7CiAgICAgUFJPQ0VTU19GcmVlUERCKCBwZGIgKTsKICAgICByZXR1cm4gTlVMTDsKQEAgLTM5OCwxMyArNDEzLDIwIEBACiAgKi8KIEhBTkRMRTMyIFdJTkFQSSBPcGVuUHJvY2VzcyggRFdPUkQgYWNjZXNzLCBCT09MMzIgaW5oZXJpdCwgRFdPUkQgaWQgKQogeworICAgIGludCBzZXJ2ZXJfaGFuZGxlOwogICAgIFBEQjMyICpwZGIgPSBQUk9DRVNTX0lEX1RPX1BEQihpZCk7CiAgICAgaWYgKCFLMzJPQkpfSXNWYWxpZCggJnBkYi0+aGVhZGVyLCBLMzJPQkpfUFJPQ0VTUyApKQogICAgIHsKICAgICAgICAgU2V0TGFzdEVycm9yKCBFUlJPUl9JTlZBTElEX0hBTkRMRSApOwogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgcmV0dXJuIEhBTkRMRV9BbGxvYyggUFJPQ0VTU19DdXJyZW50KCksICZwZGItPmhlYWRlciwgYWNjZXNzLCBpbmhlcml0ICk7CisgICAgaWYgKChzZXJ2ZXJfaGFuZGxlID0gQ0xJRU5UX09wZW5Qcm9jZXNzKCBwZGItPnNlcnZlcl9waWQsIGFjY2VzcywgaW5oZXJpdCApKSA9PSAtMSkKKyAgICB7CisgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfSU5WQUxJRF9IQU5ETEUgKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBIQU5ETEVfQWxsb2MoIFBST0NFU1NfQ3VycmVudCgpLCAmcGRiLT5oZWFkZXIsIGFjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0LCBzZXJ2ZXJfaGFuZGxlICk7CiB9CQkJICAgICAgCiAKIApAQCAtNDQyLDcgKzQ2NCw3IEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgU2V0UHJpb3JpdHlDbGFzcyggSEFORExFMzIgaHByb2Nlc3MsIERXT1JEIHByaW9yaXR5Y2xhc3MgKQogewotICAgIFBEQjMyICpwZGIgPSBQUk9DRVNTX0dldFB0ciggaHByb2Nlc3MsIFBST0NFU1NfU0VUX0lORk9STUFUSU9OICk7CisgICAgUERCMzIgKnBkYiA9IFBST0NFU1NfR2V0UHRyKCBocHJvY2VzcywgUFJPQ0VTU19TRVRfSU5GT1JNQVRJT04sIE5VTEwgKTsKICAgICBpZiAoIXBkYikgcmV0dXJuIEZBTFNFOwogICAgIHN3aXRjaCAocHJpb3JpdHljbGFzcykKICAgICB7CkBAIC00NzIsNyArNDk0LDcgQEAKICAqLwogRFdPUkQgV0lOQVBJIEdldFByaW9yaXR5Q2xhc3MoSEFORExFMzIgaHByb2Nlc3MpCiB7Ci0gICAgUERCMzIgKnBkYiA9IFBST0NFU1NfR2V0UHRyKCBocHJvY2VzcywgUFJPQ0VTU19RVUVSWV9JTkZPUk1BVElPTiApOworICAgIFBEQjMyICpwZGIgPSBQUk9DRVNTX0dldFB0ciggaHByb2Nlc3MsIFBST0NFU1NfUVVFUllfSU5GT1JNQVRJT04sIE5VTEwgKTsKICAgICBEV09SRCByZXQgPSAwOwogICAgIGlmIChwZGIpCiAgICAgewpAQCAtNjg5LDEwICs3MTEsMTggQEAKICAgICBMUERXT1JEIGxwRXhpdENvZGUpIC8qIFtPXSBhZGRyZXNzIHRvIHJlY2VpdmUgdGVybWluYXRpb24gc3RhdHVzICovCiB7CiAgICAgUERCMzIgKnByb2Nlc3M7CisgICAgaW50IHNlcnZlcl9oYW5kbGU7CisgICAgc3RydWN0IGdldF9wcm9jZXNzX2luZm9fcmVwbHkgaW5mbzsKIAotICAgIGlmICghKHByb2Nlc3MgPSBQUk9DRVNTX0dldFB0ciggaFByb2Nlc3MsIFBST0NFU1NfUVVFUllfSU5GT1JNQVRJT04gKSkpCisgICAgaWYgKCEocHJvY2VzcyA9IFBST0NFU1NfR2V0UHRyKCBoUHJvY2VzcywgUFJPQ0VTU19RVUVSWV9JTkZPUk1BVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJ2ZXJfaGFuZGxlICkpKQogICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKGxwRXhpdENvZGUpICpscEV4aXRDb2RlID0gcHJvY2Vzcy0+ZXhpdF9jb2RlOworICAgIGlmIChzZXJ2ZXJfaGFuZGxlICE9IC0xKQorICAgIHsKKyAgICAgICAgQ0xJRU5UX0dldFByb2Nlc3NJbmZvKCBzZXJ2ZXJfaGFuZGxlLCAmaW5mbyApOworICAgICAgICBpZiAobHBFeGl0Q29kZSkgKmxwRXhpdENvZGUgPSBpbmZvLmV4aXRfY29kZTsKKyAgICB9CisgICAgZWxzZSBpZiAobHBFeGl0Q29kZSkgKmxwRXhpdENvZGUgPSBwcm9jZXNzLT5leGl0X2NvZGU7CiAgICAgSzMyT0JKX0RlY0NvdW50KCAmcHJvY2Vzcy0+aGVhZGVyICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CkBAIC03MTEsMyArNzQxLDY0IEBACiAJLyogbnVtYmVyIG9mIGF2YWlsYWJsZSBoZWFwcyAqLwogCXJldHVybiAxOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBST0NFU1NfU3VzcGVuZE90aGVyVGhyZWFkcworICovCisKK3ZvaWQgUFJPQ0VTU19TdXNwZW5kT3RoZXJUaHJlYWRzKHZvaWQpCit7CisgICAgUERCMzIgKnBkYjsKKyAgICBUSFJFQURfRU5UUlkgKmVudHJ5OworCisgICAgU1lTVEVNX0xPQ0soKTsKKworICAgIHBkYiA9IFBST0NFU1NfQ3VycmVudCgpOworICAgIGVudHJ5ID0gcGRiLT50aHJlYWRfbGlzdC0+bmV4dDsKKyAgICBmb3IgKDs7KQorICAgIHsKKyAgICAgICAgIGlmIChlbnRyeS0+dGhyZWFkICE9IFRIUkVBRF9DdXJyZW50KCkpCisgICAgICAgICB7CisgICAgICAgICAgICAgSEFORExFMzIgaGFuZGxlID0gSEFORExFX0FsbG9jKCBQUk9DRVNTX0N1cnJlbnQoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW50cnktPnRocmVhZC0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSRUFEX0FMTF9BQ0NFU1MsIEZBTFNFLCAtMSApOworICAgICAgICAgICAgIFN1c3BlbmRUaHJlYWQoaGFuZGxlKTsKKyAgICAgICAgICAgICBDbG9zZUhhbmRsZShoYW5kbGUpOworICAgICAgICAgfQorICAgICAgICAgaWYgKGVudHJ5ID09IHBkYi0+dGhyZWFkX2xpc3QpIGJyZWFrOworICAgICAgICAgZW50cnkgPSBlbnRyeS0+bmV4dDsKKyAgICB9CisKKyAgICBTWVNURU1fVU5MT0NLKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUFJPQ0VTU19SZXN1bWVPdGhlclRocmVhZHMKKyAqLworCit2b2lkIFBST0NFU1NfUmVzdW1lT3RoZXJUaHJlYWRzKHZvaWQpCit7CisgICAgUERCMzIgKnBkYjsKKyAgICBUSFJFQURfRU5UUlkgKmVudHJ5OworCisgICAgU1lTVEVNX0xPQ0soKTsKKworICAgIHBkYiA9IFBST0NFU1NfQ3VycmVudCgpOworICAgIGVudHJ5ID0gcGRiLT50aHJlYWRfbGlzdC0+bmV4dDsKKyAgICBmb3IgKDs7KQorICAgIHsKKyAgICAgICAgIGlmIChlbnRyeS0+dGhyZWFkICE9IFRIUkVBRF9DdXJyZW50KCkpCisgICAgICAgICB7CisgICAgICAgICAgICAgSEFORExFMzIgaGFuZGxlID0gSEFORExFX0FsbG9jKCBQUk9DRVNTX0N1cnJlbnQoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW50cnktPnRocmVhZC0+aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSRUFEX0FMTF9BQ0NFU1MsIEZBTFNFLCAtMSApOworICAgICAgICAgICAgIFJlc3VtZVRocmVhZChoYW5kbGUpOworICAgICAgICAgICAgIENsb3NlSGFuZGxlKGhhbmRsZSk7CisgICAgICAgICB9CisgICAgICAgICBpZiAoZW50cnkgPT0gcGRiLT50aHJlYWRfbGlzdCkgYnJlYWs7CisgICAgICAgICBlbnRyeSA9IGVudHJ5LT5uZXh0OworICAgIH0KKworICAgIFNZU1RFTV9VTkxPQ0soKTsKK30KKwpkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL3NlbWFwaG9yZS5jIGIvc2NoZWR1bGVyL3NlbWFwaG9yZS5jCmluZGV4IGE0NTZlYmYuLjYyNjE1MGUgMTAwNjQ0Ci0tLSBhL3NjaGVkdWxlci9zZW1hcGhvcmUuYworKysgYi9zY2hlZHVsZXIvc2VtYXBob3JlLmMKQEAgLTk0LDcgKzk0LDcgQEAKICAgICBTWVNURU1fTE9DSygpOwogICAgIGlmICgob2JqID0gSzMyT0JKX0ZpbmROYW1lVHlwZSggbmFtZSwgSzMyT0JKX1NFTUFQSE9SRSApKSAhPSBOVUxMKQogICAgIHsKLSAgICAgICAgaGFuZGxlID0gSEFORExFX0FsbG9jKCBQUk9DRVNTX0N1cnJlbnQoKSwgb2JqLCBhY2Nlc3MsIGluaGVyaXQgKTsKKyAgICAgICAgaGFuZGxlID0gSEFORExFX0FsbG9jKCBQUk9DRVNTX0N1cnJlbnQoKSwgb2JqLCBhY2Nlc3MsIGluaGVyaXQsIC0xICk7CiAgICAgICAgIEszMk9CSl9EZWNDb3VudCggb2JqICk7CiAgICAgfQogICAgIFNZU1RFTV9VTkxPQ0soKTsKQEAgLTEyNCw3ICsxMjQsNyBAQAogICAgIFNZU1RFTV9MT0NLKCk7CiAgICAgaWYgKCEoc2VtID0gKFNFTUFQSE9SRSAqKUhBTkRMRV9HZXRPYmpQdHIoIFBST0NFU1NfQ3VycmVudCgpLCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEszMk9CSl9TRU1BUEhPUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTUFQSE9SRV9NT0RJRllfU1RBVEUgKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTUFQSE9SRV9NT0RJRllfU1RBVEUsIE5VTEwgKSkpCiAgICAgewogICAgICAgICBTWVNURU1fVU5MT0NLKCk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKZGlmZiAtLWdpdCBhL3NjaGVkdWxlci9zeW5jaHJvLmMgYi9zY2hlZHVsZXIvc3luY2hyby5jCmluZGV4IGJiNGExMTAuLjIyOTEzNGMgMTAwNjQ0Ci0tLSBhL3NjaGVkdWxlci9zeW5jaHJvLmMKKysrIGIvc2NoZWR1bGVyL3N5bmNocm8uYwpAQCAtMTksNyArMTksOCBAQAogICogICAgICAgICAgIFNZTkNfQnVpbGRXYWl0U3RydWN0CiAgKi8KIHN0YXRpYyBCT09MMzIgU1lOQ19CdWlsZFdhaXRTdHJ1Y3QoIERXT1JEIGNvdW50LCBjb25zdCBIQU5ETEUzMiAqaGFuZGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiB3YWl0X2FsbCwgV0FJVF9TVFJVQ1QgKndhaXQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDMyIHdhaXRfYWxsLCBCT09MMzIgd2FpdF9tc2csIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0FJVF9TVFJVQ1QgKndhaXQgKQogewogICAgIERXT1JEIGk7CiAgICAgSzMyT0JKICoqcHRyOwpAQCAtMjcsMTUgKzI4LDIwIEBACiAgICAgd2FpdC0+Y291bnQgICAgPSBjb3VudDsKICAgICB3YWl0LT5zaWduYWxlZCA9IFdBSVRfRkFJTEVEOwogICAgIHdhaXQtPndhaXRfYWxsID0gd2FpdF9hbGw7CisgICAgd2FpdC0+d2FpdF9tc2cgPSB3YWl0X21zZzsKICAgICBTWVNURU1fTE9DSygpOwogICAgIGZvciAoaSA9IDAsIHB0ciA9IHdhaXQtPm9ianM7IGkgPCBjb3VudDsgaSsrLCBwdHIrKykKICAgICB7CiAgICAgICAgIGlmICghKCpwdHIgPSBIQU5ETEVfR2V0T2JqUHRyKCBQUk9DRVNTX0N1cnJlbnQoKSwgaGFuZGxlc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEszMk9CSl9VTktOT1dOLCBTWU5DSFJPTklaRSApKSkKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzMyT0JKX1VOS05PV04sIFNZTkNIUk9OSVpFLCBOVUxMICkpKQorICAgICAgICB7IAorICAgICAgICAgICAgRVJSKHdpbjMyLCAiQmFkIGhhbmRsZSAlMDh4XG4iLCBoYW5kbGVzW2ldKTsgCisgICAgICAgICAgICBicmVhazsgCisgICAgICAgIH0KICAgICAgICAgaWYgKCFLMzJPQkpfT1BTKCAqcHRyICktPnNpZ25hbGVkKQogICAgICAgICB7CiAgICAgICAgICAgICAvKiBUaGlzIG9iamVjdCB0eXBlIGNhbm5vdCBiZSB3YWl0ZWQgdXBvbiAqLworICAgICAgICAgICAgRVJSKHdpbjMyLCAiQ2Fubm90IHdhaXQgb24gaGFuZGxlICUwOHhcbiIsIGhhbmRsZXNbaV0pOyAKICAgICAgICAgICAgIEszMk9CSl9EZWNDb3VudCggKnB0ciApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTQ0LDYgKzUwLDcgQEAKICAgICBpZiAoaSAhPSBjb3VudCkKICAgICB7CiAgICAgICAgIC8qIFRoZXJlIHdhcyBhbiBlcnJvciAqLworICAgICAgICB3YWl0LT53YWl0X21zZyA9IEZBTFNFOwogICAgICAgICB3aGlsZSAoaS0tKSBLMzJPQkpfRGVjQ291bnQoIHdhaXQtPm9ianNbaV0gKTsKICAgICB9CiAgICAgU1lTVEVNX1VOTE9DSygpOwpAQCAtNTksNiArNjYsNyBAQAogICAgIERXT1JEIGk7CiAgICAgSzMyT0JKICoqcHRyOwogICAgIFNZU1RFTV9MT0NLKCk7CisgICAgd2FpdC0+d2FpdF9tc2cgPSBGQUxTRTsKICAgICBmb3IgKGkgPSAwLCBwdHIgPSB3YWl0LT5vYmpzOyBpIDwgd2FpdC0+Y291bnQ7IGkrKywgcHRyKyspCiAgICAgICAgIEszMk9CSl9EZWNDb3VudCggKnB0ciApOwogICAgIFNZU1RFTV9VTkxPQ0soKTsKQEAgLTI1Niw0MiArMjY0LDM5IEBACiAgICAgU1lTVEVNX1VOTE9DSygpOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3QgICAoS0VSTkVMMzIuNzIzKQorICogICAgICAgICAgIFNZTkNfTXNnV2FrZVVwCiAgKi8KLURXT1JEIFdJTkFQSSBXYWl0Rm9yU2luZ2xlT2JqZWN0KCBIQU5ETEUzMiBoYW5kbGUsIERXT1JEIHRpbWVvdXQgKQordm9pZCBTWU5DX01zZ1dha2VVcCggVEhEQiAqdGhkYiApCiB7Ci0gICAgcmV0dXJuIFdhaXRGb3JNdWx0aXBsZU9iamVjdHNFeCggMSwgJmhhbmRsZSwgRkFMU0UsIHRpbWVvdXQsIEZBTFNFICk7CisgICAgU1lTVEVNX0xPQ0soKTsKKworICAgIGlmICghdGhkYikgCisgICAgeworICAgICAgICBTWVNURU1fVU5MT0NLKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodGhkYi0+d2FpdF9zdHJ1Y3Qud2FpdF9tc2cpCisgICAgeworICAgICAgICB0aGRiLT53YWl0X3N0cnVjdC5zaWduYWxlZCA9IHRoZGItPndhaXRfc3RydWN0LmNvdW50OworCisgICAgICAgIFRSQUNFKHdpbjMyLCAid2FraW5nIHVwICUwNHggZm9yIG1lc3NhZ2VcbiIsIHRoZGItPnRlYl9zZWwgKTsKKyAgICAgICAgaWYgKHRoZGItPnVuaXhfcGlkKQorICAgICAgICAgICAga2lsbCggdGhkYi0+dW5peF9waWQsIFNJR1VTUjEgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgRklYTUUod2luMzIsImhhdmUgZ290IHVuaXhfcGlkIDBcbiIpOworICAgIH0KKworICAgIFNZU1RFTV9VTkxPQ0soKTsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0RXggICAoS0VSTkVMMzIuNzI0KQorICogICAgICAgICAgIFNZTkNfRG9XYWl0CiAgKi8KLURXT1JEIFdJTkFQSSBXYWl0Rm9yU2luZ2xlT2JqZWN0RXgoIEhBTkRMRTMyIGhhbmRsZSwgRFdPUkQgdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBhbGVydGFibGUgKQotewotICAgIHJldHVybiBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzRXgoIDEsICZoYW5kbGUsIEZBTFNFLCB0aW1lb3V0LCBhbGVydGFibGUgKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzICAgKEtFUk5FTDMyLjcyMSkKLSAqLwotRFdPUkQgV0lOQVBJIFdhaXRGb3JNdWx0aXBsZU9iamVjdHMoIERXT1JEIGNvdW50LCBjb25zdCBIQU5ETEUzMiAqaGFuZGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgd2FpdF9hbGwsIERXT1JEIHRpbWVvdXQgKQotewotICAgIHJldHVybiBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzRXgoY291bnQsIGhhbmRsZXMsIHdhaXRfYWxsLCB0aW1lb3V0LCBGQUxTRSk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgV2FpdEZvck11bHRpcGxlT2JqZWN0c0V4ICAgKEtFUk5FTDMyLjcyMikKLSAqLwotRFdPUkQgV0lOQVBJIFdhaXRGb3JNdWx0aXBsZU9iamVjdHNFeCggRFdPUkQgY291bnQsIGNvbnN0IEhBTkRMRTMyICpoYW5kbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDMyIHdhaXRfYWxsLCBEV09SRCB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDMyIGFsZXJ0YWJsZSApCitEV09SRCBTWU5DX0RvV2FpdCggRFdPUkQgY291bnQsIGNvbnN0IEhBTkRMRTMyICpoYW5kbGVzLAorICAgICAgICAgICAgICAgICAgIEJPT0wzMiB3YWl0X2FsbCwgRFdPUkQgdGltZW91dCwgCisgICAgICAgICAgICAgICAgICAgQk9PTDMyIGFsZXJ0YWJsZSwgQk9PTDMyIHdhaXRfbXNnICkKIHsKICAgICBXQUlUX1NUUlVDVCAqd2FpdCA9ICZUSFJFQURfQ3VycmVudCgpLT53YWl0X3N0cnVjdDsKIApAQCAtMzA1LDcgKzMxMCw3IEBACiAgICAgICAgIEZJWE1FKHdpbjMyLCAiYWxlcnRhYmxlIG5vdCBpbXBsZW1lbnRlZFxuIiApOwogCiAgICAgU1lTVEVNX0xPQ0soKTsKLSAgICBpZiAoIVNZTkNfQnVpbGRXYWl0U3RydWN0KCBjb3VudCwgaGFuZGxlcywgd2FpdF9hbGwsIHdhaXQgKSkKKyAgICBpZiAoIVNZTkNfQnVpbGRXYWl0U3RydWN0KCBjb3VudCwgaGFuZGxlcywgd2FpdF9hbGwsIHdhaXRfbXNnLCB3YWl0ICkpCiAgICAgICAgIHdhaXQtPnNpZ25hbGVkID0gV0FJVF9GQUlMRUQ7CiAgICAgZWxzZQogICAgIHsKQEAgLTMxNiwzICszMjEsNDIgQEAKICAgICBTWVNURU1fVU5MT0NLKCk7CiAgICAgcmV0dXJuIHdhaXQtPnNpZ25hbGVkOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0ICAgKEtFUk5FTDMyLjcyMykKKyAqLworRFdPUkQgV0lOQVBJIFdhaXRGb3JTaW5nbGVPYmplY3QoIEhBTkRMRTMyIGhhbmRsZSwgRFdPUkQgdGltZW91dCApCit7CisgICAgcmV0dXJuIFNZTkNfRG9XYWl0KCAxLCAmaGFuZGxlLCBGQUxTRSwgdGltZW91dCwgRkFMU0UsIEZBTFNFICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgV2FpdEZvclNpbmdsZU9iamVjdEV4ICAgKEtFUk5FTDMyLjcyNCkKKyAqLworRFdPUkQgV0lOQVBJIFdhaXRGb3JTaW5nbGVPYmplY3RFeCggSEFORExFMzIgaGFuZGxlLCBEV09SRCB0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDMyIGFsZXJ0YWJsZSApCit7CisgICAgcmV0dXJuIFNZTkNfRG9XYWl0KCAxLCAmaGFuZGxlLCBGQUxTRSwgdGltZW91dCwgYWxlcnRhYmxlLCBGQUxTRSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFdhaXRGb3JNdWx0aXBsZU9iamVjdHMgICAoS0VSTkVMMzIuNzIxKQorICovCitEV09SRCBXSU5BUEkgV2FpdEZvck11bHRpcGxlT2JqZWN0cyggRFdPUkQgY291bnQsIGNvbnN0IEhBTkRMRTMyICpoYW5kbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiB3YWl0X2FsbCwgRFdPUkQgdGltZW91dCApCit7CisgICAgcmV0dXJuIFNZTkNfRG9XYWl0KCBjb3VudCwgaGFuZGxlcywgd2FpdF9hbGwsIHRpbWVvdXQsIEZBTFNFLCBGQUxTRSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFdhaXRGb3JNdWx0aXBsZU9iamVjdHNFeCAgIChLRVJORUwzMi43MjIpCisgKi8KK0RXT1JEIFdJTkFQSSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzRXgoIERXT1JEIGNvdW50LCBjb25zdCBIQU5ETEUzMiAqaGFuZGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiB3YWl0X2FsbCwgRFdPUkQgdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBhbGVydGFibGUgKQoreworICAgIHJldHVybiBTWU5DX0RvV2FpdCggY291bnQsIGhhbmRsZXMsIHdhaXRfYWxsLCB0aW1lb3V0LCBhbGVydGFibGUsIEZBTFNFICk7Cit9CmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvc3lzZGVwcy5jIGIvc2NoZWR1bGVyL3N5c2RlcHMuYwppbmRleCAzOTBjNjhjLi5kNjNkMzBmIDEwMDY0NAotLS0gYS9zY2hlZHVsZXIvc3lzZGVwcy5jCisrKyBiL3NjaGVkdWxlci9zeXNkZXBzLmMKQEAgLTgwLDExICs4MCw5IEBACiAgKi8KIHN0YXRpYyB2b2lkIFNZU0RFUFNfU3RhcnRUaHJlYWQoIFRIREIgKnRoZGIgKQogewotICAgIExQVEhSRUFEX1NUQVJUX1JPVVRJTkUgZnVuYyA9IChMUFRIUkVBRF9TVEFSVF9ST1VUSU5FKXRoZGItPmVudHJ5X3BvaW50OwogICAgIHRoZGItPnVuaXhfcGlkID0gZ2V0cGlkKCk7CiAgICAgU0VUX0ZTKCB0aGRiLT50ZWJfc2VsICk7Ci0gICAgQ0xJRU5UX0luaXRUaHJlYWQoKTsKLSAgICBFeGl0VGhyZWFkKCBmdW5jKCB0aGRiLT5lbnRyeV9hcmcgKSApOworICAgIFRIUkVBRF9TdGFydCggdGhkYiApOwogfQogI2VuZGlmICAvKiBfX2xpbnV4X18gKi8KIApkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL3N5c2xldmVsLmMgYi9zY2hlZHVsZXIvc3lzbGV2ZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGE1ZGQzCi0tLSAvZGV2L251bGwKKysrIGIvc2NoZWR1bGVyL3N5c2xldmVsLmMKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBXaW4zMiAnc3lzbGV2ZWwnIHJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IDE5OTggVWxyaWNoIFdlaWdhbmQKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAic3lzbGV2ZWwuaCIKKyNpbmNsdWRlICJoZWFwLmgiCisjaW5jbHVkZSAic3RhY2tmcmFtZS5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKK3N0YXRpYyBDUklUSUNBTF9TRUNUSU9OIFdpbjE2TXV0ZXg7CitzdGF0aWMgU0VHUFRSIHNlZ3BXaW4xNk11dGV4OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTWVNMRVZFTF9Jbml0CisgKi8KK3ZvaWQgU1lTTEVWRUxfSW5pdCh2b2lkKQoreworICAgIENSSVRJQ0FMX1NFQ1RJT04gKip3MTZNdXRleCA9IFNFR1BUUl9BTExPQyhzaXplb2YoQ1JJVElDQUxfU0VDVElPTiAqKSk7CisKKyAgICAqdzE2TXV0ZXggPSAmV2luMTZNdXRleDsKKyAgICBzZWdwV2luMTZNdXRleCA9IFNFR1BUUl9HRVQodzE2TXV0ZXgpOworCisgICAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbigmV2luMTZNdXRleCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRwV2luMTZMb2NrMzIgICAgKEtFUk5FTDMyLjkzKQorICovCitWT0lEIFdJTkFQSSBHZXRwV2luMTZMb2NrMzIoQ1JJVElDQUxfU0VDVElPTiAqKmxvY2spCit7CisgICAgKmxvY2sgPSAmV2luMTZNdXRleDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldHBXaW4xNkxvY2sxNiAgICAoS0VSTkVMLjQ0OSkKKyAqLworU0VHUFRSIFdJTkFQSSBHZXRwV2luMTZMb2NrMTYodm9pZCkgCit7IAorICAgIHJldHVybiBzZWdwV2luMTZNdXRleDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIF9FbnRlclN5c0xldmVsICAgIChLRVJORUwzMi45NykKKyAqLworVk9JRCBXSU5BUEkgX0VudGVyU3lzTGV2ZWwoQ1JJVElDQUxfU0VDVElPTiAqbG9jaykKK3sKKyAgICBFbnRlckNyaXRpY2FsU2VjdGlvbihsb2NrKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIF9MZWF2ZVN5c0xldmVsICAgIChLRVJORUwzMi45OCkKKyAqLworVk9JRCBXSU5BUEkgX0xlYXZlU3lzTGV2ZWwoQ1JJVElDQUxfU0VDVElPTiAqbG9jaykKK3sKKyAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbihsb2NrKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIChLRVJORUwzMi44NikKKyAqLworVk9JRCBXSU5BUEkgX0tFUk5FTDMyXzg2KENSSVRJQ0FMX1NFQ1RJT04gKmxvY2spCit7CisgICAgX0xlYXZlU3lzTGV2ZWwobG9jayk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTWVNMRVZFTF9FbnRlcldpbjE2TG9jaworICovCitWT0lEIFNZU0xFVkVMX0VudGVyV2luMTZMb2NrKFZPSUQpCit7CisgICAgVFJBQ0Uod2luMzIsICJ0aHJlYWQgJTA0eCAocGlkICVkKSBhYm91dCB0byBlbnRlclxuIiwgCisgICAgICAgICAgVEhSRUFEX0N1cnJlbnQoKS0+dGViX3NlbCwgZ2V0cGlkKCkpOworCisgICAgX0VudGVyU3lzTGV2ZWwoJldpbjE2TXV0ZXgpOworCisgICAgVFJBQ0Uod2luMzIsICJ0aHJlYWQgJTA0eCAocGlkICVkKSBlbnRlcmVkLCBjb3VudCBpcyAlbGRcbiIsCisgICAgICAgICAgVEhSRUFEX0N1cnJlbnQoKS0+dGViX3NlbCwgZ2V0cGlkKCksIFdpbjE2TXV0ZXguUmVjdXJzaW9uQ291bnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU1lTTEVWRUxfTGVhdmVXaW4xNkxvY2sKKyAqLworVk9JRCBTWVNMRVZFTF9MZWF2ZVdpbjE2TG9jayhWT0lEKQoreworICAgIFRSQUNFKHdpbjMyLCAidGhyZWFkICUwNHggKHBpZCAlZCkgYWJvdXQgdG8gbGVhdmUsIGNvdW50IGlzICVsZFxuIiwgCisgICAgICAgICAgVEhSRUFEX0N1cnJlbnQoKS0+dGViX3NlbCwgZ2V0cGlkKCksIFdpbjE2TXV0ZXguUmVjdXJzaW9uQ291bnQpOworCisgICAgX0xlYXZlU3lzTGV2ZWwoJldpbjE2TXV0ZXgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgX0NoZWNrTm90U3lzTGV2ZWwgICAgKEtFUk5FTDMyLjk0KQorICovCitWT0lEIFdJTkFQSSBfQ2hlY2tOb3RTeXNMZXZlbChDUklUSUNBTF9TRUNUSU9OICpsb2NrKQoreworICAgIEZJWE1FKHdpbjMyLCAiKClcbiIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgX0NvbmZpcm1TeXNMZXZlbCAgICAoS0VSTkVMMzIuOTUpCisgKi8KK1ZPSUQgV0lOQVBJIF9Db25maXJtU3lzTGV2ZWwoQ1JJVElDQUxfU0VDVElPTiAqbG9jaykKK3sKKyAgICBGSVhNRSh3aW4zMiwgIigpXG4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIF9Db25maXJtV2luMTZMb2NrICAgIChLRVJORUwzMi45NikKKyAqLworRFdPUkQgV0lOQVBJIF9Db25maXJtV2luMTZMb2NrKHZvaWQpCit7CisgICAgRklYTUUod2luMzIsICIoKVxuIik7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBSZWxlYXNlVGh1bmtMb2NrICAgIChLRVJORUwzMi40OCkKKyAqLworVk9JRCBXSU5BUEkgUmVsZWFzZVRodW5rTG9jayhEV09SRCAqbXV0ZXhfY291bnQpCit7CisgICAgRFdPUkQgY291bnQgPSBXaW4xNk11dGV4LlJlY3Vyc2lvbkNvdW50OworICAgICptdXRleF9jb3VudCA9IGNvdW50OworCisgICAgd2hpbGUgKGNvdW50LS0gPiAwKQorICAgICAgICBfTGVhdmVTeXNMZXZlbCgmV2luMTZNdXRleCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBSZXN0b3JlVGh1bmtMb2NrICAgIChLRVJORUwzMi40OSkKKyAqLworVk9JRCBXSU5BUEkgUmVzdG9yZVRodW5rTG9jayhEV09SRCBtdXRleF9jb3VudCkKK3sKKyAgICB3aGlsZSAobXV0ZXhfY291bnQtLSA+IDApCisgICAgICAgIF9FbnRlclN5c0xldmVsKCZXaW4xNk11dGV4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNZU0xFVkVMX1JlbGVhc2VXaW4xNkxvY2sKKyAqLworVk9JRCBTWVNMRVZFTF9SZWxlYXNlV2luMTZMb2NrKFZPSUQpCit7CisgICAgRFdPUkQgY291bnQ7CisKKyAgICBUUkFDRSh3aW4zMiwgInRocmVhZCAlMDR4IChwaWQgJWQpIGFib3V0IHRvIHJlbGVhc2UsIGNvdW50IGlzICVsZFxuIiwgCisgICAgICAgICAgVEhSRUFEX0N1cnJlbnQoKS0+dGViX3NlbCwgZ2V0cGlkKCksIFdpbjE2TXV0ZXguUmVjdXJzaW9uQ291bnQpOworCisgICAgUmVsZWFzZVRodW5rTG9jaygmY291bnQpOworCisgICAgaWYgKGNvdW50ID4gMHhmZmZmKQorICAgICAgICBFUlIod2luMzIsICJXaW4xNk11dGV4IHJlY3Vyc2lvbiBjb3VudCB0b28gbGFyZ2UhXG4iKTsKKworICAgIENVUlJFTlRfU1RBQ0sxNi0+bXV0ZXhfY291bnQgPSAoV09SRCljb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNZU0xFVkVMX1Jlc3RvcmVXaW4xNkxvY2sKKyAqLworVk9JRCBTWVNMRVZFTF9SZXN0b3JlV2luMTZMb2NrKFZPSUQpCit7CisgICAgRFdPUkQgY291bnQgPSBDVVJSRU5UX1NUQUNLMTYtPm11dGV4X2NvdW50OworCisgICAgaWYgKCFjb3VudCkKKyAgICAgICAgRVJSKHdpbjMyLCAiV2luMTZNdXRleCByZWN1cnNpb24gY291bnQgaXMgemVybyFcbiIpOworCisgICAgVFJBQ0Uod2luMzIsICJ0aHJlYWQgJTA0eCAocGlkICVkKSBhYm91dCB0byByZXN0b3JlIChjb3VudCAlbGQpXG4iLCAKKyAgICAgICAgICBUSFJFQURfQ3VycmVudCgpLT50ZWJfc2VsLCBnZXRwaWQoKSwgY291bnQpOworCisgICAgUmVzdG9yZVRodW5rTG9jayhjb3VudCk7CisKKyAgICBUUkFDRSh3aW4zMiwgInRocmVhZCAlMDR4IChwaWQgJWQpIHJlc3RvcmVkIGxvY2ssIGNvdW50IGlzICVsZFxuIiwgCisgICAgICAgICAgVEhSRUFEX0N1cnJlbnQoKS0+dGViX3NlbCwgZ2V0cGlkKCksIFdpbjE2TXV0ZXguUmVjdXJzaW9uQ291bnQpOworfQorCmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvdGhyZWFkLmMgYi9zY2hlZHVsZXIvdGhyZWFkLmMKaW5kZXggZTg4MWUwNS4uMmZhYmRiYyAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL3RocmVhZC5jCisrKyBiL3NjaGVkdWxlci90aHJlYWQuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgIm1pc2NlbXUuaCIKICNpbmNsdWRlICJ3aW5udC5oIgogI2luY2x1ZGUgInNlcnZlci5oIgorI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAjaWZuZGVmIF9faTM4Nl9fCkBAIC01MCwxNyArNTEsMTggQEAKICAqIFJldHVybiBhIHBvaW50ZXIgdG8gYSB0aHJlYWQgb2JqZWN0LiBUaGUgb2JqZWN0IGNvdW50IG11c3QgYmUgZGVjcmVtZW50ZWQKICAqIHdoZW4gbm8gbG9uZ2VyIHVzZWQuCiAgKi8KLVRIREIgKlRIUkVBRF9HZXRQdHIoIEhBTkRMRTMyIGhhbmRsZSwgRFdPUkQgYWNjZXNzICkKK1RIREIgKlRIUkVBRF9HZXRQdHIoIEhBTkRMRTMyIGhhbmRsZSwgRFdPUkQgYWNjZXNzLCBpbnQgKnNlcnZlcl9oYW5kbGUgKQogewogICAgIFRIREIgKnRocmVhZDsKIAogICAgIGlmIChoYW5kbGUgPT0gQ1VSUkVOVF9USFJFQURfUFNFVURPSEFORExFKSAgLyogU2VsZi10aHJlYWQgaGFuZGxlICovCiAgICAgewogICAgICAgICB0aHJlYWQgPSBUSFJFQURfQ3VycmVudCgpOworICAgICAgICBpZiAoc2VydmVyX2hhbmRsZSkgKnNlcnZlcl9oYW5kbGUgPSBDVVJSRU5UX1RIUkVBRF9QU0VVRE9IQU5ETEU7CiAgICAgICAgIEszMk9CSl9JbmNDb3VudCggJnRocmVhZC0+aGVhZGVyICk7CiAgICAgfQogICAgIGVsc2UgdGhyZWFkID0gKFRIREIgKilIQU5ETEVfR2V0T2JqUHRyKCBQUk9DRVNTX0N1cnJlbnQoKSwgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLMzJPQkpfVEhSRUFELCBhY2Nlc3MgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzMyT0JKX1RIUkVBRCwgYWNjZXNzLCBzZXJ2ZXJfaGFuZGxlICk7CiAgICAgcmV0dXJuIHRocmVhZDsKIH0KIApAQCAtMTM0LDYgKzEzNiw3IEBACiAgKiAgICAgICAgICAgVEhSRUFEX0NyZWF0ZQogICovCiBUSERCICpUSFJFQURfQ3JlYXRlKCBQREIzMiAqcGRiLCBEV09SRCBzdGFja19zaXplLCBCT09MMzIgYWxsb2Nfc3RhY2sxNiwKKyAgICAgICAgICAgICAgICAgICAgIGludCAqc2VydmVyX3RoYW5kbGUsIGludCAqc2VydmVyX3BoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICBMUFRIUkVBRF9TVEFSVF9ST1VUSU5FIHN0YXJ0X2FkZHIsIExQVk9JRCBwYXJhbSApCiB7CiAgICAgRFdPUkQgb2xkX3Byb3Q7CkBAIC0xOTQsNyArMTk3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAsIFNFR01FTlRfREFUQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBGQUxTRSApOwogICAgICAgICBpZiAoIXRoZGItPnRlYi5zdGFja19zZWwpIGdvdG8gZXJyb3I7Ci0gICAgICAgIHRoZGItPmN1cl9zdGFjayA9IFBUUl9TRUdfT0ZGX1RPX1NFR1BUUiggdGhkYi0+dGViLnN0YWNrX3NlbCwgMHhmZmZjICk7CisgICAgICAgIHRoZGItPmN1cl9zdGFjayA9IFBUUl9TRUdfT0ZGX1RPX1NFR1BUUiggdGhkYi0+dGViLnN0YWNrX3NlbCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMCAtIHNpemVvZihTVEFDSzE2RlJBTUUpICk7CiAgICAgfQogCiAgICAgLyogQWxsb2NhdGUgdGhlIGV2ZW50ICovCkBAIC0yMDMsNyArMjA3LDExIEBACiAKICAgICAvKiBDcmVhdGUgdGhlIHRocmVhZCBzb2NrZXQgKi8KIAotICAgIGlmIChDTElFTlRfTmV3VGhyZWFkKCB0aGRiICkpIGdvdG8gZXJyb3I7CisgICAgaWYgKENMSUVOVF9OZXdUaHJlYWQoIHRoZGIsIHNlcnZlcl90aGFuZGxlLCBzZXJ2ZXJfcGhhbmRsZSApKSBnb3RvIGVycm9yOworCisgICAgLyogQWRkIHRocmVhZCB0byBwcm9jZXNzJ3MgbGlzdCBvZiB0aHJlYWRzICovCisKKyAgICBUSFJFQURfQWRkUXVldWUoICZwZGItPnRocmVhZF9saXN0LCB0aGRiICk7CiAKICAgICAvKiBJbml0aWFsaXplIHRoZSB0aHJlYWQgY29udGV4dCAqLwogCkBAIC0zMTYsMjAgKzMyNCwzNiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFRIUkVBRF9TdGFydAorICoKKyAqIFN0YXJ0IGV4ZWN1dGlvbiBvZiBhIG5ld2x5IGNyZWF0ZWQgdGhyZWFkLiBEb2VzIG5vdCByZXR1cm4uCisgKi8KK3ZvaWQgVEhSRUFEX1N0YXJ0KCBUSERCICp0aGRiICkKK3sKKyAgICBMUFRIUkVBRF9TVEFSVF9ST1VUSU5FIGZ1bmMgPSAoTFBUSFJFQURfU1RBUlRfUk9VVElORSl0aGRiLT5lbnRyeV9wb2ludDsKKyAgICBhc3NlcnQoIFRIUkVBRF9DdXJyZW50KCkgPT0gdGhkYiApOworICAgIENMSUVOVF9Jbml0VGhyZWFkKCk7CisgICAgUEVfSW5pdGlhbGl6ZURMTHMoIHRoZGItPnByb2Nlc3MsIERMTF9USFJFQURfQVRUQUNILCBOVUxMICk7CisgICAgRXhpdFRocmVhZCggZnVuYyggdGhkYi0+ZW50cnlfYXJnICkgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDcmVhdGVUaHJlYWQgICAoS0VSTkVMMzIuNjMpCiAgKi8KIEhBTkRMRTMyIFdJTkFQSSBDcmVhdGVUaHJlYWQoIFNFQ1VSSVRZX0FUVFJJQlVURVMgKnNhLCBEV09SRCBzdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVEhSRUFEX1NUQVJUX1JPVVRJTkUgc3RhcnQsIExQVk9JRCBwYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGZsYWdzLCBMUERXT1JEIGlkICkKIHsKKyAgICBpbnQgc2VydmVyX2hhbmRsZSA9IC0xOwogICAgIEhBTkRMRTMyIGhhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFMzI7CiAgICAgQk9PTDMyIGluaGVyaXQgPSAoc2EgJiYgKHNhLT5uTGVuZ3RoPj1zaXplb2YoKnNhKSkgJiYgc2EtPmJJbmhlcml0SGFuZGxlKTsKIAogICAgIFRIREIgKnRocmVhZCA9IFRIUkVBRF9DcmVhdGUoIFBST0NFU1NfQ3VycmVudCgpLCBzdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLCBzdGFydCwgcGFyYW0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLCAmc2VydmVyX2hhbmRsZSwgTlVMTCwgc3RhcnQsIHBhcmFtICk7CiAgICAgaWYgKCF0aHJlYWQpIHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTMyOwogICAgIGhhbmRsZSA9IEhBTkRMRV9BbGxvYyggUFJPQ0VTU19DdXJyZW50KCksICZ0aHJlYWQtPmhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUkVBRF9BTExfQUNDRVNTLCBpbmhlcml0ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJFQURfQUxMX0FDQ0VTUywgaW5oZXJpdCwgc2VydmVyX2hhbmRsZSApOwogICAgIGlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMikgZ290byBlcnJvcjsKICAgICBpZiAoU1lTREVQU19TcGF3blRocmVhZCggdGhyZWFkICkgPT0gLTEpIGdvdG8gZXJyb3I7CiAgICAgKmlkID0gVEhEQl9UT19USFJFQURfSUQoIHRocmVhZCApOwpAQCAtMzU0LDYgKzM3OCwxMSBAQAogICAgIFRIREIgKnRoZGIgPSBUSFJFQURfQ3VycmVudCgpOwogICAgIExPTkcgY291bnQ7CiAKKyAgICAvKiBSZW1vdmUgdGhyZWFkIGZyb20gcHJvY2VzcydzIGxpc3QgKi8KKyAgICBUSFJFQURfUmVtb3ZlUXVldWUoICZ0aGRiLT5wcm9jZXNzLT50aHJlYWRfbGlzdCwgdGhkYiApOworCisgICAgUEVfSW5pdGlhbGl6ZURMTHMoIHRoZGItPnByb2Nlc3MsIERMTF9USFJFQURfREVUQUNILCBOVUxMICk7CisKICAgICBTWVNURU1fTE9DSygpOwogICAgIHRoZGItPmV4aXRfY29kZSA9IGNvZGU7CiAgICAgRVZFTlRfU2V0KCB0aGRiLT5ldmVudCApOwpAQCAtNDA3LDcgKzQzNiw5IEBACiBEV09SRCBXSU5BUEkgR2V0TGFzdEVycm9yKHZvaWQpCiB7CiAgICAgVEhEQiAqdGhyZWFkID0gVEhSRUFEX0N1cnJlbnQoKTsKLSAgICByZXR1cm4gdGhyZWFkLT5sYXN0X2Vycm9yOworICAgIERXT1JEIHJldCA9IHRocmVhZC0+bGFzdF9lcnJvcjsKKyAgICBUUkFDRSh0aHJlYWQsIjB4JWx4XG4iLHJldCk7CisgICAgcmV0dXJuIHJldDsKIH0KIAogCkBAIC00MjIsNyArNDUzLDExIEBACiB7CiAgICAgVEhEQiAqdGhyZWFkID0gVEhSRUFEX0N1cnJlbnQoKTsKICAgICAvKiBUaGlzIG9uZSBtdXN0IHdvcmsgYmVmb3JlIHdlIGhhdmUgYSB0aHJlYWQgKEZJWE1FKSAqLwotICAgIGlmICh0aHJlYWQpIHRocmVhZC0+bGFzdF9lcnJvciA9IGVycm9yOworCisgICAgVFJBQ0UodGhyZWFkLCIlcCBlcnJvcj0weCVseFxuIix0aHJlYWQsZXJyb3IpOworCisgICAgaWYgKHRocmVhZCkKKyAgICAgIHRocmVhZC0+bGFzdF9lcnJvciA9IGVycm9yOwogfQogCiAKQEAgLTQzNiw3ICs0NzEsNyBAQAogICAgIERXT1JEIGVycm9yLCAvKiBbaW5dIFBlci10aHJlYWQgZXJyb3IgY29kZSAqLwogICAgIERXT1JEIHR5cGUpICAvKiBbaW5dIEVycm9yIHR5cGUgKi8KIHsKLSAgICBUUkFDRSh0aHJlYWQsICIoJTA4bHgsICUwOGx4KVxuIiwgZXJyb3IsdHlwZSk7CisgICAgVFJBQ0UodGhyZWFkLCAiKDB4JTA4bHgsIDB4JTA4bHgpXG4iLCBlcnJvcix0eXBlKTsKICAgICBzd2l0Y2godHlwZSkgewogICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICBicmVhazsKQEAgLTU4NCw3ICs2MTksNyBAQAogICAgIEhBTkRMRTMyIGhhbmRsZSwgIC8qIFtpbl0gIEhhbmRsZSB0byB0aHJlYWQgd2l0aCBjb250ZXh0ICovCiAgICAgQ09OVEVYVCAqY29udGV4dCkgLyogW291dF0gQWRkcmVzcyBvZiBjb250ZXh0IHN0cnVjdHVyZSAqLwogewotICAgIFRIREIgKnRocmVhZCA9IFRIUkVBRF9HZXRQdHIoIGhhbmRsZSwgVEhSRUFEX0dFVF9DT05URVhUICk7CisgICAgVEhEQiAqdGhyZWFkID0gVEhSRUFEX0dldFB0ciggaGFuZGxlLCBUSFJFQURfR0VUX0NPTlRFWFQsIE5VTEwgKTsKICAgICBpZiAoIXRocmVhZCkgcmV0dXJuIEZBTFNFOwogICAgICpjb250ZXh0ID0gdGhyZWFkLT5jb250ZXh0OwogICAgIEszMk9CSl9EZWNDb3VudCggJnRocmVhZC0+aGVhZGVyICk7CkBAIC02MDIsNyArNjM3LDcgQEAKICAgICBIQU5ETEUzMiBoYW5kbGUsICAvKiBbaW5dICBIYW5kbGUgdG8gdGhyZWFkIHdpdGggY29udGV4dCAqLwogICAgIENPTlRFWFQgKmNvbnRleHQpIC8qIFtvdXRdIEFkZHJlc3Mgb2YgY29udGV4dCBzdHJ1Y3R1cmUgKi8KIHsKLSAgICBUSERCICp0aHJlYWQgPSBUSFJFQURfR2V0UHRyKCBoYW5kbGUsIFRIUkVBRF9HRVRfQ09OVEVYVCApOworICAgIFRIREIgKnRocmVhZCA9IFRIUkVBRF9HZXRQdHIoIGhhbmRsZSwgVEhSRUFEX0dFVF9DT05URVhULCBOVUxMICk7CiAgICAgaWYgKCF0aHJlYWQpIHJldHVybiBGQUxTRTsKICAgICAqY29udGV4dCA9IHRocmVhZC0+Y29udGV4dDsKICAgICBLMzJPQkpfRGVjQ291bnQoICZ0aHJlYWQtPmhlYWRlciApOwpAQCAtNjIzLDcgKzY1OCw3IEBACiAgICAgVEhEQiAqdGhyZWFkOwogICAgIElOVDMyIHJldDsKICAgICAKLSAgICBpZiAoISh0aHJlYWQgPSBUSFJFQURfR2V0UHRyKCBodGhyZWFkLCBUSFJFQURfUVVFUllfSU5GT1JNQVRJT04gKSkpCisgICAgaWYgKCEodGhyZWFkID0gVEhSRUFEX0dldFB0ciggaHRocmVhZCwgVEhSRUFEX1FVRVJZX0lORk9STUFUSU9OLCBOVUxMICkpKQogICAgICAgICByZXR1cm4gVEhSRUFEX1BSSU9SSVRZX0VSUk9SX1JFVFVSTjsKICAgICByZXQgPSB0aHJlYWQtPmRlbHRhX3ByaW9yaXR5OwogICAgIEszMk9CSl9EZWNDb3VudCggJnRocmVhZC0+aGVhZGVyICk7CkBAIC02NDQsNyArNjc5LDcgQEAKIHsKICAgICBUSERCICp0aHJlYWQ7CiAgICAgCi0gICAgaWYgKCEodGhyZWFkID0gVEhSRUFEX0dldFB0ciggaHRocmVhZCwgVEhSRUFEX1NFVF9JTkZPUk1BVElPTiApKSkKKyAgICBpZiAoISh0aHJlYWQgPSBUSFJFQURfR2V0UHRyKCBodGhyZWFkLCBUSFJFQURfU0VUX0lORk9STUFUSU9OLCBOVUxMICkpKQogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgdGhyZWFkLT5kZWx0YV9wcmlvcml0eSA9IHByaW9yaXR5OwogICAgIEszMk9CSl9EZWNDb3VudCggJnRocmVhZC0+aGVhZGVyICk7CkBAIC02ODIsNyArNzE3LDcgQEAKIHsKICAgICBUSERCICp0aHJlYWQ7CiAgICAgCi0gICAgaWYgKCEodGhyZWFkID0gVEhSRUFEX0dldFB0ciggaHRocmVhZCwgVEhSRUFEX1FVRVJZX0lORk9STUFUSU9OICkpKQorICAgIGlmICghKHRocmVhZCA9IFRIUkVBRF9HZXRQdHIoIGh0aHJlYWQsIFRIUkVBRF9RVUVSWV9JTkZPUk1BVElPTiwgTlVMTCApKSkKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIGlmIChleGl0Y29kZSkgKmV4aXRjb2RlID0gdGhyZWFkLT5leGl0X2NvZGU7CiAgICAgSzMyT0JKX0RlY0NvdW50KCAmdGhyZWFkLT5oZWFkZXIgKTsKQEAgLTcwOCw3ICs3NDMsNyBAQAogICAgIERXT1JEIG9sZGNvdW50OwogCiAgICAgU1lTVEVNX0xPQ0soKTsKLSAgICBpZiAoISh0aHJlYWQgPSBUSFJFQURfR2V0UHRyKCBodGhyZWFkLCBUSFJFQURfUVVFUllfSU5GT1JNQVRJT04gKSkpCisgICAgaWYgKCEodGhyZWFkID0gVEhSRUFEX0dldFB0ciggaHRocmVhZCwgVEhSRUFEX1FVRVJZX0lORk9STUFUSU9OLCBOVUxMICkpKQogICAgIHsKICAgICAgICAgU1lTVEVNX1VOTE9DSygpOwogICAgICAgICBXQVJOKHRocmVhZCwgIkludmFsaWQgdGhyZWFkIGhhbmRsZVxuIik7CkBAIC03NDYsNyArNzgxLDcgQEAKICAgICBEV09SRCBvbGRjb3VudDsKIAogICAgIFNZU1RFTV9MT0NLKCk7Ci0gICAgaWYgKCEodGhyZWFkID0gVEhSRUFEX0dldFB0ciggaHRocmVhZCwgVEhSRUFEX1FVRVJZX0lORk9STUFUSU9OICkpKQorICAgIGlmICghKHRocmVhZCA9IFRIUkVBRF9HZXRQdHIoIGh0aHJlYWQsIFRIUkVBRF9RVUVSWV9JTkZPUk1BVElPTiwgTlVMTCApKSkKICAgICB7CiAgICAgICAgIFNZU1RFTV9VTkxPQ0soKTsKICAgICAgICAgV0FSTih0aHJlYWQsICJJbnZhbGlkIHRocmVhZCBoYW5kbGVcbiIpOwpkaWZmIC0tZ2l0IGEvc2VydmVyL01ha2VmaWxlLmluIGIvc2VydmVyL01ha2VmaWxlLmluCmluZGV4IDE4ODFjNTIuLjAxYjY3ZjEgMTAwNjQ0Ci0tLSBhL3NlcnZlci9NYWtlZmlsZS5pbgorKysgYi9zZXJ2ZXIvTWFrZWZpbGUuaW4KQEAgLTgsOCArOCwxMCBAQAogQ19TUkNTID0gXAogCW9iamVjdC5jIFwKIAlwcm9jZXNzLmMgXAorCXJlcXVlc3QuYyBcCiAJc29ja2V0LmMgXAotCXRocmVhZC5jCisJdGhyZWFkLmMgXAorCXRyYWNlLmMKIAogRVhUUkFfU1JDUyA9IG1haW4uYwogTUFJTl9PQkpTID0gbWFpbi5vCkBAIC0yMSw2ICsyMyw2IEBACiBATUFLRV9SVUxFU0AKIAogd2luZXNlcnZlcjogJChPQkpTKSAkKE1BSU5fT0JKUykKLQlnY2MgLW8gJChQUk9HUkFNUykgJChPQkpTKSAkKE1BSU5fT0JKUykKKwkkKENDKSAtbyAkKFBST0dSQU1TKSAkKE9CSlMpICQoTUFJTl9PQkpTKSAkKExJQlMpCiAKICMjIyBEZXBlbmRlbmNpZXM6CmRpZmYgLS1naXQgYS9zZXJ2ZXIvbWFpbi5jIGIvc2VydmVyL21haW4uYwppbmRleCBhNTk2YTc2Li5kN2YwNmM5IDEwMDY0NAotLS0gYS9zZXJ2ZXIvbWFpbi5jCisrKyBiL3NlcnZlci9tYWluLmMKQEAgLTExLDEwICsxMSwxMiBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSAic2VydmVyLmgiCisjaW5jbHVkZSAic2VydmVyL29iamVjdC5oIgogCiBpbnQgbWFpbiggaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSApCiB7CiAgICAgaW50IGZkOworICAgIGV4dGVybiB2b2lkIHNlcnZlcl9tYWluX2xvb3AoIGludCBmZCApOwogCiAgICAgaWYgKGFyZ2MgIT0gMikgZ290byBlcnJvcjsKICAgICBpZiAoIWlzZGlnaXQoICphcmd2WzFdICkpIGdvdG8gZXJyb3I7CkBAIC0yMiw5ICsyNCwxMSBAQAogICAgIC8qIG1ha2Ugc3VyZSB0aGUgZmQgaXMgdmFsaWQgKi8KICAgICBpZiAoZmNudGwoIGZkLCBGX0dFVEZMLCAwICkgPT0gLTEpIGdvdG8gZXJyb3I7CiAKLSAgICBmcHJpbnRmKCBzdGRlcnIsICJTZXJ2ZXI6IHN0YXJ0aW5nIChwaWQ9JWQpXG4iLCBnZXRwaWQoKSApOworICAgIGRlYnVnX2xldmVsID0gMTsKKworICAgIGlmIChkZWJ1Z19sZXZlbCkgcHJpbnRmKCAiU2VydmVyOiBzdGFydGluZyAocGlkPSVkKVxuIiwgZ2V0cGlkKCkgKTsKICAgICBzZXJ2ZXJfbWFpbl9sb29wKCBmZCApOwotICAgIGZwcmludGYoIHN0ZGVyciwgIlNlcnZlcjogZXhpdGluZyAocGlkPSVkKVxuIiwgZ2V0cGlkKCkgKTsKKyAgICBpZiAoZGVidWdfbGV2ZWwpIHByaW50ZiggIlNlcnZlcjogZXhpdGluZyAocGlkPSVkKVxuIiwgZ2V0cGlkKCkgKTsKICAgICBleGl0KDApOwogCiAgZXJyb3I6ICAgIApkaWZmIC0tZ2l0IGEvc2VydmVyL29iamVjdC5jIGIvc2VydmVyL29iamVjdC5jCmluZGV4IDM3MjQ3NjEuLjE3YTY4NDMgMTAwNjQ0Ci0tLSBhL3NlcnZlci9vYmplY3QuYworKysgYi9zZXJ2ZXIvb2JqZWN0LmMKQEAgLTYsMTEgKzYsMTUgQEAKICAqLwogCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKICNpbmNsdWRlICJzZXJ2ZXIuaCIKLSNpbmNsdWRlICJvYmplY3QuaCIKKworI2luY2x1ZGUgInNlcnZlci9vYmplY3QuaCIKKworaW50IGRlYnVnX2xldmVsID0gMDsKIAogc3RydWN0IG9iamVjdF9uYW1lCiB7CkBAIC02OSw3ICs3MywxNiBAQAogICAgIGVsc2Ugb2JqLT5uYW1lID0gYWRkX25hbWUoIG9iaiwgbmFtZSApOwogfQogCi0vKiByZWxlYXNlIGFuIG9iamVjdCAoaS5lLiBkZWNyZW1lbnQgaXRzIHJlZmNvdW50ICovCisvKiBncmFiIGFuIG9iamVjdCAoaS5lLiBpbmNyZW1lbnQgaXRzIHJlZmNvdW50KSBhbmQgcmV0dXJuIHRoZSBvYmplY3QgKi8KK3N0cnVjdCBvYmplY3QgKmdyYWJfb2JqZWN0KCB2b2lkICpwdHIgKQoreworICAgIHN0cnVjdCBvYmplY3QgKm9iaiA9IChzdHJ1Y3Qgb2JqZWN0ICopcHRyOworICAgIGFzc2VydCggb2JqLT5yZWZjb3VudCA8IElOVF9NQVggKTsKKyAgICBvYmotPnJlZmNvdW50Kys7CisgICAgcmV0dXJuIG9iajsKK30KKworLyogcmVsZWFzZSBhbiBvYmplY3QgKGkuZS4gZGVjcmVtZW50IGl0cyByZWZjb3VudCkgKi8KIHZvaWQgcmVsZWFzZV9vYmplY3QoIHZvaWQgKnB0ciApCiB7CiAgICAgc3RydWN0IG9iamVjdCAqb2JqID0gKHN0cnVjdCBvYmplY3QgKilwdHI7CkBAIC04OCw3ICsxMDEsNiBAQAogICAgIHN0cnVjdCBvYmplY3RfbmFtZSAqcHRyID0gbmFtZXNbaGFzaF07CiAgICAgd2hpbGUgKHB0ciAmJiBzdHJjbXAoIHB0ci0+bmFtZSwgbmFtZSApKSBwdHIgPSBwdHItPm5leHQ7CiAgICAgaWYgKCFwdHIpIHJldHVybiBOVUxMOwotICAgIHB0ci0+b2JqLT5yZWZjb3VudCsrOworICAgIGdyYWJfb2JqZWN0KCBwdHItPm9iaiApOwogICAgIHJldHVybiBwdHItPm9iajsKIH0KLQpkaWZmIC0tZ2l0IGEvc2VydmVyL29iamVjdC5oIGIvc2VydmVyL29iamVjdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWY2YWJlLi4wMDAwMDAwCi0tLSBhL3NlcnZlci9vYmplY3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBXaW5lIHNlcnZlciBvYmplY3RzCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk4IEFsZXhhbmRyZSBKdWxsaWFyZAotICovCi0KLSNpZm5kZWYgX19XSU5FX09CSkVDVF9ICi0jZGVmaW5lIF9fV0lORV9PQkpFQ1RfSAotCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLQotc3RydWN0IG9iamVjdDsKLXN0cnVjdCBvYmplY3RfbmFtZTsKLQotc3RydWN0IG9iamVjdF9vcHMKLXsKLSAgICB2b2lkICgqZGVzdHJveSkoc3RydWN0IG9iamVjdCAqKTsgICAgLyogZGVzdHJveSBvbiByZWZjb3VudCA9PSAwICovCi19OwotCi1zdHJ1Y3Qgb2JqZWN0Ci17Ci0gICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICByZWZjb3VudDsKLSAgICBjb25zdCBzdHJ1Y3Qgb2JqZWN0X29wcyAgKm9wczsKLSAgICBzdHJ1Y3Qgb2JqZWN0X25hbWUgICAgICAgKm5hbWU7Ci19OwotCi1leHRlcm4gdm9pZCBpbml0X29iamVjdCggc3RydWN0IG9iamVjdCAqb2JqLCBjb25zdCBzdHJ1Y3Qgb2JqZWN0X29wcyAqb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgKTsKLS8qIHJlbGVhc2Ugb2JqZWN0IGNhbiB0YWtlIGFueSBwb2ludGVyLCBidXQgeW91IGJldHRlciBtYWtlIHN1cmUgdGhhdCAqLwotLyogdGhlIHRoaW5nIHBvaW50ZWQgdG8gc3RhcnRzIHdpdGggYSBzdHJ1Y3Qgb2JqZWN0Li4uICovCi1leHRlcm4gdm9pZCByZWxlYXNlX29iamVjdCggdm9pZCAqb2JqICk7Ci0KLS8qIHJlcXVlc3QgaGFuZGxlcnMgKi8KLQotc3RydWN0IHRocmVhZDsKLXR5cGVkZWYgdm9pZCAoKnJlcV9oYW5kbGVyKSggdm9pZCAqZGF0YSwgaW50IGxlbiwgaW50IGZkLCBzdHJ1Y3QgdGhyZWFkICpzZWxmKTsKLWV4dGVybiBjb25zdCByZXFfaGFuZGxlciByZXFfaGFuZGxlcnNbUkVRX05CX1JFUVVFU1RTXTsKLQotLyogc29ja2V0IGZ1bmN0aW9ucyAqLwotCi1leHRlcm4gaW50IGFkZF9jbGllbnQoIGludCBjbGllbnRfZmQsIHN0cnVjdCB0aHJlYWQgKnNlbGYgKTsKLWV4dGVybiB2b2lkIHJlbW92ZV9jbGllbnQoIGludCBjbGllbnRfZmQgKTsKLWV4dGVybiBpbnQgZ2V0X2luaXRpYWxfY2xpZW50X2ZkKHZvaWQpOwotZXh0ZXJuIHZvaWQgc2V0X3RpbWVvdXQoIGludCBjbGllbnRfZmQsIHN0cnVjdCB0aW1ldmFsICp3aGVuICk7Ci1leHRlcm4gaW50IHNlbmRfcmVwbHkoIGludCBjbGllbnRfZmQsIGludCBlcnJfY29kZSwgaW50IHBhc3NfZmQsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBuLCAuLi4gLyogYXJnXzEsIGxlbl8xLCAuLi4sIGFyZ19uLCBsZW5fbiAqLyApOwotCi0vKiBwcm9jZXNzIGZ1bmN0aW9ucyAqLwotCi1zdHJ1Y3QgcHJvY2VzczsKLQotZXh0ZXJuIHN0cnVjdCBwcm9jZXNzICpjcmVhdGVfcHJvY2Vzcyh2b2lkKTsKLWV4dGVybiBzdHJ1Y3QgcHJvY2VzcyAqZ2V0X3Byb2Nlc3NfZnJvbV9pZCggdm9pZCAqaWQgKTsKLQotI2VuZGlmICAvKiBfX1dJTkVfT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL3NlcnZlci9wcm9jZXNzLmMgYi9zZXJ2ZXIvcHJvY2Vzcy5jCmluZGV4IDk1NjkwZGIuLmIzYWRjYjIgMTAwNjQ0Ci0tLSBhL3NlcnZlci9wcm9jZXNzLmMKKysrIGIvc2VydmVyL3Byb2Nlc3MuYwpAQCAtNSwyOSArNSw2MSBAQAogICovCiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJ3aW5lcnJvci5oIgorI2luY2x1ZGUgIndpbmJhc2UuaCIKKyNpbmNsdWRlICJ3aW5udC5oIgogCiAjaW5jbHVkZSAic2VydmVyLmgiCi0jaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSAic2VydmVyL3RocmVhZC5oIgogCisvKiByZXNlcnZlZCBoYW5kbGUgYWNjZXNzIHJpZ2h0cyAqLworI2RlZmluZSBSRVNFUlZFRF9TSElGVCAgICAgICAgIDI1CisjZGVmaW5lIFJFU0VSVkVEX0lOSEVSSVQgICAgICAgKEhBTkRMRV9GTEFHX0lOSEVSSVQgPDwgUkVTRVJWRURfU0hJRlQpCisjZGVmaW5lIFJFU0VSVkVEX0NMT1NFX1BST1RFQ1QgKEhBTkRMRV9GTEFHX1BST1RFQ1RfRlJPTV9DTE9TRSA8PCBSRVNFUlZFRF9TSElGVCkKKyNkZWZpbmUgUkVTRVJWRURfQUxMICAgICAgICAgICAoUkVTRVJWRURfSU5IRVJJVCB8IFJFU0VSVkVEX0NMT1NFX1BST1RFQ1QpCisKK3N0cnVjdCBoYW5kbGVfZW50cnkKK3sKKyAgICBzdHJ1Y3Qgb2JqZWN0ICpwdHI7CisgICAgdW5zaWduZWQgaW50ICAgYWNjZXNzOworfTsKIAogLyogcHJvY2VzcyBzdHJ1Y3R1cmU7IG5vdCBtdWNoIGZvciBub3cuLi4gKi8KIAogc3RydWN0IHByb2Nlc3MKIHsKLSAgICBzdHJ1Y3Qgb2JqZWN0ICAgb2JqOyAgICAgICAvKiBvYmplY3QgaGVhZGVyICovCi0gICAgc3RydWN0IHByb2Nlc3MgKm5leHQ7ICAgICAgLyogc3lzdGVtLXdpZGUgcHJvY2VzcyBsaXN0ICovCi0gICAgc3RydWN0IHByb2Nlc3MgKnByZXY7CisgICAgc3RydWN0IG9iamVjdCAgICAgICAgb2JqOyAgICAgICAgICAgICAvKiBvYmplY3QgaGVhZGVyICovCisgICAgc3RydWN0IHByb2Nlc3MgICAgICAqbmV4dDsgICAgICAgICAgICAvKiBzeXN0ZW0td2lkZSBwcm9jZXNzIGxpc3QgKi8KKyAgICBzdHJ1Y3QgcHJvY2VzcyAgICAgICpwcmV2OworICAgIHN0cnVjdCB0aHJlYWQgICAgICAgKnRocmVhZF9saXN0OyAgICAgLyogaGVhZCBvZiB0aGUgdGhyZWFkIGxpc3QgKi8KKyAgICBzdHJ1Y3QgaGFuZGxlX2VudHJ5ICplbnRyaWVzOyAgICAgICAgIC8qIGhhbmRsZSBlbnRyeSB0YWJsZSAqLworICAgIGludCAgICAgICAgICAgICAgICAgIGhhbmRsZV9jb3VudDsgICAgLyogbmIgb2YgYWxsb2NhdGVkIGhhbmRsZSBlbnRyaWVzICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgaGFuZGxlX2xhc3Q7ICAgICAvKiBsYXN0IHVzZWQgaGFuZGxlIGVudHJ5ICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgZXhpdF9jb2RlOyAgICAgICAvKiBwcm9jZXNzIGV4aXQgY29kZSAqLworICAgIGludCAgICAgICAgICAgICAgICAgIHJ1bm5pbmdfdGhyZWFkczsgLyogbnVtYmVyIG9mIHRocmVhZHMgcnVubmluZyBpbiB0aGlzIHByb2Nlc3MgKi8KKyAgICBzdHJ1Y3QgdGltZXZhbCAgICAgICBzdGFydF90aW1lOyAgICAgIC8qIGFic29sdXRlIHRpbWUgYXQgcHJvY2VzcyBzdGFydCAqLworICAgIHN0cnVjdCB0aW1ldmFsICAgICAgIGVuZF90aW1lOyAgICAgICAgLyogYWJzb2x1dGUgdGltZSBhdCBwcm9jZXNzIGVuZCAqLwogfTsKIAogc3RhdGljIHN0cnVjdCBwcm9jZXNzICpmaXJzdF9wcm9jZXNzOwogCisjZGVmaW5lIE1JTl9IQU5ETEVfRU5UUklFUyAgMzIKKwogLyogcHJvY2VzcyBvcGVyYXRpb25zICovCiAKK3N0YXRpYyB2b2lkIGR1bXBfcHJvY2Vzcyggc3RydWN0IG9iamVjdCAqb2JqLCBpbnQgdmVyYm9zZSApOwogc3RhdGljIHZvaWQgZGVzdHJveV9wcm9jZXNzKCBzdHJ1Y3Qgb2JqZWN0ICpvYmogKTsKK3N0YXRpYyB2b2lkIGZyZWVfaGFuZGxlcyggc3RydWN0IHByb2Nlc3MgKnByb2Nlc3MgKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvYmplY3Rfb3BzIHByb2Nlc3Nfb3BzID0KIHsKKyAgICBkdW1wX3Byb2Nlc3MsCiAgICAgZGVzdHJveV9wcm9jZXNzCiB9OwogCkBAIC0zNSwxMiArNjcsMjkgQEAKIHN0cnVjdCBwcm9jZXNzICpjcmVhdGVfcHJvY2Vzcyh2b2lkKQogewogICAgIHN0cnVjdCBwcm9jZXNzICpwcm9jZXNzOworICAgIHN0cnVjdCBoYW5kbGVfZW50cnkgKmVudHJpZXM7CiAKICAgICBpZiAoIShwcm9jZXNzID0gbWFsbG9jKCBzaXplb2YoKnByb2Nlc3MpICkpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIShlbnRyaWVzID0gbWFsbG9jKCBNSU5fSEFORExFX0VOVFJJRVMgKiBzaXplb2Yoc3RydWN0IGhhbmRsZV9lbnRyeSkpKSkKKyAgICB7CisgICAgICAgIGZyZWUoIHByb2Nlc3MgKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICAgIGluaXRfb2JqZWN0KCAmcHJvY2Vzcy0+b2JqLCAmcHJvY2Vzc19vcHMsIE5VTEwgKTsKLSAgICBwcm9jZXNzLT5uZXh0ID0gZmlyc3RfcHJvY2VzczsKLSAgICBwcm9jZXNzLT5wcmV2ID0gTlVMTDsKKyAgICBwcm9jZXNzLT5uZXh0ICAgICAgICAgICAgPSBmaXJzdF9wcm9jZXNzOworICAgIHByb2Nlc3MtPnByZXYgICAgICAgICAgICA9IE5VTEw7CisgICAgcHJvY2Vzcy0+dGhyZWFkX2xpc3QgICAgID0gTlVMTDsKKyAgICBwcm9jZXNzLT5leGl0X2NvZGUgICAgICAgPSAweDEwMzsgIC8qIFNUSUxMX0FDVElWRSAqLworICAgIHByb2Nlc3MtPnJ1bm5pbmdfdGhyZWFkcyA9IDA7CisgICAgcHJvY2Vzcy0+aGFuZGxlX2NvdW50ICAgID0gTUlOX0hBTkRMRV9FTlRSSUVTOworICAgIHByb2Nlc3MtPmhhbmRsZV9sYXN0ICAgICA9IC0xOworICAgIHByb2Nlc3MtPmVudHJpZXMgICAgICAgICA9IGVudHJpZXM7CisKKyAgICBpZiAoZmlyc3RfcHJvY2VzcykgZmlyc3RfcHJvY2Vzcy0+cHJldiA9IHByb2Nlc3M7CiAgICAgZmlyc3RfcHJvY2VzcyA9IHByb2Nlc3M7CisKKyAgICBnZXR0aW1lb2ZkYXkoICZwcm9jZXNzLT5zdGFydF90aW1lLCBOVUxMICk7CisgICAgYWxsb2NfaGFuZGxlKCBwcm9jZXNzLCBwcm9jZXNzLCBQUk9DRVNTX0FMTF9BQ0NFU1MsIDAgKTsKICAgICByZXR1cm4gcHJvY2VzczsKIH0KIApAQCAtNTAsMTcgKzk5LDMxNiBAQAogICAgIHN0cnVjdCBwcm9jZXNzICpwcm9jZXNzID0gKHN0cnVjdCBwcm9jZXNzICopb2JqOwogICAgIGFzc2VydCggb2JqLT5vcHMgPT0gJnByb2Nlc3Nfb3BzICk7CiAKKyAgICAvKiB3ZSBjYW4ndCBoYXZlIGEgdGhyZWFkIHJlbWFpbmluZyAqLworICAgIGFzc2VydCggIXByb2Nlc3MtPnRocmVhZF9saXN0ICk7CiAgICAgaWYgKHByb2Nlc3MtPm5leHQpIHByb2Nlc3MtPm5leHQtPnByZXYgPSBwcm9jZXNzLT5wcmV2OwogICAgIGlmIChwcm9jZXNzLT5wcmV2KSBwcm9jZXNzLT5wcmV2LT5uZXh0ID0gcHJvY2Vzcy0+bmV4dDsKICAgICBlbHNlIGZpcnN0X3Byb2Nlc3MgPSBwcm9jZXNzLT5uZXh0OworICAgIGZyZWVfaGFuZGxlcyggcHJvY2VzcyApOwogICAgIGZyZWUoIHByb2Nlc3MgKTsKIH0KIAorLyogZHVtcCBhIHByb2Nlc3Mgb24gc3Rkb3V0IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgKi8KK3N0YXRpYyB2b2lkIGR1bXBfcHJvY2Vzcyggc3RydWN0IG9iamVjdCAqb2JqLCBpbnQgdmVyYm9zZSApCit7CisgICAgc3RydWN0IHByb2Nlc3MgKnByb2Nlc3MgPSAoc3RydWN0IHByb2Nlc3MgKilvYmo7CisgICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmcHJvY2Vzc19vcHMgKTsKKworICAgIHByaW50ZiggIlByb2Nlc3MgbmV4dD0lcCBwcmV2PSVwXG4iLCBwcm9jZXNzLT5uZXh0LCBwcm9jZXNzLT5wcmV2ICk7Cit9CisKIC8qIGdldCBhIHByb2Nlc3MgZnJvbSBhbiBpZCAoYW5kIGluY3JlbWVudCB0aGUgcmVmY291bnQpICovCiBzdHJ1Y3QgcHJvY2VzcyAqZ2V0X3Byb2Nlc3NfZnJvbV9pZCggdm9pZCAqaWQgKQogewogICAgIHN0cnVjdCBwcm9jZXNzICpwID0gZmlyc3RfcHJvY2VzczsKICAgICB3aGlsZSAocCAmJiAocCAhPSBpZCkpIHAgPSBwLT5uZXh0OwotICAgIGlmIChwKSBwLT5vYmoucmVmY291bnQrKzsKKyAgICBpZiAocCkgZ3JhYl9vYmplY3QoIHAgKTsKKyAgICBlbHNlIFNFVF9FUlJPUiggRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgKTsKICAgICByZXR1cm4gcDsKIH0KKworLyogZ2V0IGEgcHJvY2VzcyBmcm9tIGEgaGFuZGxlIChhbmQgaW5jcmVtZW50IHRoZSByZWZjb3VudCkgKi8KK3N0cnVjdCBwcm9jZXNzICpnZXRfcHJvY2Vzc19mcm9tX2hhbmRsZSggaW50IGhhbmRsZSwgdW5zaWduZWQgaW50IGFjY2VzcyApCit7CisgICAgcmV0dXJuIChzdHJ1Y3QgcHJvY2VzcyAqKWdldF9oYW5kbGVfb2JqKCBjdXJyZW50LT5wcm9jZXNzLCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3MsICZwcm9jZXNzX29wcyApOworfQorCisvKiBhIHByb2Nlc3MgaGFzIGJlZW4ga2lsbGVkIChpLmUuIGl0cyBsYXN0IHRocmVhZCBkaWVkKSAqLworc3RhdGljIHZvaWQgcHJvY2Vzc19raWxsZWQoIHN0cnVjdCBwcm9jZXNzICpwcm9jZXNzLCBpbnQgZXhpdF9jb2RlICkKK3sKKyAgICBhc3NlcnQoICFwcm9jZXNzLT50aHJlYWRfbGlzdCApOworICAgIHByb2Nlc3MtPmV4aXRfY29kZSA9IGV4aXRfY29kZTsKKyAgICBnZXR0aW1lb2ZkYXkoICZwcm9jZXNzLT5lbmRfdGltZSwgTlVMTCApOworICAgIGZyZWVfaGFuZGxlcyggcHJvY2VzcyApOworfQorCisvKiBmcmVlIHRoZSBwcm9jZXNzIGhhbmRsZSBlbnRyaWVzICovCitzdGF0aWMgdm9pZCBmcmVlX2hhbmRsZXMoIHN0cnVjdCBwcm9jZXNzICpwcm9jZXNzICkKK3sKKyAgICBzdHJ1Y3QgaGFuZGxlX2VudHJ5ICplbnRyeTsKKyAgICBpbnQgaGFuZGxlOworCisgICAgaWYgKCEoZW50cnkgPSBwcm9jZXNzLT5lbnRyaWVzKSkgcmV0dXJuOworICAgIGZvciAoaGFuZGxlID0gMDsgaGFuZGxlIDw9IHByb2Nlc3MtPmhhbmRsZV9sYXN0OyBoYW5kbGUrKywgZW50cnkrKykKKyAgICB7CisgICAgICAgIHN0cnVjdCBvYmplY3QgKm9iaiA9IGVudHJ5LT5wdHI7CisgICAgICAgIGVudHJ5LT5wdHIgPSBOVUxMOworICAgICAgICBpZiAob2JqKSByZWxlYXNlX29iamVjdCggb2JqICk7CisgICAgfQorICAgIGZyZWUoIHByb2Nlc3MtPmVudHJpZXMgKTsKKyAgICBwcm9jZXNzLT5oYW5kbGVfY291bnQgPSAwOworICAgIHByb2Nlc3MtPmhhbmRsZV9sYXN0ICA9IC0xOworICAgIHByb2Nlc3MtPmVudHJpZXMgPSBOVUxMOworfQorCisvKiBhZGQgYSB0aHJlYWQgdG8gYSBwcm9jZXNzIHJ1bm5pbmcgdGhyZWFkcyBsaXN0ICovCit2b2lkIGFkZF9wcm9jZXNzX3RocmVhZCggc3RydWN0IHByb2Nlc3MgKnByb2Nlc3MsIHN0cnVjdCB0aHJlYWQgKnRocmVhZCApCit7CisgICAgdGhyZWFkLT5wcm9jX25leHQgPSBwcm9jZXNzLT50aHJlYWRfbGlzdDsKKyAgICB0aHJlYWQtPnByb2NfcHJldiA9IE5VTEw7CisgICAgaWYgKHRocmVhZC0+cHJvY19uZXh0KSB0aHJlYWQtPnByb2NfbmV4dC0+cHJvY19wcmV2ID0gdGhyZWFkOworICAgIHByb2Nlc3MtPnRocmVhZF9saXN0ID0gdGhyZWFkOworICAgIHByb2Nlc3MtPnJ1bm5pbmdfdGhyZWFkcysrOworICAgIGdyYWJfb2JqZWN0KCB0aHJlYWQgKTsKK30KKworLyogcmVtb3ZlIGEgdGhyZWFkIGZyb20gYSBwcm9jZXNzIHJ1bm5pbmcgdGhyZWFkcyBsaXN0ICovCit2b2lkIHJlbW92ZV9wcm9jZXNzX3RocmVhZCggc3RydWN0IHByb2Nlc3MgKnByb2Nlc3MsIHN0cnVjdCB0aHJlYWQgKnRocmVhZCApCit7CisgICAgYXNzZXJ0KCBwcm9jZXNzLT5ydW5uaW5nX3RocmVhZHMgPiAwICk7CisgICAgYXNzZXJ0KCBwcm9jZXNzLT50aHJlYWRfbGlzdCApOworCisgICAgaWYgKHRocmVhZC0+cHJvY19uZXh0KSB0aHJlYWQtPnByb2NfbmV4dC0+cHJvY19wcmV2ID0gdGhyZWFkLT5wcm9jX3ByZXY7CisgICAgaWYgKHRocmVhZC0+cHJvY19wcmV2KSB0aHJlYWQtPnByb2NfcHJldi0+cHJvY19uZXh0ID0gdGhyZWFkLT5wcm9jX25leHQ7CisgICAgZWxzZSBwcm9jZXNzLT50aHJlYWRfbGlzdCA9IHRocmVhZC0+cHJvY19uZXh0OworCisgICAgaWYgKCEtLXByb2Nlc3MtPnJ1bm5pbmdfdGhyZWFkcykKKyAgICB7CisgICAgICAgIC8qIHdlIGhhdmUgcmVtb3ZlZCB0aGUgbGFzdCBydW5uaW5nIHRocmVhZCwgZXhpdCB0aGUgcHJvY2VzcyAqLworICAgICAgICBwcm9jZXNzX2tpbGxlZCggcHJvY2VzcywgdGhyZWFkLT5leGl0X2NvZGUgKTsKKyAgICB9CisgICAgcmVsZWFzZV9vYmplY3QoIHRocmVhZCApOworfQorCisvKiBncm93IGEgaGFuZGxlIHRhYmxlICovCisvKiByZXR1cm4gMSBpZiBPSywgMCBvbiBlcnJvciAqLworc3RhdGljIGludCBncm93X2hhbmRsZV90YWJsZSggc3RydWN0IHByb2Nlc3MgKnByb2Nlc3MgKQoreworICAgIHN0cnVjdCBoYW5kbGVfZW50cnkgKm5ld19lbnRyaWVzOworICAgIGludCBjb3VudCA9IHByb2Nlc3MtPmhhbmRsZV9jb3VudDsKKworICAgIGlmIChjb3VudCA+PSBJTlRfTUFYIC8gMikgcmV0dXJuIDA7CisgICAgY291bnQgKj0gMjsKKyAgICBpZiAoIShuZXdfZW50cmllcyA9IHJlYWxsb2MoIHByb2Nlc3MtPmVudHJpZXMsIGNvdW50ICogc2l6ZW9mKHN0cnVjdCBoYW5kbGVfZW50cnkpICkpKQorICAgIHsKKyAgICAgICAgU0VUX0VSUk9SKCBFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcHJvY2Vzcy0+aGFuZGxlX2NvdW50ID0gY291bnQ7CisgICAgcHJvY2Vzcy0+ZW50cmllcyAgICAgID0gbmV3X2VudHJpZXM7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qIGFsbG9jYXRlIGEgaGFuZGxlIGZvciBhbiBvYmplY3QsIGluY3JlbWVudGluZyBpdHMgcmVmY291bnQgKi8KKy8qIHJldHVybiB0aGUgaGFuZGxlLCBvciAtMSBvbiBlcnJvciAqLworaW50IGFsbG9jX2hhbmRsZSggc3RydWN0IHByb2Nlc3MgKnByb2Nlc3MsIHZvaWQgKm9iaiwgdW5zaWduZWQgaW50IGFjY2VzcywKKyAgICAgICAgICAgICAgICAgIGludCBpbmhlcml0ICkKK3sKKyAgICBzdHJ1Y3QgaGFuZGxlX2VudHJ5ICplbnRyeTsKKyAgICBpbnQgaGFuZGxlOworCisgICAgYXNzZXJ0KCAhKGFjY2VzcyAmIFJFU0VSVkVEX0FMTCkgKTsKKyAgICBpZiAoaW5oZXJpdCkgYWNjZXNzIHw9IFJFU0VSVkVEX0lOSEVSSVQ7CisKKyAgICAvKiBmaW5kIHRoZSBmaXJzdCBmcmVlIGVudHJ5ICovCisKKyAgICBpZiAoIShlbnRyeSA9IHByb2Nlc3MtPmVudHJpZXMpKSByZXR1cm4gLTE7CisgICAgZm9yIChoYW5kbGUgPSAwOyBoYW5kbGUgPD0gcHJvY2Vzcy0+aGFuZGxlX2xhc3Q7IGhhbmRsZSsrLCBlbnRyeSsrKQorICAgICAgICBpZiAoIWVudHJ5LT5wdHIpIGdvdG8gZm91bmQ7CisKKyAgICBpZiAoaGFuZGxlID49IHByb2Nlc3MtPmhhbmRsZV9jb3VudCkKKyAgICB7CisgICAgICAgIGlmICghZ3Jvd19oYW5kbGVfdGFibGUoIHByb2Nlc3MgKSkgcmV0dXJuIC0xOworICAgICAgICBlbnRyeSA9IHByb2Nlc3MtPmVudHJpZXMgKyBoYW5kbGU7ICAvKiB0aGUgdGFibGUgbWF5IGhhdmUgbW92ZWQgKi8KKyAgICB9CisgICAgcHJvY2Vzcy0+aGFuZGxlX2xhc3QgPSBoYW5kbGU7CisKKyBmb3VuZDoKKyAgICBlbnRyeS0+cHRyICAgID0gZ3JhYl9vYmplY3QoIG9iaiApOworICAgIGVudHJ5LT5hY2Nlc3MgPSBhY2Nlc3M7CisgICAgcmV0dXJuIGhhbmRsZSArIDE7ICAvKiBhdm9pZCBoYW5kbGUgMCAqLworfQorCisvKiBhbGxvY2F0ZSBhIHNwZWNpZmljIGhhbmRsZSBmb3IgYW4gb2JqZWN0LCBpbmNyZW1lbnRpbmcgaXRzIHJlZmNvdW50ICovCitzdGF0aWMgaW50IGFsbG9jX3NwZWNpZmljX2hhbmRsZSggc3RydWN0IHByb2Nlc3MgKnByb2Nlc3MsIHZvaWQgKm9iaiwgaW50IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYWNjZXNzLCBpbnQgaW5oZXJpdCApCit7CisgICAgc3RydWN0IGhhbmRsZV9lbnRyeSAqZW50cnk7CisgICAgc3RydWN0IG9iamVjdCAqb2xkOworCisgICAgaWYgKGhhbmRsZSA9PSAtMSkgcmV0dXJuIGFsbG9jX2hhbmRsZSggcHJvY2Vzcywgb2JqLCBhY2Nlc3MsIGluaGVyaXQgKTsKKworICAgIGFzc2VydCggIShhY2Nlc3MgJiBSRVNFUlZFRF9BTEwpICk7CisgICAgaWYgKGluaGVyaXQpIGFjY2VzcyB8PSBSRVNFUlZFRF9JTkhFUklUOworCisgICAgaGFuZGxlLS07ICAvKiBoYW5kbGVzIHN0YXJ0IGF0IDEgKi8KKyAgICBpZiAoKGhhbmRsZSA8IDApIHx8IChoYW5kbGUgPiBwcm9jZXNzLT5oYW5kbGVfbGFzdCkpCisgICAgeworICAgICAgICBTRVRfRVJST1IoIEVSUk9SX0lOVkFMSURfSEFORExFICk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZW50cnkgPSBwcm9jZXNzLT5lbnRyaWVzICsgaGFuZGxlOworCisgICAgb2xkID0gZW50cnktPnB0cjsKKyAgICBlbnRyeS0+cHRyID0gZ3JhYl9vYmplY3QoIG9iaiApOworICAgIGVudHJ5LT5hY2Nlc3MgPSBhY2Nlc3M7CisgICAgaWYgKG9sZCkgcmVsZWFzZV9vYmplY3QoIG9sZCApOworICAgIHJldHVybiBoYW5kbGUgKyAxOworfQorCisvKiByZXR1cm4gYW4gaGFuZGxlIGVudHJ5LCBvciBOVUxMIGlmIHRoZSBoYW5kbGUgaXMgaW52YWxpZCAqLworc3RhdGljIHN0cnVjdCBoYW5kbGVfZW50cnkgKmdldF9oYW5kbGUoIHN0cnVjdCBwcm9jZXNzICpwcm9jZXNzLCBpbnQgaGFuZGxlICkKK3sKKyAgICBzdHJ1Y3QgaGFuZGxlX2VudHJ5ICplbnRyeTsKKworICAgIGhhbmRsZS0tOyAgLyogaGFuZGxlcyBzdGFydCBhdCAxICovCisgICAgaWYgKChoYW5kbGUgPCAwKSB8fCAoaGFuZGxlID4gcHJvY2Vzcy0+aGFuZGxlX2xhc3QpKSBnb3RvIGVycm9yOworICAgIGVudHJ5ID0gcHJvY2Vzcy0+ZW50cmllcyArIGhhbmRsZTsKKyAgICBpZiAoIWVudHJ5LT5wdHIpIGdvdG8gZXJyb3I7CisgICAgcmV0dXJuIGVudHJ5OworCisgZXJyb3I6CisgICAgU0VUX0VSUk9SKCBFUlJPUl9JTlZBTElEX0hBTkRMRSApOworICAgIHJldHVybiBOVUxMOworfQorCisvKiBhdHRlbXB0IHRvIHNocmluayBhIHRhYmxlICovCisvKiByZXR1cm4gMSBpZiBPSywgMCBvbiBlcnJvciAqLworc3RhdGljIGludCBzaHJpbmtfaGFuZGxlX3RhYmxlKCBzdHJ1Y3QgcHJvY2VzcyAqcHJvY2VzcyApCit7CisgICAgc3RydWN0IGhhbmRsZV9lbnRyeSAqbmV3X2VudHJpZXM7CisgICAgc3RydWN0IGhhbmRsZV9lbnRyeSAqZW50cnkgPSBwcm9jZXNzLT5lbnRyaWVzICsgcHJvY2Vzcy0+aGFuZGxlX2xhc3Q7CisgICAgaW50IGNvdW50ID0gcHJvY2Vzcy0+aGFuZGxlX2NvdW50OworCisgICAgd2hpbGUgKHByb2Nlc3MtPmhhbmRsZV9sYXN0ID49IDApCisgICAgeworICAgICAgICBpZiAoZW50cnktPnB0cikgYnJlYWs7CisgICAgICAgIHByb2Nlc3MtPmhhbmRsZV9sYXN0LS07CisgICAgICAgIGVudHJ5LS07CisgICAgfQorICAgIGlmIChwcm9jZXNzLT5oYW5kbGVfbGFzdCA+PSBjb3VudCAvIDQpIHJldHVybiAxOyAgLyogbm8gbmVlZCB0byBzaHJpbmsgKi8KKyAgICBpZiAoY291bnQgPCBNSU5fSEFORExFX0VOVFJJRVMgKiAyKSByZXR1cm4gMTsgIC8qIHRvbyBzbWFsbCB0byBzaHJpbmsgKi8KKyAgICBjb3VudCAvPSAyOworICAgIGlmICghKG5ld19lbnRyaWVzID0gcmVhbGxvYyggcHJvY2Vzcy0+ZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICogc2l6ZW9mKHN0cnVjdCBoYW5kbGVfZW50cnkpICkpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBwcm9jZXNzLT5oYW5kbGVfY291bnQgPSBjb3VudDsKKyAgICBwcm9jZXNzLT5lbnRyaWVzICAgICAgPSBuZXdfZW50cmllczsKKyAgICByZXR1cm4gMTsKK30KKworLyogY2xvc2UgYSBoYW5kbGUgYW5kIGRlY3JlbWVudCB0aGUgcmVmY291bnQgb2YgdGhlIGFzc29jaWF0ZWQgb2JqZWN0ICovCisvKiByZXR1cm4gMSBpZiBPSywgMCBvbiBlcnJvciAqLworaW50IGNsb3NlX2hhbmRsZSggc3RydWN0IHByb2Nlc3MgKnByb2Nlc3MsIGludCBoYW5kbGUgKQoreworICAgIHN0cnVjdCBoYW5kbGVfZW50cnkgKmVudHJ5OworICAgIHN0cnVjdCBvYmplY3QgKm9iajsKKworICAgIGlmICghKGVudHJ5ID0gZ2V0X2hhbmRsZSggcHJvY2VzcywgaGFuZGxlICkpKSByZXR1cm4gMDsKKyAgICBpZiAoZW50cnktPmFjY2VzcyAmIFJFU0VSVkVEX0NMT1NFX1BST1RFQ1QpIHJldHVybiAwOyAgLyogRklYTUU6IGVycm9yIGNvZGUgKi8KKyAgICBvYmogPSBlbnRyeS0+cHRyOworICAgIGVudHJ5LT5wdHIgPSBOVUxMOworICAgIGlmIChoYW5kbGUtMSA9PSBwcm9jZXNzLT5oYW5kbGVfbGFzdCkgc2hyaW5rX2hhbmRsZV90YWJsZSggcHJvY2VzcyApOworICAgIHJlbGVhc2Vfb2JqZWN0KCBvYmogKTsKKyAgICByZXR1cm4gMTsKK30KKworLyogcmV0cmlldmUgdGhlIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIGEgaGFuZGxlLCBpbmNyZW1lbnRpbmcgaXRzIHJlZmNvdW50ICovCitzdHJ1Y3Qgb2JqZWN0ICpnZXRfaGFuZGxlX29iaiggc3RydWN0IHByb2Nlc3MgKnByb2Nlc3MsIGludCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGFjY2VzcywgY29uc3Qgc3RydWN0IG9iamVjdF9vcHMgKm9wcyApCit7CisgICAgc3RydWN0IGhhbmRsZV9lbnRyeSAqZW50cnk7CisgICAgc3RydWN0IG9iamVjdCAqb2JqOworCisgICAgc3dpdGNoKCBoYW5kbGUgKQorICAgIHsKKyAgICBjYXNlIDB4ZmZmZmZmZmU6ICAvKiBjdXJyZW50IHRocmVhZCBwc2V1ZG8taGFuZGxlICovCisgICAgICAgIG9iaiA9ICZjdXJyZW50LT5vYmo7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg3ZmZmZmZmZjogIC8qIGN1cnJlbnQgcHJvY2VzcyBwc2V1ZG8taGFuZGxlICovCisgICAgICAgIG9iaiA9IChzdHJ1Y3Qgb2JqZWN0ICopY3VycmVudC0+cHJvY2VzczsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKCEoZW50cnkgPSBnZXRfaGFuZGxlKCBwcm9jZXNzLCBoYW5kbGUgKSkpIHJldHVybiBOVUxMOworICAgICAgICBpZiAoKGVudHJ5LT5hY2Nlc3MgJiBhY2Nlc3MpICE9IGFjY2VzcykKKyAgICAgICAgeworICAgICAgICAgICAgU0VUX0VSUk9SKCBFUlJPUl9BQ0NFU1NfREVOSUVEICk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBvYmogPSBlbnRyeS0+cHRyOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKG9wcyAmJiAob2JqLT5vcHMgIT0gb3BzKSkKKyAgICB7CisgICAgICAgIFNFVF9FUlJPUiggRVJST1JfSU5WQUxJRF9IQU5ETEUgKTsgIC8qIG5vdCB0aGUgcmlnaHQgdHlwZSAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGdyYWJfb2JqZWN0KCBvYmogKTsKK30KKworLyogZ2V0L3NldCB0aGUgaGFuZGxlIHJlc2VydmVkIGZsYWdzICovCisvKiByZXR1cm4gdGhlIG5ldyBmbGFncyAob3IgLTEgb24gZXJyb3IpICovCitpbnQgc2V0X2hhbmRsZV9pbmZvKCBzdHJ1Y3QgcHJvY2VzcyAqcHJvY2VzcywgaW50IGhhbmRsZSwgaW50IG1hc2ssIGludCBmbGFncyApCit7CisgICAgc3RydWN0IGhhbmRsZV9lbnRyeSAqZW50cnk7CisKKyAgICBpZiAoIShlbnRyeSA9IGdldF9oYW5kbGUoIHByb2Nlc3MsIGhhbmRsZSApKSkgcmV0dXJuIC0xOworICAgIG1hc2sgID0gKG1hc2sgPDwgUkVTRVJWRURfU0hJRlQpICYgUkVTRVJWRURfQUxMOworICAgIGZsYWdzID0gKGZsYWdzIDw8IFJFU0VSVkVEX1NISUZUKSAmIG1hc2s7CisgICAgZW50cnktPmFjY2VzcyA9IChlbnRyeS0+YWNjZXNzICYgfm1hc2spIHwgZmxhZ3M7CisgICAgcmV0dXJuIChlbnRyeS0+YWNjZXNzICYgUkVTRVJWRURfQUxMKSA+PiBSRVNFUlZFRF9TSElGVDsKK30KKworLyogZHVwbGljYXRlIGEgaGFuZGxlICovCitpbnQgZHVwbGljYXRlX2hhbmRsZSggc3RydWN0IHByb2Nlc3MgKnNyYywgaW50IHNyY19oYW5kbGUsIHN0cnVjdCBwcm9jZXNzICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9oYW5kbGUsIHVuc2lnbmVkIGludCBhY2Nlc3MsIGludCBpbmhlcml0LCBpbnQgb3B0aW9ucyApCit7CisgICAgc3RydWN0IGhhbmRsZV9lbnRyeSAqZW50cnkgPSBnZXRfaGFuZGxlKCBzcmMsIHNyY19oYW5kbGUgKTsKKyAgICBpZiAoIWVudHJ5KSByZXR1cm4gLTE7CisKKyAgICBpZiAob3B0aW9ucyAmIERVUExJQ0FURV9TQU1FX0FDQ0VTUykgYWNjZXNzID0gZW50cnktPmFjY2VzczsKKyAgICBhY2Nlc3MgJj0gflJFU0VSVkVEX0FMTDsKKyAgICByZXR1cm4gYWxsb2Nfc3BlY2lmaWNfaGFuZGxlKCBkc3QsIGVudHJ5LT5wdHIsIGRzdF9oYW5kbGUsIGFjY2VzcywgaW5oZXJpdCApOworfQorCisvKiBkdW1wIGEgaGFuZGxlIHRhYmxlIG9uIHN0ZG91dCAqLwordm9pZCBkdW1wX2hhbmRsZXMoIHN0cnVjdCBwcm9jZXNzICpwcm9jZXNzICkKK3sKKyAgICBzdHJ1Y3QgaGFuZGxlX2VudHJ5ICplbnRyeTsKKyAgICBpbnQgaTsKKworICAgIGlmICghcHJvY2Vzcy0+ZW50cmllcykgcmV0dXJuOworICAgIGVudHJ5ID0gcHJvY2Vzcy0+ZW50cmllczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcHJvY2Vzcy0+aGFuZGxlX2xhc3Q7IGkrKywgZW50cnkrKykKKyAgICB7CisgICAgICAgIGlmICghZW50cnktPnB0cikgY29udGludWU7CisgICAgICAgIHByaW50ZiggIiU1ZDogJXAgJTA4eCAiLCBpICsgMSwgZW50cnktPnB0ciwgZW50cnktPmFjY2VzcyApOworICAgICAgICBlbnRyeS0+cHRyLT5vcHMtPmR1bXAoIGVudHJ5LT5wdHIsIDAgKTsKKyAgICB9Cit9CisKKy8qIGtpbGwgYSBwcm9jZXNzIG9uIHRoZSBzcG90ICovCit2b2lkIGtpbGxfcHJvY2Vzcyggc3RydWN0IHByb2Nlc3MgKnByb2Nlc3MsIGludCBleGl0X2NvZGUgKQoreworICAgIHdoaWxlIChwcm9jZXNzLT50aHJlYWRfbGlzdCkKKyAgICAgICAga2lsbF90aHJlYWQoIHByb2Nlc3MtPnRocmVhZF9saXN0LCBleGl0X2NvZGUgKTsKK30KKworLyogZ2V0IGFsbCBpbmZvcm1hdGlvbiBhYm91dCBhIHByb2Nlc3MgKi8KK3ZvaWQgZ2V0X3Byb2Nlc3NfaW5mbyggc3RydWN0IHByb2Nlc3MgKnByb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnZXRfcHJvY2Vzc19pbmZvX3JlcGx5ICpyZXBseSApCit7CisgICAgcmVwbHktPnBpZCAgICAgICA9IHByb2Nlc3M7CisgICAgcmVwbHktPmV4aXRfY29kZSA9IHByb2Nlc3MtPmV4aXRfY29kZTsKK30KZGlmZiAtLWdpdCBhL3NlcnZlci9yZXF1ZXN0LmMgYi9zZXJ2ZXIvcmVxdWVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5N2ZlNGYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2ZXIvcmVxdWVzdC5jCkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogU2VydmVyLXNpZGUgcmVxdWVzdCBoYW5kbGluZworICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCBBbGV4YW5kcmUgSnVsbGlhcmQKKyAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJ3aW5lcnJvci5oIgorI2luY2x1ZGUgIndpbm50LmgiCisjaW5jbHVkZSAid2luYmFzZS5oIgorI2RlZmluZSBXQU5UX1JFUVVFU1RfSEFORExFUlMKKyNpbmNsdWRlICJzZXJ2ZXIuaCIKKyNpbmNsdWRlICJzZXJ2ZXIvcmVxdWVzdC5oIgorI2luY2x1ZGUgInNlcnZlci90aHJlYWQuaCIKKworCitzdHJ1Y3QgdGhyZWFkICpjdXJyZW50ID0gTlVMTDsgIC8qIHRocmVhZCBoYW5kbGluZyB0aGUgY3VycmVudCByZXF1ZXN0ICovCisKKy8qIGNvbXBsYWluIGFib3V0IGEgcHJvdG9jb2wgZXJyb3IgYW5kIHRlcm1pbmF0ZSB0aGUgY2xpZW50IGNvbm5lY3Rpb24gKi8KK3N0YXRpYyB2b2lkIGZhdGFsX3Byb3RvY29sX2Vycm9yKCBjb25zdCBjaGFyICplcnIsIC4uLiApCit7CisgICAgdmFfbGlzdCBhcmdzOworCisgICAgdmFfc3RhcnQoIGFyZ3MsIGVyciApOworICAgIGZwcmludGYoIHN0ZGVyciwgIlByb3RvY29sIGVycm9yOiVwOiAiLCBjdXJyZW50ICk7CisgICAgdmZwcmludGYoIHN0ZGVyciwgZXJyLCBhcmdzICk7CisgICAgdmFfZW5kKCBhcmdzICk7CisgICAgcmVtb3ZlX2NsaWVudCggY3VycmVudC0+Y2xpZW50X2ZkLCAtMiApOworfQorCisvKiBjYWxsIGEgcmVxdWVzdCBoYW5kbGVyICovCit2b2lkIGNhbGxfcmVxX2hhbmRsZXIoIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgZW51bSByZXF1ZXN0IHJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50IGxlbiwgaW50IGZkICkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgaGFuZGxlciAqaGFuZGxlciA9ICZyZXFfaGFuZGxlcnNbcmVxXTsKKyAgICBjaGFyICpwdHI7CisKKyAgICBjdXJyZW50ID0gdGhyZWFkOworICAgIGlmICgocmVxIDwgMCkgfHwgKHJlcSA+PSBSRVFfTkJfUkVRVUVTVFMpKQorICAgIHsKKyAgICAgICAgZmF0YWxfcHJvdG9jb2xfZXJyb3IoICJ1bmtub3duIHJlcXVlc3QgJWRcbiIsIHJlcSApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGxlbiA8IGhhbmRsZXItPm1pbl9zaXplKQorICAgIHsKKyAgICAgICAgZmF0YWxfcHJvdG9jb2xfZXJyb3IoICJyZXEgJWQgYmFkIGxlbmd0aCAlZCA8ICVkKVxuIiwgcmVxLCBsZW4sIGhhbmRsZXItPm1pbl9zaXplICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBub3cgY2FsbCB0aGUgaGFuZGxlciAqLworICAgIGlmIChjdXJyZW50KQorICAgIHsKKyAgICAgICAgQ0xFQVJfRVJST1IoKTsKKyAgICAgICAgaWYgKGRlYnVnX2xldmVsKSB0cmFjZV9yZXF1ZXN0KCByZXEsIGRhdGEsIGxlbiwgZmQgKTsKKyAgICB9CisgICAgbGVuIC09IGhhbmRsZXItPm1pbl9zaXplOworICAgIHB0ciA9IChjaGFyICopZGF0YSArIGhhbmRsZXItPm1pbl9zaXplOworICAgIGhhbmRsZXItPmhhbmRsZXIoIGRhdGEsIHB0ciwgbGVuLCBmZCApOworICAgIGN1cnJlbnQgPSBOVUxMOworfQorCisvKiBoYW5kbGUgYSBjbGllbnQgdGltZW91dCAodW51c2VkIGZvciBub3cpICovCit2b2lkIGNhbGxfdGltZW91dF9oYW5kbGVyKCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgKQoreworICAgIGN1cnJlbnQgPSB0aHJlYWQ7CisgICAgaWYgKGRlYnVnX2xldmVsKSB0cmFjZV90aW1lb3V0KCk7CisgICAgQ0xFQVJfRVJST1IoKTsKKyAgICBzZW5kX3JlcGx5KCBjdXJyZW50LCAtMSwgMCApOworICAgIGN1cnJlbnQgPSBOVUxMOworfQorCisvKiBhIHRocmVhZCBoYXMgYmVlbiBraWxsZWQgKi8KK3ZvaWQgY2FsbF9raWxsX2hhbmRsZXIoIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgaW50IGV4aXRfY29kZSApCit7CisgICAgLyogbXVzdCBiZSByZWVudHJhbnQgV1JUIGNhbGxfcmVxX2hhbmRsZXIgKi8KKyAgICBzdHJ1Y3QgdGhyZWFkICpvbGRfY3VycmVudCA9IGN1cnJlbnQ7CisgICAgY3VycmVudCA9IHRocmVhZDsKKyAgICBpZiAoY3VycmVudCkKKyAgICB7CisgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkgdHJhY2Vfa2lsbCggZXhpdF9jb2RlICk7CisgICAgICAgIHRocmVhZF9raWxsZWQoIGN1cnJlbnQsIGV4aXRfY29kZSApOworICAgIH0KKyAgICBjdXJyZW50ID0gKG9sZF9jdXJyZW50ICE9IHRocmVhZCkgPyBvbGRfY3VycmVudCA6IE5VTEw7Cit9CisKKworLyogY3JlYXRlIGEgbmV3IHRocmVhZCAqLworREVDTF9IQU5ETEVSKG5ld190aHJlYWQpCit7CisgICAgc3RydWN0IG5ld190aHJlYWRfcmVwbHkgcmVwbHk7CisgICAgc3RydWN0IHRocmVhZCAqbmV3X3RocmVhZDsKKyAgICBpbnQgbmV3X2ZkLCBlcnI7CisKKyAgICBpZiAoKG5ld19mZCA9IGR1cChmZCkpID09IC0xKQorICAgIHsKKyAgICAgICAgbmV3X3RocmVhZCA9IE5VTEw7CisgICAgICAgIGVyciA9IEVSUk9SX1RPT19NQU5ZX09QRU5fRklMRVM7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisgICAgaWYgKCEobmV3X3RocmVhZCA9IGNyZWF0ZV90aHJlYWQoIG5ld19mZCwgcmVxLT5waWQsICZyZXBseS50aGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHkucGhhbmRsZSApKSkKKyAgICB7CisgICAgICAgIGVyciA9IEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZOworICAgICAgICBjbG9zZSggbmV3X2ZkICk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisgICAgcmVwbHkudGlkID0gbmV3X3RocmVhZDsKKyAgICByZXBseS5waWQgPSBuZXdfdGhyZWFkLT5wcm9jZXNzOworICAgIGVyciA9IEVSUk9SX1NVQ0NFU1M7CisKKyBkb25lOgorICAgIGlmICghY3VycmVudCkKKyAgICB7CisgICAgICAgIC8qIGZpcnN0IGNsaWVudCBkb2Vzbid0IGhhdmUgYSBjdXJyZW50ICovCisgICAgICAgIHN0cnVjdCBpb3ZlYyB2ZWMgPSB7ICZyZXBseSwgc2l6ZW9mKHJlcGx5KSB9OworICAgICAgICBzZW5kX3JlcGx5X3YoIGdldF9pbml0aWFsX2NsaWVudF9mZCgpLCBlcnIsIC0xLCAmdmVjLCAxICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFNFVF9FUlJPUiggZXJyICk7CisgICAgICAgIHNlbmRfcmVwbHkoIGN1cnJlbnQsIC0xLCAxLCAmcmVwbHksIHNpemVvZihyZXBseSkgKTsKKyAgICB9Cit9CisKKy8qIGNyZWF0ZSBhIG5ldyB0aHJlYWQgKi8KK0RFQ0xfSEFORExFUihpbml0X3RocmVhZCkKK3sKKyAgICBjdXJyZW50LT51bml4X3BpZCA9IHJlcS0+dW5peF9waWQ7CisgICAgaWYgKCEoY3VycmVudC0+bmFtZSA9IG1hbGxvYyggbGVuICsgMSApKSkKKyAgICB7CisgICAgICAgIFNFVF9FUlJPUiggRVJST1JfTk9UX0VOT1VHSF9NRU1PUlkgKTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKyAgICBtZW1jcHkoIGN1cnJlbnQtPm5hbWUsIGRhdGEsIGxlbiApOworICAgIGN1cnJlbnQtPm5hbWVbbGVuXSA9ICdcMCc7CisgICAgQ0xFQVJfRVJST1IoKTsKKyBkb25lOgorICAgIHNlbmRfcmVwbHkoIGN1cnJlbnQsIC0xLCAwICk7Cit9CisKKy8qIHRlcm1pbmF0ZSBhIHByb2Nlc3MgKi8KK0RFQ0xfSEFORExFUih0ZXJtaW5hdGVfcHJvY2VzcykKK3sKKyAgICBzdHJ1Y3QgcHJvY2VzcyAqcHJvY2VzczsKKworICAgIGlmICgocHJvY2VzcyA9IGdldF9wcm9jZXNzX2Zyb21faGFuZGxlKCByZXEtPmhhbmRsZSwgUFJPQ0VTU19URVJNSU5BVEUgKSkpCisgICAgeworICAgICAgICBraWxsX3Byb2Nlc3MoIHByb2Nlc3MsIHJlcS0+ZXhpdF9jb2RlICk7CisgICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBwcm9jZXNzICk7CisgICAgfQorICAgIGlmIChjdXJyZW50KSBzZW5kX3JlcGx5KCBjdXJyZW50LCAtMSwgMCApOworfQorCisvKiB0ZXJtaW5hdGUgYSB0aHJlYWQgKi8KK0RFQ0xfSEFORExFUih0ZXJtaW5hdGVfdGhyZWFkKQoreworICAgIHN0cnVjdCB0aHJlYWQgKnRocmVhZDsKKworICAgIGlmICgodGhyZWFkID0gZ2V0X3RocmVhZF9mcm9tX2hhbmRsZSggcmVxLT5oYW5kbGUsIFRIUkVBRF9URVJNSU5BVEUgKSkpCisgICAgeworICAgICAgICBraWxsX3RocmVhZCggdGhyZWFkLCByZXEtPmV4aXRfY29kZSApOworICAgICAgICByZWxlYXNlX29iamVjdCggdGhyZWFkICk7CisgICAgfQorICAgIGlmIChjdXJyZW50KSBzZW5kX3JlcGx5KCBjdXJyZW50LCAtMSwgMCApOworfQorCisvKiBjbG9zZSBhIGhhbmRsZSAqLworREVDTF9IQU5ETEVSKGNsb3NlX2hhbmRsZSkKK3sKKyAgICBjbG9zZV9oYW5kbGUoIGN1cnJlbnQtPnByb2Nlc3MsIHJlcS0+aGFuZGxlICk7CisgICAgc2VuZF9yZXBseSggY3VycmVudCwgLTEsIDAgKTsKK30KKworLyogZHVwbGljYXRlIGEgaGFuZGxlICovCitERUNMX0hBTkRMRVIoZHVwX2hhbmRsZSkKK3sKKyAgICBzdHJ1Y3QgZHVwX2hhbmRsZV9yZXBseSByZXBseSA9IHsgLTEgfTsKKyAgICBzdHJ1Y3QgcHJvY2VzcyAqc3JjLCAqZHN0OworCisgICAgaWYgKChzcmMgPSBnZXRfcHJvY2Vzc19mcm9tX2hhbmRsZSggcmVxLT5zcmNfcHJvY2VzcywgUFJPQ0VTU19EVVBfSEFORExFICkpKQorICAgIHsKKyAgICAgICAgaWYgKChkc3QgPSBnZXRfcHJvY2Vzc19mcm9tX2hhbmRsZSggcmVxLT5kc3RfcHJvY2VzcywgUFJPQ0VTU19EVVBfSEFORExFICkpKQorICAgICAgICB7CisgICAgICAgICAgICByZXBseS5oYW5kbGUgPSBkdXBsaWNhdGVfaGFuZGxlKCBzcmMsIHJlcS0+c3JjX2hhbmRsZSwgZHN0LCByZXEtPmRzdF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEtPmFjY2VzcywgcmVxLT5pbmhlcml0LCByZXEtPm9wdGlvbnMgKTsKKyAgICAgICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBkc3QgKTsKKyAgICAgICAgfQorICAgICAgICAvKiBjbG9zZSB0aGUgaGFuZGxlIG5vIG1hdHRlciB3aGF0IGhhcHBlbmVkICovCisgICAgICAgIGlmIChyZXEtPm9wdGlvbnMgJiBEVVBMSUNBVEVfQ0xPU0VfU09VUkNFKQorICAgICAgICAgICAgY2xvc2VfaGFuZGxlKCBzcmMsIHJlcS0+c3JjX2hhbmRsZSApOworICAgICAgICByZWxlYXNlX29iamVjdCggc3JjICk7CisgICAgfQorICAgIHNlbmRfcmVwbHkoIGN1cnJlbnQsIC0xLCAxLCAmcmVwbHksIHNpemVvZihyZXBseSkgKTsKK30KKworLyogZmV0Y2ggaW5mb3JtYXRpb24gYWJvdXQgYSBwcm9jZXNzICovCitERUNMX0hBTkRMRVIoZ2V0X3Byb2Nlc3NfaW5mbykKK3sKKyAgICBzdHJ1Y3QgcHJvY2VzcyAqcHJvY2VzczsKKyAgICBzdHJ1Y3QgZ2V0X3Byb2Nlc3NfaW5mb19yZXBseSByZXBseSA9IHsgMCwgMCB9OworCisgICAgaWYgKChwcm9jZXNzID0gZ2V0X3Byb2Nlc3NfZnJvbV9oYW5kbGUoIHJlcS0+aGFuZGxlLCBQUk9DRVNTX1FVRVJZX0lORk9STUFUSU9OICkpKQorICAgIHsKKyAgICAgICAgZ2V0X3Byb2Nlc3NfaW5mbyggcHJvY2VzcywgJnJlcGx5ICk7CisgICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBwcm9jZXNzICk7CisgICAgfQorICAgIHNlbmRfcmVwbHkoIGN1cnJlbnQsIC0xLCAxLCAmcmVwbHksIHNpemVvZihyZXBseSkgKTsKK30KKworLyogb3BlbiBhIGhhbmRsZSBhIHByb2Nlc3MgKi8KK0RFQ0xfSEFORExFUihvcGVuX3Byb2Nlc3MpCit7CisgICAgc3RydWN0IG9wZW5fcHJvY2Vzc19yZXBseSByZXBseSA9IHsgLTEgfTsKKyAgICBzdHJ1Y3QgcHJvY2VzcyAqcHJvY2VzcyA9IGdldF9wcm9jZXNzX2Zyb21faWQoIHJlcS0+cGlkICk7CisgICAgaWYgKHByb2Nlc3MpCisgICAgeworICAgICAgICByZXBseS5oYW5kbGUgPSBhbGxvY19oYW5kbGUoIGN1cnJlbnQtPnByb2Nlc3MsIHByb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLT5hY2Nlc3MsIHJlcS0+aW5oZXJpdCApOworICAgICAgICByZWxlYXNlX29iamVjdCggcHJvY2VzcyApOworICAgIH0KKyAgICBzZW5kX3JlcGx5KCBjdXJyZW50LCAtMSwgMSwgJnJlcGx5LCBzaXplb2YocmVwbHkpICk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2ZXIvc29ja2V0LmMgYi9zZXJ2ZXIvc29ja2V0LmMKaW5kZXggM2RkNzNjOS4uNWQ5NmE5MyAxMDA2NDQKLS0tIGEvc2VydmVyL3NvY2tldC5jCisrKyBiL3NlcnZlci9zb2NrZXQuYwpAQCAtMjAsNyArMjAsOCBAQAogCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAic2VydmVyLmgiCi0jaW5jbHVkZSAib2JqZWN0LmgiCisKKyNpbmNsdWRlICJzZXJ2ZXIvb2JqZWN0LmgiCiAKIC8qIFNvbWUgdmVyc2lvbnMgb2YgZ2xpYmMgZG9uJ3QgZGVmaW5lIHRoaXMgKi8KICNpZm5kZWYgU0NNX1JJR0hUUwpAQCAtNjcsNiArNjgsMTEgQEAKIHN0YXRpYyBzdHJ1Y3QgdGltZW91dCAqdGltZW91dF9oZWFkOyAgICAgICAgLyogc29ydGVkIHRpbWVvdXRzIGxpc3QgaGVhZCAqLwogc3RhdGljIHN0cnVjdCB0aW1lb3V0ICp0aW1lb3V0X3RhaWw7ICAgICAgICAvKiBzb3J0ZWQgdGltZW91dHMgbGlzdCB0YWlsICovCiAKKy8qIGV4aXQgY29kZSBwYXNzZWQgdG8gcmVtb3ZlX2NsaWVudCAqLworI2RlZmluZSBPVVRfT0ZfTUVNT1JZICAtMQorI2RlZmluZSBCUk9LRU5fUElQRSAgICAtMgorI2RlZmluZSBQUk9UT0NPTF9FUlJPUiAtMworCiAKIC8qIHNpZ25hbCBhIGNsaWVudCBwcm90b2NvbCBlcnJvciAqLwogc3RhdGljIHZvaWQgcHJvdG9jb2xfZXJyb3IoIGludCBjbGllbnRfZmQsIGNvbnN0IGNoYXIgKmVyciwgLi4uICkKQEAgLTgxLDcgKzg3LDcgQEAKIAogCiAvKiBzZW5kIGEgbWVzc2FnZSB0byBhIGNsaWVudCB0aGF0IGlzIHJlYWR5IHRvIHJlY2VpdmUgc29tZXRoaW5nICovCi1zdGF0aWMgaW50IGRvX3dyaXRlKCBpbnQgY2xpZW50X2ZkICkKK3N0YXRpYyB2b2lkIGRvX3dyaXRlKCBpbnQgY2xpZW50X2ZkICkKIHsKICAgICBzdHJ1Y3QgY2xpZW50ICpjbGllbnQgPSBjbGllbnRzW2NsaWVudF9mZF07CiAgICAgc3RydWN0IGlvdmVjIHZlY1syXTsKQEAgLTEyNCwxNCArMTMwLDE1IEBACiAgICAgaWYgKHJldCA9PSAtMSkKICAgICB7CiAgICAgICAgIGlmIChlcnJubyAhPSBFUElQRSkgcGVycm9yKCJzZW5kbXNnIik7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmVtb3ZlX2NsaWVudCggY2xpZW50X2ZkLCBCUk9LRU5fUElQRSApOworICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGlmIChjbGllbnQtPnBhc3NfZmQgIT0gLTEpICAvKiBXZSBzZW50IHRoZSBmZCwgbm93IHdlIGNhbiBjbG9zZSBpdCAqLwogICAgIHsKICAgICAgICAgY2xvc2UoIGNsaWVudC0+cGFzc19mZCApOwogICAgICAgICBjbGllbnQtPnBhc3NfZmQgPSAtMTsKICAgICB9Ci0gICAgaWYgKChjbGllbnQtPmNvdW50ICs9IHJldCkgPCBjbGllbnQtPmhlYWQubGVuKSByZXR1cm4gMDsKKyAgICBpZiAoKGNsaWVudC0+Y291bnQgKz0gcmV0KSA8IGNsaWVudC0+aGVhZC5sZW4pIHJldHVybjsKIAogICAgIC8qIHdlIGhhdmUgZmluaXNoZWQgd2l0aCB0aGlzIG1lc3NhZ2UgKi8KICAgICBpZiAoY2xpZW50LT5kYXRhKSBmcmVlKCBjbGllbnQtPmRhdGEgKTsKQEAgLTE0MSwxMiArMTQ4LDExIEBACiAgICAgY2xpZW50LT5zZXErKzsKICAgICBGRF9DTFIoIGNsaWVudF9mZCwgJndyaXRlX3NldCApOwogICAgIEZEX1NFVCggY2xpZW50X2ZkLCAmcmVhZF9zZXQgKTsKLSAgICByZXR1cm4gMDsKIH0KIAogCiAvKiByZWFkIGEgbWVzc2FnZSBmcm9tIGEgY2xpZW50IHRoYXQgaGFzIHNvbWV0aGluZyB0byBzYXkgKi8KLXN0YXRpYyBpbnQgZG9fcmVhZCggaW50IGNsaWVudF9mZCApCitzdGF0aWMgdm9pZCBkb19yZWFkKCBpbnQgY2xpZW50X2ZkICkKIHsKICAgICBzdHJ1Y3QgY2xpZW50ICpjbGllbnQgPSBjbGllbnRzW2NsaWVudF9mZF07CiAgICAgc3RydWN0IGlvdmVjIHZlYzsKQEAgLTE3MSw3ICsxNzcsMTAgQEAKICAgICB7CiAgICAgICAgIGlmICghY2xpZW50LT5kYXRhICYmCiAgICAgICAgICAgICAhKGNsaWVudC0+ZGF0YSA9IG1hbGxvYyhjbGllbnQtPmhlYWQubGVuLXNpemVvZihjbGllbnQtPmhlYWQpKSkpCi0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlbW92ZV9jbGllbnQoIGNsaWVudF9mZCwgT1VUX09GX01FTU9SWSApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIHZlYy5pb3ZfYmFzZSA9IGNsaWVudC0+ZGF0YSArIGNsaWVudC0+Y291bnQgLSBzaXplb2YoY2xpZW50LT5oZWFkKTsKICAgICAgICAgdmVjLmlvdl9sZW4gID0gY2xpZW50LT5oZWFkLmxlbiAtIGNsaWVudC0+Y291bnQ7CiAgICAgfQpAQCAtMTgwLDcgKzE4OSw4IEBACiAgICAgaWYgKHJldCA9PSAtMSkKICAgICB7CiAgICAgICAgIHBlcnJvcigicmVjdm1zZyIpOwotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJlbW92ZV9jbGllbnQoIGNsaWVudF9mZCwgQlJPS0VOX1BJUEUgKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KICNpZm5kZWYgSEFWRV9NU0dIRFJfQUNDUklHSFRTCiAgICAgcGFzc19mZCA9IGNtc2cuZmQ7CkBAIC0xOTEsMjYgKzIwMSwzMiBAQAogICAgICAgICBpZiAoY2xpZW50LT5wYXNzX2ZkICE9IC0xKSBjbG9zZSggY2xpZW50LT5wYXNzX2ZkICk7CiAgICAgICAgIGNsaWVudC0+cGFzc19mZCA9IHBhc3NfZmQ7CiAgICAgfQotICAgIGVsc2UgaWYgKCFyZXQpIHJldHVybiAtMTsgIC8qIGNsb3NlZCBwaXBlICovCisgICAgZWxzZSBpZiAoIXJldCkgIC8qIGNsb3NlZCBwaXBlICovCisgICAgeworICAgICAgICByZW1vdmVfY2xpZW50KCBjbGllbnRfZmQsIEJST0tFTl9QSVBFICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICBjbGllbnQtPmNvdW50ICs9IHJldDsKIAogICAgIC8qIHJlY2VpdmVkIHRoZSBjb21wbGV0ZSBoZWFkZXIgeWV0PyAqLwotICAgIGlmIChjbGllbnQtPmNvdW50IDwgc2l6ZW9mKGNsaWVudC0+aGVhZCkpIHJldHVybiAwOworICAgIGlmIChjbGllbnQtPmNvdW50IDwgc2l6ZW9mKGNsaWVudC0+aGVhZCkpIHJldHVybjsKIAogICAgIC8qIHNhbml0eSBjaGVja3MgKi8KICAgICBpZiAoY2xpZW50LT5oZWFkLnNlcSAhPSBjbGllbnQtPnNlcSkKICAgICB7CiAgICAgICAgIHByb3RvY29sX2Vycm9yKCBjbGllbnRfZmQsICJiYWQgc2VxdWVuY2UgJTA4eCBpbnN0ZWFkIG9mICUwOHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmhlYWQuc2VxLCBjbGllbnQtPnNlcSApOwotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJlbW92ZV9jbGllbnQoIGNsaWVudF9mZCwgUFJPVE9DT0xfRVJST1IgKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBpZiAoKGNsaWVudC0+aGVhZC5sZW4gPCBzaXplb2YoY2xpZW50LT5oZWFkKSkgfHwKICAgICAgICAgKGNsaWVudC0+aGVhZC5sZW4gPiBNQVhfTVNHX0xFTkdUSCArIHNpemVvZihjbGllbnQtPmhlYWQpKSkKICAgICB7CiAgICAgICAgIHByb3RvY29sX2Vycm9yKCBjbGllbnRfZmQsICJiYWQgaGVhZGVyIGxlbmd0aCAlMDh4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5oZWFkLmxlbiApOwotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJlbW92ZV9jbGllbnQoIGNsaWVudF9mZCwgUFJPVE9DT0xfRVJST1IgKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIC8qIHJlY2VpdmVkIHRoZSB3aG9sZSBtZXNzYWdlPyAqLwpAQCAtMjE4LDE3ICsyMzQsMTAgQEAKICAgICB7CiAgICAgICAgIC8qIGRvbmUgcmVhZGluZyB0aGUgZGF0YSwgY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KIAorICAgICAgICBpbnQgbGVuID0gY2xpZW50LT5oZWFkLmxlbiAtIHNpemVvZihjbGllbnQtPmhlYWQpOwogICAgICAgICBjaGFyICpkYXRhID0gY2xpZW50LT5kYXRhOwogICAgICAgICBpbnQgcGFzc2VkX2ZkID0gY2xpZW50LT5wYXNzX2ZkOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlID0gY2xpZW50LT5oZWFkLnR5cGU7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0IGxlbiAgPSBjbGllbnQtPmhlYWQubGVuIC0gc2l6ZW9mKGNsaWVudC0+aGVhZCk7Ci0KLSAgICAgICAgaWYgKCh0eXBlID49IFJFUV9OQl9SRVFVRVNUUykgfHwgIXJlcV9oYW5kbGVyc1tjbGllbnQtPmhlYWQudHlwZV0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3RvY29sX2Vycm9yKCBjbGllbnRfZmQsICJ1bmtub3duIHJlcXVlc3QgJTA4eFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmhlYWQudHlwZSApOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9CisgICAgICAgIGVudW0gcmVxdWVzdCB0eXBlID0gY2xpZW50LT5oZWFkLnR5cGU7CiAKICAgICAgICAgLyogY2xlYXIgdGhlIGluZm8gbm93LCBhcyB0aGUgY2xpZW50IG1heSBiZSBkZWxldGVkIGJ5IHRoZSBjYWxsYmFjayAqLwogICAgICAgICBjbGllbnQtPmhlYWQubGVuICA9IDA7CkBAIC0yMzksNTcgKzI0OCwxOSBAQAogICAgICAgICBjbGllbnQtPnN0YXRlICAgICA9IFdBSVRJTkc7CiAgICAgICAgIGNsaWVudC0+c2VxKys7CiAKLSAgICAgICAgcmVxX2hhbmRsZXJzW3R5cGVdKCBkYXRhLCBsZW4sIHBhc3NlZF9mZCwgY2xpZW50LT5zZWxmICk7CisgICAgICAgIGNhbGxfcmVxX2hhbmRsZXIoIGNsaWVudC0+c2VsZiwgdHlwZSwgZGF0YSwgbGVuLCBwYXNzZWRfZmQgKTsKICAgICAgICAgaWYgKHBhc3NlZF9mZCAhPSAtMSkgY2xvc2UoIHBhc3NlZF9mZCApOwogICAgICAgICBpZiAoZGF0YSkgZnJlZSggZGF0YSApOwogICAgIH0KLSAgICByZXR1cm4gMDsKIH0KIAogCiAvKiBoYW5kbGUgYSBjbGllbnQgdGltZW91dCAqLwotc3RhdGljIGludCBkb190aW1lb3V0KCBpbnQgY2xpZW50X2ZkICkKK3N0YXRpYyB2b2lkIGRvX3RpbWVvdXQoIGludCBjbGllbnRfZmQgKQogewogICAgIHN0cnVjdCBjbGllbnQgKmNsaWVudCA9IGNsaWVudHNbY2xpZW50X2ZkXTsKICAgICBzZXRfdGltZW91dCggY2xpZW50X2ZkLCAwICk7ICAvKiBSZW1vdmUgdGhlIHRpbWVvdXQgKi8KLSAgICByZXFfaGFuZGxlcnNbUkVRX1RJTUVPVVRdKCBOVUxMLCAwLCAtMSwgY2xpZW50LT5zZWxmICk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotLyogc2VuZCBhIHJlcGx5IHRvIGEgY2xpZW50ICovCi1zdGF0aWMgaW50IHNlbmRfcmVwbHlfdiggaW50IGNsaWVudF9mZCwgaW50IHR5cGUsIGludCBwYXNzX2ZkLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpb3ZlYyAqdmVjLCBpbnQgdmVjbGVuICkKLXsKLSAgICBpbnQgaTsKLSAgICB1bnNpZ25lZCBpbnQgbGVuOwotICAgIGNoYXIgKnA7Ci0gICAgc3RydWN0IGNsaWVudCAqY2xpZW50ID0gY2xpZW50c1tjbGllbnRfZmRdOwotCi0gICAgYXNzZXJ0KCBjbGllbnQgKTsKLSAgICBhc3NlcnQoIGNsaWVudC0+c3RhdGUgPT0gV0FJVElORyApOwotICAgIGFzc2VydCggIWNsaWVudC0+ZGF0YSApOwotCi0gICAgZm9yIChpID0gbGVuID0gMDsgaSA8IHZlY2xlbjsgaSsrKSBsZW4gKz0gdmVjW2ldLmlvdl9sZW47Ci0gICAgYXNzZXJ0KCBsZW4gPCBNQVhfTVNHX0xFTkdUSCApOwotCi0gICAgaWYgKGxlbiAmJiAhKGNsaWVudC0+ZGF0YSA9IG1hbGxvYyggbGVuICkpKSByZXR1cm4gLTE7Ci0gICAgY2xpZW50LT5jb3VudCAgICAgPSAwOwotICAgIGNsaWVudC0+aGVhZC5sZW4gID0gbGVuICsgc2l6ZW9mKGNsaWVudC0+aGVhZCk7Ci0gICAgY2xpZW50LT5oZWFkLnR5cGUgPSB0eXBlOwotICAgIGNsaWVudC0+aGVhZC5zZXEgID0gY2xpZW50LT5zZXE7Ci0gICAgY2xpZW50LT5wYXNzX2ZkICAgPSBwYXNzX2ZkOwotCi0gICAgZm9yIChpID0gMCwgcCA9IGNsaWVudC0+ZGF0YTsgaSA8IHZlY2xlbjsgaSsrKQotICAgIHsKLSAgICAgICAgbWVtY3B5KCBwLCB2ZWNbaV0uaW92X2Jhc2UsIHZlY1tpXS5pb3ZfbGVuICk7Ci0gICAgICAgIHAgKz0gdmVjW2ldLmlvdl9sZW47Ci0gICAgfQotCi0gICAgY2xpZW50LT5zdGF0ZSA9IFJFQURJTkc7Ci0gICAgRkRfQ0xSKCBjbGllbnRfZmQsICZyZWFkX3NldCApOwotICAgIEZEX1NFVCggY2xpZW50X2ZkLCAmd3JpdGVfc2V0ICk7Ci0gICAgcmV0dXJuIDA7CisgICAgY2FsbF90aW1lb3V0X2hhbmRsZXIoIGNsaWVudC0+c2VsZiApOwogfQogCiAKQEAgLTMxNyw4ICsyODgsNyBAQAogICAgICAgICAgICAgICAgICgodGltZW91dF9oZWFkLT53aGVuLnR2X3NlYyA9PSBub3cudHZfc2VjKSAmJgogICAgICAgICAgICAgICAgICAodGltZW91dF9oZWFkLT53aGVuLnR2X3VzZWMgPCBub3cudHZfdXNlYykpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBpZCA9IHRpbWVvdXRfaGVhZC0+Y2xpZW50OwotICAgICAgICAgICAgICAgIGlmIChkb190aW1lb3V0KCBpZCApID09IC0xKSByZW1vdmVfY2xpZW50KCBpZCApOworICAgICAgICAgICAgICAgIGRvX3RpbWVvdXQoIHRpbWVvdXRfaGVhZC0+Y2xpZW50ICk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB0di50dl9zZWMgPSB0aW1lb3V0X2hlYWQtPndoZW4udHZfc2VjIC0gbm93LnR2X3NlYzsKQEAgLTM0MSwxMyArMzExLDExIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChGRF9JU1NFVCggaSwgJndyaXRlICkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFjbGllbnRzW2ldKSBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZiAoZG9fd3JpdGUoIGkgKSA9PSAtMSkgcmVtb3ZlX2NsaWVudCggaSApOworICAgICAgICAgICAgICAgIGlmIChjbGllbnRzW2ldKSBkb193cml0ZSggaSApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSBpZiAoRkRfSVNTRVQoIGksICZyZWFkICkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFjbGllbnRzW2ldKSBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZiAoZG9fcmVhZCggaSApID09IC0xKSByZW1vdmVfY2xpZW50KCBpICk7CisgICAgICAgICAgICAgICAgaWYgKGNsaWVudHNbaV0pIGRvX3JlYWQoIGkgKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTM4OCwxMiArMzU2LDEyIEBACiB9CiAKIC8qIHJlbW92ZSBhIGNsaWVudCAqLwotdm9pZCByZW1vdmVfY2xpZW50KCBpbnQgY2xpZW50X2ZkICkKK3ZvaWQgcmVtb3ZlX2NsaWVudCggaW50IGNsaWVudF9mZCwgaW50IGV4aXRfY29kZSApCiB7CiAgICAgc3RydWN0IGNsaWVudCAqY2xpZW50ID0gY2xpZW50c1tjbGllbnRfZmRdOwogICAgIGFzc2VydCggY2xpZW50ICk7CiAKLSAgICByZXFfaGFuZGxlcnNbUkVRX0tJTExfVEhSRUFEXSggTlVMTCwgMCwgLTEsIGNsaWVudC0+c2VsZiApOworICAgIGNhbGxfa2lsbF9oYW5kbGVyKCBjbGllbnQtPnNlbGYsIGV4aXRfY29kZSApOwogCiAgICAgc2V0X3RpbWVvdXQoIGNsaWVudF9mZCwgMCApOwogICAgIGNsaWVudHNbY2xpZW50X2ZkXSA9IE5VTEw7CkBAIC00NjMsMjEgKzQzMSw0MCBAQAogICAgIH0KIH0KIAotLyogc2VuZCBhIHJlcGx5IHRvIGEgY2xpZW50ICovCi1pbnQgc2VuZF9yZXBseSggaW50IGNsaWVudF9mZCwgaW50IGVycl9jb2RlLCBpbnQgcGFzc19mZCwKLSAgICAgICAgICAgICAgICBpbnQgbiwgLi4uIC8qIGFyZ18xLCBsZW5fMSwgLi4uLCBhcmdfbiwgbGVuX24gKi8gKQotewotICAgIHN0cnVjdCBpb3ZlYyB2ZWNbMTZdOwotICAgIHZhX2xpc3QgYXJnczsKLSAgICBpbnQgaTsKIAotICAgIGFzc2VydCggbiA8IDE2ICk7Ci0gICAgdmFfc3RhcnQoIGFyZ3MsIG4gKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorLyogc2VuZCBhIHJlcGx5IHRvIGEgY2xpZW50ICovCitpbnQgc2VuZF9yZXBseV92KCBpbnQgY2xpZW50X2ZkLCBpbnQgdHlwZSwgaW50IHBhc3NfZmQsCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW92ZWMgKnZlYywgaW50IHZlY2xlbiApCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgaW50IGxlbjsKKyAgICBjaGFyICpwOworICAgIHN0cnVjdCBjbGllbnQgKmNsaWVudCA9IGNsaWVudHNbY2xpZW50X2ZkXTsKKworICAgIGFzc2VydCggY2xpZW50ICk7CisgICAgYXNzZXJ0KCBjbGllbnQtPnN0YXRlID09IFdBSVRJTkcgKTsKKyAgICBhc3NlcnQoICFjbGllbnQtPmRhdGEgKTsKKworICAgIGlmIChkZWJ1Z19sZXZlbCkgdHJhY2VfcmVwbHkoIGNsaWVudC0+c2VsZiwgdHlwZSwgcGFzc19mZCwgdmVjLCB2ZWNsZW4gKTsKKworICAgIGZvciAoaSA9IGxlbiA9IDA7IGkgPCB2ZWNsZW47IGkrKykgbGVuICs9IHZlY1tpXS5pb3ZfbGVuOworICAgIGFzc2VydCggbGVuIDwgTUFYX01TR19MRU5HVEggKTsKKworICAgIGlmIChsZW4gJiYgIShjbGllbnQtPmRhdGEgPSBtYWxsb2MoIGxlbiApKSkgcmV0dXJuIC0xOworICAgIGNsaWVudC0+Y291bnQgICAgID0gMDsKKyAgICBjbGllbnQtPmhlYWQubGVuICA9IGxlbiArIHNpemVvZihjbGllbnQtPmhlYWQpOworICAgIGNsaWVudC0+aGVhZC50eXBlID0gdHlwZTsKKyAgICBjbGllbnQtPmhlYWQuc2VxICA9IGNsaWVudC0+c2VxOworICAgIGNsaWVudC0+cGFzc19mZCAgID0gcGFzc19mZDsKKworICAgIGZvciAoaSA9IDAsIHAgPSBjbGllbnQtPmRhdGE7IGkgPCB2ZWNsZW47IGkrKykKICAgICB7Ci0gICAgICAgIHZlY1tpXS5pb3ZfYmFzZSA9IHZhX2FyZyggYXJncywgdm9pZCAqICk7Ci0gICAgICAgIHZlY1tpXS5pb3ZfbGVuICA9IHZhX2FyZyggYXJncywgaW50ICk7CisgICAgICAgIG1lbWNweSggcCwgdmVjW2ldLmlvdl9iYXNlLCB2ZWNbaV0uaW92X2xlbiApOworICAgICAgICBwICs9IHZlY1tpXS5pb3ZfbGVuOwogICAgIH0KLSAgICB2YV9lbmQoIGFyZ3MgKTsKLSAgICByZXR1cm4gc2VuZF9yZXBseV92KCBjbGllbnRfZmQsIGVycl9jb2RlLCBwYXNzX2ZkLCB2ZWMsIG4gKTsKKworICAgIGNsaWVudC0+c3RhdGUgPSBSRUFESU5HOworICAgIEZEX0NMUiggY2xpZW50X2ZkLCAmcmVhZF9zZXQgKTsKKyAgICBGRF9TRVQoIGNsaWVudF9mZCwgJndyaXRlX3NldCApOworICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc2VydmVyL3RocmVhZC5jIGIvc2VydmVyL3RocmVhZC5jCmluZGV4IGQxY2UzMGIuLjIwNmUxYTkgMTAwNjQ0Ci0tLSBhL3NlcnZlci90aHJlYWQuYworKysgYi9zZXJ2ZXIvdGhyZWFkLmMKQEAgLTYsOTYgKzYsOTEgQEAKIAogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKKyNpbmNsdWRlICJ3aW5udC5oIgogI2luY2x1ZGUgIndpbmVycm9yLmgiCiAjaW5jbHVkZSAic2VydmVyLmgiCi0jaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSAic2VydmVyL3RocmVhZC5oIgogCiAKLS8qIHJlcXVlc3QgaGFuZGxpbmcgKi8KLQotc3RhdGljIHZvaWQgaGFuZGxlX3RpbWVvdXQoIHZvaWQgKmRhdGEsIGludCBsZW4sIGludCBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGhyZWFkICpzZWxmICk7Ci1zdGF0aWMgdm9pZCBoYW5kbGVfa2lsbF90aHJlYWQoIHZvaWQgKmRhdGEsIGludCBsZW4sIGludCBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRocmVhZCAqc2VsZiApOwotc3RhdGljIHZvaWQgaGFuZGxlX25ld190aHJlYWQoIHZvaWQgKmRhdGEsIGludCBsZW4sIGludCBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGhyZWFkICpzZWxmICk7Ci1zdGF0aWMgdm9pZCBoYW5kbGVfaW5pdF90aHJlYWQoIHZvaWQgKmRhdGEsIGludCBsZW4sIGludCBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRocmVhZCAqc2VsZiApOwotCi1jb25zdCByZXFfaGFuZGxlciByZXFfaGFuZGxlcnNbUkVRX05CX1JFUVVFU1RTXSA9Ci17Ci0gICAgaGFuZGxlX3RpbWVvdXQsICAgICAgICAvKiBSRVFfVElNRU9VVCAqLwotICAgIGhhbmRsZV9raWxsX3RocmVhZCwgICAgLyogUkVRX0tJTExfVEhSRUFEICovCi0gICAgaGFuZGxlX25ld190aHJlYWQsICAgICAvKiBSRVFfTkVXX1RIUkVBRCAqLwotICAgIGhhbmRsZV9pbml0X3RocmVhZCAgICAgLyogUkVRX0lOSVRfVEhSRUFEICovCi19OwotCi0KLS8qIHRocmVhZCBzdHJ1Y3R1cmU7IG5vdCBtdWNoIGZvciBub3cuLi4gKi8KLQotc3RydWN0IHRocmVhZAotewotICAgIHN0cnVjdCBvYmplY3QgICBvYmo7ICAgICAgIC8qIG9iamVjdCBoZWFkZXIgKi8KLSAgICBzdHJ1Y3QgdGhyZWFkICAqbmV4dDsgICAgICAvKiBzeXN0ZW0td2lkZSB0aHJlYWQgbGlzdCAqLwotICAgIHN0cnVjdCB0aHJlYWQgICpwcmV2OwotICAgIHN0cnVjdCBwcm9jZXNzICpwcm9jZXNzOwotICAgIGludCAgICAgICAgICAgICBjbGllbnRfZmQ7IC8qIGNsaWVudCBmZCBmb3Igc29ja2V0IGNvbW11bmljYXRpb25zICovCi0gICAgaW50ICAgICAgICAgICAgIHVuaXhfcGlkOwotICAgIGNoYXIgICAgICAgICAgICpuYW1lOwotfTsKLQotc3RhdGljIHN0cnVjdCB0aHJlYWQgKmZpcnN0X3RocmVhZDsKLQogLyogdGhyZWFkIG9wZXJhdGlvbnMgKi8KIAorc3RhdGljIHZvaWQgZHVtcF90aHJlYWQoIHN0cnVjdCBvYmplY3QgKm9iaiwgaW50IHZlcmJvc2UgKTsKIHN0YXRpYyB2b2lkIGRlc3Ryb3lfdGhyZWFkKCBzdHJ1Y3Qgb2JqZWN0ICpvYmogKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvYmplY3Rfb3BzIHRocmVhZF9vcHMgPQogeworICAgIGR1bXBfdGhyZWFkLAogICAgIGRlc3Ryb3lfdGhyZWFkCiB9OwogCitzdGF0aWMgc3RydWN0IHRocmVhZCAqZmlyc3RfdGhyZWFkOworCiAKIC8qIGNyZWF0ZSBhIG5ldyB0aHJlYWQgKi8KLXN0YXRpYyBzdHJ1Y3QgdGhyZWFkICpjcmVhdGVfdGhyZWFkKCBpbnQgZmQsIHZvaWQgKnBpZCApCitzdHJ1Y3QgdGhyZWFkICpjcmVhdGVfdGhyZWFkKCBpbnQgZmQsIHZvaWQgKnBpZCwgaW50ICp0aHJlYWRfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwcm9jZXNzX2hhbmRsZSApCiB7CiAgICAgc3RydWN0IHRocmVhZCAqdGhyZWFkOwogICAgIHN0cnVjdCBwcm9jZXNzICpwcm9jZXNzOwogCi0gICAgaWYgKHBpZCkKKyAgICBpZiAoISh0aHJlYWQgPSBtYWxsb2MoIHNpemVvZigqdGhyZWFkKSApKSkgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAocGlkKSBwcm9jZXNzID0gZ2V0X3Byb2Nlc3NfZnJvbV9pZCggcGlkICk7CisgICAgZWxzZSBwcm9jZXNzID0gY3JlYXRlX3Byb2Nlc3MoKTsKKyAgICBpZiAoIXByb2Nlc3MpCiAgICAgewotICAgICAgICBpZiAoIShwcm9jZXNzID0gZ2V0X3Byb2Nlc3NfZnJvbV9pZCggcGlkICkpKSByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKCEocHJvY2VzcyA9IGNyZWF0ZV9wcm9jZXNzKCkpKSByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKCEodGhyZWFkID0gbWFsbG9jKCBzaXplb2YoKnRocmVhZCkgKSkpCi0gICAgewotICAgICAgICByZWxlYXNlX29iamVjdCggcHJvY2VzcyApOworICAgICAgICBmcmVlKCB0aHJlYWQgKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQorCiAgICAgaW5pdF9vYmplY3QoICZ0aHJlYWQtPm9iaiwgJnRocmVhZF9vcHMsIE5VTEwgKTsKICAgICB0aHJlYWQtPmNsaWVudF9mZCA9IGZkOwogICAgIHRocmVhZC0+cHJvY2VzcyAgID0gcHJvY2VzczsKICAgICB0aHJlYWQtPnVuaXhfcGlkICA9IDA7ICAvKiBub3Qga25vd24geWV0ICovCiAgICAgdGhyZWFkLT5uYW1lICAgICAgPSBOVUxMOworICAgIHRocmVhZC0+ZXJyb3IgICAgID0gMDsKKyAgICB0aHJlYWQtPmV4aXRfY29kZSA9IDB4MTAzOyAgLyogU1RJTExfQUNUSVZFICovCisgICAgdGhyZWFkLT5uZXh0ICAgICAgPSBmaXJzdF90aHJlYWQ7CisgICAgdGhyZWFkLT5wcmV2ICAgICAgPSBOVUxMOwogCi0gICAgdGhyZWFkLT5uZXh0ID0gZmlyc3RfdGhyZWFkOwotICAgIHRocmVhZC0+cHJldiA9IE5VTEw7CisgICAgaWYgKGZpcnN0X3RocmVhZCkgZmlyc3RfdGhyZWFkLT5wcmV2ID0gdGhyZWFkOwogICAgIGZpcnN0X3RocmVhZCA9IHRocmVhZDsKKyAgICBhZGRfcHJvY2Vzc190aHJlYWQoIHByb2Nlc3MsIHRocmVhZCApOwogCi0gICAgaWYgKGFkZF9jbGllbnQoIGZkLCB0aHJlYWQgKSA9PSAtMSkKKyAgICAqdGhyZWFkX2hhbmRsZSA9ICpwcm9jZXNzX2hhbmRsZSA9IC0xOworICAgIGlmIChjdXJyZW50KQogICAgIHsKLSAgICAgICAgcmVsZWFzZV9vYmplY3QoIHRocmVhZCApOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCgqdGhyZWFkX2hhbmRsZSA9IGFsbG9jX2hhbmRsZSggY3VycmVudC0+cHJvY2VzcywgdGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJFQURfQUxMX0FDQ0VTUywgMCApKSA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQorICAgIGlmIChjdXJyZW50ICYmICFwaWQpCisgICAgeworICAgICAgICBpZiAoKCpwcm9jZXNzX2hhbmRsZSA9IGFsbG9jX2hhbmRsZSggY3VycmVudC0+cHJvY2VzcywgcHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NfQUxMX0FDQ0VTUywgMCApKSA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYgKGFkZF9jbGllbnQoIGZkLCB0aHJlYWQgKSA9PSAtMSkgZ290byBlcnJvcjsKKwogICAgIHJldHVybiB0aHJlYWQ7CisKKyBlcnJvcjoKKyAgICBpZiAoY3VycmVudCkKKyAgICB7CisgICAgICAgIGNsb3NlX2hhbmRsZSggY3VycmVudC0+cHJvY2VzcywgKnRocmVhZF9oYW5kbGUgKTsKKyAgICAgICAgY2xvc2VfaGFuZGxlKCBjdXJyZW50LT5wcm9jZXNzLCAqcHJvY2Vzc19oYW5kbGUgKTsKKyAgICB9CisgICAgcmVtb3ZlX3Byb2Nlc3NfdGhyZWFkKCBwcm9jZXNzLCB0aHJlYWQgKTsKKyAgICByZWxlYXNlX29iamVjdCggdGhyZWFkICk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIGRlc3Ryb3kgYSB0aHJlYWQgd2hlbiBpdHMgcmVmY291bnQgaXMgMCAqLwpAQCAtMTEyLDkzICsxMDcsNjIgQEAKICAgICBmcmVlKCB0aHJlYWQgKTsKIH0KIAorLyogZHVtcCBhIHRocmVhZCBvbiBzdGRvdXQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyAqLworc3RhdGljIHZvaWQgZHVtcF90aHJlYWQoIHN0cnVjdCBvYmplY3QgKm9iaiwgaW50IHZlcmJvc2UgKQoreworICAgIHN0cnVjdCB0aHJlYWQgKnRocmVhZCA9IChzdHJ1Y3QgdGhyZWFkICopb2JqOworICAgIGFzc2VydCggb2JqLT5vcHMgPT0gJnRocmVhZF9vcHMgKTsKKworICAgIHByaW50ZiggIlRocmVhZCBwaWQ9JWQgZmQ9JWQgbmFtZT0nJXMnXG4iLAorICAgICAgICAgICAgdGhyZWFkLT51bml4X3BpZCwgdGhyZWFkLT5jbGllbnRfZmQsIHRocmVhZC0+bmFtZSApOworfQorCisvKiBnZXQgYSB0aHJlYWQgcG9pbnRlciBmcm9tIGEgdGhyZWFkIGlkIChhbmQgaW5jcmVtZW50IHRoZSByZWZjb3VudCkgKi8KIHN0cnVjdCB0aHJlYWQgKmdldF90aHJlYWRfZnJvbV9pZCggdm9pZCAqaWQgKQogewogICAgIHN0cnVjdCB0aHJlYWQgKnQgPSBmaXJzdF90aHJlYWQ7CiAgICAgd2hpbGUgKHQgJiYgKHQgIT0gaWQpKSB0ID0gdC0+bmV4dDsKKyAgICBpZiAodCkgZ3JhYl9vYmplY3QoIHQgKTsKICAgICByZXR1cm4gdDsKIH0KIAotLyogaGFuZGxlIGEgY2xpZW50IHRpbWVvdXQgKHVudXNlZCBmb3Igbm93KSAqLwotc3RhdGljIHZvaWQgaGFuZGxlX3RpbWVvdXQoIHZvaWQgKmRhdGEsIGludCBsZW4sIGludCBmZCwgc3RydWN0IHRocmVhZCAqc2VsZiApCisvKiBnZXQgYSB0aHJlYWQgZnJvbSBhIGhhbmRsZSAoYW5kIGluY3JlbWVudCB0aGUgcmVmY291bnQpICovCitzdHJ1Y3QgdGhyZWFkICpnZXRfdGhyZWFkX2Zyb21faGFuZGxlKCBpbnQgaGFuZGxlLCB1bnNpZ25lZCBpbnQgYWNjZXNzICkKIHsKLS8qICAgIGZwcmludGYoIHN0ZGVyciwgIlNlcnZlcjogZ290IHRpbWVvdXQgZm9yICVzXG4iLCBzZWxmLT5uYW1lICk7Ki8KLSAgICBzZW5kX3JlcGx5KCBzZWxmLT5jbGllbnRfZmQsIDAsIC0xLCAwICk7CisgICAgcmV0dXJuIChzdHJ1Y3QgdGhyZWFkICopZ2V0X2hhbmRsZV9vYmooIGN1cnJlbnQtPnByb2Nlc3MsIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzLCAmdGhyZWFkX29wcyApOworfQorCisvKiBzZW5kIGEgcmVwbHkgdG8gYSB0aHJlYWQgKi8KK2ludCBzZW5kX3JlcGx5KCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsIGludCBwYXNzX2ZkLCBpbnQgbiwKKyAgICAgICAgICAgICAgICAuLi4gLyogYXJnXzEsIGxlbl8xLCAuLi4sIGFyZ19uLCBsZW5fbiAqLyApCit7CisgICAgc3RydWN0IGlvdmVjIHZlY1sxNl07CisgICAgdmFfbGlzdCBhcmdzOworICAgIGludCBpOworCisgICAgYXNzZXJ0KCBuIDwgMTYgKTsKKyAgICB2YV9zdGFydCggYXJncywgbiApOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeworICAgICAgICB2ZWNbaV0uaW92X2Jhc2UgPSB2YV9hcmcoIGFyZ3MsIHZvaWQgKiApOworICAgICAgICB2ZWNbaV0uaW92X2xlbiAgPSB2YV9hcmcoIGFyZ3MsIGludCApOworICAgIH0KKyAgICB2YV9lbmQoIGFyZ3MgKTsKKyAgICByZXR1cm4gc2VuZF9yZXBseV92KCB0aHJlYWQtPmNsaWVudF9mZCwgdGhyZWFkLT5lcnJvciwgcGFzc19mZCwgdmVjLCBuICk7Cit9CisKKy8qIGtpbGwgYSB0aHJlYWQgb24gdGhlIHNwb3QgKi8KK3ZvaWQga2lsbF90aHJlYWQoIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgaW50IGV4aXRfY29kZSApCit7CisgICAgaWYgKHRocmVhZC0+dW5peF9waWQpIGtpbGwoIHRocmVhZC0+dW5peF9waWQsIFNJR1RFUk0gKTsKKyAgICByZW1vdmVfY2xpZW50KCB0aHJlYWQtPmNsaWVudF9mZCwgZXhpdF9jb2RlICk7IC8qIHRoaXMgd2lsbCBjYWxsIHRocmVhZF9raWxsZWQgKi8KIH0KIAogLyogYSB0aHJlYWQgaGFzIGJlZW4ga2lsbGVkICovCi1zdGF0aWMgdm9pZCBoYW5kbGVfa2lsbF90aHJlYWQoIHZvaWQgKmRhdGEsIGludCBsZW4sIGludCBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRocmVhZCAqc2VsZiApCit2b2lkIHRocmVhZF9raWxsZWQoIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgaW50IGV4aXRfY29kZSApCiB7Ci0gICAgaWYgKCFzZWxmKSByZXR1cm47ICAvKiBpbml0aWFsIGNsaWVudCBiZWluZyBraWxsZWQgKi8KLS8qICAgIGZwcmludGYoIHN0ZGVyciwgIlNlcnZlcjogdGhyZWFkICclcycga2lsbGVkXG4iLAotICAgICAgICAgICAgICAgc2VsZi0+bmFtZSA/IHNlbGYtPm5hbWUgOiAiPz8/IiApOwotKi8KLSAgICByZWxlYXNlX29iamVjdCggJnNlbGYtPm9iaiApOwotfQotCi0vKiBjcmVhdGUgYSBuZXcgdGhyZWFkICovCi1zdGF0aWMgdm9pZCBoYW5kbGVfbmV3X3RocmVhZCggdm9pZCAqZGF0YSwgaW50IGxlbiwgaW50IGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aHJlYWQgKnNlbGYgKQotewotICAgIHN0cnVjdCBuZXdfdGhyZWFkX3JlcXVlc3QgKnJlcSA9IChzdHJ1Y3QgbmV3X3RocmVhZF9yZXF1ZXN0ICopZGF0YTsKLSAgICBzdHJ1Y3QgbmV3X3RocmVhZF9yZXBseSByZXBseTsKLSAgICBzdHJ1Y3QgdGhyZWFkICpuZXdfdGhyZWFkOwotICAgIGludCBuZXdfZmQsIGVycjsKLQotICAgIGlmICgobmV3X2ZkID0gZHVwKGZkKSkgPT0gLTEpCi0gICAgewotICAgICAgICBuZXdfdGhyZWFkID0gTlVMTDsKLSAgICAgICAgZXJyID0gRVJST1JfVE9PX01BTllfT1BFTl9GSUxFUzsKLSAgICAgICAgZ290byBkb25lOwotICAgIH0KLSAgICBpZiAobGVuICE9IHNpemVvZigqcmVxKSkKLSAgICB7Ci0gICAgICAgIGVyciA9IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwotICAgICAgICBnb3RvIGRvbmU7Ci0gICAgfQotICAgIGlmICghKG5ld190aHJlYWQgPSBjcmVhdGVfdGhyZWFkKCBuZXdfZmQsIHJlcS0+cGlkICkpKQotICAgIHsKLSAgICAgICAgZXJyID0gRVJST1JfTk9UX0VOT1VHSF9NRU1PUlk7Ci0gICAgICAgIGNsb3NlKCBuZXdfZmQgKTsKLSAgICAgICAgZ290byBkb25lOwotICAgIH0KLSAgICByZXBseS50aWQgPSBuZXdfdGhyZWFkOwotICAgIHJlcGx5LnBpZCA9IG5ld190aHJlYWQtPnByb2Nlc3M7Ci0gICAgZXJyID0gRVJST1JfU1VDQ0VTUzsKLSBkb25lOgotICAgIHNlbmRfcmVwbHkoIHNlbGYgPyBzZWxmLT5jbGllbnRfZmQgOiBnZXRfaW5pdGlhbF9jbGllbnRfZmQoKSwKLSAgICAgICAgICAgICAgICBlcnIsIC0xLCAxLCAmcmVwbHksIHNpemVvZihyZXBseSkgKTsKLX0KLQotLyogY3JlYXRlIGEgbmV3IHRocmVhZCAqLwotc3RhdGljIHZvaWQgaGFuZGxlX2luaXRfdGhyZWFkKCB2b2lkICpkYXRhLCBpbnQgbGVuLCBpbnQgZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aHJlYWQgKnNlbGYgKQotewotICAgIHN0cnVjdCBpbml0X3RocmVhZF9yZXF1ZXN0ICpyZXEgPSAoc3RydWN0IGluaXRfdGhyZWFkX3JlcXVlc3QgKilkYXRhOwotICAgIGludCBlcnI7Ci0KLSAgICBpZiAobGVuIDwgc2l6ZW9mKCpyZXEpKQotICAgIHsKLSAgICAgICAgZXJyID0gRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7Ci0gICAgICAgIGdvdG8gZG9uZTsKLSAgICB9Ci0gICAgbGVuIC09IHNpemVvZigqcmVxKTsKLSAgICBzZWxmLT51bml4X3BpZCA9IHJlcS0+cGlkOwotICAgIGlmICghKHNlbGYtPm5hbWUgPSBtYWxsb2MoIGxlbiArIDEgKSkpCi0gICAgewotICAgICAgICBlcnIgPSBFUlJPUl9OT1RfRU5PVUdIX01FTU9SWTsKLSAgICAgICAgZ290byBkb25lOwotICAgIH0KLSAgICBtZW1jcHkoIHNlbGYtPm5hbWUsIChjaGFyICopZGF0YSArIHNpemVvZigqcmVxKSwgbGVuICk7Ci0gICAgc2VsZi0+bmFtZVtsZW5dID0gJ1wwJzsKLSAgICAKLS8qICAgIGZwcmludGYoIHN0ZGVyciwKLSAgICAgICAgICAgICAiU2VydmVyOiBpbml0IHRocmVhZCAnJXMnIHBpZD0lMDh4IHRpZD0lMDh4IHVuaXhfcGlkPSVkXG4iLAotICAgICAgICAgICAgIHNlbGYtPm5hbWUsIChpbnQpc2VsZi0+cHJvY2VzcywgKGludClzZWxmLCBzZWxmLT51bml4X3BpZCApOwotKi8KLQotICAgIGVyciA9IEVSUk9SX1NVQ0NFU1M7Ci0gZG9uZToKLSAgICBzZW5kX3JlcGx5KCBzZWxmLT5jbGllbnRfZmQsIGVyciwgLTEsIDAgKTsKKyAgICB0aHJlYWQtPmV4aXRfY29kZSA9IGV4aXRfY29kZTsKKyAgICByZW1vdmVfcHJvY2Vzc190aHJlYWQoIHRocmVhZC0+cHJvY2VzcywgdGhyZWFkICk7CisgICAgcmVsZWFzZV9vYmplY3QoIHRocmVhZCApOwogfQpkaWZmIC0tZ2l0IGEvc2VydmVyL3RyYWNlLmMgYi9zZXJ2ZXIvdHJhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTJlZGVhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmVyL3RyYWNlLmMKQEAgLTAsMCArMSwxODAgQEAKKy8qIEZpbGUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgdG9vbHMvbWFrZV9yZXF1ZXN0czsgRE8gTk9UIEVESVQhISAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjaW5jbHVkZSAic2VydmVyLmgiCisjaW5jbHVkZSAic2VydmVyL3RocmVhZC5oIgorCitzdGF0aWMgdm9pZCBkdW1wX25ld190aHJlYWRfcmVxdWVzdCggc3RydWN0IG5ld190aHJlYWRfcmVxdWVzdCAqcmVxICkKK3sKKyAgICBwcmludGYoICIgcGlkPSVwIiwgcmVxLT5waWQgKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9uZXdfdGhyZWFkX3JlcGx5KCBzdHJ1Y3QgbmV3X3RocmVhZF9yZXBseSAqcmVxICkKK3sKKyAgICBwcmludGYoICIgdGlkPSVwLCIsIHJlcS0+dGlkICk7CisgICAgcHJpbnRmKCAiIHRoYW5kbGU9JWQsIiwgcmVxLT50aGFuZGxlICk7CisgICAgcHJpbnRmKCAiIHBpZD0lcCwiLCByZXEtPnBpZCApOworICAgIHByaW50ZiggIiBwaGFuZGxlPSVkIiwgcmVxLT5waGFuZGxlICk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfaW5pdF90aHJlYWRfcmVxdWVzdCggc3RydWN0IGluaXRfdGhyZWFkX3JlcXVlc3QgKnJlcSApCit7CisgICAgcHJpbnRmKCAiIHVuaXhfcGlkPSVkIiwgcmVxLT51bml4X3BpZCApOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3Rlcm1pbmF0ZV9wcm9jZXNzX3JlcXVlc3QoIHN0cnVjdCB0ZXJtaW5hdGVfcHJvY2Vzc19yZXF1ZXN0ICpyZXEgKQoreworICAgIHByaW50ZiggIiBoYW5kbGU9JWQsIiwgcmVxLT5oYW5kbGUgKTsKKyAgICBwcmludGYoICIgZXhpdF9jb2RlPSVkIiwgcmVxLT5leGl0X2NvZGUgKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF90ZXJtaW5hdGVfdGhyZWFkX3JlcXVlc3QoIHN0cnVjdCB0ZXJtaW5hdGVfdGhyZWFkX3JlcXVlc3QgKnJlcSApCit7CisgICAgcHJpbnRmKCAiIGhhbmRsZT0lZCwiLCByZXEtPmhhbmRsZSApOworICAgIHByaW50ZiggIiBleGl0X2NvZGU9JWQiLCByZXEtPmV4aXRfY29kZSApOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2dldF9wcm9jZXNzX2luZm9fcmVxdWVzdCggc3RydWN0IGdldF9wcm9jZXNzX2luZm9fcmVxdWVzdCAqcmVxICkKK3sKKyAgICBwcmludGYoICIgaGFuZGxlPSVkIiwgcmVxLT5oYW5kbGUgKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9nZXRfcHJvY2Vzc19pbmZvX3JlcGx5KCBzdHJ1Y3QgZ2V0X3Byb2Nlc3NfaW5mb19yZXBseSAqcmVxICkKK3sKKyAgICBwcmludGYoICIgcGlkPSVwLCIsIHJlcS0+cGlkICk7CisgICAgcHJpbnRmKCAiIGV4aXRfY29kZT0lZCIsIHJlcS0+ZXhpdF9jb2RlICk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfY2xvc2VfaGFuZGxlX3JlcXVlc3QoIHN0cnVjdCBjbG9zZV9oYW5kbGVfcmVxdWVzdCAqcmVxICkKK3sKKyAgICBwcmludGYoICIgaGFuZGxlPSVkIiwgcmVxLT5oYW5kbGUgKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9kdXBfaGFuZGxlX3JlcXVlc3QoIHN0cnVjdCBkdXBfaGFuZGxlX3JlcXVlc3QgKnJlcSApCit7CisgICAgcHJpbnRmKCAiIHNyY19wcm9jZXNzPSVkLCIsIHJlcS0+c3JjX3Byb2Nlc3MgKTsKKyAgICBwcmludGYoICIgc3JjX2hhbmRsZT0lZCwiLCByZXEtPnNyY19oYW5kbGUgKTsKKyAgICBwcmludGYoICIgZHN0X3Byb2Nlc3M9JWQsIiwgcmVxLT5kc3RfcHJvY2VzcyApOworICAgIHByaW50ZiggIiBkc3RfaGFuZGxlPSVkLCIsIHJlcS0+ZHN0X2hhbmRsZSApOworICAgIHByaW50ZiggIiBhY2Nlc3M9JTA4eCwiLCByZXEtPmFjY2VzcyApOworICAgIHByaW50ZiggIiBpbmhlcml0PSVkLCIsIHJlcS0+aW5oZXJpdCApOworICAgIHByaW50ZiggIiBvcHRpb25zPSVkIiwgcmVxLT5vcHRpb25zICk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfZHVwX2hhbmRsZV9yZXBseSggc3RydWN0IGR1cF9oYW5kbGVfcmVwbHkgKnJlcSApCit7CisgICAgcHJpbnRmKCAiIGhhbmRsZT0lZCIsIHJlcS0+aGFuZGxlICk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfb3Blbl9wcm9jZXNzX3JlcXVlc3QoIHN0cnVjdCBvcGVuX3Byb2Nlc3NfcmVxdWVzdCAqcmVxICkKK3sKKyAgICBwcmludGYoICIgcGlkPSVwLCIsIHJlcS0+cGlkICk7CisgICAgcHJpbnRmKCAiIGFjY2Vzcz0lMDh4LCIsIHJlcS0+YWNjZXNzICk7CisgICAgcHJpbnRmKCAiIGluaGVyaXQ9JWQiLCByZXEtPmluaGVyaXQgKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9vcGVuX3Byb2Nlc3NfcmVwbHkoIHN0cnVjdCBvcGVuX3Byb2Nlc3NfcmVwbHkgKnJlcSApCit7CisgICAgcHJpbnRmKCAiIGhhbmRsZT0lZCIsIHJlcS0+aGFuZGxlICk7Cit9CisKK3N0cnVjdCBkdW1wZXIKK3sKKyAgICB2b2lkICgqZHVtcF9yZXEpKCk7CisgICAgdm9pZCAoKmR1bXBfcmVwbHkpKCk7CisgICAgdW5zaWduZWQgaW50IHNpemU7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGR1bXBlciBkdW1wZXJzW1JFUV9OQl9SRVFVRVNUU10gPQoreworICAgIHsgKHZvaWQoKikoKSlkdW1wX25ld190aHJlYWRfcmVxdWVzdCwKKyAgICAgICh2b2lkKCopKCkpZHVtcF9uZXdfdGhyZWFkX3JlcGx5LAorICAgICAgc2l6ZW9mKHN0cnVjdCBuZXdfdGhyZWFkX3JlcXVlc3QpIH0sCisgICAgeyAodm9pZCgqKSgpKWR1bXBfaW5pdF90aHJlYWRfcmVxdWVzdCwKKyAgICAgICh2b2lkKCopKCkpMCwKKyAgICAgIHNpemVvZihzdHJ1Y3QgaW5pdF90aHJlYWRfcmVxdWVzdCkgfSwKKyAgICB7ICh2b2lkKCopKCkpZHVtcF90ZXJtaW5hdGVfcHJvY2Vzc19yZXF1ZXN0LAorICAgICAgKHZvaWQoKikoKSkwLAorICAgICAgc2l6ZW9mKHN0cnVjdCB0ZXJtaW5hdGVfcHJvY2Vzc19yZXF1ZXN0KSB9LAorICAgIHsgKHZvaWQoKikoKSlkdW1wX3Rlcm1pbmF0ZV90aHJlYWRfcmVxdWVzdCwKKyAgICAgICh2b2lkKCopKCkpMCwKKyAgICAgIHNpemVvZihzdHJ1Y3QgdGVybWluYXRlX3RocmVhZF9yZXF1ZXN0KSB9LAorICAgIHsgKHZvaWQoKikoKSlkdW1wX2dldF9wcm9jZXNzX2luZm9fcmVxdWVzdCwKKyAgICAgICh2b2lkKCopKCkpZHVtcF9nZXRfcHJvY2Vzc19pbmZvX3JlcGx5LAorICAgICAgc2l6ZW9mKHN0cnVjdCBnZXRfcHJvY2Vzc19pbmZvX3JlcXVlc3QpIH0sCisgICAgeyAodm9pZCgqKSgpKWR1bXBfY2xvc2VfaGFuZGxlX3JlcXVlc3QsCisgICAgICAodm9pZCgqKSgpKTAsCisgICAgICBzaXplb2Yoc3RydWN0IGNsb3NlX2hhbmRsZV9yZXF1ZXN0KSB9LAorICAgIHsgKHZvaWQoKikoKSlkdW1wX2R1cF9oYW5kbGVfcmVxdWVzdCwKKyAgICAgICh2b2lkKCopKCkpZHVtcF9kdXBfaGFuZGxlX3JlcGx5LAorICAgICAgc2l6ZW9mKHN0cnVjdCBkdXBfaGFuZGxlX3JlcXVlc3QpIH0sCisgICAgeyAodm9pZCgqKSgpKWR1bXBfb3Blbl9wcm9jZXNzX3JlcXVlc3QsCisgICAgICAodm9pZCgqKSgpKWR1bXBfb3Blbl9wcm9jZXNzX3JlcGx5LAorICAgICAgc2l6ZW9mKHN0cnVjdCBvcGVuX3Byb2Nlc3NfcmVxdWVzdCkgfSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcmVxX25hbWVzW1JFUV9OQl9SRVFVRVNUU10gPQoreworICAgICJuZXdfdGhyZWFkIiwKKyAgICAiaW5pdF90aHJlYWQiLAorICAgICJ0ZXJtaW5hdGVfcHJvY2VzcyIsCisgICAgInRlcm1pbmF0ZV90aHJlYWQiLAorICAgICJnZXRfcHJvY2Vzc19pbmZvIiwKKyAgICAiY2xvc2VfaGFuZGxlIiwKKyAgICAiZHVwX2hhbmRsZSIsCisgICAgIm9wZW5fcHJvY2VzcyIsCit9OworCit2b2lkIHRyYWNlX3JlcXVlc3QoIGVudW0gcmVxdWVzdCByZXEsIHZvaWQgKmRhdGEsIGludCBsZW4sIGludCBmZCApCit7CisgICAgY3VycmVudC0+bGFzdF9yZXEgPSByZXE7CisgICAgcHJpbnRmKCAiJTA4eDogJXMoIiwgKHVuc2lnbmVkIGludCljdXJyZW50LCByZXFfbmFtZXNbcmVxXSApOworICAgIGR1bXBlcnNbcmVxXS5kdW1wX3JlcSggZGF0YSApOworICAgIGlmIChsZW4gPiBkdW1wZXJzW3JlcV0uc2l6ZSkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyICopZGF0YSArIGR1bXBlcnNbcmVxXS5zaXplOworCWxlbiAtPSBkdW1wZXJzW3JlcV0uc2l6ZTsKKyAgICAgICAgd2hpbGUgKGxlbi0tKSBwcmludGYoICIsICUwMngiLCAqcHRyKysgKTsKKyAgICB9CisgICAgaWYgKGZkICE9IC0xKSBwcmludGYoICIgKSBmZD0lZFxuIiwgZmQgKTsKKyAgICBlbHNlIHByaW50ZiggIiApXG4iICk7Cit9CisKK3ZvaWQgdHJhY2VfdGltZW91dCh2b2lkKQoreworICAgIHByaW50ZiggIiUwOHg6ICp0aW1lb3V0KlxuIiwgKHVuc2lnbmVkIGludCljdXJyZW50ICk7Cit9CisKK3ZvaWQgdHJhY2Vfa2lsbCggaW50IGV4aXRfY29kZSApCit7CisgICAgcHJpbnRmKCAiJTA4eDogKmtpbGxlZCogZXhpdF9jb2RlPSVkXG4iLAorICAgICAgICAgICAgKHVuc2lnbmVkIGludCljdXJyZW50LCBleGl0X2NvZGUgKTsKK30KKwordm9pZCB0cmFjZV9yZXBseSggc3RydWN0IHRocmVhZCAqdGhyZWFkLCBpbnQgdHlwZSwgaW50IHBhc3NfZmQsCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW92ZWMgKnZlYywgaW50IHZlY2xlbiApCit7CisgICAgaWYgKCF0aHJlYWQpIHJldHVybjsKKyAgICBwcmludGYoICIlMDh4OiAlcygpID0gJWQiLAorICAgICAgICAgICAgKHVuc2lnbmVkIGludCl0aHJlYWQsIHJlcV9uYW1lc1t0aHJlYWQtPmxhc3RfcmVxXSwgdHlwZSApOworICAgIGlmICh2ZWNsZW4pCisgICAgeworCXByaW50ZiggIiB7IiApOworCWlmIChkdW1wZXJzW3RocmVhZC0+bGFzdF9yZXFdLmR1bXBfcmVwbHkpCisJeworCSAgICBkdW1wZXJzW3RocmVhZC0+bGFzdF9yZXFdLmR1bXBfcmVwbHkoIHZlYy0+aW92X2Jhc2UgKTsKKwkgICAgdmVjKys7CisJICAgIHZlY2xlbi0tOworCX0KKwlmb3IgKDsgdmVjbGVuOyB2ZWNsZW4tLSwgdmVjKyspCisJeworCSAgICB1bnNpZ25lZCBjaGFyICpwdHIgPSB2ZWMtPmlvdl9iYXNlOworCSAgICBpbnQgbGVuID0gdmVjLT5pb3ZfbGVuOworCSAgICB3aGlsZSAobGVuLS0pIHByaW50ZiggIiwgJTAyeCIsICpwdHIrKyApOworCX0KKwlwcmludGYoICIgfSIgKTsKKyAgICB9CisgICAgaWYgKHBhc3NfZmQgIT0gLTEpIHByaW50ZiggIiBmZD0lZFxuIiwgcGFzc19mZCApOworICAgIGVsc2UgcHJpbnRmKCAiXG4iICk7Cit9CmRpZmYgLS1naXQgYS90b29scy9idWlsZC5jIGIvdG9vbHMvYnVpbGQuYwppbmRleCBjMTE5MTM2Li43NmQ4YjdlIDEwMDY0NAotLS0gYS90b29scy9idWlsZC5jCisrKyBiL3Rvb2xzL2J1aWxkLmMKQEAgLTE1MCw2ICsxNTAsNyBAQAogc3RhdGljIGNoYXIgKlNwZWNOYW1lOwogc3RhdGljIEZJTEUgKlNwZWNGcDsKIHN0YXRpYyBXT1JEIENvZGVfU2VsZWN0b3IsIERhdGFfU2VsZWN0b3I7CitzdGF0aWMgY2hhciBETExJbml0RnVuY1s4MF07CiAKIGNoYXIgKlBhcnNlQnVmZmVyID0gTlVMTDsKIGNoYXIgKlBhcnNlTmV4dDsKQEAgLTE2Nyw5ICsxNjgsNiBAQAogICAvKiBPZmZzZXQgb2YgdGhlIHN0YWNrIHBvaW50ZXIgcmVsYXRpdmUgdG8gJWZzOigwKSAqLwogI2RlZmluZSBTVEFDS09GRlNFVCAoU1RSVUNUT0ZGU0VUKFRIREIsY3VyX3N0YWNrKSAtIFNUUlVDVE9GRlNFVChUSERCLHRlYikpCiAKLSAgLyogT2Zmc2V0IG9mIHRoZSBzYXZlZCBmcyByZWxhdGl2ZSB0byAlZnM6KDApICovCi0jZGVmaW5lIEZTT0ZGU0VUIChTVFJVQ1RPRkZTRVQoVEhEQixzYXZlZF9mcykgLSBTVFJVQ1RPRkZTRVQoVEhEQix0ZWIpKQotCiAKIHN0YXRpYyB2b2lkICp4bWFsbG9jIChzaXplX3Qgc2l6ZSkKIHsKQEAgLTcwNSw2ICs3MDMsMTQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIERMTEhlYXBTaXplID0gYXRvaSh0b2tlbik7CiAJfQorICAgICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJpbml0IikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyY3B5KERMTEluaXRGdW5jLCBHZXRUb2tlbigpKTsKKyAgICAgICAgICAgIGlmICghRExMSW5pdEZ1bmNbMF0pCisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczolZDogRXhwZWN0ZWQgZnVuY3Rpb24gbmFtZSBhZnRlciBpbml0XG4iLCBTcGVjTmFtZSwgTGluZSk7CisgICAgICAgICAgICBlbHNlICAKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkluaXRGdW5jIGlzICVzXG4iLCBETExJbml0RnVuYyk7CisgICAgICAgIH0KIAllbHNlIGlmIChJc051bWJlclN0cmluZyh0b2tlbikpCiAJewogCSAgICBpbnQgb3JkaW5hbDsKQEAgLTEwMzcsNiArMTA0MywxMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyogT3V0cHV0IExpYk1haW4gZnVuY3Rpb24gKi8KKyAgICBpZiAoRExMSW5pdEZ1bmNbMF0pIGZwcmludGYoIG91dGZpbGUsICJleHRlcm4gdm9pZCAlcygpO1xuIiwgRExMSW5pdEZ1bmMgKTsKKworCiAgICAgLyogT3V0cHV0IHRoZSBETEwgZnVuY3Rpb25zIHRhYmxlICovCiAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXG5zdGF0aWMgY29uc3QgRU5UUllQT0lOVDMyIEZ1bmN0aW9uc1slZF0gPVxue1xuIiwKQEAgLTExNTEsOCArMTE2MSw5IEBACiAgICAgICAgICAgICAgIiAgICBGdW5jTmFtZXMsXG4iCiAgICAgICAgICAgICAgIiAgICBGdW5jT3JkaW5hbHMsXG4iCiAgICAgICAgICAgICAgIiAgICBGdW5jQXJncyxcbiIKLSAgICAgICAgICAgICAiICAgIEFyZ1R5cGVzXG4iCi0gICAgICAgICAgICAgIn07XG4iICk7CisgICAgICAgICAgICAgIiAgICBBcmdUeXBlcyxcbiIpOworICAgIGZwcmludGYoIG91dGZpbGUsICIgICAgJXNcbiIsIERMTEluaXRGdW5jWzBdID8gRExMSW5pdEZ1bmMgOiAiMCIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAifTtcbiIgKTsgICAgICAgICAgICAgCiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTE0MTAsNyArMTQyMSw3IEBACiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJWVkaSwlZCglJWVieClcbiIsCiAgICAgICAgICAgICAgQ09OVEVYVE9GRlNFVChFZGkpIC0gc2l6ZW9mKENPTlRFWFQpICk7CiAKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsIC0yMCglJWVicCksJSVlYXhcbiIgKTsgLyogR2V0ICVlYnggZnJvbSBzdGFjayovCisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAtMjQoJSVlYnApLCUlZWF4XG4iICk7IC8qIEdldCAlZWJ4IGZyb20gc3RhY2sqLwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJSVlYXgsJWQoJSVlYngpXG4iLAogICAgICAgICAgICAgIENPTlRFWFRPRkZTRVQoRWJ4KSAtIHNpemVvZihDT05URVhUKSApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdnp3bCAtMTAoJSVlYnApLCUlZWF4XG4iICk7IC8qIEdldCAlZHMgZnJvbSBzdGFjayovCkBAIC0xNDIyLDcgKzE0MzMsNyBAQAogICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hmbFxuIiApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcGwgJWQoJSVlYngpXG4iLAogICAgICAgICAgICAgIENPTlRFWFRPRkZTRVQoRUZsYWdzKSAtIHNpemVvZihDT05URVhUKSApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgLTE2KCUlZWJwKSwlJWVheFxuIiApOyAvKiBHZXQgJWVicCBmcm9tIHN0YWNrICovCisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAtMjAoJSVlYnApLCUlZWF4XG4iICk7IC8qIEdldCAlZWJwIGZyb20gc3RhY2sgKi8KICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICUlZWF4LCVkKCUlZWJ4KVxuIiwKICAgICAgICAgICAgICBDT05URVhUT0ZGU0VUKEVicCkgLSBzaXplb2YoQ09OVEVYVCkgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z6d2wgMiglJWVicCksJSVlYXhcbiIgKTsgLyogR2V0ICVpcCBmcm9tIHN0YWNrICovCkBAIC0xNDM0LDcgKzE0NDUsNyBAQAogICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdnp3bCA0KCUlZWJwKSwlJWVheFxuIiApOyAvKiBHZXQgJWNzIGZyb20gc3RhY2sgKi8KICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICUlZWF4LCVkKCUlZWJ4KVxuIiwKICAgICAgICAgICAgICBDT05URVhUT0ZGU0VUKFNlZ0NzKSAtIHNpemVvZihDT05URVhUKSApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgJSVmcywlJWF4XG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92endsIC0xNCglJWVicCksJSVlYXhcbiIgKTsgLyogR2V0ICVmcyBmcm9tIHN0YWNrICovCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJWVheCwlZCglJWVieClcbiIsCiAgICAgICAgICAgICAgQ09OVEVYVE9GRlNFVChTZWdGcykgLSBzaXplb2YoQ09OVEVYVCkgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3ICUlZ3MsJSVheFxuIiApOwpAQCAtMTQ5Miw2ICsxNTAzLDggQEAKICAgICAgICAgICAgICBDT05URVhUT0ZGU0VUKFNlZ0RzKSAtIHNpemVvZihDT05URVhUKSApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsICVkKCUlZWJ4KVxuIiwgIC8qIFB1c2ggbmV3IGVzICovCiAgICAgICAgICAgICAgQ09OVEVYVE9GRlNFVChTZWdFcykgLSBzaXplb2YoQ09OVEVYVCkgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAlZCglJWVieClcbiIsICAvKiBQdXNoIG5ldyBmcyAqLworICAgICAgICAgICAgIENPTlRFWFRPRkZTRVQoU2VnRnMpIC0gc2l6ZW9mKENPTlRFWFQpICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgJWQoJSVlYngpXG4iLAogICAgICAgICAgICAgIENPTlRFWFRPRkZTRVQoRUZsYWdzKSAtIHNpemVvZihDT05URVhUKSApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcGZsXG4iICk7CkBAIC0xNDk5LDYgKzE1MTIsNyBAQAogICAgICAgICAgICAgIENPTlRFWFRPRkZTRVQoRWF4KSAtIHNpemVvZihDT05URVhUKSApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJWQoJSVlYngpLCUlZWJ4XG4iLAogICAgICAgICAgICAgIENPTlRFWFRPRkZTRVQoRWJ4KSAtIHNpemVvZihDT05URVhUKSApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcGwgJSVmc1xuIiApOyAgLyogU2V0IGZzICovCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cG9wbCAlJWVzXG4iICk7ICAvKiBTZXQgZXMgKi8KICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwb3BsICUlZHNcbiIgKTsgIC8qIFNldCBkcyAqLwogfQpAQCAtMTUzOSw4ICsxNTUzLDEwIEBACiAgKiAoc3ApICAgIHdvcmQgICBsb3cgd29yZCBvZiBpcCBvZiAxNi1iaXQgZW50cnkgcG9pbnQKICAqCiAgKiBBZGRlZCBvbiB0aGUgc3RhY2s6Ci0gKiAoc3AtNCkgIGxvbmcgICBlYnAKLSAqIChzcC04KSAgbG9uZyAgIHNhdmVkIHByZXZpb3VzIHN0YWNrCisgKiAoc3AtMikgIHdvcmQgICBzYXZlZCBmcworICogKHNwLTQpICB3b3JkICAgYnVmZmVyIGZvciBXaW4xNk11dGV4IHJlY3Vyc2lvbiBjb3VudAorICogKHNwLTgpICBsb25nICAgZWJwCisgKiAoc3AtMTIpIGxvbmcgICBzYXZlZCBwcmV2aW91cyBzdGFjawogICovCiBzdGF0aWMgdm9pZCBCdWlsZENhbGxGcm9tMTZGdW5jKCBGSUxFICpvdXRmaWxlLCBjaGFyICpwcm9maWxlICkKIHsKQEAgLTE1NzksMTEgKzE1OTUsMTYgQEAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuZ2xvYmwgIiBQUkVGSVggIkNhbGxGcm9tMTZfJXNcbiIsIHByb2ZpbGUgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCBQUkVGSVggIkNhbGxGcm9tMTZfJXM6XG4iLCBwcm9maWxlICk7CiAKKyAgICAvKiBTYXZlIDE2LWJpdCBmcyBhbmQgbGVhdmUgcm9vbSBmb3IgV2luMTZNdXRleCByZWN1cnNpb24gY291bnQgKi8KKworICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2h3ICUlZnNcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNodyAkMFxuIiApOworCiAgICAgLyogU2V0dXAgYnAgdG8gcG9pbnQgdG8gaXRzIGNvcHkgb24gdGhlIHN0YWNrICovCiAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAlJWVicFxuIiApOyAgLyogU2F2ZSB0aGUgZnVsbCAzMi1iaXQgZWJwICovCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92endsICUlc3AsJSVlYnBcbiIgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRhZGR3ICQxNiwlJWJwXG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0YWRkdyAkMjAsJSVicFxuIiApOwogCiAgICAgLyogU2F2ZSAxNi1iaXQgZHMgYW5kIGVzICovCiAKQEAgLTE2MDksOSArMTYzMCw3IEBACiAjZW5kaWYKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3ICUlYngsJSVlc1xuIiApOwogCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92dyAlJWZzLCAlJWJ4XG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92dyAiIFBSRUZJWCAiQ0FMTFRPMTZfQ3VycmVudF9mcywlJWZzXG4iICk7Ci0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmJ5dGUgMHg2NFxuXHRtb3Z3ICUlYngsKCVkKVxuIiwgRlNPRkZTRVQgKTsKIAogICAgIC8qIEdldCB0aGUgMzItYml0IHN0YWNrIHBvaW50ZXIgZnJvbSB0aGUgVEVCICovCiAKQEAgLTE2MzUsMTAgKzE2NTQsMTAgQEAKICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92dyAlJXNzLCUlYXhcbiIgKTsKICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0YW5kbCAkMHhmZmY4LCUlZWF4XG4iICk7CiAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgIiBQUkVGSVggImxkdF9jb3B5KCUlZWF4KSwlJWVheFxuIiApOwotICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICUlZWF4LC0yMCglJWVicClcbiIgKTsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJWVheCwtMjQoJSVlYnApXG4iICk7CiAgICAgICAgIC8qIEFkZCB0aGUgb2Zmc2V0ICovCi0gICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdGxlYWwgLTE2KCUlZWJwKSwlJWVheFxuIiApOwotICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRhZGRsICUlZWF4LC0yMCglJWVicClcbiIgKTsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bGVhbCAtMjAoJSVlYnApLCUlZWF4XG4iICk7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdGFkZGwgJSVlYXgsLTI0KCUlZWJwKVxuIiApOwogICAgIH0KIAogICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgQVBJIGZ1bmN0aW9uICovCkBAIC0xNzMwLDkgKzE3NDksNiBAQAogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5ieXRlIDB4NjRcblx0cG9wbCAoJWQpXG4iLCBTVEFDS09GRlNFVCApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgJSVmcywiIFBSRUZJWCAiQ0FMTFRPMTZfQ3VycmVudF9mc1xuIiApOwogCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmJ5dGUgMHg2NFxuXHRtb3Z3ICglZCksJSVieFxuIiwgRlNPRkZTRVQgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3ICUlYngsICUlZnNcbiIgKTsKLQogICAgIGlmIChyZWdfZnVuYykKICAgICB7CiAgICAgICAgIC8qIENhbGMgdGhlIGFyZ3VtZW50cyBzaXplICovCkBAIC0xNzY1LDggKzE3ODEsMTAgQEAKICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cG9wbCAlJWVicFxuIiApOwogCiAgICAgICAgIC8qIFJlc3RvcmUgZHMgYW5kIGVzICovCi0gICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdGluY2wgJSVlc3BcbiIgKTsgICAgICAvKiBSZW1vdmUgaXAgKi8KKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0aW5jbCAlJWVzcFxuIiApOyAgICAgIC8qIFJlbW92ZSBtdXRleCBjb3VudCAqLwogICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRpbmNsICUlZXNwXG4iICk7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcGwgJSVlZHhcbiIgKTsgICAgICAvKiBSZW1vdmUgaXAgYW5kIGZzICovCisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgJSVkeCwlJWZzXG4iICk7ICAvKiBhbmQgcmVzdG9yZSBmcyAqLwogICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwb3BsICUlZWR4XG4iICk7ICAgICAgLyogUmVtb3ZlIGNzIGFuZCBkcyAqLwogICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3ICUlZHgsJSVkc1xuIiApOyAgLyogYW5kIHJlc3RvcmUgZHMgKi8KICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmJ5dGUgMHg2NlxuXHRwb3BsICUlZXNcbiIgKTsgICAgLyogUmVzdG9yZSBlcyAqLwpAQCAtMTg1OCwzMyArMTg3NiwxOCBAQAogICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsICUlZWJwXG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJWVzcCwlJWVicFxuIiApOwogCi0gICAgLyogQ2FsbCB0aGUgYWN0dWFsIENhbGxUbzE2IHJvdXRpbmUgKHNpbXVsYXRlIGEgbGNhbGwpICovCi0KLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAlJWNzXG4iICk7Ci0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0Y2FsbCBkb19jYWxsdG8xNl8lc1xuIiwgcHJvZmlsZSApOwotCi0gICAgLyogRXhpdCBjb2RlICovCi0KLSAgICAvKiBGSVhNRTogdGhpcyBpcyBhIGhhY2sgYmVjYXVzZSBvZiB0YXNrLmMgKi8KLSAgICBpZiAoIXN0cmNtcCggcHJvZmlsZSwgIndvcmRfIiApKQotICAgIHsKLSAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIi5nbG9ibCAiIFBSRUZJWCAiQ0FMTFRPMTZfUmVzdG9yZVxuIiApOwotICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCBQUkVGSVggIkNBTExUTzE2X1Jlc3RvcmU6XG4iICk7Ci0gICAgfQotICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcGwgJSVlYnBcbiIgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRyZXQgJCVkXG4iLCA0ICogc3RybGVuKGFyZ3MpICsgNCApOwotCi0gICAgLyogU3RhcnQgb2YgdGhlIGFjdHVhbCBDYWxsVG8xNiByb3V0aW5lICovCi0KICAgICAvKiBTYXZlIHRoZSAzMi1iaXQgcmVnaXN0ZXJzICovCiAKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiZG9fY2FsbHRvMTZfJXM6XG4iLCBwcm9maWxlICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgJSVlYnhcbiIgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAlJWVjeFxuIiApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsICUlZWR4XG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgJSVlc2lcbiIgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAlJWVkaVxuIiApOwogCisgICAgLyogRW50ZXIgV2luMTYgTXV0ZXggKi8KKworICAgIGZwcmludGYoIG91dGZpbGUsICJcdGNhbGwgIiBQUkVGSVggIlNZU0xFVkVMX0VudGVyV2luMTZMb2NrXG4iICk7CisKICAgICAvKiBQcmludCBkZWJ1Z2dpbmcgaW5mbyAqLwogCiAgICAgaWYgKGRlYnVnZ2luZykKQEAgLTE4OTgsNiArMTkwMSw1MyBAQAogICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwb3BsICUlZWF4XG4iICk7CiAgICAgfQogCisgICAgLyogQ2FsbCB0aGUgYWN0dWFsIENhbGxUbzE2IHJvdXRpbmUgKHNpbXVsYXRlIGEgbGNhbGwpICovCisKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAlJWNzXG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0Y2FsbCBkb19jYWxsdG8xNl8lc1xuIiwgcHJvZmlsZSApOworCisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgJSVlYXhcbiIgKTsKKworICAgIC8qIFByaW50IGRlYnVnZ2luZyBpbmZvICovCisKKyAgICBpZiAoZGVidWdnaW5nKQorICAgIHsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgJSVlYXhcbiIgKTsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0Y2FsbCAiIFBSRUZJWCAiUkVMQVlfRGVidWdDYWxsVG8xNlJldFxuIiApOworICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwb3BsICUlZWF4XG4iICk7CisgICAgfQorCisgICAgLyogTGVhdmUgV2luMTYgTXV0ZXggKi8KKworICAgIGZwcmludGYoIG91dGZpbGUsICJcdGNhbGwgIiBQUkVGSVggIlNZU0xFVkVMX0xlYXZlV2luMTZMb2NrXG4iICk7CisKKyAgICAvKiBSZXN0b3JlIHRoZSAzMi1iaXQgcmVnaXN0ZXJzICovCisKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwb3BsICUlZWF4XG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cG9wbCAlJWVkaVxuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcGwgJSVlc2lcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwb3BsICUlZWR4XG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cG9wbCAlJWVjeFxuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcGwgJSVlYnhcbiIgKTsKKworICAgIC8qIEV4aXQgY29kZSAqLworCisjaWYgMAorICAgIC8qIEZJWE1FOiB0aGlzIGlzIGEgaGFjayBiZWNhdXNlIG9mIHRhc2suYyAqLworICAgIGlmICghc3RyY21wKCBwcm9maWxlLCAid29yZF8iICkpCisgICAgeworICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiLmdsb2JsICIgUFJFRklYICJDQUxMVE8xNl9SZXN0b3JlXG4iICk7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsIFBSRUZJWCAiQ0FMTFRPMTZfUmVzdG9yZTpcbiIgKTsKKyAgICB9CisjZW5kaWYKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwb3BsICUlZWJwXG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cmV0ICQlZFxuIiwgNCAqIHN0cmxlbihhcmdzKSArIDQgKTsKKworCisgICAgLyogU3RhcnQgb2YgdGhlIGFjdHVhbCBDYWxsVG8xNiByb3V0aW5lICovCisKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiZG9fY2FsbHRvMTZfJXM6XG4iLCBwcm9maWxlICk7CisKICAgICAvKiBTYXZlIHRoZSAzMi1iaXQgc3RhY2sgYW5kICVmcyAqLwogCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmJ5dGUgMHg2NFxuXHRwdXNobCAoJWQpXG4iLCBTVEFDS09GRlNFVCApOwpAQCAtMTkxOCwxNCArMTk2OCwxMyBAQAogICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICUlZWF4LCUlZXNwXG4iICk7CiAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5ieXRlIDB4NjRcblx0bW92bCAlJWVkeCwoJWQpXG4iLCBTVEFDS09GRlNFVCApOwogCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmJ5dGUgMHg2NFxuXHRtb3Z3ICglZCksJSVjeFxuIiwgRlNPRkZTRVQgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3ICUlY3gsICUlZnNcbiIgKTsKLQogICAgICAgICAvKiBHZXQgdGhlIHJlZ2lzdGVycy4gZWJ4IGlzIGhhbmRsZWQgbGF0ZXIgb24uICovCiAKICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCA4KCUlZWJ4KSwlJWVieFxuIiApOwogICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICVkKCUlZWJ4KSwlJWVheFxuIiwgQ09OVEVYVE9GRlNFVChTZWdFcykgKTsKICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92dyAlJWF4LCUlZXNcbiIgKTsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlZCglJWVieCksJSVlYXhcbiIsIENPTlRFWFRPRkZTRVQoU2VnRnMpICk7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgJSVheCwlJWZzXG4iICk7CiAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJWQoJSVlYngpLCUlZWJwXG4iLCBDT05URVhUT0ZGU0VUKEVicCkgKTsKICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlZCglJWVieCksJSVlYXhcbiIsIENPTlRFWFRPRkZTRVQoRWF4KSApOwogICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICVkKCUlZWJ4KSwlJWVjeFxuIiwgQ09OVEVYVE9GRlNFVChFY3gpICk7CkBAIC0xOTcxLDkgKzIwMjAsNiBAQAogICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuYnl0ZSAweDY0XG5cdG1vdncgKCVkKSwlJXNwXG4iLCBTVEFDS09GRlNFVCApOwogICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuYnl0ZSAweDY0XG5cdG1vdmwgJSVlZHgsKCVkKVxuIiwgU1RBQ0tPRkZTRVQgKTsKIAotICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5ieXRlIDB4NjRcblx0bW92dyAoJWQpLCUlY3hcbiIsIEZTT0ZGU0VUICk7Ci0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92dyAlJWN4LCAlJWZzXG4iICk7Ci0KICAgICAgICAgLyogTWFrZSAlYnAgcG9pbnQgdG8gdGhlIHByZXZpb3VzIHN0YWNrZnJhbWUgKGJ1aWx0IGJ5IENhbGxGcm9tMTYpICovCiAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdnp3bCAlJXNwLCUlZWJwXG4iICk7CiAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdGxlYWwgJWQoJSVlYnApLCUlZWJwXG4iLApAQCAtMjAwNyw2ICsyMDUzLDExIEBACiAKICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgOCglJWVieClcbiIgKTsKIAorICAgICAgICAvKiBTZXQgJWZzIHRvIHRoZSB2YWx1ZSBzYXZlZCBieSB0aGUgbGFzdCBDYWxsRnJvbTE2ICovCisKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92dyAtMTQoJSVlYnApLCUlYXhcbiIgKTsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92dyAlJWF4LCUlZnNcbiIgKTsKKwogICAgICAgICAvKiBTZXQgJWRzIGFuZCAlZXMgKGFuZCAlYXgganVzdCBpbiBjYXNlKSBlcXVhbCB0byAlc3MgKi8KIAogICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3ICUlc3MsJSVheFxuIiApOwpAQCAtMjA1NSw5ICsyMTA2LDcgQEAKICNlbmRpZgogICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgJSVieCwlJWVzXG4iICk7CiAKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3ICUlZnMsICUlY3hcbiIgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3ICIgUFJFRklYICJDQUxMVE8xNl9DdXJyZW50X2ZzLCUlZnNcbiIgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuYnl0ZSAweDY0XG5cdG1vdncgJSVjeCwoJWQpXG4iLCBGU09GRlNFVCApOwogCiAgICAgLyogUmVzdG9yZSB0aGUgMzItYml0IHN0YWNrICovCiAKQEAgLTIwNjgsMTQgKzIxMTcsNiBAQAogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5ieXRlIDB4NjRcblx0bW92bCAoJWQpLCUlZXNwXG4iLCBTVEFDS09GRlNFVCApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5ieXRlIDB4NjRcblx0cG9wbCAoJWQpXG4iLCBTVEFDS09GRlNFVCApOwogCi0gICAgLyogUmVzdG9yZSB0aGUgMzItYml0IHJlZ2lzdGVycyAqLwotCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cG9wbCAlJWVkaVxuIiApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcGwgJSVlc2lcbiIgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwb3BsICUlZWR4XG4iICk7Ci0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cG9wbCAlJWVjeFxuIiApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcGwgJSVlYnhcbiIgKTsKLQogICAgIC8qIFJldHVybiB0byBjYWxsZXIgKi8KIAogICAgIGZwcmludGYoIG91dGZpbGUsICJcdGxyZXRcbiIgKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL21ha2VfcmVxdWVzdHMgYi90b29scy9tYWtlX3JlcXVlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFjYmE1ODAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9tYWtlX3JlcXVlc3RzCkBAIC0wLDAgKzEsMjQ0IEBACisjISAvdXNyL2Jpbi9wZXJsCisjCisjIEJ1aWxkIHRoZSBzZXJ2ZXIvdHJhY2UuYyBhbmQgaW5jbHVkZS9zZXJ2ZXIvcmVxdWVzdC5oIGZpbGVzCisjIGZyb20gdGhlIGNvbnRlbnRzIG9mIGluY2x1ZGUvc2VydmVyLmguCisjCisjIENvcHlyaWdodCAoQykgMTk5OCBBbGV4YW5kcmUgSnVsbGlhcmQKKyMKKworJWZvcm1hdHMgPQorKAorICAgICJpbnQiICAgICAgICAgID0+ICIlZCIsCisgICAgInVuc2lnbmVkIGludCIgPT4gIiUwOHgiLAorICAgICJ2b2lkKiIgICAgICAgID0+ICIlcCIKKyk7CisKK215IEByZXF1ZXN0cyA9ICgpOworbXkgJXJlcGxpZXMgPSAoKTsKKworb3BlbihTRVJWRVIsImluY2x1ZGUvc2VydmVyLmgiKSBvciBkaWUgIkNhbid0IG9wZW4gaW5jbHVkZS9zZXJ2ZXIuaCI7CitvcGVuKFRSQUNFLCI+c2VydmVyL3RyYWNlLmMiKSBvciBkaWUgIkNhbid0IGNyZWF0ZSBzZXJ2ZXIvdHJhY2UuYyI7CitvcGVuKFJFUVVFU1RTLCI+aW5jbHVkZS9zZXJ2ZXIvcmVxdWVzdC5oIikgb3IgZGllICJDYW4ndCBjcmVhdGUgaW5jbHVkZS9zZXJ2ZXIvcmVxdWVzdC5oIjsKKworIyMjIEdlbmVyYXRlIHRoZSBoZWFkZXIKKworcHJpbnQgVFJBQ0UgPDxFT0Y7CisvKiBGaWxlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICQwOyBETyBOT1QgRURJVCEhICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlICJzZXJ2ZXIuaCIKKyNpbmNsdWRlICJzZXJ2ZXIvdGhyZWFkLmgiCitFT0YKKworIyMjIFBhcnNlIHNlcnZlci5oIHRvIGZpbmQgcmVxdWVzdC9yZXBseSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMKKword2hpbGUgKDxTRVJWRVI+KQoreworICAgIGlmICgvXnN0cnVjdCArKFx3KylfcmVxdWVzdC8pIHsgJkRPX1JFUVVFU1QoJDEpOyB9CisgICAgaWYgKC9ec3RydWN0ICsoXHcrKV9yZXBseS8pICAgeyAmRE9fUkVQTFkoJDEpOyB9Cit9CisKKyMjIyBPdXRwdXQgdGhlIGR1bXBpbmcgZnVuY3Rpb24gdGFibGVzCisKK3ByaW50IFRSQUNFPDxFT0Y7CisKK3N0cnVjdCBkdW1wZXIKK3sKKyAgICB2b2lkICgqZHVtcF9yZXEpKCk7CisgICAgdm9pZCAoKmR1bXBfcmVwbHkpKCk7CisgICAgdW5zaWduZWQgaW50IHNpemU7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGR1bXBlciBkdW1wZXJzW1JFUV9OQl9SRVFVRVNUU10gPQoreworRU9GCisKK2ZvcmVhY2ggJHJlcSAoQHJlcXVlc3RzKQoreworICAgICRyZXF1ZXN0ID0gJHJlcSAuICJfcmVxdWVzdCI7CisgICAgJHJlcGx5ID0gJHJlcGxpZXN7JHJlcX0gPyAiZHVtcF8ke3JlcX1fcmVwbHkiIDogIjAiOworICAgIHByaW50IFRSQUNFICIgICAgeyAodm9pZCgqKSgpKWR1bXBfJHJlcXVlc3QsXG4iOworICAgIHByaW50IFRSQUNFICIgICAgICAodm9pZCgqKSgpKSRyZXBseSxcbiI7CisgICAgcHJpbnQgVFJBQ0UgIiAgICAgIHNpemVvZihzdHJ1Y3QgJHJlcXVlc3QpIH0sXG4iOworfQorCitwcmludCBUUkFDRSA8PEVPRjsKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcmVxX25hbWVzW1JFUV9OQl9SRVFVRVNUU10gPQoreworRU9GCitmb3JlYWNoICRyZXEgKEByZXF1ZXN0cykKK3sKKyAgICBwcmludCBUUkFDRSAiICAgIFwiJHJlcVwiLFxuIjsKK30KKworIyMjIE91dHB1dCB0aGUgdHJhY2luZyBmdW5jdGlvbnMKKworcHJpbnQgVFJBQ0UgPDxFT0Y7Cit9OworCit2b2lkIHRyYWNlX3JlcXVlc3QoIGVudW0gcmVxdWVzdCByZXEsIHZvaWQgKmRhdGEsIGludCBsZW4sIGludCBmZCApCit7CisgICAgY3VycmVudC0+bGFzdF9yZXEgPSByZXE7CisgICAgcHJpbnRmKCAiJTA4eDogJXMoIiwgKHVuc2lnbmVkIGludCljdXJyZW50LCByZXFfbmFtZXNbcmVxXSApOworICAgIGR1bXBlcnNbcmVxXS5kdW1wX3JlcSggZGF0YSApOworICAgIGlmIChsZW4gPiBkdW1wZXJzW3JlcV0uc2l6ZSkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyICopZGF0YSArIGR1bXBlcnNbcmVxXS5zaXplOworCWxlbiAtPSBkdW1wZXJzW3JlcV0uc2l6ZTsKKyAgICAgICAgd2hpbGUgKGxlbi0tKSBwcmludGYoICIsICUwMngiLCAqcHRyKysgKTsKKyAgICB9CisgICAgaWYgKGZkICE9IC0xKSBwcmludGYoICIgKSBmZD0lZFxcbiIsIGZkICk7CisgICAgZWxzZSBwcmludGYoICIgKVxcbiIgKTsKK30KKwordm9pZCB0cmFjZV90aW1lb3V0KHZvaWQpCit7CisgICAgcHJpbnRmKCAiJTA4eDogKnRpbWVvdXQqXFxuIiwgKHVuc2lnbmVkIGludCljdXJyZW50ICk7Cit9CisKK3ZvaWQgdHJhY2Vfa2lsbCggaW50IGV4aXRfY29kZSApCit7CisgICAgcHJpbnRmKCAiJTA4eDogKmtpbGxlZCogZXhpdF9jb2RlPSVkXFxuIiwKKyAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpY3VycmVudCwgZXhpdF9jb2RlICk7Cit9CisKK3ZvaWQgdHJhY2VfcmVwbHkoIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgaW50IHR5cGUsIGludCBwYXNzX2ZkLAorICAgICAgICAgICAgICAgICAgc3RydWN0IGlvdmVjICp2ZWMsIGludCB2ZWNsZW4gKQoreworICAgIGlmICghdGhyZWFkKSByZXR1cm47CisgICAgcHJpbnRmKCAiJTA4eDogJXMoKSA9ICVkIiwKKyAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpdGhyZWFkLCByZXFfbmFtZXNbdGhyZWFkLT5sYXN0X3JlcV0sIHR5cGUgKTsKKyAgICBpZiAodmVjbGVuKQorICAgIHsKKwlwcmludGYoICIgeyIgKTsKKwlpZiAoZHVtcGVyc1t0aHJlYWQtPmxhc3RfcmVxXS5kdW1wX3JlcGx5KQorCXsKKwkgICAgZHVtcGVyc1t0aHJlYWQtPmxhc3RfcmVxXS5kdW1wX3JlcGx5KCB2ZWMtPmlvdl9iYXNlICk7CisJICAgIHZlYysrOworCSAgICB2ZWNsZW4tLTsKKwl9CisJZm9yICg7IHZlY2xlbjsgdmVjbGVuLS0sIHZlYysrKQorCXsKKwkgICAgdW5zaWduZWQgY2hhciAqcHRyID0gdmVjLT5pb3ZfYmFzZTsKKwkgICAgaW50IGxlbiA9IHZlYy0+aW92X2xlbjsKKwkgICAgd2hpbGUgKGxlbi0tKSBwcmludGYoICIsICUwMngiLCAqcHRyKysgKTsKKwl9CisJcHJpbnRmKCAiIH0iICk7CisgICAgfQorICAgIGlmIChwYXNzX2ZkICE9IC0xKSBwcmludGYoICIgZmQ9JWRcXG4iLCBwYXNzX2ZkICk7CisgICAgZWxzZSBwcmludGYoICJcXG4iICk7Cit9CitFT0YKKworIyMjIE91dHB1dCB0aGUgcmVxdWVzdHMgbGlzdAorCitwcmludCBSRVFVRVNUUyA8PEVPRjsKKy8qIEZpbGUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgJDA7IERPIE5PVCBFRElUISEgKi8KKworI2lmbmRlZiBfX1dJTkVfU0VSVkVSX1JFUVVFU1RfSAorI2RlZmluZSBfX1dJTkVfU0VSVkVSX1JFUVVFU1RfSAorCitlbnVtIHJlcXVlc3QKK3sKK0VPRgorCitmb3JlYWNoICRyZXEgKEByZXF1ZXN0cykKK3sKKyAgICBwcmludCBSRVFVRVNUUyAiICAgIFJFUV9cVSRyZXEsXG4iOworfQorCitwcmludCBSRVFVRVNUUyA8PEVPRjsKKyAgICBSRVFfTkJfUkVRVUVTVFMKK307CisKKyNpZmRlZiBXQU5UX1JFUVVFU1RfSEFORExFUlMKKworI2RlZmluZSBERUNMX0hBTkRMRVIobmFtZSkgXFwKKyAgICBzdGF0aWMgdm9pZCByZXFfIyNuYW1lKCBzdHJ1Y3QgbmFtZSMjX3JlcXVlc3QgKnJlcSwgdm9pZCAqZGF0YSwgaW50IGxlbiwgaW50IGZkICkKKworRU9GCisKK2ZvcmVhY2ggJHJlcSAoQHJlcXVlc3RzKSB7IHByaW50IFJFUVVFU1RTICJERUNMX0hBTkRMRVIoJHJlcSk7XG4iOyB9CisKK3ByaW50IFJFUVVFU1RTIDw8RU9GOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhhbmRsZXIgeworICAgIHZvaWQgICAgICAgKCpoYW5kbGVyKSgpOworICAgIHVuc2lnbmVkIGludCBtaW5fc2l6ZTsKK30gcmVxX2hhbmRsZXJzW1JFUV9OQl9SRVFVRVNUU10gPSB7CitFT0YKKworZm9yZWFjaCAkcmVxIChAcmVxdWVzdHMpCit7CisgICAgcHJpbnQgUkVRVUVTVFMgIiAgICB7ICh2b2lkKCopKCkpcmVxXyRyZXEsIHNpemVvZihzdHJ1Y3QgJHtyZXF9X3JlcXVlc3QpIH0sXG4iOworfQorCitwcmludCBSRVFVRVNUUyA8PEVPRjsKK307CisjZW5kaWYgIC8qIFdBTlRfUkVRVUVTVF9IQU5ETEVSUyAqLworCisjZW5kaWYgIC8qIF9fV0lORV9TRVJWRVJfUkVRVUVTVF9IICovCitFT0YKKworIyMjIEhhbmRsZSBhIHJlcXVlc3Qgc3RydWN0dXJlIGRlZmluaXRpb24KKworc3ViIERPX1JFUVVFU1QKK3sKKyAgICBteSAkbmFtZSA9IHNoaWZ0OworICAgIG15IEBzdHJ1Y3QgPSAoKTsKKyAgICB3aGlsZSAoPFNFUlZFUj4pCisgICAgeworCWxhc3QgaWYgL159OyQvOworICAgICAgICBuZXh0IGlmIC9eeyQvOworCXMhL1wqLipcKi8hIWc7CisJLyAqKFx3K1wqKiggK1x3K1wqKikqKSArKFx3Kyk7LyBvciBkaWUgIlVucmVjb2duaXplZCBzeW50YXggJF8iOworCW15ICR0eXBlID0gJDE7CisJbXkgJHZhciA9ICQzOworICAgICAgICBkaWUgIlVucmVjb2duaXplZCB0eXBlICR0eXBlIiB1bmxlc3MgZGVmaW5lZCgkZm9ybWF0c3skdHlwZX0pOworCXB1c2ggQHN0cnVjdCwgJHR5cGUsICR2YXI7CisgICAgfQorICAgIHB1c2ggQHJlcXVlc3RzLCAkbmFtZTsKKyAgICAmRE9fRFVNUF9GVU5DKCAkbmFtZSAuICJfcmVxdWVzdCIsQHN0cnVjdCk7Cit9CisKKyMjIyBIYW5kbGUgYSByZXBseSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorCitzdWIgRE9fUkVQTFkKK3sKKyAgICBteSAkbmFtZSA9IHNoaWZ0OworICAgIG15IEBzdHJ1Y3QgPSAoKTsKKyAgICB3aGlsZSAoPFNFUlZFUj4pCisgICAgeworCWxhc3QgaWYgL159OyQvOworICAgICAgICBuZXh0IGlmIC9eeyQvOworCXMhL1wqLipcKi8hIWc7CisJLyAqKFx3K1wqKiggK1x3K1wqKikqKSArKFx3Kyk7LyBvciBkaWUgIlVucmVjb2duaXplZCBzeW50YXggJF8iOworCW15ICR0eXBlID0gJDE7CisJbXkgJHZhciA9ICQzOworICAgICAgICBkaWUgIlVucmVjb2duaXplZCB0eXBlICR0eXBlIiB1bmxlc3MgZGVmaW5lZCgkZm9ybWF0c3skdHlwZX0pOworCXB1c2ggQHN0cnVjdCwgJHR5cGUsICR2YXI7CisgICAgfQorICAgICRyZXBsaWVzeyRuYW1lfSA9IDE7CisgICAgJkRPX0RVTVBfRlVOQyggJG5hbWUgLiAiX3JlcGx5IiAsQHN0cnVjdCk7Cit9CisKKyMjIyBHZW5lcmF0ZSBhIGR1bXBpbmcgZnVuY3Rpb24KKworc3ViIERPX0RVTVBfRlVOQworeworICAgIG15ICRuYW1lID0gc2hpZnQ7CisgICAgcHJpbnQgVFJBQ0UgIlxuc3RhdGljIHZvaWQgZHVtcF8kbmFtZSggc3RydWN0ICRuYW1lICpyZXEgKVxue1xuIjsKKyAgICB3aGlsZSAoJCNfID49IDApCisgICAgeworCW15ICR0eXBlID0gc2hpZnQ7CisJbXkgJHZhciA9IHNoaWZ0OworCXByaW50IFRSQUNFICIgICAgcHJpbnRmKCBcIiAkdmFyPSRmb3JtYXRzeyR0eXBlfSI7CisJcHJpbnQgVFJBQ0UgIiwiIGlmICgkI18gPiAwKTsKKwlwcmludCBUUkFDRSAiXCIsIHJlcS0+JHZhciApO1xuIjsKKwkkc2l6ZSAuPSAiK3NpemVvZigkdHlwZSkiOworICAgIH0KKyAgICBwcmludCBUUkFDRSAifVxuIjsKK30KZGlmZiAtLWdpdCBhL3dpbjMyL2NvbnNvbGUuYyBiL3dpbjMyL2NvbnNvbGUuYwppbmRleCA2YmFiNDZkLi4wYzI0ZmY2IDEwMDY0NAotLS0gYS93aW4zMi9jb25zb2xlLmMKKysrIGIvd2luMzIvY29uc29sZS5jCkBAIC0zODMsNyArMzgzLDcgQEAKIAlTWVNURU1fTE9DSygpOwogCWlmIChwZGItPmNvbnNvbGUgIT0gTlVMTCkgewogCQlDT05TT0xFICpjb25zb2xlID0gKENPTlNPTEUgKilwZGItPmNvbnNvbGU7Ci0JCWhhbmRsZSA9IChIRklMRTMyKUhBTkRMRV9BbGxvYyhwZGIsICZjb25zb2xlLT5oZWFkZXIsIDAsIFRSVUUpOworCQloYW5kbGUgPSAoSEZJTEUzMilIQU5ETEVfQWxsb2MocGRiLCAmY29uc29sZS0+aGVhZGVyLCAwLCBUUlVFLCAtMSk7CiAJfQogCVNZU1RFTV9VTkxPQ0soKTsKIAlyZXR1cm4gaGFuZGxlOwpAQCAtNDQwLDE0ICs0NDAsMTQgQEAKIAljb25zb2xlLT5zbGF2ZSA9IHNsYXZlOwogCWNvbnNvbGUtPnBpZCA9IHBpZDsKIAotCWlmICgoaEluID0gSEFORExFX0FsbG9jKHBkYiwmY29uc29sZS0+aGVhZGVyLCAwLCBUUlVFKSkgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMikKKwlpZiAoKGhJbiA9IEhBTkRMRV9BbGxvYyhwZGIsJmNvbnNvbGUtPmhlYWRlciwgMCwgVFJVRSwtMSkpID09IElOVkFMSURfSEFORExFX1ZBTFVFMzIpCiAgICAgICAgIHsKICAgICAgICAgICAgIEszMk9CSl9EZWNDb3VudCgmY29uc29sZS0+aGVhZGVyKTsKICAgICAgICAgICAgIFNZU1RFTV9VTkxPQ0soKTsKICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAl9CiAKLQlpZiAoKGhPdXQgPSBIQU5ETEVfQWxsb2MocGRiLCZjb25zb2xlLT5oZWFkZXIsIDAsIFRSVUUpKSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRTMyKQorCWlmICgoaE91dCA9IEhBTkRMRV9BbGxvYyhwZGIsJmNvbnNvbGUtPmhlYWRlciwgMCwgVFJVRSwtMSkpID09IElOVkFMSURfSEFORExFX1ZBTFVFMzIpCiAgICAgICAgIHsKICAgICAgICAgICAgIENsb3NlSGFuZGxlKGhJbik7CiAgICAgICAgICAgICBLMzJPQkpfRGVjQ291bnQoJmNvbnNvbGUtPmhlYWRlcik7CkBAIC00NTYsNyArNDU2LDcgQEAKIAl9CiAKIAotCWlmICgoaEVyciA9IEhBTkRMRV9BbGxvYyhwZGIsJmNvbnNvbGUtPmhlYWRlciwgMCwgVFJVRSkpID09IElOVkFMSURfSEFORExFX1ZBTFVFMzIpCisJaWYgKChoRXJyID0gSEFORExFX0FsbG9jKHBkYiwmY29uc29sZS0+aGVhZGVyLCAwLCBUUlVFLC0xKSkgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMikKICAgICAgICAgewogICAgICAgICAgICAgQ2xvc2VIYW5kbGUoaEluKTsKICAgICAgICAgICAgIENsb3NlSGFuZGxlKGhPdXQpOwpkaWZmIC0tZ2l0IGEvd2luMzIvZGV2aWNlLmMgYi93aW4zMi9kZXZpY2UuYwppbmRleCAwNTJlNDcyLi43NTc0YmI1IDEwMDY0NAotLS0gYS93aW4zMi9kZXZpY2UuYworKysgYi93aW4zMi9kZXZpY2UuYwpAQCAtNTksNyArNTksNyBAQAogCiAJaGFuZGxlID0gSEFORExFX0FsbG9jKCBQUk9DRVNTX0N1cnJlbnQoKSwgJihkZXYtPmhlYWRlciksCiAJCQkgICAgICAgRklMRV9BTExfQUNDRVNTIHwgR0VORVJJQ19SRUFEIHwKLQkJCSAgICAgICBHRU5FUklDX1dSSVRFIHwgR0VORVJJQ19FWEVDVVRFIC8qRklYTUUqLywgVFJVRSApOworCQkJICAgICAgIEdFTkVSSUNfV1JJVEUgfCBHRU5FUklDX0VYRUNVVEUgLypGSVhNRSovLCBUUlVFLCAtMSApOwogCS8qIElmIHRoZSBhbGxvY2F0aW9uIGZhaWxlZCwgdGhlIG9iamVjdCBpcyBhbHJlYWR5IGRlc3Ryb3llZCAqLwogCWlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMikgZGV2ID0gTlVMTDsKIAlyZXR1cm4gaGFuZGxlOwpAQCAtODYsNyArODYsNyBAQAogCQkJICAgICAgTFBPVkVSTEFQUEVEIGxwT3ZlcmxhcHBlZCkKIHsKIAlERVZJQ0VfT0JKRUNUCSpkZXYgPSAoREVWSUNFX09CSkVDVCAqKUhBTkRMRV9HZXRPYmpQdHIoCi0JCVBST0NFU1NfQ3VycmVudCgpLCBoRGV2aWNlLCBLMzJPQkpfREVWSUNFX0lPQ1RMLCAwIC8qRklYTUUqLyApOworCQlQUk9DRVNTX0N1cnJlbnQoKSwgaERldmljZSwgSzMyT0JKX0RFVklDRV9JT0NUTCwgMCAvKkZJWE1FKi8sIE5VTEwgKTsKIAogICAgICAgICBGSVhNRSh3aW4zMiwgIiglbGQsJWxkLCVwLCVsZCwlcCwlbGQsJXAsJXApLCBzdHViXG4iLAogCQloRGV2aWNlLGR3SW9Db250cm9sQ29kZSxscHZsbkJ1ZmZlcixjYmxuQnVmZmVyLApkaWZmIC0tZ2l0IGEvd2luMzIvZmlsZS5jIGIvd2luMzIvZmlsZS5jCmluZGV4IDNkMjQ2NDAuLmZkMWRlMTggMTAwNjQ0Ci0tLSBhL3dpbjMyL2ZpbGUuYworKysgYi93aW4zMi9maWxlLmMKQEAgLTQxLDcgKzQxLDcgQEAKIAkJICAgICBudW1iZXJPZkJ5dGVzVG9Xcml0ZSk7CiAJCiAJaWYgKCEoaW9wdHIgPSBIQU5ETEVfR2V0T2JqUHRyKCBQUk9DRVNTX0N1cnJlbnQoKSwgaEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzMyT0JKX1VOS05PV04sIDAgKSkpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEszMk9CSl9VTktOT1dOLCAwLCBOVUxMICkpKSAKIAkJcmV0dXJuIEhGSUxFX0VSUk9SMzI7CiAgICAgICAgIGlmIChLMzJPQkpfT1BTKGlvcHRyKS0+d3JpdGUpCiAgICAgICAgICAgICBzdGF0dXMgPSBLMzJPQkpfT1BTKGlvcHRyKS0+d3JpdGUoaW9wdHIsIGxwQnVmZmVyLCBudW1iZXJPZkJ5dGVzVG9Xcml0ZSwgCkBAIC02Myw3ICs2Myw3IEBACiAJCSAgICAgbnVtYmVyT2ZCeXRlc1RvUmVhZCk7CiAJCiAJaWYgKCEoaW9wdHIgPSBIQU5ETEVfR2V0T2JqUHRyKCBQUk9DRVNTX0N1cnJlbnQoKSwgaEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSzMyT0JKX1VOS05PV04sIDAgKSkpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEszMk9CSl9VTktOT1dOLCAwLCBOVUxMICkpKSAKIAkJcmV0dXJuIEhGSUxFX0VSUk9SMzI7CiAgICAgICAgIGlmIChLMzJPQkpfT1BTKGlvcHRyKS0+cmVhZCkKICAgICAgICAgICAgIHN0YXR1cyA9IEszMk9CSl9PUFMoaW9wdHIpLT5yZWFkKGlvcHRyLCBscEJ1ZmZlciwgbnVtYmVyT2ZCeXRlc1RvUmVhZCwgCkBAIC03OCw3ICs3OCw3IEBACiAgKi8KIHR5cGVkZWYKIFZPSUQKLShXSU5BUEkgKkxQT1ZFUkxBUFBFRF9DT01QTEVUSU9OX1JPVVRJTkUpKAorKENBTExCQUNLICpMUE9WRVJMQVBQRURfQ09NUExFVElPTl9ST1VUSU5FKSgKICAgICBEV09SRCBkd0Vycm9yQ29kZSwKICAgICBEV09SRCBkd051bWJlck9mQnl0ZXNUcmFuc2ZlcmVkLAogICAgIExQT1ZFUkxBUFBFRCBscE92ZXJsYXBwZWQKZGlmZiAtLWdpdCBhL3dpbjMyL2luaXQuYyBiL3dpbjMyL2luaXQuYwppbmRleCA2YTY0NmNiLi4wMjI0OTU0IDEwMDY0NAotLS0gYS93aW4zMi9pbml0LmMKKysrIGIvd2luMzIvaW5pdC5jCkBAIC0yNiw2ICsyNiw3IEBACiAKICAgICBscFN0YXJ0dXBJbmZvLT5jYlJlc2VydmVkMiA9IDA7CiAgICAgbHBTdGFydHVwSW5mby0+bHBSZXNlcnZlZDIgPSBOVUxMOyAvKiBtdXN0IGJlIE5VTEwgZm9yIFZDIHJ1bnRpbWUgKi8KKyAgICBscFN0YXJ0dXBJbmZvLT5kd0ZsYWdzICAgID0gU1RBUlRGX1VTRVNUREhBTkRMRVM7CiAgICAgbHBTdGFydHVwSW5mby0+aFN0ZElucHV0ICA9IChIQU5ETEUzMikwOwogICAgIGxwU3RhcnR1cEluZm8tPmhTdGRPdXRwdXQgPSAoSEFORExFMzIpMTsKICAgICBscFN0YXJ0dXBJbmZvLT5oU3RkRXJyb3IgID0gKEhBTkRMRTMyKTI7CmRpZmYgLS1naXQgYS93aW4zMi9rZXJuZWwzMi5jIGIvd2luMzIva2VybmVsMzIuYwppbmRleCAxMmU2OWI0Li4wOGVjYTE1IDEwMDY0NAotLS0gYS93aW4zMi9rZXJuZWwzMi5jCisrKyBiL3dpbjMyL2tlcm5lbDMyLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgImZsYXR0aHVuay5oIgorI2luY2x1ZGUgInN5c2xldmVsLmgiCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMDQ5LDcgKzEwNTAsNyBAQAogICovCiBWT0lEIFdJTkFQSSBfS0VSTkVMXzQ3NShDT05URVhUICpjb250ZXh0KSAKIHsKLSAgICBHRVRfRlMoIFRIUkVBRF9DdXJyZW50KCktPnNhdmVkX2ZzICk7CisgICAgR0VUX0ZTKCBGU19yZWcoY29udGV4dCkgKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTExNjUsNiArMTE2Niw4IEBACiAgICAgICBUUkFDRSh0aHVuaywgImFmdGVyICBTWVNUSFVOSyBoYWNrOiBFQlA6ICUwOGx4IEVTUDogJTA4bHggY3VyX3N0YWNrOiAlMDhseFxuIiwKICAgICAgICAgICAgICAgICAgICBFQlBfcmVnKGNvbnRleHQpLCBFU1BfcmVnKGNvbnRleHQpLCB0aGRiLT5jdXJfc3RhY2spOwogICAgfQorCisgICBTWVNMRVZFTF9SZWxlYXNlV2luMTZMb2NrKCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTE3NCw2ICsxMTc3LDggQEAKIHsKICAgIExQQllURSBjb2RlID0gKExQQllURSlFSVBfcmVnKGNvbnRleHQpIC0gMTM7CiAKKyAgIFNZU0xFVkVMX1Jlc3RvcmVXaW4xNkxvY2soKTsKKwogICAgLyogV2UgdW5kbyB0aGUgU1lTVEhVTksgaGFjayBpZiBuZWNlc3NhcnkuIFNlZSBLMzJUaGsxNjMyUHJvbG9nLiAqLwogCiAgICBpZiAoICAgY29kZVs1XSA9PSAweEZGICYmIGNvZGVbNl0gPT0gMHg1NSAmJiBjb2RlWzddID09IDB4RkMKZGlmZiAtLWdpdCBhL3dpbjMyL25ld2Zucy5jIGIvd2luMzIvbmV3Zm5zLmMKaW5kZXggN2Y2MTg4Ny4uNjkzYzVmNyAxMDA2NDQKLS0tIGEvd2luMzIvbmV3Zm5zLmMKKysrIGIvd2luMzIvbmV3Zm5zLmMKQEAgLTU1LDI4ICs1NSw2IEBACiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKLUhBTkRMRTMyIFdJTkFQSSBGaW5kRmlyc3RDaGFuZ2VOb3RpZmljYXRpb24zMkEoTFBDU1RSIGxwUGF0aE5hbWUsQk9PTDMyIGJXYXRjaFN1YnRyZWUsRFdPUkQgZHdOb3RpZnlGaWx0ZXIpIHsKLQlGSVhNRShmaWxlLCIoJXMsJWQsJTA4bHgpOiBzdHViXG4iLAotCSAgICAgIGxwUGF0aE5hbWUsYldhdGNoU3VidHJlZSxkd05vdGlmeUZpbHRlcik7Ci0JcmV0dXJuIDB4Y2FmZWJhYmU7Ci19Ci0KLUhBTkRMRTMyIFdJTkFQSSBGaW5kRmlyc3RDaGFuZ2VOb3RpZmljYXRpb24zMlcoTFBDV1NUUiBscFBhdGhOYW1lLEJPT0wzMiBiV2F0Y2hTdWJ0cmVlLERXT1JEIGR3Tm90aWZ5RmlsdGVyKSB7Ci0JRklYTUUoZmlsZSwiKCVzLCVkLCUwOGx4KTogc3R1YlxuIiwKLQkgICAgICBkZWJ1Z3N0cl93KGxwUGF0aE5hbWUpLGJXYXRjaFN1YnRyZWUsZHdOb3RpZnlGaWx0ZXIpOwotCXJldHVybiAweGNhZmViYWJlOwotfQotCi1CT09MMzIgV0lOQVBJIEZpbmROZXh0Q2hhbmdlTm90aWZpY2F0aW9uKEhBTkRMRTMyIGZjbmhhbmRsZSkgewotCUZJWE1FKGZpbGUsIiglMDh4KTogc3R1YiFcbiIsZmNuaGFuZGxlKTsKLQlyZXR1cm4gRkFMU0U7Ci19Ci0KLUJPT0wzMiBXSU5BUEkgRmluZENsb3NlQ2hhbmdlTm90aWZpY2F0aW9uKEhBTkRMRTMyIGZjbmhhbmRsZSkgewotCUZJWE1FKGZpbGUsIiglMDh4KTogc3R1YiFcbiIsZmNuaGFuZGxlKTsKLQlyZXR1cm4gRkFMU0U7Ci19Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSAoS0VSTkVMMzIuNTY1KQogICovCmRpZmYgLS1naXQgYS93aW4zMi9vcmRpbmFscy5jIGIvd2luMzIvb3JkaW5hbHMuYwppbmRleCBhMTA3N2E2Li5hOTY5OWNmIDEwMDY0NAotLS0gYS93aW4zMi9vcmRpbmFscy5jCisrKyBiL3dpbjMyL29yZGluYWxzLmMKQEAgLTE2LDc4ICsxNiw2IEBACiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCi1zdGF0aWMgQ1JJVElDQUxfU0VDVElPTiBXaW4xNk11dGV4Owotc3RhdGljIFNFR1BUUiBzZWdXaW4xNk11dGV4ID0gKFNFR1BUUilOVUxMOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldHBXaW4xNkxvY2sgICAgKEtFUk5FTDMyLjkzKQotICogUmV0dXJuIHRoZSBpbmZhbW91cyBXaW4xNk11dGV4LgotICovCi1WT0lEIFdJTkFQSSBHZXRwV2luMTZMb2NrKENSSVRJQ0FMX1NFQ1RJT04gKipsb2NrKQotewotICAgIEZJWE1FKHdpbjMyLCAiKCVwKVxuIixsb2NrKTsKLSAgICAqbG9jayA9ICZXaW4xNk11dGV4OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBfQ29uZmlybVdpbjE2TG9jayAgICAoS0VSTkVMMzIuOTYpCi0gKi8KLURXT1JEIFdJTkFQSSBfQ29uZmlybVdpbjE2TG9jayh2b2lkKQotewotICAgIEZJWE1FKHdpbjMyLCAiKClcbiIpOwotICAgIHJldHVybiAxOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBfRW50ZXJTeXNMZXZlbCAgICAoS0VSTkVMMzIuOTcpCi0gKi8KLVZPSUQgV0lOQVBJIF9FbnRlclN5c0xldmVsKENSSVRJQ0FMX1NFQ1RJT04gKmxvY2spCi17Ci0gICAgRklYTUUod2luMzIsICIoJXApXG4iLCBsb2NrKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgX0VudGVyU3lzTGV2ZWwgICAgKEtFUk5FTDMyLjk4KQotICovCi1WT0lEIFdJTkFQSSBfTGVhdmVTeXNMZXZlbChDUklUSUNBTF9TRUNUSU9OICpsb2NrKQotewotICAgIEZJWE1FKHdpbjMyLCAiKCVwKVxuIiwgbG9jayk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFJlbGVhc2VUaHVua0xvY2sgICAgKEtFUk5FTDMyLjQ4KQotICovCi1WT0lEIFdJTkFQSSBSZWxlYXNlVGh1bmtMb2NrKERXT1JEICptdXRleF9jb3VudCkKLXsKLSAgICBfTGVhdmVTeXNMZXZlbCgmV2luMTZNdXRleCk7Ci0KLSAgICAqbXV0ZXhfY291bnQgPSAoRFdPUkQpIE50Q3VycmVudFRlYigpLT5tdXRleF9jb3VudDsKLSAgICBOdEN1cnJlbnRUZWIoKS0+bXV0ZXhfY291bnQgPSAweEZGRkY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFJlc3RvcmVUaHVua0xvY2sgICAgKEtFUk5FTDMyLjQ5KQotICovCi1WT0lEIFdJTkFQSSBSZXN0b3JlVGh1bmtMb2NrKERXT1JEIG11dGV4X2NvdW50KQotewotICAgIE50Q3VycmVudFRlYigpLT5tdXRleF9jb3VudCA9IChXT1JEKW11dGV4X2NvdW50OwotCi0gICAgX0VudGVyU3lzTGV2ZWwoJldpbjE2TXV0ZXgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRQSzE2U3lzVmFyICAgIChLRVJORUwzMi45MikKLSAqLwotTFBWT0lEIFdJTkFQSSBHZXRQSzE2U3lzVmFyKHZvaWQpCi17Ci0gICAgc3RhdGljIEJZVEUgUEsxNlN5c1ZhclsxMjhdOwotCi0gICAgRklYTUUod2luMzIsICIoKVxuIik7Ci0gICAgcmV0dXJuIFBLMTZTeXNWYXI7Ci19Ci0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBXT1dHZXREZXNjcmlwdG9yICAgICAgICAoS0VSTkVMMzIuODgpIChXT1czMi4xKQogICovCkBAIC0xODAsNiArMTA4LDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0UEsxNlN5c1ZhciAgICAoS0VSTkVMMzIuOTIpCisgKi8KK0xQVk9JRCBXSU5BUEkgR2V0UEsxNlN5c1Zhcih2b2lkKQoreworICAgIHN0YXRpYyBCWVRFIFBLMTZTeXNWYXJbMTI4XTsKKworICAgIEZJWE1FKHdpbjMyLCAiKClcbiIpOworICAgIHJldHVybiBQSzE2U3lzVmFyOworfQorCisKIEJPT0wzMiBXSU5BUEkgX0tFUk5FTDMyXzEwMChIQU5ETEUzMiB0aHJlYWRpZCxEV09SRCBleGl0Y29kZSxEV09SRCB4KSB7CiAJRklYTUUodGhyZWFkLCIoJWQsJWxkLDB4JTA4bHgpOiBzdHViXG4iLHRocmVhZGlkLGV4aXRjb2RlLHgpOwogCXJldHVybiBUUlVFOwpAQCAtMTkwLDE4ICsxMzAsMyBAQAogCXJldHVybiAxOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJS0VSTkVMXzQ0OQkJKEtFUk5FTC40NDkpCi0gKiBUaGlzIHJldHVybnMgYSBzZWdtZW50ZWQgc3RhdGljIHBvaW50ZXIgdG8gYSBsaW5lYXIgcG9pbnRlciB0byBhIGNyaXRpY2FsCi0gKiBzZWN0aW9uIGluIGtlcm5lbDMyIGFkZHJlc3Mgc3BhY2UuIFRoaXMgaXMgbW9zdCBsaWtlbHkgdGhlIFdpbjE2IExvY2ssCi0gKiBidXQgSSBhbSBub3Qgc3VyZS4KLSAqLwotU0VHUFRSIFdJTkFQSSBLRVJORUxfNDQ5KHZvaWQpIHsgCi0JaWYgKCFzZWdXaW4xNk11dGV4KSB7Ci0JCUxQRFdPUkQJdzE2bSA9IFNFR1BUUl9BTExPQyg0KTsKLQkJCi0JCSp3MTZtID0gKERXT1JEKSZXaW4xNk11dGV4OwotCQlzZWdXaW4xNk11dGV4ID0gU0VHUFRSX0dFVCh3MTZtKTsKLQl9Ci0JcmV0dXJuIHNlZ1dpbjE2TXV0ZXg7Ci19CmRpZmYgLS1naXQgYS93aW4zMi9wcm9jZXNzLmMgYi93aW4zMi9wcm9jZXNzLmMKaW5kZXggYTllOGIyZC4uM2E4NTQzMCAxMDA2NDQKLS0tIGEvd2luMzIvcHJvY2Vzcy5jCisrKyBiL3dpbjMyL3Byb2Nlc3MuYwpAQCAtMTQsMjkgKzE0LDExIEBACiAjaW5jbHVkZSAicHJvY2Vzcy5oIgogI2luY2x1ZGUgInBlX2ltYWdlLmgiCiAjaW5jbHVkZSAiZmlsZS5oIgorI2luY2x1ZGUgInRhc2suaCIKKyNpbmNsdWRlICJ0b29saGVscC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTXNnV2FpdEZvck11bHRpcGxlT2JqZWN0cyAgICAoVVNFUjMyLjQwMCkKLSAqLwotRFdPUkQgV0lOQVBJIE1zZ1dhaXRGb3JNdWx0aXBsZU9iamVjdHMoCi0JRFdPUkQgbkNvdW50LEhBTkRMRTMyICpwSGFuZGxlcyxCT09MMzIgZldhaXRBbGwsRFdPUkQgZHdNaWxsaXNlY29uZHMsCi0JRFdPUkQgZHdXYWtlTWFzawotKSB7Ci0jaWYgMAotCWludAlpOwotCWZwcmludGYoc3RkZXJyLCJNc2dXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKCVsZCxbIixuQ291bnQpOwotCWZvciAoaT0wO2k8bkNvdW50O2krKykKLQkJZnByaW50ZihzdGRlcnIsIiVsZCwiLChEV09SRClwSGFuZGxlc1tpXSk7Ci0JZnByaW50ZihzdGRlcnIsIl0sJWQsJWxkLDB4JTA4bHgpXG4iLGZXYWl0QWxsLGR3TWlsbGlzZWNvbmRzLGR3V2FrZU1hc2spOwotCXJldHVybiAwOwotI2Vsc2UKLQlyZXR1cm4gV2FpdEZvck11bHRpcGxlT2JqZWN0c0V4KG5Db3VudCwgcEhhbmRsZXMsIGZXYWl0QWxsLCBkd01pbGxpc2Vjb25kcywKLQkJCQkJRkFMU0UpOwotI2VuZGlmCi19Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICBHZXRQcm9jZXNzQWZmaW5pdHlNYXNrCiAgKi8KQEAgLTYyLDcgKzQ0LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBTZXRUaHJlYWRBZmZpbml0eU1hc2soSEFORExFMzIgaFRocmVhZCwgRFdPUkQgZHdUaHJlYWRBZmZpbml0eU1hc2spCiB7Ci0JVEhEQgkqdGhkYiA9IFRIUkVBRF9HZXRQdHIoIGhUaHJlYWQsIFRIUkVBRF9TRVRfSU5GT1JNQVRJT04gKTsKKwlUSERCCSp0aGRiID0gVEhSRUFEX0dldFB0ciggaFRocmVhZCwgVEhSRUFEX1NFVF9JTkZPUk1BVElPTiwgTlVMTCApOwogCiAJaWYgKCF0aGRiKSAKIAkJcmV0dXJuIEZBTFNFOwpAQCAtODUsMTMgKzY3LDE2IEBACiAJRFdPUkQgY3JlYXRpb25mbGFncyxMUFZPSUQgZW52LExQQ1NUUiBjdXJkaXIsCiAJTFBTVEFSVFVQSU5GTzMyQSBzdGFydHVwaW5mbyxMUFBST0NFU1NfSU5GT1JNQVRJT04gcHJvY2Vzc2luZm8KICkgewotCVdBUk4od2luMzIsIkNyZWF0ZVByb2Nlc3NBKCVzLCVzLCVwLCVwLCVkLCUwOGx4LCVwLCVzLCVwLCVwKSxcbgotCQljYWxsaW5nIFdpbkV4ZWMzMiBpbnN0ZWFkXG4iLAorCUhJTlNUQU5DRTE2IGhJbnN0ID0gMDsKKwlpZiAocHJvY2Vzc2luZm8pIG1lbXNldChwcm9jZXNzaW5mbywgJ1wwJywgc2l6ZW9mKCpwcm9jZXNzaW5mbykpOworCisJRklYTUUod2luMzIsIiglcywlcywlcCwlcCwlZCwlMDhseCwlcCwlcywlcCwlcCk6IGNhbGxpbmcgV2luRXhlYzMyXG4iLAogCQlhcHBuYW1lLGNtZGxpbmUscHJvY2Vzc2F0dHJpYnV0ZXMsdGhyZWFkYXR0cmlidXRlcywKLQkJaW5oZXJpdGhhbmRsZXMsY3JlYXRpb25mbGFncyxlbnYsY3VyZGlyLHN0YXJ0dXBpbmZvLHByb2Nlc3NpbmZvCi0JKTsKLSAgICAgICAgV2luRXhlYzMyKGNtZGxpbmUsVFJVRSk7Ci0gICAgICAgIHJldHVybiBUUlVFOworCQlpbmhlcml0aGFuZGxlcyxjcmVhdGlvbmZsYWdzLGVudixjdXJkaXIsc3RhcnR1cGluZm8scHJvY2Vzc2luZm8pOworCisJaEluc3QgPSBXaW5FeGVjMzIoY21kbGluZSxUUlVFKTsKKworICAgICAgICByZXR1cm4gaEluc3QgPj0gMzI7CiAjaWYgMAogCS8qIG1ha2UgZnJvbSBsY2MgdXNlcyBzeXN0ZW0gYXMgZmFsbGJhY2sgaWYgQ3JlYXRlUHJvY2VzcyByZXR1cm5zCiAJICAgRkFMU0UsIHNvIHJldHVybiBmYWxzZSAqLwpkaWZmIC0tZ2l0IGEvd2luZG93cy9jbGFzcy5jIGIvd2luZG93cy9jbGFzcy5jCmluZGV4IGIzMzYwNmQuLmFlZjVjZDMgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvY2xhc3MuYworKysgYi93aW5kb3dzL2NsYXNzLmMKQEAgLTIsMTAgKzIsMTQgQEAKICAqIFdpbmRvdyBjbGFzc2VzIGZ1bmN0aW9ucwogICoKICAqIENvcHlyaWdodCAxOTkzLCAxOTk2IEFsZXhhbmRyZSBKdWxsaWFyZAorICogICAgICAgICAgIDE5OTggSnVlcmdlbiBTY2htaWVkIChqc2NoKQogICoKICAqIEZJWE1FOiBJbiB3aW4zMiBhbGwgY2xhc3NlcyBhcmUgbG9jYWwuIFRoZXkgYXJlIHJlZ2lzdGVyZWQgYXQgCiAgKgkgIHByb2dyYW0gc3RhcnQuIFByb2Nlc3NlcyBDQU5OT1Qgc2hhcmUgY2xhc3Nlcy4gKFNvdXJjZTogc29tZQogICoJICB3aW4zMS0+TlQgbWlncmF0aW9uIGJvb2spCisgKgorICogRklYTUU6IFRoZXJlIHNlZW1zIHRvIGJlIGEgZ2VuZXJhbCBwcm9ibGVtIHdpdGggaEluc3RhbmNlIGluIFdJTkUKKyAqICAgY2xhc3NlcyBhcmUgZ2V0dGluZyByZWdpc3RyZWQgd2l0aCB3cm9uZyBoSW5zdGFuY2UuCiAgKi8KIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMTksNiArMjMsNyBAQAogI2luY2x1ZGUgInRvb2xoZWxwLmgiCiAjaW5jbHVkZSAid2lucHJvYy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAid2luZXJyb3IuaCIKIAogCiBzdGF0aWMgQ0xBU1MgKmZpcnN0Q2xhc3MgPSBOVUxMOwpAQCAtMTYwLDYgKzE2NSw3IEBACiBzdGF0aWMgQk9PTDMyIENMQVNTX0ZyZWVDbGFzcyggQ0xBU1MgKmNsYXNzUHRyICkKIHsKICAgICBDTEFTUyAqKnBwQ2xhc3M7CisgICAgVFJBQ0UoY2xhc3MsIiVwIFxuIiwgY2xhc3NQdHIpOyAgCiAKICAgICAvKiBDaGVjayBpZiB3ZSBjYW4gcmVtb3ZlIHRoaXMgY2xhc3MgKi8KIApAQCAtMTk1LDYgKzIwMSw4IEBACiB7CiAgICAgQ0xBU1MgKnB0ciwgKm5leHQ7CiAgIAorICAgIFRSQUNFKGNsYXNzLCIweCUwOHggXG4iLCBoTW9kdWxlKTsgIAorCiAgICAgZm9yIChwdHIgPSBmaXJzdENsYXNzOyBwdHI7IHB0ciA9IG5leHQpCiAgICAgewogICAgICAgICBuZXh0ID0gcHRyLT5uZXh0OwpAQCAtMjA4LDE5ICsyMTYsMzAgQEAKICAqCiAgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjbGFzcy4KICAqIGhpbnN0YW5jZSBoYXMgYmVlbiBub3JtYWxpemVkIGJ5IHRoZSBjYWxsZXIuCisgKgorICogTk9URVMKKyAqICA5ODA4MDUgYSBsb2NhbCBjbGFzcyB3aWxsIGJlIGZvdW5kIG5vdyBpZiByZWdpc3RyZWQgd2l0aCBoSW5zdD0wCisgKiAgYW5kIGxvb2VkIHVwIHdpdGggYSBoSW5zdCE9MC4gbXNtb25leSBkb2VzIGl0IChqc2NoKQogICovCiBDTEFTUyAqQ0xBU1NfRmluZENsYXNzQnlBdG9tKCBBVE9NIGF0b20sIEhJTlNUQU5DRTMyIGhpbnN0YW5jZSApCi17Ci0gICAgQ0xBU1MgKiBjbGFzczsKK3sgICBDTEFTUyAqIGNsYXNzLCAqdGNsYXNzPTA7CisKKyAgICBUUkFDRShjbGFzcywiMHglMDh4IDB4JTA4eFxuIiwgYXRvbSwgaGluc3RhbmNlKTsKIAogICAgIC8qIEZpcnN0IHNlYXJjaCB0YXNrLXNwZWNpZmljIGNsYXNzZXMgKi8KIAogICAgIGZvciAoY2xhc3MgPSBmaXJzdENsYXNzOyAoY2xhc3MpOyBjbGFzcyA9IGNsYXNzLT5uZXh0KQogICAgIHsKICAgICAgICAgaWYgKGNsYXNzLT5zdHlsZSAmIENTX0dMT0JBTENMQVNTKSBjb250aW51ZTsKLSAgICAgICAgaWYgKChjbGFzcy0+YXRvbU5hbWUgPT0gYXRvbSkgJiYgCi0gICAgICAgICAgICAoKGhpbnN0YW5jZSA9PSAweGZmZmYpIHx8Ci0gICAgICAgICAgICAgKGhpbnN0YW5jZSA9PSBjbGFzcy0+aEluc3RhbmNlKSkpIHJldHVybiBjbGFzczsKKyAgICAgICAgaWYgKGNsYXNzLT5hdG9tTmFtZSA9PSBhdG9tKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaGluc3RhbmNlPT1jbGFzcy0+aEluc3RhbmNlIHx8IGhpbnN0YW5jZT09MHhmZmZmICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUUkFDRShjbGFzcywiLS0gZm91bmQgbG9jYWwgJXBcbiIsIGNsYXNzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2xhc3MtPmhJbnN0YW5jZT09MCkgdGNsYXNzID0gY2xhc3M7CisgICAgICAgIH0KICAgICB9CiAgICAgCiAgICAgICAvKiBUaGVuIHNlYXJjaCBnbG9iYWwgY2xhc3NlcyAqLwpAQCAtMjI4LDkgKzI0NywyMSBAQAogICAgIGZvciAoY2xhc3MgPSBmaXJzdENsYXNzOyAoY2xhc3MpOyBjbGFzcyA9IGNsYXNzLT5uZXh0KQogICAgIHsKICAgICAgICAgaWYgKCEoY2xhc3MtPnN0eWxlICYgQ1NfR0xPQkFMQ0xBU1MpKSBjb250aW51ZTsKLSAgICAgICAgaWYgKGNsYXNzLT5hdG9tTmFtZSA9PSBhdG9tKSByZXR1cm4gY2xhc3M7CisgICAgICAgIGlmIChjbGFzcy0+YXRvbU5hbWUgPT0gYXRvbSkKKyAgICAgICAgeworICAgICAgICAgICAgVFJBQ0UoY2xhc3MsIi0tIGZvdW5kIGdsb2JhbCAlcFxuIiwgY2xhc3MpOworICAgICAgICAgICAgcmV0dXJuIGNsYXNzOworICAgICAgICB9CiAgICAgfQogCisgICAgLyogVGhlbiBjaGVjayBpZiB0aGVyZSB3YXMgYSBsb2NhbCBjbGFzcyB3aXRoIGhJbnN0PTAqLworICAgIGlmICggdGNsYXNzICkKKyAgICB7CisgICAgICAgIFdBUk4oY2xhc3MsIi0tIGZvdW5kIGxvY2FsIENsYXNzIHJlZ2lzdHJlZCB3aXRoIGhJbnN0PTBcbiIpOworICAgICAgICByZXR1cm4gdGNsYXNzOworICAgIH0KKyAgICAKKyAgICBUUkFDRShjbGFzcywiLS0gbm90IGZvdW5kXG4iKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMjQ3LDggKzI3OCwxMCBAQAogewogICAgIENMQVNTICpjbGFzc1B0cjsKIAotICAgIC8qIENoZWNrIGlmIGEgY2xhc3Mgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMgKi8KKyAgICBUUkFDRShjbGFzcywiYXRvbT0weCV4IGhpbnN0PTB4JXggc3R5bGU9MHglbHggY2xFeHRyPTB4JXggd2luRXh0cj0weCV4IHduZFByb2M9MHglcCBQcm9jVHlwZT0weCV4XG4iLAorICAgICBhdG9tLCBoSW5zdGFuY2UsIHN0eWxlLCBjbGFzc0V4dHJhLCB3aW5FeHRyYSwgd25kUHJvYywgd25kUHJvY1R5cGUpOwogCisgICAvKiBDaGVjayBpZiBhIGNsYXNzIHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzICovCiAgICAgY2xhc3NQdHIgPSBDTEFTU19GaW5kQ2xhc3NCeUF0b20oIGF0b20sIGhJbnN0YW5jZSApOwogICAgIGlmIChjbGFzc1B0cikKICAgICB7CkBAIC0zNDYsMTggKzM3OSwyMSBAQAogICAgIEFUT00gYXRvbTsKICAgICBDTEFTUyAqY2xhc3NQdHI7CiAKLSAgICBpZiAoIShhdG9tID0gR2xvYmFsQWRkQXRvbTMyQSggd2MtPmxwc3pDbGFzc05hbWUgKSkpIHJldHVybiAwOworICAgIGlmICghKGF0b20gPSBHbG9iYWxBZGRBdG9tMzJBKCB3Yy0+bHBzekNsYXNzTmFtZSApKSkgCisgICAgeworICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0xBU1NfQUxSRUFEWV9FWElTVFMpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQogICAgIGlmICghKGNsYXNzUHRyID0gQ0xBU1NfUmVnaXN0ZXJDbGFzcyggYXRvbSwgd2MtPmhJbnN0YW5jZSwgd2MtPnN0eWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2MtPmNiQ2xzRXh0cmEsIHdjLT5jYlduZEV4dHJhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdORFBST0MxNil3Yy0+bHBmblduZFByb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5fUFJPQ18zMkEgKSkpCi0gICAgewotICAgICAgICBHbG9iYWxEZWxldGVBdG9tKCBhdG9tICk7Ci0gICAgICAgIHJldHVybiAwOworICAgIHsgICBHbG9iYWxEZWxldGVBdG9tKCBhdG9tICk7CisgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9DTEFTU19BTFJFQURZX0VYSVNUUyk7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKLSAgICBUUkFDRShjbGFzcywgImF0b209JTA0eCB3bmRwcm9jPSUwOGx4Ci1oaW5zdD0lMDR4IGJnPSUwNHggc3R5bGU9JTA4eCBjbHNFeHQ9JWQgd2luRXh0PSVkIGNsYXNzPSVwIG5hbWU9JyVzJ1xuIiwKKyAgICBUUkFDRShjbGFzcywgImF0b209JTA0eCB3bmRwcm9jPSUwOGx4IGhpbnN0PSUwNHggYmc9JTA0eCBzdHlsZT0lMDh4IGNsc0V4dD0lZCB3aW5FeHQ9JWQgY2xhc3M9JXAgbmFtZT0nJXMnXG4iLAogICAgICAgICAgICAgICAgICAgIGF0b20sIChEV09SRCl3Yy0+bHBmblduZFByb2MsIHdjLT5oSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgd2MtPmhickJhY2tncm91bmQsIHdjLT5zdHlsZSwgd2MtPmNiQ2xzRXh0cmEsCiAgICAgICAgICAgICAgICAgICAgd2MtPmNiV25kRXh0cmEsIGNsYXNzUHRyLApAQCAtMzgwLDEyICs0MTYsMTcgQEAKICAgICBBVE9NIGF0b207CiAgICAgQ0xBU1MgKmNsYXNzUHRyOwogCi0gICAgaWYgKCEoYXRvbSA9IEdsb2JhbEFkZEF0b20zMlcoIHdjLT5scHN6Q2xhc3NOYW1lICkpKSByZXR1cm4gMDsKKyAgICBpZiAoIShhdG9tID0gR2xvYmFsQWRkQXRvbTMyVyggd2MtPmxwc3pDbGFzc05hbWUgKSkpCisgICAgeworICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0xBU1NfQUxSRUFEWV9FWElTVFMpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQogICAgIGlmICghKGNsYXNzUHRyID0gQ0xBU1NfUmVnaXN0ZXJDbGFzcyggYXRvbSwgd2MtPmhJbnN0YW5jZSwgd2MtPnN0eWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2MtPmNiQ2xzRXh0cmEsIHdjLT5jYlduZEV4dHJhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdORFBST0MxNil3Yy0+bHBmblduZFByb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5fUFJPQ18zMlcgKSkpCiAgICAgeworICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0xBU1NfQUxSRUFEWV9FWElTVFMpOwogICAgICAgICBHbG9iYWxEZWxldGVBdG9tKCBhdG9tICk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTQ0NiwxNCArNDg3LDE5IEBACiAgICAgQVRPTSBhdG9tOwogICAgIENMQVNTICpjbGFzc1B0cjsKIAotICAgIGlmICghKGF0b20gPSBHbG9iYWxBZGRBdG9tMzJBKCB3Yy0+bHBzekNsYXNzTmFtZSApKSkgcmV0dXJuIDA7CisgICAgaWYgKCEoYXRvbSA9IEdsb2JhbEFkZEF0b20zMkEoIHdjLT5scHN6Q2xhc3NOYW1lICkpKQorICAgIHsKKyAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0NMQVNTX0FMUkVBRFlfRVhJU1RTKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KICAgICBpZiAoIShjbGFzc1B0ciA9IENMQVNTX1JlZ2lzdGVyQ2xhc3MoIGF0b20sIHdjLT5oSW5zdGFuY2UsIHdjLT5zdHlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjLT5jYkNsc0V4dHJhLCB3Yy0+Y2JXbmRFeHRyYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXTkRQUk9DMTYpd2MtPmxwZm5XbmRQcm9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lOX1BST0NfMzJBICkpKQogICAgIHsKKyAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0NMQVNTX0FMUkVBRFlfRVhJU1RTKTsKICAgICAgICAgR2xvYmFsRGVsZXRlQXRvbSggYXRvbSApOwotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIFRSQUNFKGNsYXNzLCAiYXRvbT0lMDR4IHduZHByb2M9JTA4bHggaGluc3Q9JTA0eCBiZz0lMDR4IHN0eWxlPSUwOHggY2xzRXh0PSVkIHdpbkV4dD0lZCBjbGFzcz0lcFxuIiwKQEAgLTQ3OCwxMiArNTI0LDE3IEBACiAgICAgQVRPTSBhdG9tOwogICAgIENMQVNTICpjbGFzc1B0cjsKIAotICAgIGlmICghKGF0b20gPSBHbG9iYWxBZGRBdG9tMzJXKCB3Yy0+bHBzekNsYXNzTmFtZSApKSkgcmV0dXJuIDA7CisgICAgaWYgKCEoYXRvbSA9IEdsb2JhbEFkZEF0b20zMlcoIHdjLT5scHN6Q2xhc3NOYW1lICkpKQorICAgIHsKKyAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0NMQVNTX0FMUkVBRFlfRVhJU1RTKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogICAgIGlmICghKGNsYXNzUHRyID0gQ0xBU1NfUmVnaXN0ZXJDbGFzcyggYXRvbSwgd2MtPmhJbnN0YW5jZSwgd2MtPnN0eWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2MtPmNiQ2xzRXh0cmEsIHdjLT5jYlduZEV4dHJhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdORFBST0MxNil3Yy0+bHBmblduZFByb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5fUFJPQ18zMlcgKSkpCiAgICAgeworICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0xBU1NfQUxSRUFEWV9FWElTVFMpOwogICAgICAgICBHbG9iYWxEZWxldGVBdG9tKCBhdG9tICk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTUyMCwzNCArNTcxLDU3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFVucmVnaXN0ZXJDbGFzczMyQSAgICAoVVNFUjMyLjU2MykKKyAqCiAgKi8KIEJPT0wzMiBXSU5BUEkgVW5yZWdpc3RlckNsYXNzMzJBKCBMUENTVFIgY2xhc3NOYW1lLCBISU5TVEFOQ0UzMiBoSW5zdGFuY2UgKQotewotICAgIENMQVNTICpjbGFzc1B0cjsKK3sgICBDTEFTUyAqY2xhc3NQdHI7CiAgICAgQVRPTSBhdG9tOworICAgIEJPT0wzMiByZXQ7CiAKLSAgICBpZiAoIShhdG9tID0gR2xvYmFsRmluZEF0b20zMkEoIGNsYXNzTmFtZSApKSkgcmV0dXJuIEZBTFNFOworICAgIFRSQUNFKGNsYXNzLCIlcyAleFxuIixjbGFzc05hbWUsIGhJbnN0YW5jZSk7CisKKyAgICBpZiAoIShhdG9tID0gR2xvYmFsRmluZEF0b20zMkEoIGNsYXNzTmFtZSApKSkKKyAgICB7CisgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9DTEFTU19ET0VTX05PVF9FWElTVCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CiAgICAgaWYgKCEoY2xhc3NQdHIgPSBDTEFTU19GaW5kQ2xhc3NCeUF0b20oIGF0b20sIGhJbnN0YW5jZSApKSB8fAotICAgICAgICAoY2xhc3NQdHItPmhJbnN0YW5jZSAhPSBoSW5zdGFuY2UpKSByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIENMQVNTX0ZyZWVDbGFzcyggY2xhc3NQdHIgKTsKKyAgICAgICAgKGNsYXNzUHRyLT5oSW5zdGFuY2UgIT0gaEluc3RhbmNlKSkKKyAgICB7CisgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9DTEFTU19ET0VTX05PVF9FWElTVCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKCEocmV0ID0gQ0xBU1NfRnJlZUNsYXNzKCBjbGFzc1B0ciApKSkKKyAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0NMQVNTX0hBU19XSU5ET1dTKTsKKyAgICByZXR1cm4gcmV0OwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFVucmVnaXN0ZXJDbGFzczMyVyAgICAoVVNFUjMyLjU2NCkKICAqLwogQk9PTDMyIFdJTkFQSSBVbnJlZ2lzdGVyQ2xhc3MzMlcoIExQQ1dTVFIgY2xhc3NOYW1lLCBISU5TVEFOQ0UzMiBoSW5zdGFuY2UgKQotewotICAgIENMQVNTICpjbGFzc1B0cjsKK3sgICBDTEFTUyAqY2xhc3NQdHI7CiAgICAgQVRPTSBhdG9tOworICAgIEJPT0wzMiByZXQ7CiAKLSAgICBpZiAoIShhdG9tID0gR2xvYmFsRmluZEF0b20zMlcoIGNsYXNzTmFtZSApKSkgcmV0dXJuIEZBTFNFOworICAgIFRSQUNFKGNsYXNzLCIlcyAleFxuIixkZWJ1Z3N0cl93KGNsYXNzTmFtZSksIGhJbnN0YW5jZSk7CisKKyAgICBpZiAoIShhdG9tID0gR2xvYmFsRmluZEF0b20zMlcoIGNsYXNzTmFtZSApKSkKKyAgICB7CisgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9DTEFTU19ET0VTX05PVF9FWElTVCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CiAgICAgaWYgKCEoY2xhc3NQdHIgPSBDTEFTU19GaW5kQ2xhc3NCeUF0b20oIGF0b20sIGhJbnN0YW5jZSApKSB8fAotICAgICAgICAoY2xhc3NQdHItPmhJbnN0YW5jZSAhPSBoSW5zdGFuY2UpKSByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIENMQVNTX0ZyZWVDbGFzcyggY2xhc3NQdHIgKTsKKyAgICAgICAgKGNsYXNzUHRyLT5oSW5zdGFuY2UgIT0gaEluc3RhbmNlKSkKKyAgICB7CisgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9DTEFTU19ET0VTX05PVF9FWElTVCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKCEocmV0ID0gQ0xBU1NfRnJlZUNsYXNzKCBjbGFzc1B0ciApKSkKKyAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0NMQVNTX0hBU19XSU5ET1dTKTsKKyAgICByZXR1cm4gcmV0OwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldENsYXNzV29yZDE2ICAgIChVU0VSLjEyOSkKICAqLwpAQCAtNTY0LDYgKzYzOCw4IEBACiB7CiAgICAgV05EICogd25kUHRyOwogICAgIAorICAgIFRSQUNFKGNsYXNzLCIleCAleFxuIixod25kLCBvZmZzZXQpOworICAgIAogICAgIGlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICkpKSByZXR1cm4gMDsKICAgICBpZiAob2Zmc2V0ID49IDApCiAgICAgewpAQCAtNTgzLDYgKzY1OSw3IEBACiAgICAgICAgIGNhc2UgR0NXX0hNT0RVTEU6CiAgICAgICAgICAgICByZXR1cm4gKFdPUkQpR2V0Q2xhc3NMb25nMzJBKCBod25kLCBvZmZzZXQgKTsKICAgICB9CisKICAgICBXQVJOKGNsYXNzLCAiSW52YWxpZCBvZmZzZXQgJWRcbiIsIG9mZnNldCk7CiAgICAgcmV0dXJuIDA7CiB9CkBAIC01OTYsNiArNjczLDggQEAKICAgICBXTkQgKnduZFB0cjsKICAgICBMT05HIHJldDsKIAorICAgIFRSQUNFKGNsYXNzLCIleCAleFxuIixod25kLCBvZmZzZXQpOworCiAgICAgc3dpdGNoKCBvZmZzZXQgKQogICAgIHsKICAgICBjYXNlIEdDTF9XTkRQUk9DOgpAQCAtNjE3LDYgKzY5Niw4IEBACiB7CiAgICAgV05EICogd25kUHRyOwogICAgIAorICAgIFRSQUNFKGNsYXNzLCIleCAleFxuIixod25kLCBvZmZzZXQpOworICAgIAogICAgIGlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICkpKSByZXR1cm4gMDsKICAgICBpZiAob2Zmc2V0ID49IDApCiAgICAgewpAQCAtNjUxLDYgKzczMiw4IEBACiB7CiAgICAgV05EICogd25kUHRyOwogCisgICAgVFJBQ0UoY2xhc3MsIiV4ICV4XG4iLGh3bmQsIG9mZnNldCk7CisKICAgICBzd2l0Y2gob2Zmc2V0KQogICAgIHsKICAgICBjYXNlIEdDTF9XTkRQUk9DOgpAQCAtNjgzLDYgKzc2Niw4IEBACiAgICAgV09SRCByZXR2YWwgPSAwOwogICAgIHZvaWQgKnB0cjsKICAgICAKKyAgICBUUkFDRShjbGFzcywiJXggJXggJXhcbiIsaHduZCwgb2Zmc2V0LCBuZXd2YWwpOworICAgIAogICAgIGlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICkpKSByZXR1cm4gMDsKICAgICBpZiAob2Zmc2V0ID49IDApCiAgICAgewpAQCAtNzI0LDYgKzgwOSw4IEBACiAgICAgV05EICp3bmRQdHI7CiAgICAgTE9ORyByZXR2YWw7CiAKKyAgICBUUkFDRShjbGFzcywiJXggJXggJWx4XG4iLGh3bmQsIG9mZnNldCwgbmV3dmFsKTsKKwogICAgIHN3aXRjaChvZmZzZXQpCiAgICAgewogICAgIGNhc2UgR0NMX1dORFBST0M6CkBAIC03NDksNiArODM2LDggQEAKICAgICBMT05HIHJldHZhbCA9IDA7CiAgICAgdm9pZCAqcHRyOwogICAgIAorICAgIFRSQUNFKGNsYXNzLCIleCAleCAlbHhcbiIsaHduZCwgb2Zmc2V0LCBuZXd2YWwpOworICAgICAgICAKICAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApKSkgcmV0dXJuIDA7CiAgICAgaWYgKG9mZnNldCA+PSAwKQogICAgIHsKQEAgLTc5OCw2ICs4ODcsOCBAQAogICAgIFdORCAqd25kUHRyOwogICAgIExPTkcgcmV0dmFsOwogCisgICAgVFJBQ0UoY2xhc3MsIiV4ICV4ICVseFxuIixod25kLCBvZmZzZXQsIG5ld3ZhbCk7CisgICAgCiAgICAgc3dpdGNoKG9mZnNldCkKICAgICB7CiAgICAgY2FzZSBHQ0xfV05EUFJPQzoKQEAgLTgzMSwxMCArOTIyLDE0IEBACiAgKiAgICAgICAgICAgR2V0Q2xhc3NOYW1lMzJBICAgICAgKFVTRVIzMi4yMTcpCiAgKi8KIElOVDMyIFdJTkFQSSBHZXRDbGFzc05hbWUzMkEoIEhXTkQzMiBod25kLCBMUFNUUiBidWZmZXIsIElOVDMyIGNvdW50ICkKLXsKK3sgICBJTlQzMiByZXQ7CiAgICAgV05EICp3bmRQdHI7CisgICAgICAgICAgICAKICAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKSkpIHJldHVybiAwOwotICAgIHJldHVybiBHbG9iYWxHZXRBdG9tTmFtZTMyQSggd25kUHRyLT5jbGFzcy0+YXRvbU5hbWUsIGJ1ZmZlciwgY291bnQgKTsKKyAgICByZXQgPSBHbG9iYWxHZXRBdG9tTmFtZTMyQSggd25kUHRyLT5jbGFzcy0+YXRvbU5hbWUsIGJ1ZmZlciwgY291bnQgKTsKKworICAgIFRSQUNFKGNsYXNzLCIleCAlcyAleFxuIixod25kLCBidWZmZXIsIGNvdW50KTsKKyAgICByZXR1cm4gcmV0OwogfQogCiAKQEAgLTg0MiwxMCArOTM3LDE1IEBACiAgKiAgICAgICAgICAgR2V0Q2xhc3NOYW1lMzJXICAgICAgKFVTRVIzMi4yMTgpCiAgKi8KIElOVDMyIFdJTkFQSSBHZXRDbGFzc05hbWUzMlcoIEhXTkQzMiBod25kLCBMUFdTVFIgYnVmZmVyLCBJTlQzMiBjb3VudCApCi17Cit7ICAgSU5UMzIgcmV0OwogICAgIFdORCAqd25kUHRyOworCiAgICAgaWYgKCEod25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCkpKSByZXR1cm4gMDsKLSAgICByZXR1cm4gR2xvYmFsR2V0QXRvbU5hbWUzMlcoIHduZFB0ci0+Y2xhc3MtPmF0b21OYW1lLCBidWZmZXIsIGNvdW50ICk7CisgICAgcmV0ID0gR2xvYmFsR2V0QXRvbU5hbWUzMlcoIHduZFB0ci0+Y2xhc3MtPmF0b21OYW1lLCBidWZmZXIsIGNvdW50ICk7CisKKyAgICBUUkFDRShjbGFzcywiJXggJXMgJXhcbiIsaHduZCwgZGVidWdzdHJfdyhidWZmZXIpLCBjb3VudCk7CisgICAgCisgICAgcmV0dXJuIHJldDsKIH0KIAogCkBAIC04NTgsNiArOTU4LDggQEAKICAgICBBVE9NIGF0b207CiAgICAgQ0xBU1MgKmNsYXNzUHRyOwogCisgICAgVFJBQ0UoY2xhc3MsIiV4ICVwICVwXG4iLGhJbnN0YW5jZSwgUFRSX1NFR19UT19MSU4gKG5hbWUpLCB3Yyk7CisgICAgCiAgICAgaEluc3RhbmNlID0gR2V0RXhlUHRyKCBoSW5zdGFuY2UgKTsKICAgICBpZiAoIShhdG9tID0gR2xvYmFsRmluZEF0b20xNiggbmFtZSApKSB8fAogICAgICAgICAhKGNsYXNzUHRyID0gQ0xBU1NfRmluZENsYXNzQnlBdG9tKCBhdG9tLCBoSW5zdGFuY2UgKSkpCkBAIC04OTAsMTEgKzk5MiwyMyBAQAogICAgIEFUT00gYXRvbTsKICAgICBDTEFTUyAqY2xhc3NQdHI7CiAKLSAgICBpZiAoIShhdG9tID0gR2xvYmFsRmluZEF0b20zMkEoIG5hbWUgKSkgfHwKLSAgICAgICAgIShjbGFzc1B0ciA9IENMQVNTX0ZpbmRDbGFzc0J5QXRvbSggYXRvbSwgaEluc3RhbmNlICkpIHx8Ci0JKGNsYXNzUHRyLT5oSW5zdGFuY2UgJiYgKGhJbnN0YW5jZSAhPSBjbGFzc1B0ci0+aEluc3RhbmNlKSkpCisgICAgVFJBQ0UoY2xhc3MsIiV4ICVwICVwXG4iLGhJbnN0YW5jZSwgbmFtZSwgd2MpOworCisgICAgLyogd29ya2Fyb3VuZDogaWYgaEluc3RhbmNlPU5VTEwgeW91IGV4cGVjdCB0byBnZXQgdGhlIHN5c3RlbSBjbGFzc2VzCisgICAgYnV0IHRoaXMgY2xhc3NlcyAoYXMgZXhhbXBsZSBmcm9tIGNvbWN0bDMyLmRsbCBTeXNMaXN0Vmlldykgd29uJ3QgYmUKKyAgICByZWdpc3RyZWQgd2l0aCBoSW5zdGFuY2U9TlVMTCBpbiBXSU5FIGJlY2F1c2Ugb2YgdGhlIGxhdGUgbG9hZGluZworICAgIG9mIHRoaXMgZGxsLiBmaXhlcyBmaWxlIGRpYWxvZ3MgaW4gV2luV29yZDk1IChqc2NoKSovCisKKyAgICBpZiAoIShhdG9tPUdsb2JhbEZpbmRBdG9tMzJBKG5hbWUpKSB8fCAhKGNsYXNzUHRyPUNMQVNTX0ZpbmRDbGFzc0J5QXRvbShhdG9tLGhJbnN0YW5jZSkpKQogICAgICAgICByZXR1cm4gRkFMU0U7CiAKKyAgICBpZiAgKGNsYXNzUHRyLT5oSW5zdGFuY2UgJiYgKGhJbnN0YW5jZSAhPSBjbGFzc1B0ci0+aEluc3RhbmNlKSkKKyAgICB7CisgICAgICAgIGlmIChoSW5zdGFuY2UpIHJldHVybiBGQUxTRTsKKyAgICAgICAgZWxzZSAgICAKKyAgICAgICAgICAgIFdBUk4oY2xhc3MsInN5c3RlbWNsYXNzICVzIChoSW5zdD0wKSBkZW1hbmRlZCBidXQgb25seSBjbGFzcyB3aXRoIGhJbnN0IT0wIGZvdW5kXG4iLG5hbWUpOworICAgIH0KKwogICAgIHdjLT5zdHlsZSAgICAgICAgID0gY2xhc3NQdHItPnN0eWxlOwogICAgIHdjLT5scGZuV25kUHJvYyAgID0gKFdORFBST0MzMilXSU5QUk9DX0dldFByb2MoIGNsYXNzUHRyLT53aW5wcm9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTl9QUk9DXzMyQSApOwpAQCAtOTE5LDYgKzEwMzMsOCBAQAogICAgIEFUT00gYXRvbTsKICAgICBDTEFTUyAqY2xhc3NQdHI7CiAKKyAgICBUUkFDRShjbGFzcywiJXggJXAgJXBcbiIsaEluc3RhbmNlLCBuYW1lLCB3Yyk7CisKICAgICBpZiAoIShhdG9tID0gR2xvYmFsRmluZEF0b20zMlcoIG5hbWUgKSkgfHwKICAgICAgICAgIShjbGFzc1B0ciA9IENMQVNTX0ZpbmRDbGFzc0J5QXRvbSggYXRvbSwgaEluc3RhbmNlICkpIHx8CiAJKGNsYXNzUHRyLT5oSW5zdGFuY2UgJiYgKGhJbnN0YW5jZSAhPSBjbGFzc1B0ci0+aEluc3RhbmNlKSkpCkBAIC05NTEsNiArMTA2Nyw4IEBACiAgICAgQVRPTSBhdG9tOwogICAgIENMQVNTICpjbGFzc1B0cjsKIAorICAgIFRSQUNFKGNsYXNzLCIleCAlcCAlcFxuIixoSW5zdGFuY2UsUFRSX1NFR19UT19MSU4oIG5hbWUgKSwgd2MpOworICAgIAogICAgIGhJbnN0YW5jZSA9IEdldEV4ZVB0ciggaEluc3RhbmNlICk7CiAgICAgaWYgKCEoYXRvbSA9IEdsb2JhbEZpbmRBdG9tMTYoIG5hbWUgKSkgfHwKICAgICAgICAgIShjbGFzc1B0ciA9IENMQVNTX0ZpbmRDbGFzc0J5QXRvbSggYXRvbSwgaEluc3RhbmNlICkpIHx8CkBAIC05ODEsNiArMTA5OSw4IEBACiAgICAgQVRPTSBhdG9tOwogICAgIENMQVNTICpjbGFzc1B0cjsKIAorICAgIFRSQUNFKGNsYXNzLCIleCAlcCAlcFxuIixoSW5zdGFuY2UsIG5hbWUsIHdjKTsKKyAgICAKICAgICBpZiAoIShhdG9tID0gR2xvYmFsRmluZEF0b20zMkEoIG5hbWUgKSkgfHwKICAgICAgICAgIShjbGFzc1B0ciA9IENMQVNTX0ZpbmRDbGFzc0J5QXRvbSggYXRvbSwgaEluc3RhbmNlICkpIHx8CiAgICAgICAgIChoSW5zdGFuY2UgIT0gY2xhc3NQdHItPmhJbnN0YW5jZSkpIHJldHVybiBGQUxTRTsKQEAgLTEwMDksNiArMTEyOSw4IEBACiAgICAgQVRPTSBhdG9tOwogICAgIENMQVNTICpjbGFzc1B0cjsKIAorICAgIFRSQUNFKGNsYXNzLCIleCAlcCAlcFxuIixoSW5zdGFuY2UsIG5hbWUsIHdjKTsKKyAgICAKICAgICBpZiAoIShhdG9tID0gR2xvYmFsRmluZEF0b20zMlcoIG5hbWUgKSkgfHwKICAgICAgICAgIShjbGFzc1B0ciA9IENMQVNTX0ZpbmRDbGFzc0J5QXRvbSggYXRvbSwgaEluc3RhbmNlICkpIHx8CiAgICAgICAgIChoSW5zdGFuY2UgIT0gY2xhc3NQdHItPmhJbnN0YW5jZSkpIHJldHVybiBGQUxTRTsKQEAgLTEwMzMsNiArMTE1NSw3IEBACiAgKi8KIEJPT0wxNiBXSU5BUEkgQ2xhc3NGaXJzdCggQ0xBU1NFTlRSWSAqcENsYXNzRW50cnkgKQogeworICAgIFRSQUNFKGNsYXNzLCIlcFxuIixwQ2xhc3NFbnRyeSk7CiAgICAgcENsYXNzRW50cnktPndOZXh0ID0gMTsKICAgICByZXR1cm4gQ2xhc3NOZXh0KCBwQ2xhc3NFbnRyeSApOwogfQpAQCAtMTA0Niw2ICsxMTY5LDggQEAKICAgICBpbnQgaTsKICAgICBDTEFTUyAqY2xhc3MgPSBmaXJzdENsYXNzOwogCisgICAgVFJBQ0UoY2xhc3MsIiVwXG4iLHBDbGFzc0VudHJ5KTsKKyAgIAogICAgIGlmICghcENsYXNzRW50cnktPndOZXh0KSByZXR1cm4gRkFMU0U7CiAgICAgZm9yIChpID0gMTsgKGkgPCBwQ2xhc3NFbnRyeS0+d05leHQpICYmIGNsYXNzOyBpKyspIGNsYXNzID0gY2xhc3MtPm5leHQ7CiAgICAgaWYgKCFjbGFzcykKZGlmZiAtLWdpdCBhL3dpbmRvd3MvbWVzc2FnZS5jIGIvd2luZG93cy9tZXNzYWdlLmMKaW5kZXggZmEzNTFiMC4uNGU4YzYzMiAxMDA2NDQKLS0tIGEvd2luZG93cy9tZXNzYWdlLmMKKysrIGIvd2luZG93cy9tZXNzYWdlLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlICJkZGUuaCIKICNpbmNsdWRlICJxdWV1ZS5oIgogI2luY2x1ZGUgIndpbnByb2MuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCiAjaW5jbHVkZSAicHJvY2Vzcy5oIgogI2luY2x1ZGUgInRocmVhZC5oIgogI2luY2x1ZGUgIm9wdGlvbnMuaCIKQEAgLTk0MywxMSArOTQ0LDM5IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBQZWVrTWVzc2FnZVcKKyAqICAgICAgICAgUGVla01lc3NhZ2VXICAgICAgICAgICAgIENoZWNrIHF1ZXVlIGZvciBtZXNzYWdlcworICoKKyAqIENoZWNrcyBmb3IgYSBtZXNzYWdlIGluIHRoZSB0aHJlYWQncyBxdWV1ZSwgZmlsdGVyZWQgYXMgZm9yCisgKiBHZXRNZXNzYWdlKCkuIFJldHVybnMgaW1tZWRpYXRlbHkgd2hldGhlciBhIG1lc3NhZ2UgaXMgYXZhaWxhYmxlCisgKiBvciBub3QuCisgKgorICogV2hldGhlciBhIHJldHJpZXZlZCBtZXNzYWdlIGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWUgaXMgc2V0IGJ5IHRoZQorICogX3dSZW1vdmVNc2dfIGZsYWdzLCB3aGljaCBzaG91bGQgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICoKKyAqICAgIFBNX05PUkVNT1ZFICAgIERvIG5vdCByZW1vdmUgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgcXVldWUuIAorICoKKyAqICAgIFBNX1JFTU9WRSAgICAgIFJlbW92ZSB0aGUgbWVzc2FnZSBmcm9tIHRoZSBxdWV1ZS4KKyAqCisgKiBJbiBhZGRpdGlvbiwgUE1fTk9ZSUVMRCBtYXkgYmUgY29tYmluZWQgaW50byBfd1JlbW92ZU1zZ18gdG8KKyAqIHJlcXVlc3QgdGhhdCB0aGUgc3lzdGVtIG5vdCB5aWVsZCBjb250cm9sIGR1cmluZyBQZWVrTWVzc2FnZSgpOworICogaG93ZXZlciBhcHBsaWNhdGlvbnMgbWF5IG5vdCByZWx5IG9uIHNjaGVkdWxpbmcgYmVoYXZpb3IuCisgKiAKKyAqIFJFVFVSTlMKKyAqCisgKiAgTm9uemVybyBpZiBhIG1lc3NhZ2UgaXMgYXZhaWxhYmxlIGFuZCBpcyByZXRyaWV2ZWQsIHplcm8gb3RoZXJ3aXNlLgorICoKKyAqIENPTkZPUk1BTkNFCisgKgorICogRUNNQS0yMzQsIFdpbjMyCisgKgogICovCi1CT09MMzIgV0lOQVBJIFBlZWtNZXNzYWdlMzJXKCBMUE1TRzMyIGxwbXNnLCBIV05EMzIgaHduZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBtaW4sVUlOVDMyIG1heCxVSU5UMzIgd1JlbW92ZU1zZykKLXsKK0JPT0wzMiBXSU5BUEkgUGVla01lc3NhZ2UzMlcoIAorICBMUE1TRzMyIGxwbXNnLCAgICAvKiBidWZmZXIgdG8gcmVjZWl2ZSBtZXNzYWdlICovCisgIEhXTkQzMiBod25kLCAgICAgIC8qIHJlc3RyaWN0IHRvIG1lc3NhZ2VzIGZvciBod25kICovCisgIFVJTlQzMiBtaW4sICAgICAgIC8qIG1pbmltdW0gbWVzc2FnZSB0byByZWNlaXZlICovCisgIFVJTlQzMiBtYXgsICAgICAgIC8qIG1heGltdW0gbWVzc2FnZSB0byByZWNlaXZlICovCisgIFVJTlQzMiB3UmVtb3ZlTXNnIC8qIHJlbW92YWwgZmxhZ3MgKi8gCispIHsKIAkvKiBGSVhNRTogU2hvdWxkIHBlcmZvcm0gVW5pY29kZSB0cmFuc2xhdGlvbiBvbiBzcGVjaWZpYyBtZXNzYWdlcyAqLwogCXJldHVybiBQZWVrTWVzc2FnZTMyQShscG1zZyxod25kLG1pbixtYXgsd1JlbW92ZU1zZyk7CiB9CkBAIC05ODMsMTAgKzEwMTIsMzggQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICBHZXRNZXNzYWdlMzJXICAgKFVTRVIzMi4yNzQpCisgKiAgICAgICAgICBHZXRNZXNzYWdlMzJXICAgKFVTRVIzMi4yNzQpIFJldHJpZXZlIG5leHQgbWVzc2FnZQorICoKKyAqIEdldE1lc3NhZ2UgcmV0cmlldmVzIHRoZSBuZXh0IGV2ZW50IGZyb20gdGhlIGNhbGxpbmcgdGhyZWFkJ3MKKyAqIHF1ZXVlIGFuZCBkZXBvc2l0cyBpdCBpbiAqbHBtc2cuCisgKgorICogSWYgX2h3bmRfIGlzIG5vdCBOVUxMLCBvbmx5IG1lc3NhZ2VzIGZvciB3aW5kb3cgX2h3bmRfIGFuZCBpdHMKKyAqIGNoaWxkcmVuIGFzIHNwZWNpZmllZCBieSBJc0NoaWxkKCkgYXJlIHJldHJpZXZlZC4gSWYgX2h3bmRfIGlzIE5VTEwKKyAqIGFsbCBhcHBsaWNhdGlvbiBtZXNzYWdlcyBhcmUgcmV0cmlldmVkLgorICoKKyAqIF9taW5fIGFuZCBfbWF4XyBzcGVjaWZ5IHRoZSByYW5nZSBvZiBtZXNzYWdlcyBvZiBpbnRlcmVzdC4gSWYKKyAqIG1pbj09bWF4PT0wLCBubyBmaWx0ZXJpbmcgaXMgcGVyZm9ybWVkLiBVc2VmdWwgZXhhbXBsZXMgYXJlCisgKiBXTV9LRVlGSVJTVCBhbmQgV01fS0VZTEFTVCB0byByZXRyaWV2ZSBrZXlib2FyZCBpbnB1dCwgYW5kCisgKiBXTV9NT1VTRUZJUlNUIGFuZCBXTV9NT1VTRUxBU1QgdG8gcmV0cmlldmUgbW91c2UgaW5wdXQuCisgKgorICogV01fUEFJTlQgbWVzc2FnZXMgYXJlIG5vdCByZW1vdmVkIGZyb20gdGhlIHF1ZXVlOyB0aGV5IHJlbWFpbiB1bnRpbAorICogcHJvY2Vzc2VkLiBPdGhlciBtZXNzYWdlcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZS4KKyAqCisgKiBSRVRVUk5TCisgKgorICogLTEgb24gZXJyb3IsIDAgaWYgbWVzc2FnZSBpcyBXTV9RVUlULCBub256ZXJvIG90aGVyd2lzZS4KKyAqCisgKiBDT05GT1JNQU5DRQorICoKKyAqIEVDTUEtMjM0LCBXaW4zMgorICogCiAgKi8KLUJPT0wzMiBXSU5BUEkgR2V0TWVzc2FnZTMyVyhNU0czMiogbHBtc2csSFdORDMyIGh3bmQsVUlOVDMyIG1pbixVSU5UMzIgbWF4KQoteworQk9PTDMyIFdJTkFQSSBHZXRNZXNzYWdlMzJXKAorICBNU0czMiogbHBtc2csIC8qIGJ1ZmZlciB0byByZWNlaXZlIG1lc3NhZ2UgKi8KKyAgSFdORDMyIGh3bmQsICAvKiByZXN0cmljdCB0byBtZXNzYWdlcyBmb3IgaHduZCAqLworICBVSU5UMzIgbWluLCAgIC8qIG1pbmltdW0gbWVzc2FnZSB0byByZWNlaXZlICovCisgIFVJTlQzMiBtYXggICAgLyogbWF4aW11bSBtZXNzYWdlIHRvIHJlY2VpdmUgKi8KKykgewogICAgIEJPT0wzMiByZXQ7CiAgICAgTVNHMTYgKm1zZyA9IFNFR1BUUl9ORVcoTVNHMTYpOwogICAgIGlmICghbXNnKSByZXR1cm4gMDsKQEAgLTEzMzUsMTMgKzEzOTIsNDggQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBXYWl0TWVzc2FnZSAgICAoVVNFUi4xMTIpIChVU0VSMzIuNTc4KQorICogIFdhaXRNZXNzYWdlICAgIChVU0VSLjExMikgKFVTRVIzMi41NzgpICBTdXNwZW5kIHRocmVhZCBwZW5kaW5nIG1lc3NhZ2VzCisgKgorICogV2FpdE1lc3NhZ2UoKSBzdXNwZW5kcyBhIHRocmVhZCB1bnRpbCBldmVudHMgYXBwZWFyIGluIHRoZSB0aHJlYWQncworICogcXVldWUuCisgKgorICogQlVHUworICoKKyAqIElzIHN1cHBvc2VkIHRvIHJldHVybiBCT09MIHVuZGVyIFdpbjMyLgorICoKKyAqIENPTkZPUk1BTkNFCisgKgorICogRUNNQS0yMzQsIFdpbjMyCisgKiAKICAqLwogdm9pZCBXSU5BUEkgV2FpdE1lc3NhZ2UoIHZvaWQgKQogewogICAgIFFVRVVFX1dhaXRCaXRzKCBRU19BTExJTlBVVCApOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBNc2dXYWl0Rm9yTXVsdGlwbGVPYmplY3RzICAgIChVU0VSMzIuNDAwKQorICovCitEV09SRCBXSU5BUEkgTXNnV2FpdEZvck11bHRpcGxlT2JqZWN0cyggRFdPUkQgbkNvdW50LCBIQU5ETEUzMiAqcEhhbmRsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDMyIGZXYWl0QWxsLCBEV09SRCBkd01pbGxpc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1dha2VNYXNrICkKK3sKKyAgICBEV09SRCByZXR2OworCisgICAgVERCICpjdXJyVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIEdldEN1cnJlbnRUYXNrKCkgKTsKKyAgICBIUVVFVUUxNiBoUXVldWUgPSBjdXJyVGFzaz8gY3VyclRhc2stPmhRdWV1ZSA6IDA7CisgICAgTUVTU0FHRVFVRVVFICptc2dRdWV1ZSA9IChNRVNTQUdFUVVFVUUgKilHbG9iYWxMb2NrMTYoIGhRdWV1ZSApOworICAgIGlmICghbXNnUXVldWUpIHJldHVybiAweEZGRkZGRkZGOworCisgICAgbXNnUXVldWUtPmNoYW5nZUJpdHMgPSAwOworICAgIG1zZ1F1ZXVlLT53YWtlTWFzayA9IGR3V2FrZU1hc2s7CisKKyAgICByZXR2ID0gU1lOQ19Eb1dhaXQoIG5Db3VudCwgcEhhbmRsZXMsIGZXYWl0QWxsLCBkd01pbGxpc2Vjb25kcywgRkFMU0UsIFRSVUUgKTsKKworICAgIHJldHVybiByZXR2OworfQorCisKIAogc3RydWN0IGFjY2VudF9jaGFyCiB7CkBAIC0xNjQ5LDYgKzE3NDEsMjQgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgRGlzcGF0Y2hNZXNzYWdlMzJXICAgKFVTRVIzMi4xNDIpCisgKgorICogUHJvY2VzcyB0aGUgbWVzc2FnZSBzcGVjaWZpZWQgaW4gdGhlIHN0cnVjdHVyZSAqX21zZ18uCisgKgorICogSWYgdGhlIGxwTXNnIHBhcmFtZXRlciBwb2ludHMgdG8gYSBXTV9USU1FUiBtZXNzYWdlIGFuZCB0aGUKKyAqIHBhcmFtZXRlciBvZiB0aGUgV01fVElNRVIgbWVzc2FnZSBpcyBub3QgTlVMTCwgdGhlIGxQYXJhbSBwYXJhbWV0ZXIKKyAqIHBvaW50cyB0byB0aGUgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgaW5zdGVhZCBvZiB0aGUgd2luZG93CisgKiBwcm9jZWR1cmUuCisgKiAgCisgKiBUaGUgbWVzc2FnZSBtdXN0IGJlIHZhbGlkLgorICoKKyAqIFJFVFVSTlMKKyAqCisgKiAgIERpc3BhdGNoTWVzc2FnZSgpIHJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgd2luZG93IHByb2NlZHVyZSBpbnZva2VkLgorICoKKyAqIENPTkZPUk1BTkNFCisgKgorICogICBFQ01BLTIzNCwgV2luMzIgCisgKgogICovCiBMT05HIFdJTkFQSSBEaXNwYXRjaE1lc3NhZ2UzMlcoIGNvbnN0IE1TRzMyKiBtc2cgKQogewpkaWZmIC0tZ2l0IGEvd2luZG93cy9tc2dib3guYyBiL3dpbmRvd3MvbXNnYm94LmMKaW5kZXggNmMwODRlNC4uNDQxZWE0YSAxMDA2NDQKLS0tIGEvd2luZG93cy9tc2dib3guYworKysgYi93aW5kb3dzL21zZ2JveC5jCkBAIC0xODMsNiArMTgzLDcgQEAKICAqLwogSU5UMTYgV0lOQVBJIE1lc3NhZ2VCb3gxNiggSFdORDE2IGh3bmQsIExQQ1NUUiB0ZXh0LCBMUENTVFIgdGl0bGUsIFVJTlQxNiB0eXBlKQogeworICAgIFdBUk4oZGlhbG9nLCJNZXNzYWdlYm94XG4iKTsKICAgICByZXR1cm4gTWVzc2FnZUJveDMyQSggaHduZCwgdGV4dCwgdGl0bGUsIHR5cGUgKTsKIH0KIApAQCAtMTkzLDcgKzE5NCw3IEBACiBJTlQzMiBXSU5BUEkgTWVzc2FnZUJveDMyQShIV05EMzIgaFduZCwgTFBDU1RSIHRleHQsIExQQ1NUUiB0aXRsZSwgVUlOVDMyIHR5cGUpCiB7CiAgICAgTVNHQk9YUEFSQU1TMzJBIG1ib3g7Ci0KKyAgICBXQVJOKGRpYWxvZywiTWVzc2FnZWJveFxuIik7CiAgICAgaWYgKCF0ZXh0KSB0ZXh0PSI8V0lORS1OVUxMPiI7CiAgICAgaWYgKCF0aXRsZSkKICAgICAgIHRpdGxlPSJFcnJvciI7CkBAIC0yMTQsNyArMjE1LDExIEBACiB7CiAgICAgTFBTVFIgdGl0bGVBID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB0aXRsZSApOwogICAgIExQU1RSIHRleHRBICA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdGV4dCApOwotICAgIElOVDMyIHJldCA9IE1lc3NhZ2VCb3gzMkEoIGh3bmQsIHRleHRBLCB0aXRsZUEsIHR5cGUgKTsKKyAgICBJTlQzMiByZXQ7CisgICAgCisgICAgV0FSTihkaWFsb2csIk1lc3NhZ2Vib3hcbiIpOworCisgICAgcmV0ID0gTWVzc2FnZUJveDMyQSggaHduZCwgdGV4dEEsIHRpdGxlQSwgdHlwZSApOwogICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB0aXRsZUEgKTsKICAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdGV4dEEgKTsKICAgICByZXR1cm4gcmV0OwpAQCAtMjI3LDYgKzIzMiw3IEBACiBJTlQzMiBXSU5BUEkgTWVzc2FnZUJveEV4MzJBKCBIV05EMzIgaFduZCwgTFBDU1RSIHRleHQsIExQQ1NUUiB0aXRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiB0eXBlLCBXT1JEIGxhbmdpZCApCiB7CisgICAgV0FSTihkaWFsb2csIk1lc3NhZ2Vib3hcbiIpOwogICAgIC8qIGlnbm9yZSBsYW5ndWFnZSBpZCBmb3Igbm93ICovCiAgICAgcmV0dXJuIE1lc3NhZ2VCb3gzMkEoaFduZCx0ZXh0LHRpdGxlLHR5cGUpOwogfQpAQCAtMjM3LDYgKzI0Myw3IEBACiBJTlQzMiBXSU5BUEkgTWVzc2FnZUJveEV4MzJXKCBIV05EMzIgaFduZCwgTFBDV1NUUiB0ZXh0LCBMUENXU1RSIHRpdGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIHR5cGUsIFdPUkQgbGFuZ2lkICkKIHsKKyAgICBXQVJOKGRpYWxvZywiTWVzc2FnZWJveFxuIik7CiAgICAgLyogaWdub3JlIGxhbmd1YWdlIGlkIGZvciBub3cgKi8KICAgICByZXR1cm4gTWVzc2FnZUJveDMyVyhoV25kLHRleHQsdGl0bGUsdHlwZSk7CiB9CkBAIC0yNDcsNiArMjU0LDcgQEAKIElOVDE2IFdJTkFQSSBNZXNzYWdlQm94SW5kaXJlY3QxNiggTFBNU0dCT1hQQVJBTVMxNiBtc2dib3ggKQogewogICAgIE1TR0JPWFBBUkFNUzMyQSBtc2dib3gzMjsKKyAgICBXQVJOKGRpYWxvZywiTWVzc2FnZWJveFxuIik7ICAgIAogICAgIAogICAgIG1zZ2JveDMyLmNiU2l6ZQkJPSBtc2dib3gtPmNiU2l6ZTsKICAgICBtc2dib3gzMi5od25kT3duZXIJCT0gbXNnYm94LT5od25kT3duZXI7CkBAIC0yNzAsNiArMjc4LDcgQEAKICAqLwogSU5UMzIgV0lOQVBJIE1lc3NhZ2VCb3hJbmRpcmVjdDMyQSggTFBNU0dCT1hQQVJBTVMzMkEgbXNnYm94ICkKIHsKKyAgICBXQVJOKGRpYWxvZywiTWVzc2FnZWJveFxuIik7CiAgICAgcmV0dXJuIERpYWxvZ0JveEluZGlyZWN0UGFyYW0zMkEoIG1zZ2JveC0+aEluc3RhbmNlLAogICAgCQkJCSAgICAgIFNZU1JFU19HZXRSZXNQdHIoIFNZU1JFU19ESUFMT0dfTVNHQk9YICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ2JveC0+aHduZE93bmVyLCBNU0dCT1hfRGxnUHJvYywKQEAgLTI4MiwxMCArMjkxLDEzIEBACiBJTlQzMiBXSU5BUEkgTWVzc2FnZUJveEluZGlyZWN0MzJXKCBMUE1TR0JPWFBBUkFNUzMyVyBtc2dib3ggKQogewogICAgIE1TR0JPWFBBUkFNUzMyQQltc2dib3hhOworICAgIFdBUk4oZGlhbG9nLCJNZXNzYWdlYm94XG4iKTsKIAogICAgIG1lbWNweSgmbXNnYm94YSxtc2dib3gsc2l6ZW9mKG1zZ2JveGEpKTsKLSAgICBpZiAobXNnYm94LT5scHN6Q2FwdGlvbikJbHN0cmNweVd0b0EobXNnYm94YS5scHN6Q2FwdGlvbixtc2dib3gtPmxwc3pDYXB0aW9uKTsKLSAgICBpZiAobXNnYm94LT5scHN6VGV4dCkJbHN0cmNweVd0b0EobXNnYm94YS5scHN6VGV4dCxtc2dib3gtPmxwc3pUZXh0KTsKKyAgICBpZiAobXNnYm94LT5scHN6Q2FwdGlvbikJCisgICAgICBsc3RyY3B5V3RvQShtc2dib3hhLmxwc3pDYXB0aW9uLG1zZ2JveC0+bHBzekNhcHRpb24pOworICAgIGlmIChtc2dib3gtPmxwc3pUZXh0KQkKKyAgICAgIGxzdHJjcHlXdG9BKG1zZ2JveGEubHBzelRleHQsbXNnYm94LT5scHN6VGV4dCk7CiAKICAgICByZXR1cm4gTWVzc2FnZUJveEluZGlyZWN0MzJBKCZtc2dib3hhKTsKIH0KQEAgLTI5Niw2ICszMDgsNyBAQAogICovCiB2b2lkIFdJTkFQSSBGYXRhbEFwcEV4aXQxNiggVUlOVDE2IGFjdGlvbiwgTFBDU1RSIHN0ciApCiB7CisgICAgV0FSTihkaWFsb2csIkFwcEV4aXRcbiIpOwogICAgIEZhdGFsQXBwRXhpdDMyQSggYWN0aW9uLCBzdHIgKTsKIH0KIApAQCAtMzA1LDYgKzMxOCw3IEBACiAgKi8KIHZvaWQgV0lOQVBJIEZhdGFsQXBwRXhpdDMyQSggVUlOVDMyIGFjdGlvbiwgTFBDU1RSIHN0ciApCiB7CisgICAgV0FSTihkaWFsb2csIkFwcEV4aXRcbiIpOwogICAgIE1lc3NhZ2VCb3gzMkEoIDAsIHN0ciwgTlVMTCwgTUJfU1lTVEVNTU9EQUwgfCBNQl9PSyApOwogICAgIFRBU0tfS2lsbEN1cnJlbnRUYXNrKDApOwogfQpAQCAtMzE1LDYgKzMyOSw3IEBACiAgKi8KIHZvaWQgV0lOQVBJIEZhdGFsQXBwRXhpdDMyVyggVUlOVDMyIGFjdGlvbiwgTFBDV1NUUiBzdHIgKQogeworICAgIFdBUk4oZGlhbG9nLCJBcHBFeGl0XG4iKTsKICAgICBNZXNzYWdlQm94MzJXKCAwLCBzdHIsIE5VTEwsIE1CX1NZU1RFTU1PREFMIHwgTUJfT0sgKTsKICAgICBUQVNLX0tpbGxDdXJyZW50VGFzaygwKTsKIH0KZGlmZiAtLWdpdCBhL3dpbmRvd3Mvbm9uY2xpZW50LmMgYi93aW5kb3dzL25vbmNsaWVudC5jCmluZGV4IDhhYjhhYmYuLjgyZDc3OWEgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvbm9uY2xpZW50LmMKKysrIGIvd2luZG93cy9ub25jbGllbnQuYwpAQCAtMjYsMTAgKzI2LDYgQEAKICNpbmNsdWRlICJvcHRpb25zLmgiCiAKIAotaW50ICBOQ19NYXhDb250cm9sTnVkZ2U7Ci1pbnQgIE5DX01pbkNvbnRyb2xOdWRnZTsKLVVJTlQzMiAgTkNfQ2FwdGlvblRleHRGbGFnczsKLQogc3RhdGljIEhCSVRNQVAxNiBoYml0bWFwQ2xvc2UgPSAwOwogc3RhdGljIEhCSVRNQVAxNiBoYml0bWFwQ2xvc2VEID0gMDsKIHN0YXRpYyBIQklUTUFQMTYgaGJpdG1hcE1pbmltaXplID0gMDsKQEAgLTkyMSw3ICs5MTcsNyBAQAogCWlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19TWVNNRU5VKQogCSAgICByZWN0LnJpZ2h0IC09IHN5c01ldHJpY3NbU01fQ1lDQVBUSU9OXSArIDE7CiAJCi0JR1JBUEhfRHJhd0JpdG1hcCggaGRjLCBibSwgcmVjdC5yaWdodCArIE5DX01pbkNvbnRyb2xOdWRnZSAtCisJR1JBUEhfRHJhd0JpdG1hcCggaGRjLCBibSwgcmVjdC5yaWdodCAtCiAJCQkgIChzeXNNZXRyaWNzW1NNX0NYU0laRV0gKyBibXN6LmN4KSAvIDIsCiAJCQkgIHJlY3QudG9wICsgKHN5c01ldHJpY3NbU01fQ1lDQVBUSU9OXSAtIDEgLSBibXN6LmN5KSAvIDIsCiAJCQkgIDAsIDAsIGJtc3ouY3gsIGJtc3ouY3ksIEZBTFNFICk7CkBAIC05NzAsMTAgKzk2NiwxMCBAQAogCSAgICByZWN0LnJpZ2h0IC09IHN5c01ldHJpY3NbU01fQ1lDQVBUSU9OXSArIDE7CiAKIAlpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfTUFYSU1JWkVCT1gpCi0JICAgIHJlY3QucmlnaHQgKz0gLTEgKyBOQ19NYXhDb250cm9sTnVkZ2UgLQorCSAgICByZWN0LnJpZ2h0ICs9IC0xIC0KIAkJKHN5c01ldHJpY3NbU01fQ1hTSVpFXSArIGJtc3ouY3gpIC8gMjsKIAotCUdSQVBIX0RyYXdCaXRtYXAoIGhkYywgYm0sIHJlY3QucmlnaHQgKyBOQ19NaW5Db250cm9sTnVkZ2UgLQorCUdSQVBIX0RyYXdCaXRtYXAoIGhkYywgYm0sIHJlY3QucmlnaHQgLQogCQkJICAoc3lzTWV0cmljc1tTTV9DWFNJWkVdICsgYm1zei5jeCkgLyAyLAogCQkJICByZWN0LnRvcCArIChzeXNNZXRyaWNzW1NNX0NZQ0FQVElPTl0gLSAxIC0gYm1zei5jeSkgLyAyLAogCQkJICAwLCAwLCBibXN6LmN4LCBibXN6LmN5LCBGQUxTRSApOwpAQCAtMTI2Niw3ICsxMjYyLDcgQEAKIAogICAgIGlmICh3bmRQdHItPmZsYWdzICYgV0lOX01BTkFHRUQpIHJldHVybjsKIAotICAgIEdSQVBIX0RyYXdMaW5lcyggaGRjLCBzZXAsIDEsIFRXRUFLX1BlbkMwOTUgKTsKKyAgICBHUkFQSF9EcmF3TGluZXMoIGhkYywgc2VwLCAxLCBHZXRTeXNDb2xvclBlbjMyKENPTE9SXzNERkFDRSkgKTsKICAgICByLmJvdHRvbS0tOwogCiAgICAgRmlsbFJlY3QzMiggaGRjLCAmciwgR2V0U3lzQ29sb3JCcnVzaDMyKGFjdGl2ZSA/IENPTE9SX0FDVElWRUNBUFRJT04gOgpAQCAtMTMwOSw3ICsxMzA1LDggQEAKIAllbHNlIFNldFRleHRDb2xvcjMyKCBoZGMsIEdldFN5c0NvbG9yMzIoIENPTE9SX0lOQUNUSVZFQ0FQVElPTlRFWFQgKSApOwogCVNldEJrTW9kZTMyKCBoZGMsIFRSQU5TUEFSRU5UICk7CiAJci5sZWZ0ICs9IDI7Ci0JRHJhd1RleHQzMkEoIGhkYywgYnVmZmVyLCAtMSwgJnIsIE5DX0NhcHRpb25UZXh0RmxhZ3MgKTsKKwlEcmF3VGV4dDMyQSggaGRjLCBidWZmZXIsIC0xLCAmciwKKwkJICAgICBEVF9TSU5HTEVMSU5FIHwgRFRfVkNFTlRFUiB8IERUX05PUFJFRklYIHwgRFRfTEVGVCApOwogCURlbGV0ZU9iamVjdDMyIChTZWxlY3RPYmplY3QzMiAoaGRjLCBoT2xkRm9udCkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3dpbmRvd3MvcXVldWUuYyBiL3dpbmRvd3MvcXVldWUuYwppbmRleCBiNDViYmUyLi43MTJkZWExIDEwMDY0NAotLS0gYS93aW5kb3dzL3F1ZXVlLmMKKysrIGIvd2luZG93cy9xdWV1ZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAiY2xpcGJvYXJkLmgiCiAjaW5jbHVkZSAiaG9vay5oIgorI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJ0aHJlYWQuaCIKICNpbmNsdWRlICJwcm9jZXNzLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKQEAgLTIzNSw2ICsyMzYsMjcgQEAKICAgICB7CiAgICAgICAgIHF1ZXVlLT53YWtlTWFzayA9IDA7CiAgICAgICAgIFBvc3RFdmVudCggcXVldWUtPmhUYXNrICk7CisKKyAgICAgICAgLyogV2FrZSB1cCB0aHJlYWQgd2FpdGluZyBmb3IgbWVzc2FnZSAqLworICAgICAgICAvKiBOT1RFOiBUaGlzIHNob3VsZCByZWFsbHkgd2FrZSB1cCAqdGhlKiB0aHJlYWQgdGhhdCBvd25zCisgICAgICAgICAgICAgICAgIHRoZSBxdWV1ZS4gU2luY2Ugd2UgZG9udCd0IGhhdmUgdGhyZWFkLWxvY2FsIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgcXVldWVzIHlldCwgd2Ugd2FrZSB1cCBhbGwgd2FpdGluZyB0aHJlYWRzIC4uLiAqLworICAgICAgICBTWVNURU1fTE9DSygpOworICAgICAgICB7CisgICAgICAgICAgICBUREIgKnBUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggcXVldWUtPmhUYXNrICk7CisgICAgICAgICAgICBQREIzMiAqcGRiID0gcFRhc2s/IHBUYXNrLT50aGRiLT5wcm9jZXNzIDogTlVMTDsKKyAgICAgICAgICAgIFRIUkVBRF9FTlRSWSAqZW50cnkgPSBwZGI/IHBkYi0+dGhyZWFkX2xpc3QtPm5leHQgOiBOVUxMOworCisgICAgICAgICAgICBpZiAoZW50cnkpCisgICAgICAgICAgICAgICAgZm9yICg7OykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS0+dGhyZWFkLT53YWl0X3N0cnVjdC53YWl0X21zZykKKyAgICAgICAgICAgICAgICAgICAgICAgIFNZTkNfTXNnV2FrZVVwKCBlbnRyeS0+dGhyZWFkICk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeSA9PSBwZGItPnRocmVhZF9saXN0KSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBlbnRyeS0+bmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU1lTVEVNX1VOTE9DSygpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvd2luZG93cy93aW4uYyBiL3dpbmRvd3Mvd2luLmMKaW5kZXggZDkzNjZlNC4uMWIwOWM4YSAxMDA2NDQKLS0tIGEvd2luZG93cy93aW4uYworKysgYi93aW5kb3dzL3dpbi5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSAid2lucHJvYy5oIgogI2luY2x1ZGUgInRocmVhZC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAid2luZXJyb3IuaCIKIAogLyogRGVza3RvcCB3aW5kb3cgKi8KIHN0YXRpYyBXTkQgKnBXbmREZXNrdG9wID0gTlVMTDsKQEAgLTQ1OCwxMyArNDU5LDEzIEBACiAgICAgV05EICp3bmRQdHI7CiAgICAgSFdORDE2IGh3bmQsIGh3bmRMaW5rQWZ0ZXI7CiAgICAgUE9JTlQzMiBtYXhTaXplLCBtYXhQb3MsIG1pblRyYWNrLCBtYXhUcmFjazsKLSAgICBMUkVTVUxUIChXSU5BUEkgKmxvY2FsU2VuZDMyKShIV05EMzIsIFVJTlQzMiwgV1BBUkFNMzIsIExQQVJBTSk7CisgICAgTFJFU1VMVCAoQ0FMTEJBQ0sgKmxvY2FsU2VuZDMyKShIV05EMzIsIFVJTlQzMiwgV1BBUkFNMzIsIExQQVJBTSk7CiAKLSAgICBUUkFDRSh3aW4sICIlcyAlcyAlMDhseCAlMDhseCAlZCwlZCAlZHglZCAiCi0JCSAiJTA0eCAlMDR4ICUwOHggJXBcbiIsIGRlYnVncmVzX2EoY3MtPmxwc3pOYW1lKSwgCi0JCSBkZWJ1Z3Jlc19hKGNzLT5scHN6Q2xhc3MpLCBjcy0+ZHdFeFN0eWxlLCAKLQkJIGNzLT5zdHlsZSwgY3MtPngsIGNzLT55LCBjcy0+Y3gsIGNzLT5jeSwKLQkJIGNzLT5od25kUGFyZW50LCBjcy0+aE1lbnUsIGNzLT5oSW5zdGFuY2UsIGNzLT5scENyZWF0ZVBhcmFtcyk7CisgICAgVFJBQ0Uod2luLCAiJXMgJXMgJTA4bHggJTA4bHggJWQsJWQgJWR4JWQgJTA0eCAlMDR4ICUwOHggJXBcbiIsCisgICAgICAgICAgdW5pY29kZSA/IGRlYnVncmVzX3coKExQV1NUUiljcy0+bHBzek5hbWUpIDogZGVidWdyZXNfYShjcy0+bHBzek5hbWUpLCAKKyAgICAgICAgICB1bmljb2RlID8gZGVidWdyZXNfdygoTFBXU1RSKWNzLT5scHN6Q2xhc3MpIDogZGVidWdyZXNfYShjcy0+bHBzekNsYXNzKSwKKyAgICAgICAgICBjcy0+ZHdFeFN0eWxlLCBjcy0+c3R5bGUsIGNzLT54LCBjcy0+eSwgY3MtPmN4LCBjcy0+Y3ksCisgICAgICAgICAgY3MtPmh3bmRQYXJlbnQsIGNzLT5oTWVudSwgY3MtPmhJbnN0YW5jZSwgY3MtPmxwQ3JlYXRlUGFyYW1zICk7CiAKICAgICAvKiBGaW5kIHRoZSBwYXJlbnQgd2luZG93ICovCiAKQEAgLTU2MywxMCArNTY0LDEzIEBACiAgICAgaWYgKEhPT0tfSXNIb29rZWQoIFdIX0NCVCApKQogICAgIHsKIAlDQlRfQ1JFQVRFV05EMzJBIGNidGM7CisgICAgICAgIExSRVNVTFQgcmV0OwogCiAJY2J0Yy5scGNzID0gY3M7CiAJY2J0Yy5od25kSW5zZXJ0QWZ0ZXIgPSBod25kTGlua0FmdGVyOwotCWlmICggSE9PS19DYWxsSG9va3MzMkEoV0hfQ0JULCBIQ0JUX0NSRUFURVdORCwgaHduZCwgKExQQVJBTSkmY2J0YykgKQorICAgICAgICByZXQgPSB1bmljb2RlID8gSE9PS19DYWxsSG9va3MzMlcoV0hfQ0JULCBIQ0JUX0NSRUFURVdORCwgaHduZCwgKExQQVJBTSkmY2J0YykKKyAgICAgICAgICAgICAgICAgICAgICA6IEhPT0tfQ2FsbEhvb2tzMzJBKFdIX0NCVCwgSENCVF9DUkVBVEVXTkQsIGh3bmQsIChMUEFSQU0pJmNidGMpOworICAgICAgICBpZiAocmV0KQogCXsKIAkgICAgVFJBQ0Uod2luLCAiQ0JULWhvb2sgcmV0dXJuZWQgMFxuIik7CiAJICAgIFVTRVJfSEVBUF9GUkVFKCBod25kICk7CkBAIC0xMjA5LDcgKzEyMTMsOSBAQAogICovCiBIV05EMzIgV0lOQVBJIEZpbmRXaW5kb3czMkEoIExQQ1NUUiBjbGFzc05hbWUsIExQQ1NUUiB0aXRsZSApCiB7Ci0gICAgcmV0dXJuIEZpbmRXaW5kb3dFeDMyQSggMCwgMCwgY2xhc3NOYW1lLCB0aXRsZSApOworICAgIEhXTkQzMiByZXQgPSBGaW5kV2luZG93RXgzMkEoIDAsIDAsIGNsYXNzTmFtZSwgdGl0bGUgKTsKKyAgICBpZiAoIXJldCkgU2V0TGFzdEVycm9yIChFUlJPUl9DQU5OT1RfRklORF9XTkRfQ0xBU1MpOworICAgIHJldHVybiByZXQ7CiB9CiAKIApAQCAtMTIyNSw3ICsxMjMxLDExIEBACiAgICAgewogICAgICAgICAvKiBJZiB0aGUgYXRvbSBkb2Vzbid0IGV4aXN0LCB0aGVuIG5vIGNsYXNzICovCiAgICAgICAgIC8qIHdpdGggdGhpcyBuYW1lIGV4aXN0cyBlaXRoZXIuICovCi0gICAgICAgIGlmICghKGF0b20gPSBHbG9iYWxGaW5kQXRvbTMyQSggY2xhc3NOYW1lICkpKSByZXR1cm4gMDsKKyAgICAgICAgaWYgKCEoYXRvbSA9IEdsb2JhbEZpbmRBdG9tMzJBKCBjbGFzc05hbWUgKSkpIAorICAgICAgICB7CisgICAgICAgICAgICBTZXRMYXN0RXJyb3IgKEVSUk9SX0NBTk5PVF9GSU5EX1dORF9DTEFTUyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gV0lOX0ZpbmRXaW5kb3coIHBhcmVudCwgY2hpbGQsIGF0b20sIHRpdGxlICk7CiB9CkBAIC0xMjQ1LDcgKzEyNTUsMTEgQEAKICAgICB7CiAgICAgICAgIC8qIElmIHRoZSBhdG9tIGRvZXNuJ3QgZXhpc3QsIHRoZW4gbm8gY2xhc3MgKi8KICAgICAgICAgLyogd2l0aCB0aGlzIG5hbWUgZXhpc3RzIGVpdGhlci4gKi8KLSAgICAgICAgaWYgKCEoYXRvbSA9IEdsb2JhbEZpbmRBdG9tMzJXKCBjbGFzc05hbWUgKSkpIHJldHVybiAwOworICAgICAgICBpZiAoIShhdG9tID0gR2xvYmFsRmluZEF0b20zMlcoIGNsYXNzTmFtZSApKSkKKyAgICAgICAgeworICAgICAgICAgICAgU2V0TGFzdEVycm9yIChFUlJPUl9DQU5OT1RfRklORF9XTkRfQ0xBU1MpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KICAgICB9CiAgICAgYnVmZmVyID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB0aXRsZSApOwogICAgIGh3bmQgPSBXSU5fRmluZFdpbmRvdyggcGFyZW50LCBjaGlsZCwgYXRvbSwgYnVmZmVyICk7CkBAIC0xNjI1LDEwICsxNjM5LDc5IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAgICAgU2V0V2luZG93TG9uZzMyVyAgICAoVVNFUjMyLjUxOCkKKyAqCSAgICAgU2V0V2luZG93TG9uZzMyVyAgICAoVVNFUjMyLjUxOCkgU2V0IHdpbmRvdyBhdHRyaWJ1dGUKKyAqCisgKiBTZXRXaW5kb3dMb25nKCkgYWx0ZXJzIG9uZSBvZiBhIHdpbmRvdydzIGF0dHJpYnV0ZXMgb3Igc2V0cyBhIDMyLWJpdCAobG9uZykKKyAqIHZhbHVlIGluIGEgd2luZG93J3MgZXh0cmEgbWVtb3J5LiAKKyAqCisgKiBUaGUgX2h3bmRfIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHdpbmRvdy4gIGlzIHRoZSBoYW5kbGUgdG8gYQorICogd2luZG93IHRoYXQgaGFzIGV4dHJhIG1lbW9yeS4gVGhlIF9uZXd2YWxfIHBhcmFtZXRlciBjb250YWlucyB0aGUKKyAqIG5ldyBhdHRyaWJ1dGUgb3IgZXh0cmEgbWVtb3J5IHZhbHVlLiAgSWYgcG9zaXRpdmUsIHRoZSBfb2Zmc2V0XworICogcGFyYW1ldGVyIGlzIHRoZSBieXRlLWFkZHJlc3NlZCBsb2NhdGlvbiBpbiB0aGUgd2luZG93J3MgZXh0cmEKKyAqIG1lbW9yeSB0byBzZXQuICBJZiBuZWdhdGl2ZSwgX29mZnNldF8gc3BlY2lmaWVzIHRoZSB3aW5kb3cKKyAqIGF0dHJpYnV0ZSB0byBzZXQsIGFuZCBzaG91bGQgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICoKKyAqIEdXTF9FWFNUWUxFICAgICAgVGhlIHdpbmRvdydzIGV4dGVuZGVkIHdpbmRvdyBzdHlsZQorICoKKyAqIEdXTF9TVFlMRSAgICAgICAgVGhlIHdpbmRvdydzIHdpbmRvdyBzdHlsZS4gCisgKgorICogR1dMX1dORFBST0MgICAgICBQb2ludGVyIHRvIHRoZSB3aW5kb3cncyB3aW5kb3cgcHJvY2VkdXJlLiAKKyAqCisgKiBHV0xfSElOU1RBTkNFICAgIFRoZSB3aW5kb3cncyBwcGxpY2F0aW9uIGluc3RhbmNlIGhhbmRsZS4KKyAqCisgKiBHV0xfSUQgICAgICAgICAgIFRoZSB3aW5kb3cncyBpZGVudGlmaWVyLgorICoKKyAqIEdXTF9VU0VSREFUQSAgICAgVGhlIHdpbmRvdydzIHVzZXItc3BlY2lmaWVkIGRhdGEuIAorICoKKyAqIElmIHRoZSB3aW5kb3cgaXMgYSBkaWFsb2cgYm94LCB0aGUgX29mZnNldF8gcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgCisgKiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqCisgKiBEV0xfRExHUFJPQyAgICAgIFRoZSBhZGRyZXNzIG9mIHRoZSB3aW5kb3cncyBkaWFsb2cgYm94IHByb2NlZHVyZS4KKyAqCisgKiBEV0xfTVNHUkVTVUxUICAgIFRoZSByZXR1cm4gdmFsdWUgb2YgYSBtZXNzYWdlIAorICogICAgICAgICAgICAgICAgICB0aGF0IHRoZSBkaWFsb2cgYm94IHByb2NlZHVyZSBwcm9jZXNzZWQuCisgKgorICogRFdMX1VTRVIgICAgICAgICBBcHBsaWNhdGlvbiBzcGVjaWZpYyBpbmZvcm1hdGlvbi4KKyAqCisgKiBSRVRVUk5TCisgKgorICogSWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyB0aGUgcHJldmlvdXMgdmFsdWUgbG9jYXRlZCBhdCBfb2Zmc2V0Xy4gT3RoZXJ3aXNlLAorICogcmV0dXJucyAwLgorICoKKyAqIE5PVEVTCisgKgorICogRXh0cmEgbWVtb3J5IGZvciBhIHdpbmRvdyBjbGFzcyBpcyBzcGVjaWZpZWQgYnkgYSBub256ZXJvIGNiV25kRXh0cmEgCisgKiBwYXJhbWV0ZXIgb2YgdGhlIFdORENMQVNTIHN0cnVjdHVyZSBwYXNzZWQgdG8gUmVnaXN0ZXJDbGFzcygpIGF0IHRoZQorICogdGltZSBvZiBjbGFzcyBjcmVhdGlvbi4KKyAqICAKKyAqIFVzaW5nIEdXTF9XTkRQUk9DIHRvIHNldCBhIG5ldyB3aW5kb3cgcHJvY2VkdXJlIGVmZmVjdGl2ZWx5IGNyZWF0ZXMKKyAqIGEgd2luZG93IHN1YmNsYXNzLiBVc2UgQ2FsbFdpbmRvd1Byb2MoKSBpbiB0aGUgbmV3IHdpbmRvd3MgcHJvY2VkdXJlCisgKiB0byBwYXNzIG1lc3NhZ2VzIHRvIHRoZSBzdXBlcmNsYXNzJ3Mgd2luZG93IHByb2NlZHVyZS4KKyAqCisgKiBUaGUgdXNlciBkYXRhIGlzIHJlc2VydmVkIGZvciB1c2UgYnkgdGhlIGFwcGxpY2F0aW9uIHdoaWNoIGNyZWF0ZWQKKyAqIHRoZSB3aW5kb3cuCisgKgorICogRG8gbm90IHVzZSBHV0xfU1RZTEUgdG8gY2hhbmdlIHRoZSB3aW5kb3cncyBXU19ESVNBQkxFIHN0eWxlOworICogaW5zdGVhZCwgY2FsbCB0aGUgRW5hYmxlV2luZG93KCkgZnVuY3Rpb24gdG8gY2hhbmdlIHRoZSB3aW5kb3cncworICogZGlzYWJsZWQgc3RhdGUuCisgKgorICogRG8gbm90IHVzZSBHV0xfSFdORFBBUkVOVCB0byByZXNldCB0aGUgd2luZG93J3MgcGFyZW50LCB1c2UKKyAqIFNldFBhcmVudCgpIGluc3RlYWQuCisgKgorICogQlVHUworICoKKyAqIEdXTF9TVFlMRSBkb2VzIG5vdCBkaXNwYXRjaCBXTV9TVFlMRV8uLi4gbWVzc2FnZXMuCisgKgorICogQ09ORk9STUFOQ0UKKyAqCisgKiBFQ01BLTIzNCwgV2luMzIgCisgKgogICovCi1MT05HIFdJTkFQSSBTZXRXaW5kb3dMb25nMzJXKCBIV05EMzIgaHduZCwgSU5UMzIgb2Zmc2V0LCBMT05HIG5ld3ZhbCApCi17CitMT05HIFdJTkFQSSBTZXRXaW5kb3dMb25nMzJXKCAKKyAgICBIV05EMzIgaHduZCwgLyogd2luZG93IHRvIGFsdGVyICovCisgICAgSU5UMzIgb2Zmc2V0LCAvKiBvZmZzZXQsIGluIGJ5dGVzLCBvZiBsb2NhdGlvbiB0byBhbHRlciAqLworICAgIExPTkcgbmV3dmFsICAvKiBuZXcgdmFsdWUgb2YgbG9jYXRpb24gKi8KKykgewogICAgIHJldHVybiBXSU5fU2V0V2luZG93TG9uZyggaHduZCwgb2Zmc2V0LCBuZXd2YWwsIFdJTl9QUk9DXzMyVyApOwogfQogCkBAIC0xNjU2LDggKzE3MzksOCBAQAogICovCiBJTlQzMiBXSU5BUEkgSW50ZXJuYWxHZXRXaW5kb3dUZXh0KEhXTkQzMiBod25kLExQV1NUUiBscFN0cmluZyxJTlQzMiBuTWF4Q291bnQgKQogewotCUZJWE1FKHdpbiwiKDB4JTA4bHgsMHglMDhseCwlbGQpLHN0dWIhXG4iLGh3bmQsbHBTdHJpbmcsbk1heENvdW50KTsKLQlyZXR1cm4gR2V0V2luZG93VGV4dDMyVyhod25kLGxwU3RyaW5nLG5NYXhDb3VudCk7CisgICAgRklYTUUod2luLCIoMHglMDh4LCVzLDB4JXgpLHN0dWIhXG4iLGh3bmQsZGVidWdzdHJfdyhscFN0cmluZyksbk1heENvdW50KTsKKyAgICByZXR1cm4gR2V0V2luZG93VGV4dDMyVyhod25kLGxwU3RyaW5nLG5NYXhDb3VudCk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvd2luZG93cy93aW5wcm9jLmMgYi93aW5kb3dzL3dpbnByb2MuYwppbmRleCAwM2ZkZWZmLi5mNjJmODZmIDEwMDY0NAotLS0gYS93aW5kb3dzL3dpbnByb2MuYworKysgYi93aW5kb3dzL3dpbnByb2MuYwpAQCAtMjQ5LDggKzI0OSwxMCBAQAogICAgIHsKICAgICAgICAgaWYgKCgoV0lORE9XUFJPQyAqKXByb2MpLT50eXBlID09IFdJTl9QUk9DXzE2KQogICAgICAgICAgICAgcmV0dXJuIChXTkRQUk9DMTYpJigoV0lORE9XUFJPQyAqKXByb2MpLT50aHVuazsKKyAgICAgICAgZWxzZSBpZiAodHlwZSAhPSAoKFdJTkRPV1BST0MgKilwcm9jKS0+dHlwZSkKKyAgICAgICAgICAgIC8qIEhhdmUgdG8gcmV0dXJuIHRoZSBqbXAgYWRkcmVzcyBpZiB0eXBlcyBkb24ndCBtYXRjaCAqLworICAgICAgICAgICAgcmV0dXJuIChXTkRQUk9DMTYpJigoV0lORE9XUFJPQyAqKXByb2MpLT5qbXA7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIC8qIHJldHVybiAoV05EUFJPQzE2KSYoKFdJTkRPV1BST0MgKilwcm9jKS0+am1wOyAqLwogICAgICAgICAgICAgLyogU29tZSBXaW4xNiBwcm9ncmFtcyB3YW50IHRvIGdldCBiYWNrIHRoZSBwcm9jIHRoZXkgc2V0ICovCiAgICAgICAgICAgICByZXR1cm4gKFdORFBST0MxNikoKFdJTkRPV1BST0MgKilwcm9jKS0+dGh1bmsudF9mcm9tMTYucHJvYzsKICAgICB9CkBAIC04MDMsMTIgKzgwNSwxNSBAQAogICAgICAgICAgICAgKnBscGFyYW0gPSAoTFBBUkFNKXdwOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAxOworICAgIGNhc2UgV01fTk9USUZZOgorICAgIAkqcGxwYXJhbSA9IChMUEFSQU0pUFRSX1NFR19UT19MSU4oKnBscGFyYW0pOworICAgIAlyZXR1cm4gMTsKICAgICBjYXNlIFdNX0FTS0NCRk9STUFUTkFNRToKICAgICBjYXNlIFdNX0RFVk1PREVDSEFOR0U6CiAgICAgY2FzZSBXTV9QQUlOVENMSVBCT0FSRDoKICAgICBjYXNlIFdNX1NJWkVDTElQQk9BUkQ6CiAgICAgY2FzZSBXTV9XSU5JTklDSEFOR0U6Ci0gICAgICAgIFdBUk4oIG1zZywgIm1lc3NhZ2UgJTA0eCBuZWVkcyB0cmFuc2xhdGlvblxuIixtc2cxNiApOworICAgICAgICBGSVhNRSggbXNnLCAibWVzc2FnZSAlMDR4IG5lZWRzIHRyYW5zbGF0aW9uXG4iLG1zZzE2ICk7CiAgICAgICAgIHJldHVybiAtMTsKIAogICAgIGRlZmF1bHQ6ICAvKiBObyB0cmFuc2xhdGlvbiBuZWVkZWQgKi8KQEAgLTE4NTgsMTEgKzE4NjMsMzYgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJICAgICBDYWxsV2luZG93UHJvYzMyQSAgICAoVVNFUjMyLjE4KQorICoJICAgICBDYWxsV2luZG93UHJvYzMyQSAgICAoVVNFUjMyLjE4KSAKKyAqCisgKiBUaGUgQ2FsbFdpbmRvd1Byb2MoKSBmdW5jdGlvbiBpbnZva2VzIHRoZSB3aW5kb3dzIHByb2NlZHVyZSBfZnVuY18sCisgKiB3aXRoIF9od25kXyBhcyB0aGUgdGFyZ2V0IHdpbmRvdywgdGhlIG1lc3NhZ2Ugc3BlY2lmaWVkIGJ5IF9tc2dfLCBhbmQKKyAqIHRoZSBtZXNzYWdlIHBhcmFtZXRlcnMgX3dQYXJhbV8gYW5kIF9sUGFyYW1fLgorICoKKyAqIFNvbWUga2luZHMgb2YgYXJndW1lbnQgY29udmVyc2lvbiBtYXkgYmUgZG9uZSwgSSdtIG5vdCBzdXJlIHdoYXQuCisgKgorICogQ2FsbFdpbmRvd1Byb2MoKSBtYXkgYmUgdXNlZCBmb3Igd2luZG93cyBzdWJjbGFzc2luZy4gVXNlCisgKiBTZXRXaW5kb3dMb25nKCkgdG8gc2V0IGEgbmV3IHdpbmRvd3MgcHJvY2VkdXJlIGZvciB3aW5kb3dzIG9mIHRoZQorICogc3ViY2xhc3MsIGFuZCBoYW5kbGUgc3ViY2xhc3NlZCBtZXNzYWdlcyBpbiB0aGUgbmV3IHdpbmRvd3MKKyAqIHByb2NlZHVyZS4gVGhlIG5ldyB3aW5kb3dzIHByb2NlZHVyZSBtYXkgdGhlbiB1c2UgQ2FsbFdpbmRvd1Byb2MoKQorICogd2l0aCBfZnVuY18gc2V0IHRvIHRoZSBwYXJlbnQgY2xhc3MncyB3aW5kb3dzIHByb2NlZHVyZSB0byBkaXNwYXRjaAorICogdGhlIG1lc3NhZ2UgdG8gdGhlIHN1cGVyY2xhc3MuCisgKgorICogUkVUVVJOUworICoKKyAqICAgIFRoZSByZXR1cm4gdmFsdWUgaXMgbWVzc2FnZSBkZXBlbmRlbnQuCisgKgorICogQ09ORk9STUFOQ0UKKyAqCisgKiAgIEVDTUEtMjM0LCBXaW4zMiAKICAqLwotTFJFU1VMVCBXSU5BUEkgQ2FsbFdpbmRvd1Byb2MzMkEoIFdORFBST0MzMiBmdW5jLCBIV05EMzIgaHduZCwgVUlOVDMyIG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKQoteworTFJFU1VMVCBXSU5BUEkgQ2FsbFdpbmRvd1Byb2MzMkEoIAorICAgIFdORFBST0MzMiBmdW5jLCAvKiB3aW5kb3cgcHJvY2VkdXJlICovCisgICAgSFdORDMyIGh3bmQsIC8qIHRhcmdldCB3aW5kb3cgKi8KKyAgICBVSU5UMzIgbXNnLCAgLyogbWVzc2FnZSAqLworICAgIFdQQVJBTTMyIHdQYXJhbSwgLyogbWVzc2FnZSBkZXBlbmRlbnQgcGFyYW1ldGVyICovCisgICAgTFBBUkFNIGxQYXJhbSAgICAvKiBtZXNzYWdlIGRlcGVuZGVudCBwYXJhbWV0ZXIgKi8KKykgewogICAgIFdJTkRPV1BST0MgKnByb2MgPSBXSU5QUk9DX0dldFB0ciggKFdORFBST0MxNilmdW5jICk7CiAKICAgICBpZiAoIXByb2MpIHJldHVybiBXSU5QUk9DX0NhbGxXbmRQcm9jMzIoIGZ1bmMsIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsK