From: Eric Gouriou Subject: Re: [PATCH 2/2] ext4: optimize memmmove lengths in extent/index insertions Date: Mon, 26 Sep 2011 09:20:52 -0700 Message-ID: References: <1317020069-16355-1-git-send-email-egouriou@google.com> <1317020069-16355-2-git-send-email-egouriou@google.com> <878vpb4hn9.fsf@dmbot.sw.ru> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: base64 Cc: "Theodore Ts'o" , linux-ext4@vger.kernel.org To: Dmitry Monakhov Return-path: Received: from smtp-out.google.com ([74.125.121.67]:12300 "EHLO smtp-out.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751766Ab1IZQU4 (ORCPT ); Mon, 26 Sep 2011 12:20:56 -0400 Received: from wpaz1.hot.corp.google.com (wpaz1.hot.corp.google.com [172.24.198.65]) by smtp-out.google.com with ESMTP id p8QGKrF0025394 for ; Mon, 26 Sep 2011 09:20:54 -0700 Received: from gxk26 (gxk26.prod.google.com [10.202.11.26]) by wpaz1.hot.corp.google.com with ESMTP id p8QGJxL3006521 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT) for ; Mon, 26 Sep 2011 09:20:52 -0700 Received: by gxk26 with SMTP id 26so4626109gxk.13 for ; Mon, 26 Sep 2011 09:20:52 -0700 (PDT) In-Reply-To: <878vpb4hn9.fsf@dmbot.sw.ru> Sender: linux-ext4-owner@vger.kernel.org List-ID: T24gTW9uLCBTZXAgMjYsIDIwMTEgYXQgMDU6MjMsIERtaXRyeSBNb25ha2hvdiA8ZG1vbmFraG92 QG9wZW52ei5vcmc+IHdyb3RlOgo+Cj4gT24gU3VuLCAyNSBTZXAgMjAxMSAyMzo1NDoyOSAtMDcw MCwgRXJpYyBHb3VyaW91IDxlZ291cmlvdUBnb29nbGUuY29tPiB3cm90ZToKPgo+IFNlZW1zIHBh dGNoIHdhcyBnZW5lcmF0ZWQgd2l0aCAiZ2l0IGRpZmYgLVIiCgpJdCB3YXMgZ2VuZXJhdGVkIHRo dXNseToKwqAgZ2l0IGZvcm1hdC1wYXRjaCAtbyB1cHN0cmVhbS1wYXRjaGVzLyAtcyA2MmQzYWM2 CgpJJ20gc3RpbGwgZmFpcmx5IG5ldyBhdCB0aGUgYnVzaW5lc3Mgb2Ygc3VibWl0dGluZyBwYXRj aGVzIHZpYSBtYWlsaW5nIGxpc3RzLApzbyBJJ20gdmVyeSBlYWdlciB0byBoZWFyIGhvdyBJIGNv dWxkIGJlIGRvaW5nIGEgYmV0dGVyIGpvYi4gSW4gdGhpcyBwYXJ0aWN1bGFyCmNhc2UgdGhlIHBh dGNoLCBhcyBzZW50LCBsb29rcyBmaW5lIHRvIG1lLiBnaXQgaXMgbm90IGRvaW5nIGEgZmFudGFz dGljIGpvYiBhdApzaG93aW5nIHRoZSBsb2dpYyBjaGFuZ2VzLCBob3dldmVyIEkgY2FuJ3QgcmVh bGx5IGJsYW1lIGl0LCB0aGUKcmVzdWx0aW5nIGNvbnRyb2wKZmxvdyBpcyBwcmV0dHkgc2ltaWxh ciB0byB0aGUgcHJlLWV4aXN0aW5nIG9uZSwgYnV0IGhvcGVmdWxseSBjbGVhbmVyIGFuZCBtb3Jl CmVmZmljaWVudC4KCiBSZWdhcmRzIC0gRXJpYwoKPgo+ID4gZXh0NF9leHRfaW5zZXJ0X2V4dGVu dCgpIChyZXNwZWN0aXZlbHkgZXh0NF9leHRfaW5zZXJ0X2luZGV4KCkpCj4gPiB3YXMgdXNpbmcg RVhUX01BWF9FWFRFTlQoKSAocmVzcC4gRVhUX01BWF9JTkRFWCgpKSB0byBkZXRlcm1pbmUKPiA+ IGhvdyBtYW55IGVudHJpZXMgbmVlZGVkIHRvIGJlIG1vdmVkIGJleW9uZCB0aGUgaW5zZXJ0aW9u IHBvaW50Lgo+ID4gSW4gcHJhY3RpY2UgdGhpcyBtZWFucyB0aGF0ICgzMjAgLSBJKSAqIDI0IGJ5 dGVzIHdlcmUgbWVtbW92ZSgpJ2QKPiA+IHdoZW4gSSBpcyB0aGUgaW5zZXJ0aW9uIHBvaW50LCBy YXRoZXIgdGhhbiAoI2VudHJpZXMgLSBJKSAqIDI0IGJ5dGVzLgo+ID4KPiA+IFRoaXMgcGF0Y2gg dXNlcyBFWFRfTEFTVF9FWFRFTlQoKSAocmVzcC4gRVhUX0xBU1RfSU5ERVgoKSkgaW5zdGVhZAo+ ID4gdG8gb25seSBtb3ZlIGV4aXN0aW5nIGVudHJpZXMuIFRoZSBjb2RlIGZsb3cgaXMgYWxzbyBz aW1wbGlmaWVkCj4gPiBzbGlnaHRseSB0byBoaWdobGlnaHQgc2ltaWxhcml0aWVzIGFuZCByZWR1 Y2UgY29kZSBkdXBsaWNhdGlvbiBpbgo+ID4gdGhlIGluc2VydGlvbiBsb2dpYy4KPiA+Cj4gPiBU aGlzIHBhdGNoIHJlZHVjZXMgc3lzdGVtIENQVSBjb25zdW1wdGlvbiBieSBvdmVyIDI1JSBvbiBh IDRrQgo+ID4gc3luY2hyb25vdXMgYXBwZW5kIERJTyB3cml0ZSB3b3JrbG9hZCB3aGVuIHVzZWQg d2l0aCB0aGUKPiA+IHByZS0yLjYuMzkgeDg2XzY0IG1lbW1vdmUoKSBpbXBsZW1lbnRhdGlvbi4g V2l0aCB0aGUgbXVjaCBmYXN0ZXIKPiA+IDIuNi4zOSBtZW1tb3ZlKCkgaW1wbGVtZW50YXRpb24g d2Ugc3RpbGwgc2VlIGEgZGVjcmVhc2UgaW4KPiA+IHN5c3RlbSBDUFUgdXNhZ2UgYmV0d2VlbiAy JSBhbmQgNyUuCj4gPgo+ID4gTm90ZSB0aGF0IHRoZSBleHRfZGVidWcoKSBvdXRwdXQgY2hhbmdl cyB3aXRoIHRoaXMgcGF0Y2gsIHNwbGl0dGluZwo+ID4gc29tZSBsb2cgaW5mb3JtYXRpb24gYmV0 d2VlbiBlbnRyaWVzLiBVc2VycyBvZiB0aGUgZXh0X2RlYnVnKCkgb3V0cHV0Cj4gPiBzaG91bGQg bm90ZSB0aGF0IHRoZSAibW92ZSAlZCIgdW5pdHMgY2hhbmdlZCBmcm9tIHJlcG9ydGluZyB0aGUg bnVtYmVyCj4gPiBvZiBieXRlcyBtb3ZlZCB0byByZXBvcnRpbmcgdGhlIG51bWJlciBvZiBlbnRy aWVzIG1vdmVkLgo+ID4KPiA+IFNpZ25lZC1vZmYtYnk6IEVyaWMgR291cmlvdSA8ZWdvdXJpb3VA Z29vZ2xlLmNvbT4KPiA+IC0tLQo+ID4gwqBmcy9leHQ0L2V4dGVudHMuYyB8IMKgIDg1ICsrKysr KysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gPiDCoDEg ZmlsZXMgY2hhbmdlZCwgNDIgaW5zZXJ0aW9ucygrKSwgNDMgZGVsZXRpb25zKC0pCj4gPgo+ID4g ZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0ZW50cy5jIGIvZnMvZXh0NC9leHRlbnRzLmMKPiA+IGlu ZGV4IDBhN2RkODUuLjMwZGQ2NDEgMTAwNjQ0Cj4gPiAtLS0gYS9mcy9leHQ0L2V4dGVudHMuYwo+ ID4gKysrIGIvZnMvZXh0NC9leHRlbnRzLmMKPiA+IEBAIC03NTEsMzEgKzc1MSwyNSBAQCBzdGF0 aWMgaW50IGV4dDRfZXh0X2luc2VydF9pbmRleChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5v ZGUgKmlub2RlLAo+ID4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgcmV0dXJuIC1FSU87Cj4gPiDCoCDC oCDCoCB9Cj4gPgo+ID4gLSDCoCDCoCBsZW4gPSBFWFRfTUFYX0lOREVYKGN1cnAtPnBfaGRyKSAt IGN1cnAtPnBfaWR4Owo+ID4gwqAgwqAgwqAgaWYgKGxvZ2ljYWwgPiBsZTMyX3RvX2NwdShjdXJw LT5wX2lkeC0+ZWlfYmxvY2spKSB7Cj4gPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCAvKiBpbnNlcnQg YWZ0ZXIgKi8KPiA+IC0gwqAgwqAgwqAgwqAgwqAgwqAgaWYgKGN1cnAtPnBfaWR4ICE9IEVYVF9M QVNUX0lOREVYKGN1cnAtPnBfaGRyKSkgewo+ID4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCBsZW4gPSAobGVuIC0gMSkgKiBzaXplb2Yoc3RydWN0IGV4dDRfZXh0ZW50X2lkeCk7Cj4g PiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGxlbiA9IGxlbiA8IDAgPyAwIDogbGVu Owo+ID4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBleHRfZGVidWcoImluc2VydCBu ZXcgaW5kZXggJWQgYWZ0ZXI6ICVsbHUuICIKPiA+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgIm1vdmUgJWQgZnJvbSAweCVwIHRvIDB4JXBc biIsCj4gPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIGxvZ2ljYWwsIHB0ciwgbGVuLAo+ID4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAoY3VycC0+cF9pZHggKyAxKSwgKGN1cnAtPnBf aWR4ICsgMikpOwo+ID4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBtZW1tb3ZlKGN1 cnAtPnBfaWR4ICsgMiwgY3VycC0+cF9pZHggKyAxLCBsZW4pOwo+ID4gLSDCoCDCoCDCoCDCoCDC oCDCoCB9Cj4gPiArIMKgIMKgIMKgIMKgIMKgIMKgIGV4dF9kZWJ1ZygiaW5zZXJ0IG5ldyBpbmRl eCAlZCBhZnRlcjogJWxsdVxuIiwgbG9naWNhbCwgcHRyKTsKPiA+IMKgIMKgIMKgIMKgIMKgIMKg IMKgIGl4ID0gY3VycC0+cF9pZHggKyAxOwo+ID4gwqAgwqAgwqAgfSBlbHNlIHsKPiA+IMKgIMKg IMKgIMKgIMKgIMKgIMKgIC8qIGluc2VydCBiZWZvcmUgKi8KPiA+IC0gwqAgwqAgwqAgwqAgwqAg wqAgbGVuID0gbGVuICogc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dGVudF9pZHgpOwo+ID4gLSDCoCDC oCDCoCDCoCDCoCDCoCBsZW4gPSBsZW4gPCAwID8gMCA6IGxlbjsKPiA+IC0gwqAgwqAgwqAgwqAg wqAgwqAgZXh0X2RlYnVnKCJpbnNlcnQgbmV3IGluZGV4ICVkIGJlZm9yZTogJWxsdS4gIgo+ID4g LSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAibW92ZSAlZCBmcm9t IDB4JXAgdG8gMHglcFxuIiwKPiA+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgbG9naWNhbCwgcHRyLCBsZW4sCj4gPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIGN1cnAtPnBfaWR4LCAoY3VycC0+cF9pZHggKyAxKSk7Cj4gPiAt IMKgIMKgIMKgIMKgIMKgIMKgIG1lbW1vdmUoY3VycC0+cF9pZHggKyAxLCBjdXJwLT5wX2lkeCwg bGVuKTsKPiA+ICsgwqAgwqAgwqAgwqAgwqAgwqAgZXh0X2RlYnVnKCJpbnNlcnQgbmV3IGluZGV4 ICVkIGJlZm9yZTogJWxsdVxuIiwgbG9naWNhbCwgcHRyKTsKPiA+IMKgIMKgIMKgIMKgIMKgIMKg IMKgIGl4ID0gY3VycC0+cF9pZHg7Cj4gPiDCoCDCoCDCoCB9Cj4gPgo+ID4gKyDCoCDCoCBsZW4g PSBFWFRfTEFTVF9JTkRFWChjdXJwLT5wX2hkcikgLSBpeCArIDE7Cj4gPiArIMKgIMKgIEJVR19P TihsZW4gPCAwKTsKPiA+ICsgwqAgwqAgaWYgKGxlbiA+IDApIHsKPiA+ICsgwqAgwqAgwqAgwqAg wqAgwqAgZXh0X2RlYnVnKCJpbnNlcnQgbmV3IGluZGV4ICVkOiAiCj4gPiArIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICJtb3ZlICVkIGluZGljZXMgZnJvbSAweCVw IHRvIDB4JXBcbiIsCj4gPiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIGxvZ2ljYWwsIGxlbiwgaXgsIGl4ICsgMSk7Cj4gPiArIMKgIMKgIMKgIMKgIMKgIMKgIG1l bW1vdmUoaXggKyAxLCBpeCwgbGVuICogc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dGVudF9pZHgpKTsK PiA+ICsgwqAgwqAgfQo+ID4gKwo+ID4gwqAgwqAgwqAgaXgtPmVpX2Jsb2NrID0gY3B1X3RvX2xl MzIobG9naWNhbCk7Cj4gPiDCoCDCoCDCoCBleHQ0X2lkeF9zdG9yZV9wYmxvY2soaXgsIHB0cik7 Cj4gPiDCoCDCoCDCoCBsZTE2X2FkZF9jcHUoJmN1cnAtPnBfaGRyLT5laF9lbnRyaWVzLCAxKTsK PiA+IEBAIC0xNzc4LDQxICsxNzcyLDQ2IEBAIGhhc19zcGFjZToKPiA+IMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGV4dDRfZXh0X3BibG9jayhuZXdleHQpLAo+ ID4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZXh0NF9leHRf aXNfdW5pbml0aWFsaXplZChuZXdleHQpLAo+ID4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4obmV3ZXh0KSk7Cj4gPiAt IMKgIMKgIMKgIMKgIMKgIMKgIHBhdGhbZGVwdGhdLnBfZXh0ID0gRVhUX0ZJUlNUX0VYVEVOVChl aCk7Cj4gPiAtIMKgIMKgIH0gZWxzZSBpZiAobGUzMl90b19jcHUobmV3ZXh0LT5lZV9ibG9jaykK PiA+ICsgwqAgwqAgwqAgwqAgwqAgwqAgbmVhcmV4ID0gRVhUX0ZJUlNUX0VYVEVOVChlaCk7Cj4g PiArIMKgIMKgIH0gZWxzZSB7Cj4gPiArIMKgIMKgIMKgIMKgIMKgIMKgIGlmIChsZTMyX3RvX2Nw dShuZXdleHQtPmVlX2Jsb2NrKQo+ID4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqA+IGxlMzJfdG9fY3B1KG5lYXJleC0+ZWVfYmxvY2spKSB7Cj4gPiAtLyogwqAgwqAgwqAg wqAgwqAgQlVHX09OKG5ld2V4dC0+ZWVfYmxvY2sgPT0gbmVhcmV4LT5lZV9ibG9jayk7ICovCj4g PiAtIMKgIMKgIMKgIMKgIMKgIMKgIGlmIChuZWFyZXggIT0gRVhUX0xBU1RfRVhURU5UKGVoKSkg ewo+ID4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBsZW4gPSBFWFRfTUFYX0VYVEVO VChlaCkgLSBuZWFyZXg7Cj4gPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGxlbiA9 IChsZW4gLSAxKSAqIHNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnQpOwo+ID4gLSDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCBsZW4gPSBsZW4gPCAwID8gMCA6IGxlbjsKPiA+IC0gwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZXh0X2RlYnVnKCJpbnNlcnQgJWQ6JWxsdTpbJWRdJWQg YWZ0ZXI6IG5lYXJlc3QgMHglcCwgIgo+ID4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAibW92ZSAlZCBmcm9tIDB4JXAgdG8gMHglcFxuIiwK PiA+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgLyogSW5zZXJ0IGFmdGVyICovCj4g PiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGV4dF9kZWJ1ZygiaW5zZXJ0ICVkOiVs bHU6WyVkXSVkICVzIGJlZm9yZTogIgo+ID4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAibmVhcmVzdCAweCVwXG4iCj4gPiArIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGxlMzJfdG9fY3B1 KG5ld2V4dC0+ZWVfYmxvY2spLAo+ID4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBleHQ0X2V4dF9wYmxvY2sobmV3ZXh0KSwKPiA+ICsgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZXh0NF9l eHRfaXNfdW5pbml0aWFsaXplZChuZXdleHQpLAo+ID4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihu ZXdleHQpLAo+ID4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCBuZWFyZXgpOwo+ID4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBu ZWFyZXgrKzsKPiA+ICsgwqAgwqAgwqAgwqAgwqAgwqAgfSBlbHNlIHsKPiA+ICsgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgLyogSW5zZXJ0IGJlZm9yZSAqLwo+ID4gKyDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCBCVUdfT04obmV3ZXh0LT5lZV9ibG9jayA9PSBuZWFyZXgtPmVl X2Jsb2NrKTsKPiA+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZXh0X2RlYnVnKCJp bnNlcnQgJWQ6JWxsdTpbJWRdJWQgJXMgYWZ0ZXI6ICIKPiA+ICsgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgIm5lYXJlc3QgMHglcFxuIgo+ID4g wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg bGUzMl90b19jcHUobmV3ZXh0LT5lZV9ibG9jayksCj4gPiDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBleHQ0X2V4dF9wYmxvY2sobmV3ZXh0 KSwKPiA+IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIGV4dDRfZXh0X2lzX3VuaW5pdGlhbGl6ZWQobmV3ZXh0KSwKPiA+IMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGV4dDRfZXh0X2dl dF9hY3R1YWxfbGVuKG5ld2V4dCksCj4gPiAtIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIG5lYXJleCwgbGVuLCBuZWFyZXggKyAxLCBuZWFyZXgg KyAyKTsKPiA+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgbWVtbW92ZShuZWFyZXgg KyAyLCBuZWFyZXggKyAxLCBsZW4pOwo+ID4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBuZWFyZXgpOwo+ID4gKyDCoCDCoCDCoCDCoCDCoCDC oCB9Cj4gPiArIMKgIMKgIMKgIMKgIMKgIMKgIGxlbiA9IEVYVF9MQVNUX0VYVEVOVChlaCkgLSBu ZWFyZXggKyAxOwo+ID4gKyDCoCDCoCDCoCDCoCDCoCDCoCBpZiAobGVuID4gMCkgewo+ID4gKyDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBleHRfZGVidWcoImluc2VydCAlZDolbGx1Olsl ZF0lZDogIgo+ID4gKyDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCAibW92ZSAlZCBleHRlbnRzIGZyb20gMHglcCB0byAweCVwXG4iLAo+ID4gKyDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBsZTMy X3RvX2NwdShuZXdleHQtPmVlX2Jsb2NrKSwKPiA+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZXh0NF9leHRfcGJsb2NrKG5ld2V4dCksCj4g PiArIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IGV4dDRfZXh0X2lzX3VuaW5pdGlhbGl6ZWQobmV3ZXh0KSwKPiA+ICsgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgZXh0NF9leHRfZ2V0X2FjdHVh bF9sZW4obmV3ZXh0KSwKPiA+ICsgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgbGVuLCBuZWFyZXgsIG5lYXJleCArIDEpOwo+ID4gKyDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBtZW1tb3ZlKG5lYXJleCArIDEsIG5lYXJleCwKPiA+ICsg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgbGVuICogc2l6ZW9mKHN0 cnVjdCBleHQ0X2V4dGVudCkpOwo+ID4gwqAgwqAgwqAgwqAgwqAgwqAgwqAgfQo+ID4gLSDCoCDC oCDCoCDCoCDCoCDCoCBwYXRoW2RlcHRoXS5wX2V4dCA9IG5lYXJleCArIDE7Cj4gPiAtIMKgIMKg IH0gZWxzZSB7Cj4gPiAtIMKgIMKgIMKgIMKgIMKgIMKgIEJVR19PTihuZXdleHQtPmVlX2Jsb2Nr ID09IG5lYXJleC0+ZWVfYmxvY2spOwo+ID4gLSDCoCDCoCDCoCDCoCDCoCDCoCBsZW4gPSAoRVhU X01BWF9FWFRFTlQoZWgpIC0gbmVhcmV4KSAqIHNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnQpOwo+ ID4gLSDCoCDCoCDCoCDCoCDCoCDCoCBsZW4gPSBsZW4gPCAwID8gMCA6IGxlbjsKPiA+IC0gwqAg wqAgwqAgwqAgwqAgwqAgZXh0X2RlYnVnKCJpbnNlcnQgJWQ6JWxsdTpbJWRdJWQgYmVmb3JlOiBu ZWFyZXN0IDB4JXAsICIKPiA+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgIm1vdmUgJWQgZnJvbSAweCVwIHRvIDB4JXBcbiIsCj4gPiAtIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIGxlMzJfdG9fY3B1KG5ld2V4dC0+ZWVfYmxvY2sp LAo+ID4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBleHQ0X2V4 dF9wYmxvY2sobmV3ZXh0KSwKPiA+IC0gwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgZXh0NF9leHRfaXNfdW5pbml0aWFsaXplZChuZXdleHQpLAo+ID4gLSDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBleHQ0X2V4dF9nZXRfYWN0dWFsX2xl bihuZXdleHQpLAo+ID4gLSDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCBuZWFyZXgsIGxlbiwgbmVhcmV4LCBuZWFyZXggKyAxKTsKPiA+IC0gwqAgwqAgwqAgwqAgwqAg wqAgbWVtbW92ZShuZWFyZXggKyAxLCBuZWFyZXgsIGxlbik7Cj4gPiAtIMKgIMKgIMKgIMKgIMKg IMKgIHBhdGhbZGVwdGhdLnBfZXh0ID0gbmVhcmV4Owo+ID4gwqAgwqAgwqAgfQo+ID4KPiA+IMKg IMKgIMKgIGxlMTZfYWRkX2NwdSgmZWgtPmVoX2VudHJpZXMsIDEpOwo+ID4gLSDCoCDCoCBuZWFy ZXggPSBwYXRoW2RlcHRoXS5wX2V4dDsKPiA+ICsgwqAgwqAgcGF0aFtkZXB0aF0ucF9leHQgPSBu ZWFyZXg7Cj4gPiDCoCDCoCDCoCBuZWFyZXgtPmVlX2Jsb2NrID0gbmV3ZXh0LT5lZV9ibG9jazsK PiA+IMKgIMKgIMKgIGV4dDRfZXh0X3N0b3JlX3BibG9jayhuZWFyZXgsIGV4dDRfZXh0X3BibG9j ayhuZXdleHQpKTsKPiA+IMKgIMKgIMKgIG5lYXJleC0+ZWVfbGVuID0gbmV3ZXh0LT5lZV9sZW47 Cj4gPiAtLQo+ID4gMS43LjMuMQo+ID4KPiA+IC0tCj4gPiBUbyB1bnN1YnNjcmliZSBmcm9tIHRo aXMgbGlzdDogc2VuZCB0aGUgbGluZSAidW5zdWJzY3JpYmUgbGludXgtZXh0NCIgaW4KPiA+IHRo ZSBib2R5IG9mIGEgbWVzc2FnZSB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwub3JnCj4gPiBNb3Jl IG1ham9yZG9tbyBpbmZvIGF0IMKgaHR0cDovL3ZnZXIua2VybmVsLm9yZy9tYWpvcmRvbW8taW5m by5odG1sCg==