From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tvrtko Ursulin Subject: Re: [PATCH 5/6] drm/i915: dynamically allocate forcewake domains Date: Wed, 19 Jun 2019 15:22:17 +0100 Message-ID: References: <20190617180935.505-1-daniele.ceraolospurio@intel.com> <20190617180935.505-6-daniele.ceraolospurio@intel.com> <550f7eb9-7021-4dd2-2f8f-90f95bcec715@linux.intel.com> <2f8d35a3-7c47-9a02-7bbb-5b4d72ccfbe1@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by gabe.freedesktop.org (Postfix) with ESMTPS id E48336E3D2 for ; Wed, 19 Jun 2019 14:22:19 +0000 (UTC) In-Reply-To: <2f8d35a3-7c47-9a02-7bbb-5b4d72ccfbe1@intel.com> Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Daniele Ceraolo Spurio , intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org Ck9uIDE5LzA2LzIwMTkgMDA6MDYsIERhbmllbGUgQ2VyYW9sbyBTcHVyaW8gd3JvdGU6Cj4gT24g Ni8xOC8xOSAyOjIzIEFNLCBUdnJ0a28gVXJzdWxpbiB3cm90ZToKPj4gT24gMTcvMDYvMjAxOSAx OTowOSwgRGFuaWVsZSBDZXJhb2xvIFNwdXJpbyB3cm90ZToKPj4+IFdlJ2QgbGlrZSB0byBpbnRy b2R1Y2UgYSBkaXNwbGF5IHVuY29yZSB3aXRoIG5vIGZvcmNld2FrZSBkb21haW5zLCBzbwo+Pj4g bGV0J3MgYXZvaWQgd2FzdGluZyBtZW1vcnkgYW5kIGJlIHJlYWR5IHRvIGFsbG9jYXRlIG9ubHkg d2hhdCB3ZSBuZWVkLgo+Pj4gRXZlbiB3aXRob3V0IG11bHRpcGxlIHVuY29yZSwgd2Ugc3RpbGwg ZG9uJ3QgbmVlZCBhbGwgdGhlIGRvbWFpbnMgb24gYWxsCj4+PiBnZW5zLgo+Pgo+PiBMb29rcyBn b29kIGluIHByaW5jaXBsZSwgb25seSBhIGZldyBjb252ZXJzYXRpb24gcG9pbnRzIGJlbG93Lgo+ Pgo+Pj4KPj4+IFNpZ25lZC1vZmYtYnk6IERhbmllbGUgQ2VyYW9sbyBTcHVyaW8gPGRhbmllbGUu Y2VyYW9sb3NwdXJpb0BpbnRlbC5jb20+Cj4+PiAtLS0KPj4+IMKgIGRyaXZlcnMvZ3B1L2RybS9p OTE1L2ludGVsX3VuY29yZS5jIHwgMTU1ICsrKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0KPj4+ IMKgIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3VuY29yZS5oIHzCoCAxMyArLS0KPj4+IMKg IDIgZmlsZXMgY2hhbmdlZCwgMTAyIGluc2VydGlvbnMoKyksIDY2IGRlbGV0aW9ucygtKQo+Pj4K Pj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF91bmNvcmUuYyAKPj4+ IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfdW5jb3JlLmMKPj4+IGluZGV4IGMwZjU1Njdl ZTA5Ni4uN2YzMTE4MjdjM2VmIDEwMDY0NAo+Pj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUv aW50ZWxfdW5jb3JlLmMKPj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3VuY29y ZS5jCj4+PiBAQCAtMzQ0LDcgKzM0NCw3IEBAIGludGVsX3VuY29yZV9md19yZWxlYXNlX3RpbWVy KHN0cnVjdCBocnRpbWVyICp0aW1lcikKPj4+IMKgIHsKPj4+IMKgwqDCoMKgwqAgc3RydWN0IGlu dGVsX3VuY29yZV9mb3JjZXdha2VfZG9tYWluICpkb21haW4gPQo+Pj4gwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGNvbnRhaW5lcl9vZih0aW1lciwgc3RydWN0IAo+Pj4gaW50ZWxfdW5jb3JlX2Zv cmNld2FrZV9kb21haW4sIHRpbWVyKTsKPj4+IC3CoMKgwqAgc3RydWN0IGludGVsX3VuY29yZSAq dW5jb3JlID0gZm9yY2V3YWtlX2RvbWFpbl90b191bmNvcmUoZG9tYWluKTsKPj4+ICvCoMKgwqAg c3RydWN0IGludGVsX3VuY29yZSAqdW5jb3JlID0gZG9tYWluLT51bmNvcmU7Cj4+PiDCoMKgwqDC oMKgIHVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7Cj4+PiDCoMKgwqDCoMKgIGFzc2VydF9ycG1fZGV2 aWNlX25vdF9zdXNwZW5kZWQodW5jb3JlLT5ycG0pOwo+Pj4gQEAgLTEyOTEsMjMgKzEyOTEsMjMg QEAgZG8geyBcCj4+PiDCoMKgwqDCoMKgICh1bmNvcmUpLT5mdW5jcy5yZWFkX2Z3X2RvbWFpbnMg PSB4IyNfcmVnX3JlYWRfZndfZG9tYWluczsgXAo+Pj4gwqAgfSB3aGlsZSAoMCkKPj4+IC1zdGF0 aWMgdm9pZCBmd19kb21haW5faW5pdChzdHJ1Y3QgaW50ZWxfdW5jb3JlICp1bmNvcmUsCj4+PiAr c3RhdGljIGludCBmd19kb21haW5faW5pdChzdHJ1Y3QgaW50ZWxfdW5jb3JlICp1bmNvcmUsCj4+ PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlbnVtIGZvcmNld2FrZV9kb21haW5f aWQgZG9tYWluX2lkLAo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaTkxNV9y ZWdfdCByZWdfc2V0LAo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaTkxNV9y ZWdfdCByZWdfYWNrKQo+Pj4gwqAgewo+Pj4gwqDCoMKgwqDCoCBzdHJ1Y3QgaW50ZWxfdW5jb3Jl X2ZvcmNld2FrZV9kb21haW4gKmQ7Cj4+PiAtwqDCoMKgIGlmIChXQVJOX09OKGRvbWFpbl9pZCA+ PSBGV19ET01BSU5fSURfQ09VTlQpKQo+Pj4gLcKgwqDCoMKgwqDCoMKgIHJldHVybjsKPj4+IC0K Pj4+IC3CoMKgwqAgZCA9ICZ1bmNvcmUtPmZ3X2RvbWFpbltkb21haW5faWRdOwo+Pj4gK8KgwqDC oCBHRU1fQlVHX09OKGRvbWFpbl9pZCA+PSBGV19ET01BSU5fSURfQ09VTlQpOwo+Pj4gLcKgwqDC oCBXQVJOX09OKGQtPndha2VfY291bnQpOwo+Pgo+PiBJIHdvbmRlciB3aGF0IHdhcyB0aGlzIGZv ci4KPj4KPj4gRG8geW91IHdhbnQgdG8gYWRkIHNvbWUgcHJvdGVjdGlvbiBhZ2FpbnN0IGRvdWJs ZSBpbml0IG9mIHRoZSBzYW1lIAo+PiBkb21haW4/Cj4+Cj4gCj4ganVzdCBhIEdFTV9CVUdfT04g bWF5YmU/IEl0IHNob3VsZG4ndCByZWFsbHkgZXZlciBoYXBwZW4gdW5sZXNzIHdlJ3JlIAo+IG1v dmluZyBzb21ldGhpbmcgYXJvdW5kLgoKWWVzLCBzb3VuZHMgcmlnaHQuCgo+IAo+Pj4gK8KgwqDC oCBkID0ga3phbGxvYyhzaXplb2YoKmQpLCBHRlBfS0VSTkVMKTsKPj4+ICvCoMKgwqAgaWYgKCFk KQo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAtRU5PTUVNOwo+Pj4gwqDCoMKgwqDCoCBXQVJO X09OKCFpOTE1X21taW9fcmVnX3ZhbGlkKHJlZ19zZXQpKTsKPj4+IMKgwqDCoMKgwqAgV0FSTl9P TighaTkxNV9tbWlvX3JlZ192YWxpZChyZWdfYWNrKSk7Cj4+PiArwqDCoMKgIGQtPnVuY29yZSA9 IHVuY29yZTsKPj4+IMKgwqDCoMKgwqAgZC0+d2FrZV9jb3VudCA9IDA7Cj4+PiDCoMKgwqDCoMKg IGQtPnJlZ19zZXQgPSB1bmNvcmUtPnJlZ3MgKyBpOTE1X21taW9fcmVnX29mZnNldChyZWdfc2V0 KTsKPj4+IMKgwqDCoMKgwqAgZC0+cmVnX2FjayA9IHVuY29yZS0+cmVncyArIGk5MTVfbW1pb19y ZWdfb2Zmc2V0KHJlZ19hY2spOwo+Pj4gQEAgLTEzMjQsNyArMTMyNCw2IEBAIHN0YXRpYyB2b2lk IGZ3X2RvbWFpbl9pbml0KHN0cnVjdCBpbnRlbF91bmNvcmUgCj4+PiAqdW5jb3JlLAo+Pj4gwqDC oMKgwqDCoCBCVUlMRF9CVUdfT04oRk9SQ0VXQUtFX01FRElBX1ZFQk9YMCAhPSAoMSA8PCAKPj4+ IEZXX0RPTUFJTl9JRF9NRURJQV9WRUJPWDApKTsKPj4+IMKgwqDCoMKgwqAgQlVJTERfQlVHX09O KEZPUkNFV0FLRV9NRURJQV9WRUJPWDEgIT0gKDEgPDwgCj4+PiBGV19ET01BSU5fSURfTUVESUFf VkVCT1gxKSk7Cj4+PiAtCj4+PiDCoMKgwqDCoMKgIGQtPm1hc2sgPSBCSVQoZG9tYWluX2lkKTsK Pj4+IMKgwqDCoMKgwqAgaHJ0aW1lcl9pbml0KCZkLT50aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBI UlRJTUVSX01PREVfUkVMKTsKPj4+IEBAIC0xMzMzLDYgKzEzMzIsMTAgQEAgc3RhdGljIHZvaWQg ZndfZG9tYWluX2luaXQoc3RydWN0IGludGVsX3VuY29yZSAKPj4+ICp1bmNvcmUsCj4+PiDCoMKg wqDCoMKgIHVuY29yZS0+ZndfZG9tYWlucyB8PSBCSVQoZG9tYWluX2lkKTsKPj4+IMKgwqDCoMKg wqAgZndfZG9tYWluX3Jlc2V0KGQpOwo+Pj4gKwo+Pj4gK8KgwqDCoCB1bmNvcmUtPmZ3X2RvbWFp bltkb21haW5faWRdID0gZDsKPj4+ICsKPj4+ICvCoMKgwqAgcmV0dXJuIDA7Cj4+PiDCoCB9Cj4+ PiDCoCBzdGF0aWMgdm9pZCBmd19kb21haW5fZmluaShzdHJ1Y3QgaW50ZWxfdW5jb3JlICp1bmNv cmUsCj4+PiBAQCAtMTM0MCw3NyArMTM0Myw5MiBAQCBzdGF0aWMgdm9pZCBmd19kb21haW5fZmlu aShzdHJ1Y3QgCj4+PiBpbnRlbF91bmNvcmUgKnVuY29yZSwKPj4+IMKgIHsKPj4+IMKgwqDCoMKg wqAgc3RydWN0IGludGVsX3VuY29yZV9mb3JjZXdha2VfZG9tYWluICpkOwo+Pj4gLcKgwqDCoCBp ZiAoV0FSTl9PTihkb21haW5faWQgPj0gRldfRE9NQUlOX0lEX0NPVU5UKSkKPj4+IC3CoMKgwqDC oMKgwqDCoCByZXR1cm47Cj4+PiArwqDCoMKgIEdFTV9CVUdfT04oZG9tYWluX2lkID49IEZXX0RP TUFJTl9JRF9DT1VOVCk7Cj4+PiAtwqDCoMKgIGQgPSAmdW5jb3JlLT5md19kb21haW5bZG9tYWlu X2lkXTsKPj4+ICvCoMKgwqAgZCA9IGZldGNoX2FuZF96ZXJvKCZ1bmNvcmUtPmZ3X2RvbWFpbltk b21haW5faWRdKTsKPj4KPj4gTWF5YmUgZWFybHkgaWYgIWQgaGVyZSBhbmQgZnVuY3Rpb24gZmxv dyBqdXN0IGNhcnJpZXMgb24/Cj4+Cj4gCj4gd2lsbCBkby4KPiAKPj4+ICvCoMKgwqAgdW5jb3Jl LT5md19kb21haW5zICY9IH5CSVQoZG9tYWluX2lkKTsKPj4+IC3CoMKgwqAgV0FSTl9PTihkLT53 YWtlX2NvdW50KTsKPj4+IC3CoMKgwqAgV0FSTl9PTihocnRpbWVyX2NhbmNlbCgmZC0+dGltZXIp KTsKPj4+IC3CoMKgwqAgbWVtc2V0KGQsIDAsIHNpemVvZigqZCkpOwo+Pj4gK8KgwqDCoCBpZiAo ZCkgewo+Pj4gK8KgwqDCoMKgwqDCoMKgIFdBUk5fT04oZC0+d2FrZV9jb3VudCk7Cj4+PiArwqDC oMKgwqDCoMKgwqAgV0FSTl9PTihocnRpbWVyX2NhbmNlbCgmZC0+dGltZXIpKTsKPj4+ICvCoMKg wqDCoMKgwqDCoCBrZnJlZShkKTsKPj4+ICvCoMKgwqAgfQo+Pj4gK30KPj4+IC3CoMKgwqAgdW5j b3JlLT5md19kb21haW5zICY9IH5CSVQoZG9tYWluX2lkKTsKPj4+ICtzdGF0aWMgdm9pZCBpbnRl bF91bmNvcmVfZndfZG9tYWluc19maW5pKHN0cnVjdCBpbnRlbF91bmNvcmUgKnVuY29yZSkKPj4+ ICt7Cj4+PiArwqDCoMKgIHN0cnVjdCBpbnRlbF91bmNvcmVfZm9yY2V3YWtlX2RvbWFpbiAqZDsK Pj4+ICvCoMKgwqAgaW50IHRtcDsKPj4+ICsKPj4+ICvCoMKgwqAgZm9yX2VhY2hfZndfZG9tYWlu KGQsIHVuY29yZSwgdG1wKQo+Pj4gK8KgwqDCoMKgwqDCoMKgIGZ3X2RvbWFpbl9maW5pKHVuY29y ZSwgZC0+aWQpOwo+Pj4gwqAgfQo+Pj4gLXN0YXRpYyB2b2lkIGludGVsX3VuY29yZV9md19kb21h aW5zX2luaXQoc3RydWN0IGludGVsX3VuY29yZSAqdW5jb3JlKQo+Pj4gK3N0YXRpYyBpbnQgaW50 ZWxfdW5jb3JlX2Z3X2RvbWFpbnNfaW5pdChzdHJ1Y3QgaW50ZWxfdW5jb3JlICp1bmNvcmUpCj4+ PiDCoCB7Cj4+PiDCoMKgwqDCoMKgIHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gdW5j b3JlLT5pOTE1Owo+Pj4gK8KgwqDCoCBpbnQgcmV0Owo+Pj4gwqDCoMKgwqDCoCBHRU1fQlVHX09O KCFpbnRlbF91bmNvcmVfaGFzX2ZvcmNld2FrZSh1bmNvcmUpKTsKPj4+ICsjZGVmaW5lIF9fZndf ZG9tYWluX2luaXQoaWRfXywgc2V0X18sIGFja19fKSBcCj4+PiArwqDCoMKgIHJldCA9IGZ3X2Rv bWFpbl9pbml0KHVuY29yZSwgKGlkX18pLCAoc2V0X18pLCAoYWNrX18pKTsgXAo+Pj4gK8KgwqDC oCBpZiAocmV0KSBcCj4+PiArwqDCoMKgwqDCoMKgwqAgZ290byBvdXRfY2xlYW47Cj4+Cj4+IEhp ZGRlbiBjb250cm9sIGZsb3cgaXMgc2xpZ2h0bHkgb2JqZWN0aW9uYWJsZSBidXQgSSBkb24ndCBv ZmZlciBhbnkgCj4+IG5pY2UgYWx0ZXJuYXRpdmVzIHNvIEkgZ3Vlc3Mgd2lsbCBoYXZlIHRvIHBh c3MuIE9yIG1heWJlIGFjY3VtdWxhdGUgCj4+IHRoZSBlcnJvciAoZXJyIHw9IGZ3X2RvbWFpbl9p bml0KC4uKSkgYXMgeW91IGdvIGFuZCB0aGVuIGNsZWFudXAgYXQgCj4+IHRoZSBlbmQgaWYgYW55 IGZhaWxlZD8KPiAKPiBJJ2QgcHJlZmVyIHRvIGF2b2lkIGFjY3VtdWxhdGluZyB0aGUgZXJyb3Ig c2luY2UgaXQnZCBqdXN0IGNhdXNlIHVzIHRvIAo+IGhhdmluZyB0byB1bnJvbGwgbW9yZSBkb21h aW5zIHdoZW4gd2UgY291bGQndmUgc3RvcHBlZCBlYXJseS4KCkFsdGhvdWdoIHVucm9sbGluZyBo YXBwZW5zIGNsb3NlIHRvIG5ldmVyLWV2ZXIgc28gaXQgaXNuJ3QgYSBwcmFjdGljYWwgCmNvbmNl cm4uLgoKPiAKPj4KPj4gT24gdGhlIG90aGVyIGhhbmQgdGhlIGlkZWEgc2xpZ2h0bHkgY29uZmxp Y3RzIHdpdGggbXkgb3RoZXIgc3VnZ2VzdGlvbiAKPj4gdG8gcmVuYW1lIGV4aXN0aW5nIGZ3X2Rv bWFpbl9pbml0IHRvIF9fZndfZG9tYWluX2luaXQgYW5kIGNhbGwgdGhlIAo+PiBtYWNybyBmd19k b21haW5faW5pdCBhbmQgYXZvaWQgYWxsIHRoZSBjaHVybiBiZWxvdy4KPj4KPiAKPiBJJ2xsIHBp Y2sgdGhpcyBzdWdnZXN0aW9uIGFtb25nIHRoZSAyLCB1bmxlc3MgdGhlcmUgaXMgYW5vdGhlciAK PiBzdWdnZXN0aW9uIG9uIGhvdyB0byBhdm9pZCB0aGUgaGlkZGVuIGdvdG8uCgouLiBidXQgb2th eSwgaGlkZGVuIGdvdG8gaXMgYWxzbyBvbmx5IGEgY29uY2VybiBpZiBzb21lb25lIGFkZHMgbmV3 IGluaXQgCnN0ZXBzIGJlZm9yZSB0aGUgZndfZG9tYWluX2luaXQgc3RlcHMsIG9ibGl2aW91cyB0 aGF0IGNsZWFudXAgaXMgYWxzbyAKbmVlZGVkLiBQZXJoYXBzIHRoZSBvdXRfY2xlYW4gbGFiZWwg d291bGQgYmUgZW5vdWdoIG9mIGEgY2x1ZSBmb3IgdGhhdCBjYXNlLgoKPiAKPj4+ICsKPj4+IMKg wqDCoMKgwqAgaWYgKElOVEVMX0dFTihpOTE1KSA+PSAxMSkgewo+Pj4gwqDCoMKgwqDCoMKgwqDC oMKgIGludCBpOwo+Pj4gLcKgwqDCoMKgwqDCoMKgIHVuY29yZS0+ZnVuY3MuZm9yY2Vfd2FrZV9n ZXQgPQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZndfZG9tYWluc19nZXRfd2l0aF9mYWxs YmFjazsKPj4+ICvCoMKgwqDCoMKgwqDCoCB1bmNvcmUtPmZ1bmNzLmZvcmNlX3dha2VfZ2V0ID0g ZndfZG9tYWluc19nZXRfd2l0aF9mYWxsYmFjazsKPj4+IMKgwqDCoMKgwqDCoMKgwqDCoCB1bmNv cmUtPmZ1bmNzLmZvcmNlX3dha2VfcHV0ID0gZndfZG9tYWluc19wdXQ7Cj4+PiAtwqDCoMKgwqDC oMKgwqAgZndfZG9tYWluX2luaXQodW5jb3JlLCBGV19ET01BSU5fSURfUkVOREVSLAo+Pj4gLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBGT1JDRVdBS0VfUkVOREVSX0dFTjks Cj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEZPUkNFV0FLRV9BQ0tf UkVOREVSX0dFTjkpOwo+Pj4gLcKgwqDCoMKgwqDCoMKgIGZ3X2RvbWFpbl9pbml0KHVuY29yZSwg RldfRE9NQUlOX0lEX0JMSVRURVIsCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIEZPUkNFV0FLRV9CTElUVEVSX0dFTjksCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIEZPUkNFV0FLRV9BQ0tfQkxJVFRFUl9HRU45KTsKPj4+ICvCoMKgwqDC oMKgwqDCoCBfX2Z3X2RvbWFpbl9pbml0KEZXX0RPTUFJTl9JRF9SRU5ERVIsCj4+PiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgRk9SQ0VXQUtFX1JFTkRFUl9HRU45LAo+Pj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEZPUkNFV0FLRV9BQ0tfUkVOREVSX0dFTjkp Owo+Pj4gK8KgwqDCoMKgwqDCoMKgIF9fZndfZG9tYWluX2luaXQoRldfRE9NQUlOX0lEX0JMSVRU RVIsCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgRk9SQ0VXQUtFX0JMSVRU RVJfR0VOOSwKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBGT1JDRVdBS0Vf QUNLX0JMSVRURVJfR0VOOSk7Cj4+PiArCj4+PiDCoMKgwqDCoMKgwqDCoMKgwqAgZm9yIChpID0g MDsgaSA8IEk5MTVfTUFYX1ZDUzsgaSsrKSB7Cj4+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBpZiAoIUhBU19FTkdJTkUoaTkxNSwgX1ZDUyhpKSkpCj4+PiDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGNvbnRpbnVlOwo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZndf ZG9tYWluX2luaXQodW5jb3JlLCBGV19ET01BSU5fSURfTUVESUFfVkRCT1gwICsgaSwKPj4+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBGT1JDRVdBS0VfTUVE SUFfVkRCT1hfR0VOMTEoaSksCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgRk9SQ0VXQUtFX0FDS19NRURJQV9WREJPWF9HRU4xMShpKSk7Cj4+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBfX2Z3X2RvbWFpbl9pbml0KEZXX0RPTUFJTl9JRF9NRURJQV9W REJPWDAgKyBpLAo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg Rk9SQ0VXQUtFX01FRElBX1ZEQk9YX0dFTjExKGkpLAo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgRk9SQ0VXQUtFX0FDS19NRURJQV9WREJPWF9HRU4xMShpKSk7 Cj4+PiDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIGZvciAoaSA9 IDA7IGkgPCBJOTE1X01BWF9WRUNTOyBpKyspIHsKPj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGlmICghSEFTX0VOR0lORShpOTE1LCBfVkVDUyhpKSkpCj4+PiDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGNvbnRpbnVlOwo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg ZndfZG9tYWluX2luaXQodW5jb3JlLCBGV19ET01BSU5fSURfTUVESUFfVkVCT1gwICsgaSwKPj4+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBGT1JDRVdBS0Vf TUVESUFfVkVCT1hfR0VOMTEoaSksCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgRk9SQ0VXQUtFX0FDS19NRURJQV9WRUJPWF9HRU4xMShpKSk7Cj4+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBfX2Z3X2RvbWFpbl9pbml0KEZXX0RPTUFJTl9JRF9NRURJ QV9WRUJPWDAgKyBpLAo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgRk9SQ0VXQUtFX01FRElBX1ZFQk9YX0dFTjExKGkpLAo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgRk9SQ0VXQUtFX0FDS19NRURJQV9WRUJPWF9HRU4xMShp KSk7Cj4+PiDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+Pj4gwqDCoMKgwqDCoCB9IGVsc2UgaWYgKElT X0dFTl9SQU5HRShpOTE1LCA5LCAxMCkpIHsKPj4+IC3CoMKgwqDCoMKgwqDCoCB1bmNvcmUtPmZ1 bmNzLmZvcmNlX3dha2VfZ2V0ID0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZ3X2RvbWFp bnNfZ2V0X3dpdGhfZmFsbGJhY2s7Cj4+PiArwqDCoMKgwqDCoMKgwqAgdW5jb3JlLT5mdW5jcy5m b3JjZV93YWtlX2dldCA9IGZ3X2RvbWFpbnNfZ2V0X3dpdGhfZmFsbGJhY2s7Cj4+PiDCoMKgwqDC oMKgwqDCoMKgwqAgdW5jb3JlLT5mdW5jcy5mb3JjZV93YWtlX3B1dCA9IGZ3X2RvbWFpbnNfcHV0 Owo+Pj4gLcKgwqDCoMKgwqDCoMKgIGZ3X2RvbWFpbl9pbml0KHVuY29yZSwgRldfRE9NQUlOX0lE X1JFTkRFUiwKPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgRk9SQ0VX QUtFX1JFTkRFUl9HRU45LAo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBGT1JDRVdBS0VfQUNLX1JFTkRFUl9HRU45KTsKPj4+IC3CoMKgwqDCoMKgwqDCoCBmd19kb21h aW5faW5pdCh1bmNvcmUsIEZXX0RPTUFJTl9JRF9CTElUVEVSLAo+Pj4gLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBGT1JDRVdBS0VfQkxJVFRFUl9HRU45LAo+Pj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBGT1JDRVdBS0VfQUNLX0JMSVRURVJfR0VO OSk7Cj4+PiAtwqDCoMKgwqDCoMKgwqAgZndfZG9tYWluX2luaXQodW5jb3JlLCBGV19ET01BSU5f SURfTUVESUEsCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEZPUkNF V0FLRV9NRURJQV9HRU45LCBGT1JDRVdBS0VfQUNLX01FRElBX0dFTjkpOwo+Pj4gK8KgwqDCoMKg wqDCoMKgIF9fZndfZG9tYWluX2luaXQoRldfRE9NQUlOX0lEX1JFTkRFUiwKPj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBGT1JDRVdBS0VfUkVOREVSX0dFTjksCj4+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgRk9SQ0VXQUtFX0FDS19SRU5ERVJfR0VOOSk7 Cj4+PiArwqDCoMKgwqDCoMKgwqAgX19md19kb21haW5faW5pdChGV19ET01BSU5fSURfQkxJVFRF UiwKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBGT1JDRVdBS0VfQkxJVFRF Ul9HRU45LAo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEZPUkNFV0FLRV9B Q0tfQkxJVFRFUl9HRU45KTsKPj4+ICvCoMKgwqDCoMKgwqDCoCBfX2Z3X2RvbWFpbl9pbml0KEZX X0RPTUFJTl9JRF9NRURJQSwKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBG T1JDRVdBS0VfTUVESUFfR0VOOSwKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBGT1JDRVdBS0VfQUNLX01FRElBX0dFTjkpOwo+Pj4gwqDCoMKgwqDCoCB9IGVsc2UgaWYgKElT X1ZBTExFWVZJRVcoaTkxNSkgfHwgSVNfQ0hFUlJZVklFVyhpOTE1KSkgewo+Pj4gwqDCoMKgwqDC oMKgwqDCoMKgIHVuY29yZS0+ZnVuY3MuZm9yY2Vfd2FrZV9nZXQgPSBmd19kb21haW5zX2dldDsK Pj4+IMKgwqDCoMKgwqDCoMKgwqDCoCB1bmNvcmUtPmZ1bmNzLmZvcmNlX3dha2VfcHV0ID0gZndf ZG9tYWluc19wdXQ7Cj4+PiAtwqDCoMKgwqDCoMKgwqAgZndfZG9tYWluX2luaXQodW5jb3JlLCBG V19ET01BSU5fSURfUkVOREVSLAo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBGT1JDRVdBS0VfVkxWLCBGT1JDRVdBS0VfQUNLX1ZMVik7Cj4+PiAtwqDCoMKgwqDCoMKg wqAgZndfZG9tYWluX2luaXQodW5jb3JlLCBGV19ET01BSU5fSURfTUVESUEsCj4+PiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEZPUkNFV0FLRV9NRURJQV9WTFYsIEZPUkNF V0FLRV9BQ0tfTUVESUFfVkxWKTsKPj4+ICvCoMKgwqDCoMKgwqDCoCBfX2Z3X2RvbWFpbl9pbml0 KEZXX0RPTUFJTl9JRF9SRU5ERVIsCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgRk9SQ0VXQUtFX1ZMViwgRk9SQ0VXQUtFX0FDS19WTFYpOwo+Pj4gK8KgwqDCoMKgwqDCoMKg IF9fZndfZG9tYWluX2luaXQoRldfRE9NQUlOX0lEX01FRElBLAo+Pj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIEZPUkNFV0FLRV9NRURJQV9WTFYsIEZPUkNFV0FLRV9BQ0tfTUVE SUFfVkxWKTsKPj4+IMKgwqDCoMKgwqAgfSBlbHNlIGlmIChJU19IQVNXRUxMKGk5MTUpIHx8IElT X0JST0FEV0VMTChpOTE1KSkgewo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIHVuY29yZS0+ZnVuY3Mu Zm9yY2Vfd2FrZV9nZXQgPQo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZndfZG9tYWlu c19nZXRfd2l0aF90aHJlYWRfc3RhdHVzOwo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIHVuY29yZS0+ ZnVuY3MuZm9yY2Vfd2FrZV9wdXQgPSBmd19kb21haW5zX3B1dDsKPj4+IC3CoMKgwqDCoMKgwqDC oCBmd19kb21haW5faW5pdCh1bmNvcmUsIEZXX0RPTUFJTl9JRF9SRU5ERVIsCj4+PiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEZPUkNFV0FLRV9NVCwgRk9SQ0VXQUtFX0FD S19IU1cpOwo+Pj4gK8KgwqDCoMKgwqDCoMKgIF9fZndfZG9tYWluX2luaXQoRldfRE9NQUlOX0lE X1JFTkRFUiwKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBGT1JDRVdBS0Vf TVQsIEZPUkNFV0FLRV9BQ0tfSFNXKTsKPj4+IMKgwqDCoMKgwqAgfSBlbHNlIGlmIChJU19JVllC UklER0UoaTkxNSkpIHsKPj4+IMKgwqDCoMKgwqDCoMKgwqDCoCB1MzIgZWNvYnVzOwo+Pj4gQEAg LTE0MzcsOCArMTQ1NSw4IEBAIHN0YXRpYyB2b2lkIGludGVsX3VuY29yZV9md19kb21haW5zX2lu aXQoc3RydWN0IAo+Pj4gaW50ZWxfdW5jb3JlICp1bmNvcmUpCj4+PiDCoMKgwqDCoMKgwqDCoMKg wqAgX19yYXdfdW5jb3JlX3dyaXRlMzIodW5jb3JlLCBGT1JDRVdBS0UsIDApOwo+Pj4gwqDCoMKg wqDCoMKgwqDCoMKgIF9fcmF3X3Bvc3RpbmdfcmVhZCh1bmNvcmUsIEVDT0JVUyk7Cj4+PiAtwqDC oMKgwqDCoMKgwqAgZndfZG9tYWluX2luaXQodW5jb3JlLCBGV19ET01BSU5fSURfUkVOREVSLAo+ Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBGT1JDRVdBS0VfTVQsIEZP UkNFV0FLRV9NVF9BQ0spOwo+Pj4gK8KgwqDCoMKgwqDCoMKgIF9fZndfZG9tYWluX2luaXQoRldf RE9NQUlOX0lEX1JFTkRFUiwKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBG T1JDRVdBS0VfTVQsIEZPUkNFV0FLRV9NVF9BQ0spOwo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIHNw aW5fbG9ja19pcnEoJnVuY29yZS0+bG9jayk7Cj4+PiDCoMKgwqDCoMKgwqDCoMKgwqAgZndfZG9t YWluc19nZXRfd2l0aF90aHJlYWRfc3RhdHVzKHVuY29yZSwgRk9SQ0VXQUtFX1JFTkRFUik7Cj4+ PiBAQCAtMTQ0OSwxOSArMTQ2NywyNyBAQCBzdGF0aWMgdm9pZCAKPj4+IGludGVsX3VuY29yZV9m d19kb21haW5zX2luaXQoc3RydWN0IGludGVsX3VuY29yZSAqdW5jb3JlKQo+Pj4gwqDCoMKgwqDC oMKgwqDCoMKgIGlmICghKGVjb2J1cyAmIEZPUkNFV0FLRV9NVF9FTkFCTEUpKSB7Cj4+PiDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBEUk1fSU5GTygiTm8gTVQgZm9yY2V3YWtlIGF2YWlsYWJs ZSBvbiBJdnlicmlkZ2UsIHRoaXMgCj4+PiBjYW4gcmVzdWx0IGluIGlzc3Vlc1xuIik7Cj4+PiDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBEUk1fSU5GTygid2hlbiB1c2luZyB2Ymxhbmstc3lu Y2VkIHBhcnRpYWwgc2NyZWVuIAo+Pj4gdXBkYXRlcy5cbiIpOwo+Pj4gLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgZndfZG9tYWluX2luaXQodW5jb3JlLCBGV19ET01BSU5fSURfUkVOREVSLAo+Pj4g LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEZPUkNFV0FLRSwg Rk9SQ0VXQUtFX0FDSyk7Cj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBfX2Z3X2RvbWFpbl9p bml0KEZXX0RPTUFJTl9JRF9SRU5ERVIsCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBGT1JDRVdBS0UsIEZPUkNFV0FLRV9BQ0spOwo+Pj4gwqDCoMKgwqDCoMKg wqDCoMKgIH0KPj4+IMKgwqDCoMKgwqAgfSBlbHNlIGlmIChJU19HRU4oaTkxNSwgNikpIHsKPj4+ IMKgwqDCoMKgwqDCoMKgwqDCoCB1bmNvcmUtPmZ1bmNzLmZvcmNlX3dha2VfZ2V0ID0KPj4+IMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZ3X2RvbWFpbnNfZ2V0X3dpdGhfdGhyZWFkX3N0YXR1 czsKPj4+IMKgwqDCoMKgwqDCoMKgwqDCoCB1bmNvcmUtPmZ1bmNzLmZvcmNlX3dha2VfcHV0ID0g ZndfZG9tYWluc19wdXQ7Cj4+PiAtwqDCoMKgwqDCoMKgwqAgZndfZG9tYWluX2luaXQodW5jb3Jl LCBGV19ET01BSU5fSURfUkVOREVSLAo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBGT1JDRVdBS0UsIEZPUkNFV0FLRV9BQ0spOwo+Pj4gK8KgwqDCoMKgwqDCoMKgIF9f ZndfZG9tYWluX2luaXQoRldfRE9NQUlOX0lEX1JFTkRFUiwKPj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBGT1JDRVdBS0UsIEZPUkNFV0FLRV9BQ0spOwo+Pj4gwqDCoMKgwqDC oCB9Cj4+PiArI3VuZGVmIF9fZndfZG9tYWluX2luaXQKPj4+ICsKPj4+IMKgwqDCoMKgwqAgLyog QWxsIGZ1dHVyZSBwbGF0Zm9ybXMgYXJlIGV4cGVjdGVkIHRvIHJlcXVpcmUgY29tcGxleCBwb3dl ciAKPj4+IGdhdGluZyAqLwo+Pj4gwqDCoMKgwqDCoCBXQVJOX09OKHVuY29yZS0+ZndfZG9tYWlu cyA9PSAwKTsKPj4+ICsKPj4+ICvCoMKgwqAgcmV0dXJuIDA7Cj4+PiArCj4+PiArb3V0X2NsZWFu Ogo+Pj4gK8KgwqDCoCBpbnRlbF91bmNvcmVfZndfZG9tYWluc19maW5pKHVuY29yZSk7Cj4+PiAr wqDCoMKgIHJldHVybiByZXQ7Cj4+PiDCoCB9Cj4+PiDCoCAjZGVmaW5lIEFTU0lHTl9GV19ET01B SU5TX1RBQkxFKHVuY29yZSwgZCkgXAo+Pj4gQEAgLTE1NjIsMTMgKzE1ODgsMTcgQEAgc3RhdGlj IHZvaWQgdW5jb3JlX3Jhd19pbml0KHN0cnVjdCAKPj4+IGludGVsX3VuY29yZSAqdW5jb3JlKQo+ Pj4gwqDCoMKgwqDCoCB9Cj4+PiDCoCB9Cj4+PiAtc3RhdGljIHZvaWQgdW5jb3JlX2ZvcmNld2Fr ZV9pbml0KHN0cnVjdCBpbnRlbF91bmNvcmUgKnVuY29yZSkKPj4+ICtzdGF0aWMgaW50IHVuY29y ZV9mb3JjZXdha2VfaW5pdChzdHJ1Y3QgaW50ZWxfdW5jb3JlICp1bmNvcmUpCj4+PiDCoCB7Cj4+ PiDCoMKgwqDCoMKgIHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gdW5jb3JlLT5pOTE1 Owo+Pj4gK8KgwqDCoCBpbnQgcmV0Owo+Pj4gwqDCoMKgwqDCoCBHRU1fQlVHX09OKCFpbnRlbF91 bmNvcmVfaGFzX2ZvcmNld2FrZSh1bmNvcmUpKTsKPj4+IC3CoMKgwqAgaW50ZWxfdW5jb3JlX2Z3 X2RvbWFpbnNfaW5pdCh1bmNvcmUpOwo+Pj4gK8KgwqDCoCByZXQgPSBpbnRlbF91bmNvcmVfZndf ZG9tYWluc19pbml0KHVuY29yZSk7Cj4+PiArwqDCoMKgIGlmIChyZXQpCj4+PiArwqDCoMKgwqDC oMKgwqAgcmV0dXJuIHJldDsKPj4+ICsKPj4+IMKgwqDCoMKgwqAgZm9yY2V3YWtlX2Vhcmx5X3Nh bml0aXplKHVuY29yZSwgMCk7Cj4+PiDCoMKgwqDCoMKgIGlmIChJU19HRU5fUkFOR0UoaTkxNSwg NiwgNykpIHsKPj4+IEBAIC0xNjAxLDYgKzE2MzEsOCBAQCBzdGF0aWMgdm9pZCB1bmNvcmVfZm9y Y2V3YWtlX2luaXQoc3RydWN0IAo+Pj4gaW50ZWxfdW5jb3JlICp1bmNvcmUpCj4+PiDCoMKgwqDC oMKgIHVuY29yZS0+cG1pY19idXNfYWNjZXNzX25iLm5vdGlmaWVyX2NhbGwgPSAKPj4+IGk5MTVf cG1pY19idXNfYWNjZXNzX25vdGlmaWVyOwo+Pj4gaW9zZl9tYmlfcmVnaXN0ZXJfcG1pY19idXNf YWNjZXNzX25vdGlmaWVyKCZ1bmNvcmUtPnBtaWNfYnVzX2FjY2Vzc19uYik7Cj4+PiArCj4+PiAr wqDCoMKgIHJldHVybiAwOwo+Pj4gwqAgfQo+Pj4gwqAgaW50IGludGVsX3VuY29yZV9pbml0X21t aW8oc3RydWN0IGludGVsX3VuY29yZSAqdW5jb3JlKQo+Pj4gQEAgLTE2MTksMTAgKzE2NTEsMTMg QEAgaW50IGludGVsX3VuY29yZV9pbml0X21taW8oc3RydWN0IAo+Pj4gaW50ZWxfdW5jb3JlICp1 bmNvcmUpCj4+PiDCoMKgwqDCoMKgIHVuY29yZS0+dW5jbGFpbWVkX21taW9fY2hlY2sgPSAxOwo+ Pj4gLcKgwqDCoCBpZiAoIWludGVsX3VuY29yZV9oYXNfZm9yY2V3YWtlKHVuY29yZSkpCj4+PiAr wqDCoMKgIGlmICghaW50ZWxfdW5jb3JlX2hhc19mb3JjZXdha2UodW5jb3JlKSkgewo+Pj4gwqDC oMKgwqDCoMKgwqDCoMKgIHVuY29yZV9yYXdfaW5pdCh1bmNvcmUpOwo+Pj4gLcKgwqDCoCBlbHNl Cj4+PiAtwqDCoMKgwqDCoMKgwqAgdW5jb3JlX2ZvcmNld2FrZV9pbml0KHVuY29yZSk7Cj4+PiAr wqDCoMKgIH0gZWxzZSB7Cj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0ID0gdW5jb3JlX2ZvcmNld2Fr ZV9pbml0KHVuY29yZSk7Cj4+PiArwqDCoMKgwqDCoMKgwqAgaWYgKHJldCkKPj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGdvdG8gb3V0X21taW9fY2xlYW51cDsKPj4+ICvCoMKgwqAgfQo+Pj4g wqDCoMKgwqDCoCAvKiBtYWtlIHN1cmUgZncgZnVuY3MgYXJlIHNldCBpZiBhbmQgb25seSBpZiB3 ZSBoYXZlIGZ3Ki8KPj4+IMKgwqDCoMKgwqAgR0VNX0JVR19PTihpbnRlbF91bmNvcmVfaGFzX2Zv cmNld2FrZSh1bmNvcmUpICE9IAo+Pj4gISF1bmNvcmUtPmZ1bmNzLmZvcmNlX3dha2VfZ2V0KTsK Pj4+IEBAIC0xNjQ0LDYgKzE2NzksMTEgQEAgaW50IGludGVsX3VuY29yZV9pbml0X21taW8oc3Ry dWN0IGludGVsX3VuY29yZSAKPj4+ICp1bmNvcmUpCj4+PiDCoMKgwqDCoMKgwqDCoMKgwqAgRFJN X0RFQlVHKCJ1bmNsYWltZWQgbW1pbyBkZXRlY3RlZCBvbiB1bmNvcmUgaW5pdCwgCj4+PiBjbGVh cmluZ1xuIik7Cj4+PiDCoMKgwqDCoMKgIHJldHVybiAwOwo+Pj4gKwo+Pj4gK291dF9tbWlvX2Ns ZWFudXA6Cj4+PiArwqDCoMKgIHVuY29yZV9tbWlvX2NsZWFudXAodW5jb3JlKTsKPj4+ICsKPj4+ ICvCoMKgwqAgcmV0dXJuIHJldDsKPj4+IMKgIH0KPj4+IMKgIC8qCj4+PiBAQCAtMTY4OSw2ICsx NzI5LDcgQEAgdm9pZCBpbnRlbF91bmNvcmVfZmluaV9tbWlvKHN0cnVjdCBpbnRlbF91bmNvcmUg Cj4+PiAqdW5jb3JlKQo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIGlvc2ZfbWJpX3VucmVnaXN0ZXJf cG1pY19idXNfYWNjZXNzX25vdGlmaWVyX3VubG9ja2VkKAo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgJnVuY29yZS0+cG1pY19idXNfYWNjZXNzX25iKTsKPj4+IMKgwqDCoMKgwqDCoMKg wqDCoCBpbnRlbF91bmNvcmVfZm9yY2V3YWtlX3Jlc2V0KHVuY29yZSk7Cj4+PiArwqDCoMKgwqDC oMKgwqAgaW50ZWxfdW5jb3JlX2Z3X2RvbWFpbnNfZmluaSh1bmNvcmUpOwo+Pj4gwqDCoMKgwqDC oMKgwqDCoMKgIGlvc2ZfbWJpX3B1bml0X3JlbGVhc2UoKTsKPj4+IMKgwqDCoMKgwqAgfQo+Pj4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3VuY29yZS5oIAo+Pj4gYi9k cml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF91bmNvcmUuaAo+Pj4gaW5kZXggODc5MjUyNzM1YmJh Li5iYmZmMjgxYjg4MGQgMTAwNjQ0Cj4+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRl bF91bmNvcmUuaAo+Pj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfdW5jb3JlLmgK Pj4+IEBAIC0xMjYsNiArMTI2LDcgQEAgc3RydWN0IGludGVsX3VuY29yZSB7Cj4+PiDCoMKgwqDC oMKgIGVudW0gZm9yY2V3YWtlX2RvbWFpbnMgZndfZG9tYWluc19zYXZlZDsgLyogdXNlciBkb21h aW5zIHNhdmVkIAo+Pj4gZm9yIFMzICovCj4+PiDCoMKgwqDCoMKgIHN0cnVjdCBpbnRlbF91bmNv cmVfZm9yY2V3YWtlX2RvbWFpbiB7Cj4+PiArwqDCoMKgwqDCoMKgwqAgc3RydWN0IGludGVsX3Vu Y29yZSAqdW5jb3JlOwo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIGVudW0gZm9yY2V3YWtlX2RvbWFp bl9pZCBpZDsKPj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBlbnVtIGZvcmNld2FrZV9kb21haW5zIG1h c2s7Cj4+PiDCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgaW50IHdha2VfY291bnQ7Cj4+PiBA QCAtMTMzLDcgKzEzNCw3IEBAIHN0cnVjdCBpbnRlbF91bmNvcmUgewo+Pj4gwqDCoMKgwqDCoMKg wqDCoMKgIHN0cnVjdCBocnRpbWVyIHRpbWVyOwo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIHUzMiBf X2lvbWVtICpyZWdfc2V0Owo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIHUzMiBfX2lvbWVtICpyZWdf YWNrOwo+Pj4gLcKgwqDCoCB9IGZ3X2RvbWFpbltGV19ET01BSU5fSURfQ09VTlRdOwo+Pj4gK8Kg wqDCoCB9ICpmd19kb21haW5bRldfRE9NQUlOX0lEX0NPVU5UXTsKPj4KPj4gVGhlIGFycmF5IGl0 c2VsZiBjb3VsZCBhbHNvIGJlIG1hZGUgZHluYW1pYywgbm8/IFRvIG11Y2ggaGFzc2xlIGZvciAK Pj4gdmVyeSBsaXR0bGUgZ2Fpbj8KPj4KPiAKPiBXaXRoIHRoZSBjdXJyZW50IGFwcHJvYWNoIHdl IGRvbid0IGtub3cgaG93IG1hbnkgZG9tYWlucyB3ZSBoYXZlIGluIAo+IGFkdmFuY2UsIHNvIHdl J2QgaGF2ZSB0byBlaXRoZXIgYWRkIGEgdGFibGUgZm9yIHRoYXQgb3IgcmVhbGxvYyB0aGUgCj4g YXJyYXkgYXMgd2UgaW5jcmVhc2UgdGhlIG51bWJlciBvZiBkb21haW5zLiBCb3RoIG9wdGlvbnMg ZG9uJ3Qgc2VlbSAKPiB3b3J0aCB0aGUgaGFzc2xlIElNTy4KCkFncmVlZC4gSXQgd291bGQgYWxz byBuZWVkIGNoYW5nZXMgaW4gbG9va3VwIHNvIGl0IGxvb2tzIGV2ZW4gbGVzcyAKYXBwZWFsaW5n IHRoYXQgaXQgZGlkIHRvIG1lIHllc3RlcmRheS4gOikKClJlZ2FyZHMsCgpUdnJ0a28KCgo+IAo+ IFRoYW5rcywKPiBEYW5pZWxlCj4gCj4+PiDCoMKgwqDCoMKgIHN0cnVjdCB7Cj4+PiDCoMKgwqDC oMKgwqDCoMKgwqAgdW5zaWduZWQgaW50IGNvdW50Owo+Pj4gQEAgLTE0NywxOCArMTQ4LDEyIEBA IHN0cnVjdCBpbnRlbF91bmNvcmUgewo+Pj4gwqAgLyogSXRlcmF0ZSBvdmVyIGluaXRpYWxpc2Vk IGZ3IGRvbWFpbnMgKi8KPj4+IMKgICNkZWZpbmUgZm9yX2VhY2hfZndfZG9tYWluX21hc2tlZChk b21haW5fXywgbWFza19fLCB1bmNvcmVfXywgdG1wX18pIFwKPj4+IC3CoMKgwqAgZm9yICh0bXBf XyA9IChtYXNrX18pOyBcCj4+PiAtwqDCoMKgwqDCoMKgwqDCoCB0bXBfXyA/IChkb21haW5fXyA9 IAo+Pj4gJih1bmNvcmVfXyktPmZ3X2RvbWFpbltfX21hc2tfbmV4dF9iaXQodG1wX18pXSksIDEg OiAwOykKPj4+ICvCoMKgwqAgZm9yICh0bXBfXyA9IChtYXNrX18pOyB0bXBfXyA7KSBcCj4+PiAr wqDCoMKgwqDCoMKgwqAgZm9yX2VhY2hfaWYoZG9tYWluX18gPSAKPj4+ICh1bmNvcmVfXyktPmZ3 X2RvbWFpbltfX21hc2tfbmV4dF9iaXQodG1wX18pXSkKPj4+IMKgICNkZWZpbmUgZm9yX2VhY2hf ZndfZG9tYWluKGRvbWFpbl9fLCB1bmNvcmVfXywgdG1wX18pIFwKPj4+IMKgwqDCoMKgwqAgZm9y X2VhY2hfZndfZG9tYWluX21hc2tlZChkb21haW5fXywgKHVuY29yZV9fKS0+ZndfZG9tYWlucywg Cj4+PiB1bmNvcmVfXywgdG1wX18pCj4+PiAtc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50ZWxfdW5j b3JlICoKPj4+IC1mb3JjZXdha2VfZG9tYWluX3RvX3VuY29yZShjb25zdCBzdHJ1Y3QgCj4+PiBp bnRlbF91bmNvcmVfZm9yY2V3YWtlX2RvbWFpbiAqZCkKPj4+IC17Cj4+PiAtwqDCoMKgIHJldHVy biBjb250YWluZXJfb2YoZCwgc3RydWN0IGludGVsX3VuY29yZSwgZndfZG9tYWluW2QtPmlkXSk7 Cj4+PiAtfQo+Pj4gLQo+Pj4gwqAgc3RhdGljIGlubGluZSBib29sCj4+PiDCoCBpbnRlbF91bmNv cmVfaGFzX2ZvcmNld2FrZShjb25zdCBzdHJ1Y3QgaW50ZWxfdW5jb3JlICp1bmNvcmUpCj4+PiDC oCB7Cj4+Pgo+Pgo+PiBSZWdhcmRzLAo+Pgo+PiBUdnJ0a28KPiAKX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRl bC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3Jn L21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4