From: Dave Young Subject: Re: [Ext4 punch hole 3/5] Ext4 Punch Hole Support: Punch out extents Date: Tue, 1 Mar 2011 15:38:09 +0800 Message-ID: References: <4D6C633F.4000608@linux.vnet.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: base64 Cc: linux-ext4@vger.kernel.org To: Allison Henderson Return-path: Received: from mail-vx0-f174.google.com ([209.85.220.174]:48444 "EHLO mail-vx0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751100Ab1CAHiK (ORCPT ); Tue, 1 Mar 2011 02:38:10 -0500 Received: by vxi39 with SMTP id 39so3938854vxi.19 for ; Mon, 28 Feb 2011 23:38:09 -0800 (PST) In-Reply-To: <4D6C633F.4000608@linux.vnet.ibm.com> Sender: linux-ext4-owner@vger.kernel.org List-ID: T24gVHVlLCBNYXIgMSwgMjAxMSBhdCAxMTowOCBBTSwgQWxsaXNvbiBIZW5kZXJzb24KPGFjaGVu ZGVyQGxpbnV4LnZuZXQuaWJtLmNvbT4gd3JvdGU6Cj4gVGhpcyBwYXRjaCBtb2RpZmVzIHRoZSB0 cnVuY2F0ZSByb3V0aW5lcyB0byBzdXBwb3J0IGhvbGUgcHVuY2hpbmcKPiBCZWxvdyBpcyBhIGJy aWVmIHN1bW1hcnkgb2YgdGhlIHBhY3RoZXMgY2hhbmdlczoKPgo+IC0gQWRkZWQgbmV3IGZ1bmN0 aW9uICJleHRfZXh0NF9ybV9sZWFmX3B1bmNoX2hvbGUiLgo+IMKgIMKgIMKgIMKgVGhpcyByb3V0 aW5lIGlzIHZlcnkgc2ltaWxhciB0byBleHRfZXh0NF9ybV9sZWFmIGV4Y2VwdCB0aGF0Cj4gwqAg wqAgwqAgwqBpdCBwdW5jaGVzIGEgaG9sZSBpbiBhIGxlYWYgaW5zdGVhZCBvZiBqdXN0IHJlbW92 aW5nIHRoZSB0YWlsCj4gwqAgwqAgwqAgwqBvciByZW1vdmluZyB0aGUgZW50aXJlIGxlYWYgYWxs IHRvZ2V0aGVyCgpUaGVzZSB0d28gZnVuY3Rpb25zIGFyZSBhbG1vc3QgZHVwbGljYXRlLAptZXJn ZSB0aGVtIGFzIG9uZSBmdW5jdGlvbiB3b3VsZCBiZSBiZXR0ZXIKCkFsc28gYXMgQW5kcmVhcyBE aWxnZXIgc2FpZCBjb2Rpbmcgc3R5bGUgcHJvYmxlbXMgbmVlZCBmaXggYXMgd2VsbAoKPgo+IC0g SW1wbGVtZW50ZWQgdGhlICJyZW1vdmUgaGVhZCIgY2FzZSBpbiB0aGUgZXh0X3JlbW92ZV9ibG9j a3Mgcm91dGluZQo+IMKgIMKgIMKgIMKgVGhpcyByb3V0aW5lIGlzIHVzZWQgYnkgZXh0X2V4dDRf cm1fbGVhZiB0byByZW1vdmUgdGhlIHRhaWwKPiDCoCDCoCDCoCDCoG9mIGFuIGV4dGVudCBkdXJp bmcgYSB0cnVuY2F0ZS4gwqBUaGUgbmV3IGV4dF9leHQ0X3JtX2xlYWZfcHVuY2hfaG9sZQo+IMKg IMKgIMKgIMKgcm91dGluZSB3aWxsIG5vdyBhbHNvIHVzZSBpdCB0byByZW1vdmUgdGhlIGhlYWQg b2YgYW4gZXh0ZW50IGluIHRoZQo+IMKgIMKgIMKgIMKgY2FzZSB0aGF0IHRoZSBob2xlIGNvdmVy cyBhIHJlZ2lvbiBvZiBibG9ja3MgYXQgdGhlIGJlZ2lubmluZwo+IMKgIMKgIMKgIMKgb2YgYW4g ZXh0ZW50Lgo+Cj4gLSBBZGRlZCAic3RvcCIgcGFyYW0gdG8gZXh0NF9leHRfcmVtb3ZlX3NwYWNl IHJvdXRpbmUKPiDCoCDCoCDCoCDCoFRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gbW9kaWZpZWQgdG8g YWNjZXB0IGEgc3RvcCBwYXJhbWV0ZXIuIMKgSWYgc3RvcAo+IMKgIMKgIMKgIMKgaXMgbm90IEVY VF9NQVhfQkxPQ0ssIHRoZSByb3V0aW5lIHdpbGwgY2FsbCBleHRfZXh0NF9ybV9sZWFmX3B1bmNo X2hvbGUKPiDCoCDCoCDCoCDCoGluc3RlYWQgb2YgZXh0X2V4dDRfcm1fbGVhZi4KPgo+IC0gQWRk ZWQgbmV3ICJleHQ0X2V4dF9yZWxlYXNlX2Jsb2NrcyIgcm91dGluZQo+IMKgIMKgIMKgIMKgVGhp cyByb3V0aW5lIGlzIGJhc2ljYWxseSB0aGUgZXh0NF9leHRfdHJ1bmNhdGUgcm91dGluZSwgYnV0 Cj4gwqAgwqAgwqAgwqBtb2RpZmllZCB0byBhY2NlcHQgYSAic3RvcCIgcGFyYW0gaW4gYWRkaXRp b24gdG8gInN0YXJ0Ii4gwqBUaGUgZXhpc3RpbmcKPiDCoCDCoCDCoCDCoGV4dDRfZXh0X3RydW5j YXRlIHJvdXRpbmUgaGFzIG5vdyBiZWNvbWUgYSB3cmFwcGVyIHRvIHRoaXMKPiDCoCDCoCDCoCDC oGZ1bmN0aW9uLiDCoFRoZSBzdG9wIHBhcmFtZXRlciBqdXN0IHBhc3NlZCB0aHJvdWdoIHRvIGV4 dDRfZXh0X3JlbW92ZV9zcGFjZQo+Cj4gU2lnbmVkLW9mZi1ieTogQWxsaXNvbiBIZW5kZXJzb24g PGFjaGVuZGVyQHVzLmlibS5jb20+Cj4gLS0tCj4gOjEwMDY0NCAxMDA2NDQgYWIyZTQyZS4uLiBl ZmJjM2VmLi4uIE0gwqBmcy9leHQ0L2V4dGVudHMuYwo+IMKgZnMvZXh0NC9leHRlbnRzLmMgfCDC oDI2NSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyst LQo+IMKgMSBmaWxlcyBjaGFuZ2VkLCAyNTYgaW5zZXJ0aW9ucygrKSwgOSBkZWxldGlvbnMoLSkK Pgo+IGRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dGVudHMuYyBiL2ZzL2V4dDQvZXh0ZW50cy5jCj4g aW5kZXggYWIyZTQyZS4uZWZiYzNlZiAxMDA2NDQKPiAtLS0gYS9mcy9leHQ0L2V4dGVudHMuYwo+ ICsrKyBiL2ZzL2V4dDQvZXh0ZW50cy5jCj4gQEAgLTIxNTksOCArMjE1OSwxNiBAQCBzdGF0aWMg aW50IGV4dDRfcmVtb3ZlX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlu b2RlLAo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlu b2RlLCAwLCBzdGFydCwgbnVtLCBmbGFncyk7Cj4gwqAgwqAgwqAgwqB9IGVsc2UgaWYgKGZyb20g PT0gbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKQo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg ICYmIHRvIDw9IGxlMzJfdG9fY3B1KGV4LT5lZV9ibG9jaykgKyBlZV9sZW4gLSAxKSB7Cj4gLSDC oCDCoCDCoCDCoCDCoCDCoCDCoCBwcmludGsoS0VSTl9JTkZPICJzdHJhbmdlIHJlcXVlc3Q6IHJl bW92YWwgJXUtJXUgZnJvbSAldToldVxuIiwKPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIGZyb20sIHRvLCBsZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spLCBlZV9sZW4pOwo+ICsg wqAgwqAgwqAgwqAgwqAgwqAgwqAgLyogaGVhZCByZW1vdmFsICovCj4gKyDCoCDCoCDCoCDCoCDC oCDCoCDCoCBleHQ0X2xibGtfdCBudW07Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBleHQ0X2Zz YmxrX3Qgc3RhcnQ7Cj4gKwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgbnVtID0gdG8gLSBmcm9t Owo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgc3RhcnQgPSBleHQ0X2V4dF9wYmxvY2soZXgpOwo+ ICsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGV4dF9kZWJ1ZygiZnJlZSBmaXJzdCAldSBibG9j a3Mgc3RhcnRpbmcgJWxsdVxuIiwgbnVtLCBzdGFydCk7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDC oCBleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIDAsIHN0YXJ0LCBudW0sIGZsYWdzKTsK PiArCj4gwqAgwqAgwqAgwqB9IGVsc2Ugewo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgcHJpbnRr KEtFUk5fSU5GTyAic3RyYW5nZSByZXF1ZXN0OiByZW1vdmFsKDIpICIKPiDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCIldS0ldSBmcm9tICV1OiV1XG4iLAo+ IEBAIC0yNDAxLDYgKzI0MDksMjE0IEBAIG91dDoKPiDCoH0KPgo+IMKgLyoKPiArICogZXh0NF9l eHRfcm1fbGVhZl9wdW5jaF9ob2xlKCkgUmVtb3ZlcyB0aGUgZXh0ZW50cyBhc3NvY2lhdGVkIHdp dGggdGhlCj4gKyAqIGJsb2NrcyBhcHBlYXJpbmcgYmV0d2VlbiAic3RhcnQiIGFuZCAic3RvcCIs IGFuZCBzcGxpdHMgdGhlIGV4dGVudHMKPiArICogaWYgInN0YXJ0IiBhbmQgInN0b3AiIGFwcGVh ciBpbiB0aGUgc2FtZSBleHRlbnQKPiArICovCj4gK3N0YXRpYyBpbnQKPiArZXh0NF9leHRfcm1f bGVhZl9wdW5jaF9ob2xlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCj4g KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCwgZXh0NF9s YmxrX3Qgc3RhcnQsIGV4dDRfbGJsa190IHN0b3ApCj4gK3sKPiArIMKgIMKgIMKgIGludCBlcnIg PSAwLCBjb3JyZWN0X2luZGV4ID0gMDsKPiArIMKgIMKgIMKgIGludCBkZXB0aCA9IGV4dF9kZXB0 aChpbm9kZSksIGNyZWRpdHM7Cj4gKyDCoCDCoCDCoCBzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVy ICplaDsKPiArIMKgIMKgIMKgIGV4dDRfbGJsa190IGEsIGIsIGJsb2NrOwo+ICsgwqAgwqAgwqAg dW5zaWduZWQgaW50IG51bTsKPiArIMKgIMKgIMKgIGV4dDRfbGJsa190IGV4X2VlX2Jsb2NrOwo+ ICsgwqAgwqAgwqAgdW5zaWduZWQgc2hvcnQgZXhfZWVfbGVuOwo+ICsgwqAgwqAgwqAgdW5zaWdu ZWQgaW50IHVuaW5pdGlhbGl6ZWQgPSAwOwo+ICsgwqAgwqAgwqAgc3RydWN0IGV4dDRfZXh0ZW50 ICpleCwgKmlfZXg7Cj4gKwo+ICsgwqAgwqAgwqAgLyogdGhlIGhlYWRlciBtdXN0IGJlIGNoZWNr ZWQgYWxyZWFkeSBpbiBleHQ0X2V4dF9yZW1vdmVfc3BhY2UoKSAqLwo+ICsgwqAgwqAgwqAgZXh0 X2RlYnVnKCJ0cnVuY2F0ZSBzaW5jZSAldSBpbiBsZWFmXG4iLCBzdGFydCk7Cj4gKyDCoCDCoCDC oCBpZiAoIXBhdGhbZGVwdGhdLnBfaGRyKQo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcGF0aFtk ZXB0aF0ucF9oZHIgPSBleHRfYmxvY2tfaGRyKHBhdGhbZGVwdGhdLnBfYmgpOwo+ICsKPiArIMKg IMKgIMKgIGVoID0gcGF0aFtkZXB0aF0ucF9oZHI7Cj4gKyDCoCDCoCDCoCBpZiAodW5saWtlbHko cGF0aFtkZXB0aF0ucF9oZHIgPT0gTlVMTCkpIHsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIEVY VDRfRVJST1JfSU5PREUoaW5vZGUsICJwYXRoWyVkXS5wX2hkciA9PSBOVUxMIiwgZGVwdGgpOwo+ ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmV0dXJuIC1FSU87Cj4gKyDCoCDCoCDCoCB9Cj4gKwo+ ICsgwqAgwqAgwqAgLyogZmluZCB3aGVyZSB0byBzdGFydCByZW1vdmluZyAqLwo+ICsgwqAgwqAg wqAgZXggPSBFWFRfTEFTVF9FWFRFTlQoZWgpOwo+ICsKPiArIMKgIMKgIMKgIGV4X2VlX2Jsb2Nr ID0gbGUzMl90b19jcHUoZXgtPmVlX2Jsb2NrKTsKPiArIMKgIMKgIMKgIGV4X2VlX2xlbiA9IGV4 dDRfZXh0X2dldF9hY3R1YWxfbGVuKGV4KTsKPiArCj4gKyDCoCDCoCDCoCB3aGlsZSAoZXggPj0g RVhUX0ZJUlNUX0VYVEVOVChlaCkgJiYKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIGV4X2VlX2Jsb2NrICsgZXhfZWVfbGVuID4gc3RhcnQgKSB7Cj4gKyDCoCDCoCDCoCDCoCDC oCDCoCDCoCBpZiAoZXh0NF9leHRfaXNfdW5pbml0aWFsaXplZChleCkpCj4gKyDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB1bmluaXRpYWxpemVkID0gMTsKPiArIMKgIMKgIMKgIMKg IMKgIMKgIMKgIGVsc2UKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIHVuaW5p dGlhbGl6ZWQgPSAwOwo+ICsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGV4dF9kZWJ1ZygicmVt b3ZlIGV4dCAldTpbJWRdJWRcbiIsIGV4X2VlX2Jsb2NrLAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqB1bmluaXRpYWxpemVkLCBleF9lZV9sZW4pOwo+ICsgwqAgwqAgwqAg wqAgwqAgwqAgwqAgcGF0aFtkZXB0aF0ucF9leHQgPSBleDsKPiArCj4gKyDCoCDCoCDCoCDCoCDC oCDCoCDCoCBhID0gZXhfZWVfYmxvY2sgPiBzdGFydCA/IGV4X2VlX2Jsb2NrIDogc3RhcnQ7Cj4g KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBiID0gZXhfZWVfYmxvY2srZXhfZWVfbGVuIC0gMSA8IHN0 b3AgPyBleF9lZV9ibG9jaytleF9lZV9sZW4gLSAxIDogc3RvcDsKPiArCj4gKyDCoCDCoCDCoCDC oCDCoCDCoCDCoCBleHRfZGVidWcoIiDCoGJvcmRlciAldToldVxuIiwgYSwgYik7Cj4gKwo+ICsg wqAgwqAgwqAgwqAgwqAgwqAgwqAgLyogSWYgdGhpcyBleHRlbnQgaXMgYmV5b25kIHRoZSBlbmQg b2YgdGhlIGhvbGUsIHNraXAgaXQgwqAqLwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaWYoc3Rv cCA8PSBleF9lZV9ibG9jayl7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBl eC0tOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZXhfZWVfYmxvY2sgPSBs ZTMyX3RvX2NwdShleC0+ZWVfYmxvY2spOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgZXhfZWVfbGVuID0gZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4oZXgpOwo+ICsgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgY29udGludWU7Cj4gKyDCoCDCoCDCoCDCoCDCoCDC oCDCoCB9Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBlbHNlIGlmIChhICE9IGV4X2VlX2Jsb2Nr ICYmIGIgIT0gZXhfZWVfYmxvY2sgKyBleF9lZV9sZW4gLSAxKSB7Cj4gKyDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCAvKgo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAqIElmIHRoaXMgaXMgYSB0cnVuY2F0ZSwgdGhlbiB0aGlzIGNvbmRpdGlvbiBzaG91bGQK PiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKiBuZXZlciBoYXBwZW4gYmVj YXNlIGF0IGxlYXN0IG9uZSBvZiB0aGUgZW5kIHBvaW50cwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAqIG5lZWRzIHRvIGJlIG9uIHRoZSBlZGdlIG9mIHRoZSBleHRlbnQu Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCovCj4gKyDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZihzdG9wID09IEVYVF9NQVhfQkxPQ0spewo+ICsgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZXh0X2RlYnVnKCIgwqBi YWQgdHJ1bmNhdGUgJXU6JXVcbiIsIHN0YXJ0LCBzdG9wKTsKPiArIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGJsb2NrID0gMDsKPiArIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG51bSA9IDA7Cj4gKyDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBlcnIgPSAtRUlPOwo+ICsgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZ290byBvdXQ7Cj4gKyDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB9Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCAvKgo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAqIGVsc2Ug dGhpcyBpcyBhIGhvbGUgcHVuY2gsIHNvIHRoZSBleHRlbnQgbmVlZHMgdG8KPiArIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgKiBiZSBzcGxpdCBzaW5jZSBuZWl0aGVyIGVkZ2Ug b2YgdGhlIGhvbGUgaXMgb24gdGhlCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCogZXh0ZW50IGVkZ2UKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg Ki8KPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGVsc2V7Cj4gKyDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBlcnIgPSBleHQ0X3NwbGl0X2V4 dGVudHMoaGFuZGxlLGlub2RlLCBiLHBhdGgsMCk7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZihlcnIpCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBnb3RvIG91dDsKPiArCj4gKyDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBleF9lZV9sZW4gPSBleHQ0 X2V4dF9nZXRfYWN0dWFsX2xlbihleCk7Cj4gKwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgYiA9IGV4X2VlX2Jsb2NrK2V4X2VlX2xlbiAtIDEgPCBzdG9w ID8gZXhfZWVfYmxvY2srZXhfZWVfbGVuIC0gMSA6IHN0b3A7Cj4gKwo+ICsgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgLyogVGhlbiByZW1vdmUgdGFpbCBvZiB0 aGlzIGV4dGVudCAqLwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgYmxvY2sgPSBleF9lZV9ibG9jazsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIG51bSA9IGEgLSBibG9jazsKPiArIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIH0KPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIH0KPiArIMKgIMKgIMKg IMKgIMKgIMKgIMKgIGVsc2UgaWYgKGEgIT0gZXhfZWVfYmxvY2spIHsKPiArIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIC8qIHJlbW92ZSB0YWlsIG9mIHRoZSBleHRlbnQgKi8KPiAr IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGJsb2NrID0gZXhfZWVfYmxvY2s7Cj4g KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBudW0gPSBhIC0gYmxvY2s7Cj4gKyDC oCDCoCDCoCDCoCDCoCDCoCDCoCB9Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBlbHNlIGlmIChi ICE9IGV4X2VlX2Jsb2NrICsgZXhfZWVfbGVuIC0gMSkgewo+ICsgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgLyogcmVtb3ZlIGhlYWQgb2YgdGhlIGV4dGVudCAqLwo+ICsgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgYmxvY2sgPSBiOwo+ICsgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgbnVtID0gwqBleF9lZV9ibG9jaytleF9lZV9sZW4gLSBiOwo+ICsK PiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIC8qIElmIHRoaXMgaXMgYSB0cnVu Y2F0ZSwgdGhpcyBjb25kaXRpb24gc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwo+ICsgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaWYoc3RvcCA9PSBFWFRfTUFYX0JMT0NLKXsKPiArIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGVyciA9IC1FSU87Cj4g KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBnb3RvIG91dDsK PiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIH0KPiArIMKgIMKgIMKgIMKgIMKg IMKgIMKgIH0KPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGVsc2Ugewo+ICsgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgLyogcmVtb3ZlIHdob2xlIGV4dGVudDogZXhjZWxsZW50ISAq Lwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgYmxvY2sgPSBleF9lZV9ibG9j azsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG51bSA9IDA7Cj4gKyDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZiAoYSAhPSBleF9lZV9ibG9jayl7Cj4gKyDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBlcnIgPSAtRUlPOwo+ ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZ290byBvdXQ7 Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB9Cj4gKwo+ICsgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaWYgKGIgIT0gZXhfZWVfYmxvY2sgKyBleF9lZV9sZW4g LSAxKXsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGVy ciA9IC1FSU87Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCBnb3RvIG91dDsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIH0KPiArIMKg IMKgIMKgIMKgIMKgIMKgIMKgIH0KPiArCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCAvKgo+ICsg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAqIDMgZm9yIGxlYWYsIHNiLCBhbmQgaW5vZGUgcGx1cyAy IChibWFwIGFuZCBncm91cAo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAqIGRlc2NyaXB0b3Ip IGZvciBlYWNoIGJsb2NrIGdyb3VwOyBhc3N1bWUgdHdvIGJsb2NrCj4gKyDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCogZ3JvdXBzIHBsdXMgZXhfZWVfbGVuL2Jsb2Nrc19wZXJfYmxvY2tfZ3JvdXAg Zm9yCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCogdGhlIHdvcnN0IGNhc2UKPiArIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgKi8KPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGNyZWRpdHMgPSA3 ICsgMiooZXhfZWVfbGVuL0VYVDRfQkxPQ0tTX1BFUl9HUk9VUChpbm9kZS0+aV9zYikpOwo+ICsg wqAgwqAgwqAgwqAgwqAgwqAgwqAgaWYgKGV4ID09IEVYVF9GSVJTVF9FWFRFTlQoZWgpKSB7Cj4g KyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBjb3JyZWN0X2luZGV4ID0gMTsKPiAr IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGNyZWRpdHMgKz0gKGV4dF9kZXB0aChp bm9kZSkpICsgMTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIH0KPiArIMKgIMKgIMKgIMKgIMKg IMKgIMKgIGNyZWRpdHMgKz0gRVhUNF9NQVhRVU9UQVNfVFJBTlNfQkxPQ0tTKGlub2RlLT5pX3Ni KTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGVyciA9IGV4dDRfZXh0X3RydW5jYXRlX2V4dGVu ZF9yZXN0YXJ0KGhhbmRsZSwgaW5vZGUsIGNyZWRpdHMpOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAg wqAgaWYgKGVycikKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGdvdG8gb3V0 Owo+ICsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGVyciA9IGV4dDRfZXh0X2dldF9hY2Nlc3Mo aGFuZGxlLCBpbm9kZSwgcGF0aCArIGRlcHRoKTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlm IChlcnIpCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBnb3RvIG91dDsKPiAr Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBlcnIgPSBleHQ0X3JlbW92ZV9ibG9ja3MoaGFuZGxl LCBpbm9kZSwgZXgsIGEsIGIpOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaWYgKGVycikKPiAr IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGdvdG8gb3V0Owo+ICsKPiArIMKgIMKg IMKgIMKgIMKgIMKgIMKgIGV4LT5lZV9ibG9jayA9IGNwdV90b19sZTMyKGJsb2NrKTsKPiArIMKg IMKgIMKgIMKgIMKgIMKgIMKgIGV4LT5lZV9sZW4gPSBjcHVfdG9fbGUxNihudW0pOwo+ICsKPiAr IMKgIMKgIMKgIMKgIMKgIMKgIMKgIC8qCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCogSWYg dGhpcyB3YXMgYSBoZWFkIHJlbW92YWwsIHRoZW4gd2UgbmVlZCB0byB1cGRhdGUKPiArIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgKiB0aGUgcGh5c2ljYWwgYmxvY2sgc2luY2UgaXQgaXMgbm93IGF0 IGEgZGlmZmVyZW50Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCogbG9jYXRpb24KPiArIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgKi8KPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGlmIChibG9j ayAhPSBleF9lZV9ibG9jaykKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGV4 dDRfZXh0X3N0b3JlX3BibG9jayhleCwgZXh0NF9leHRfcGJsb2NrKGV4KSsoYi1hKSApOwo+ICsK PiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIC8qCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCog RG8gbm90IG1hcmsgdW5pbml0aWFsaXplZCBpZiBhbGwgdGhlIGJsb2NrcyBpbiB0aGUKPiArIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgKiBleHRlbnQgaGF2ZSBiZWVuIHJlbW92ZWQuCj4gKyDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCovCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZiAodW5pbml0 aWFsaXplZCAmJiBudW0pCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBleHQ0 X2V4dF9tYXJrX3VuaW5pdGlhbGl6ZWQoZXgpOwo+ICsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKg IGVyciA9IGV4dDRfZXh0X2RpcnR5KGhhbmRsZSwgaW5vZGUsIHBhdGggKyBkZXB0aCk7Cj4gKyDC oCDCoCDCoCDCoCDCoCDCoCDCoCBpZiAoZXJyKQo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgZ290byBvdXQ7Cj4gKwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZXh0X2RlYnVn KCJuZXcgZXh0ZW50OiAldToldTolbGx1XG4iLCBibG9jaywgbnVtLAo+ICsgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZXh0NF9leHRfcGJsb2NrKGV4KSk7Cj4g Kwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgaWYgKG51bSA9PSAwKSB7Cj4gKwo+ICsgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgLyoKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgKiBGb3IgaG9sZSBwdW5jaGluZywgd2UgbmVlZCB0byBzY29vdCBhbGwgdGhl Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCogZXh0ZW50cyB1cCBzbyB0 aGF0IHdlIGRvbnQgaGF2ZSBibGFuayBleHRlbnRzCj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCogaW4gdGhlIG1pZGRsZQo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAqLwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZm9yKGlf ZXggPSBleDsgaV9leCA8IEVYVF9MQVNUX0VYVEVOVChlaCk7IGlfZXgrKyl7Cj4gKyDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBtZW1jcHkoaV9leCwgaV9leCsx LCBzaXplb2Yoc3RydWN0IGV4dDRfZXh0ZW50KSk7Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCB9Cj4gKwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgLyog bm93IGdldCByaWQgb2YgdGhlIGV4dGVudCBhdCB0aGUgZW5kIMKgKi8KPiArIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIG1lbXNldChpX2V4LCAwLCBzaXplb2Yoc3RydWN0IGV4dDRf ZXh0ZW50KSk7Cj4gKwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgbGUxNl9h ZGRfY3B1KCZlaC0+ZWhfZW50cmllcywgLTEpOwo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgfQo+ ICsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGV4LS07Cj4gKyDCoCDCoCDCoCDCoCDCoCDCoCDC oCBleF9lZV9ibG9jayA9IGxlMzJfdG9fY3B1KGV4LT5lZV9ibG9jayk7Cj4gKyDCoCDCoCDCoCDC oCDCoCDCoCDCoCBleF9lZV9sZW4gPSBleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihleCk7Cj4gKwo+ ICsgwqAgwqAgwqAgfQo+ICsKPiArIMKgIMKgIMKgIGlmIChjb3JyZWN0X2luZGV4ICYmIGVoLT5l aF9lbnRyaWVzKQo+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZXJyID0gZXh0NF9leHRfY29ycmVj dF9pbmRleGVzKGhhbmRsZSwgaW5vZGUsIHBhdGgpOwo+ICsKPiArIMKgIMKgIMKgIC8qCj4gKyDC oCDCoCDCoCDCoCogSWYgdGhpcyBsZWFmIGlzIGZyZWUsIHRoZW4gd2Ugc2hvdWxkCj4gKyDCoCDC oCDCoCDCoCogcmVtb3ZlIGl0IGZyb20gaW5kZXggYmxvY2sgYWJvdmUKPiArIMKgIMKgIMKgIMKg Ki8KPiArIMKgIMKgIMKgIGlmIChlcnIgPT0gMCAmJiBlaC0+ZWhfZW50cmllcyA9PSAwICYmIHBh dGhbZGVwdGhdLnBfYmggIT0gTlVMTCkKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGVyciA9IGV4 dDRfZXh0X3JtX2lkeChoYW5kbGUsIGlub2RlLCBwYXRoICsgZGVwdGgpOwo+ICsKPiArb3V0Ogo+ ICsgwqAgwqAgwqAgcmV0dXJuIGVycjsKPiArfQo+ICsKPiArLyoKPiDCoCogZXh0NF9leHRfbW9y ZV90b19ybToKPiDCoCogcmV0dXJucyAxIGlmIGN1cnJlbnQgaW5kZXggaGFzIHRvIGJlIGZyZWVk IChldmVuIHBhcnRpYWwpCj4gwqAqLwo+IEBAIC0yNDIxLDcgKzI2MzcsNyBAQCBleHQ0X2V4dF9t b3JlX3RvX3JtKHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKQo+IMKgIMKgIMKgIMKgcmV0dXJu IDE7Cj4gwqB9Cj4KPiAtc3RhdGljIGludCBleHQ0X2V4dF9yZW1vdmVfc3BhY2Uoc3RydWN0IGlu b2RlICppbm9kZSwgZXh0NF9sYmxrX3Qgc3RhcnQpCj4gK3N0YXRpYyBpbnQgZXh0NF9leHRfcmVt b3ZlX3NwYWNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IHN0YXJ0LCBleHQ0X2xi bGtfdCBzdG9wKQo+IMKgewo+IMKgIMKgIMKgIMKgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlu b2RlLT5pX3NiOwo+IMKgIMKgIMKgIMKgaW50IGRlcHRoID0gZXh0X2RlcHRoKGlub2RlKTsKPiBA QCAtMjQ2MCw3ICsyNjc2LDEwIEBAIGFnYWluOgo+IMKgIMKgIMKgIMKgd2hpbGUgKGkgPj0gMCAm JiBlcnIgPT0gMCkgewo+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKGkgPT0gZGVwdGgpIHsK PiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoC8qIHRoaXMgaXMgbGVhZiBibG9j ayAqLwo+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZXJyID0gZXh0NF9leHRf cm1fbGVhZihoYW5kbGUsIGlub2RlLCBwYXRoLCBzdGFydCk7Cj4gKyDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCBpZihzdG9wID09IEVYVF9NQVhfQkxPQ0spCj4gKyDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBlcnIgPSBleHQ0X2V4dF9ybV9sZWFm KGhhbmRsZSwgaW5vZGUsIHBhdGgsIHN0YXJ0KTsKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIGVsc2UKPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIGVyciA9IGV4dDRfZXh0X3JtX2xlYWZfcHVuY2hfaG9sZShoYW5kbGUsIGlub2RlLCBw YXRoLCBzdGFydCwgc3RvcCk7Cj4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAv KiByb290IGxldmVsIGhhcyBwX2JoID09IE5VTEwsIGJyZWxzZSgpIGVhdHMgdGhpcyAqLwo+IMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgYnJlbHNlKHBhdGhbaV0ucF9iaCk7Cj4g wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBwYXRoW2ldLnBfYmggPSBOVUxMOwo+ IEBAIC0zNjI3LDExICszODQ2LDIzIEBAIG91dDI6Cj4gwqAgwqAgwqAgwqByZXR1cm4gZXJyID8g ZXJyIDogYWxsb2NhdGVkOwo+IMKgfQo+Cj4gLXZvaWQgZXh0NF9leHRfdHJ1bmNhdGUoc3RydWN0 IGlub2RlICppbm9kZSkKPiArLyoKPiArICogZXh0NF9leHRfcmVsZWFzZV9ibG9ja3MKPiArICoK PiArICogUmVsZWFzZXMgdGhlIGJsb2NrcyBpbiBhIGZpbGUgc3RhcnRpbmcgYXQgYmxvY2sgInN0 YXJ0Igo+ICsgKiBhbmQgZW5kaW5nIGF0IGJsb2NrICJzdG9wIi4gwqBQYXNzIEVYVF9NQVhfQkxP Q0sKPiArICogZm9yICJzdG9wIiB0byBqdXN0IHRydW5jYXRlIHRoZSBmaWxlIHRvIHRoZQo+ICsg KiAic3RhcnQiIGJsb2NrCj4gKyAqCj4gKyAqIEBpbm9kZTogVGhlIGlub2RlIG9mIHRoZSBmaWxl IHRvIHJlbGVhc2UgYmxvY2tzIGZyb20KPiArICogQHN0YXJ0OiBUaGUgc3RhcnRpbmcgYmxvY2sg b2YgdGhlIGhvbGUKPiArICogQHN0b3A6IMKgVGhlIGVuZGluZyBibG9jayBvZiB0aGUgaG9sZQo+ ICsgKgo+ICsgKi8KPiArc3RhdGljIHZvaWQgZXh0NF9leHRfcmVsZWFzZV9ibG9ja3Moc3RydWN0 IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3Qgc3RhcnQsIGV4dDRfbGJsa190IHN0b3ApCj4gwqB7 Cj4gwqAgwqAgwqAgwqBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21h cHBpbmc7Cj4gwqAgwqAgwqAgwqBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7 Cj4gLSDCoCDCoCDCoCBleHQ0X2xibGtfdCBsYXN0X2Jsb2NrOwo+IMKgIMKgIMKgIMKgaGFuZGxl X3QgKmhhbmRsZTsKPiDCoCDCoCDCoCDCoGludCBlcnIgPSAwOwo+Cj4gQEAgLTM2NzAsOSArMzkw MSw3IEBAIHZvaWQgZXh0NF9leHRfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSkKPiDCoCDC oCDCoCDCoEVYVDRfSShpbm9kZSktPmlfZGlza3NpemUgPSBpbm9kZS0+aV9zaXplOwo+IMKgIMKg IMKgIMKgZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwo+Cj4gLSDCoCDCoCDC oCBsYXN0X2Jsb2NrID0gKGlub2RlLT5pX3NpemUgKyBzYi0+c19ibG9ja3NpemUgLSAxKQo+IC0g wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgPj4gRVhUNF9CTE9DS19TSVpFX0JJVFMo c2IpOwo+IC0gwqAgwqAgwqAgZXJyID0gZXh0NF9leHRfcmVtb3ZlX3NwYWNlKGlub2RlLCBsYXN0 X2Jsb2NrKTsKPiArIMKgIMKgIMKgIGVyciA9IGV4dDRfZXh0X3JlbW92ZV9zcGFjZShpbm9kZSwg c3RhcnQsIHN0b3ApOwo+Cj4gwqAgwqAgwqAgwqAvKiBJbiBhIG11bHRpLXRyYW5zYWN0aW9uIHRy dW5jYXRlLCB3ZSBvbmx5IG1ha2UgdGhlIGZpbmFsCj4gwqAgwqAgwqAgwqAgKiB0cmFuc2FjdGlv biBzeW5jaHJvbm91cy4KPiBAQCAtMzY5OCw2ICszOTI3LDI0IEBAIG91dF9zdG9wOgo+IMKgfQo+ Cj4gwqAvKgo+ICsgKiBleHQ0X2V4dF90cnVuY2F0ZQo+ICsgKgo+ICsgKiBUcnVuY2F0ZSB0aGUg ZmlsZSB0byB0aGUgY3VycmVudCBpX3NpemUKPiArICoKPiArICogQGlub2RlOiBUaGUgZmlsZSBp bm9kZQo+ICsgKi8KPiArdm9pZCBleHQ0X2V4dF90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2Rl KQo+ICt7Cj4gKyDCoCDCoCDCoCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7 Cj4gKyDCoCDCoCDCoCBleHQ0X2xibGtfdCBsYXN0X2Jsb2NrOwo+ICsKPiArIMKgIMKgIMKgIGxh c3RfYmxvY2sgPSAoaW5vZGUtPmlfc2l6ZSArIHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpCj4gKyDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCA+PiBFWFQ0X0JMT0NLX1NJWkVfQklUUyhzYik7 Cj4gKwo+ICsgwqAgwqAgwqAgZXh0NF9leHRfcmVsZWFzZV9ibG9ja3MoaW5vZGUsIGxhc3RfYmxv Y2ssIEVYVF9NQVhfQkxPQ0spOwo+ICsKPiArfQo+ICsvKgo+IMKgKiBleHQ0X2V4dF9jb252ZXJ0 X2Jsb2Nrc191bmluaXQoKQo+IMKgKiBDb252ZXJ0cyBhIHJhbmdlIG9mIGJsb2NrcyB0byB1bmlu aXRpYWxpemVkCj4gwqAqCj4gLS0KPiAxLjcuMQo+Cj4KPiAtLQo+IFRvIHVuc3Vic2NyaWJlIGZy b20gdGhpcyBsaXN0OiBzZW5kIHRoZSBsaW5lICJ1bnN1YnNjcmliZSBsaW51eC1leHQ0IiBpbgo+ IHRoZSBib2R5IG9mIGEgbWVzc2FnZSB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwub3JnCj4gTW9y ZSBtYWpvcmRvbW8gaW5mbyBhdCDCoGh0dHA6Ly92Z2VyLmtlcm5lbC5vcmcvbWFqb3Jkb21vLWlu Zm8uaHRtbAo+CgoKCi0tIApSZWdhcmRzCmRhdmUK