From mboxrd@z Thu Jan 1 00:00:00 1970 From: Robert Foss Subject: Re: [PATCH hwc] drm_hwcomposer: remove NVIDIA importer Date: Mon, 09 Oct 2017 13:24:25 +0200 Message-ID: <1507548265.16394.4.camel@collabora.com> References: <20171006220203.16196-1-robh@kernel.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from bhuna.collabora.co.uk (bhuna.collabora.co.uk [46.235.227.227]) by gabe.freedesktop.org (Postfix) with ESMTPS id A3E076E047 for ; Mon, 9 Oct 2017 11:24:29 +0000 (UTC) In-Reply-To: <20171006220203.16196-1-robh@kernel.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Rob Herring , dri-devel@lists.freedesktop.org Cc: Thierry Reding List-Id: dri-devel@lists.freedesktop.org SGV5IFJvYiwKCitUaGllcnJ5CgpUaGlzIGxvb2tzIGdvb2QgdG8gbWUsIGRvZXMgYW55b25lIGhh dmUgYSBzdHJvbmcgb3BpbmlvbiB0aGUgb3RoZXIgd2F5PwpJJ2xsIGxldCB0aGlzIG9uZSBzb2Fr IGZvciBhIGRheSBvciB0d28gbW9yZS4KCgpSb2IuCgpPbiBGcmksIDIwMTctMTAtMDYgYXQgMTc6 MDIgLTA1MDAsIFJvYiBIZXJyaW5nIHdyb3RlOgo+IFRoZXJlJ3Mgbm8gb3BlbnNvdXJjZSBpbXBs ZW1lbnRhdGlvbiBmb3IgdGhlIE5WSURJQSBncmFsbG9jCj4gaW1wbGVtZW50YXRpb24sCj4gc28g cmVtb3ZlIGl0IGFzIGl0IGlzIG5vdCB0ZXN0YWJsZS4KPiAKPiBBcyBhbGwgb2YgdGhlIGdyYWxs b2MgcGVyZm9ybSgpIG9wZXJhdGlvbnMgYXJlIHNwZWNpZmljIHRvIGl0LCB0aGV5Cj4gY2FuIGJl Cj4gcmVtb3ZlZCwgdG9vLgo+IAo+IFNpZ25lZC1vZmYtYnk6IFJvYiBIZXJyaW5nIDxyb2JoQGtl cm5lbC5vcmc+Cj4gLS0tCj4gwqBBbmRyb2lkLm1rwqDCoMKgwqDCoMKgfMKgwqDCoDUgLQo+IMKg ZHJtaHdjZ3JhbGxvYy5oIHzCoMKgMzMgLS0tLS0KPiDCoHBsYXRmb3JtbnYuY3BwwqDCoHwgMzc0 IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiAtLS0tLS0t LS0tCj4gwqAzIGZpbGVzIGNoYW5nZWQsIDQxMiBkZWxldGlvbnMoLSkKPiDCoGRlbGV0ZSBtb2Rl IDEwMDY0NCBwbGF0Zm9ybW52LmNwcAo+IAo+IGRpZmYgLS1naXQgYS9BbmRyb2lkLm1rIGIvQW5k cm9pZC5tawo+IGluZGV4IDk5YmJjYWMzZTk4NC4uZDdkYzY3ODJlMWUwIDEwMDY0NAo+IC0tLSBh L0FuZHJvaWQubWsKPiArKysgYi9BbmRyb2lkLm1rCj4gQEAgLTcxLDcgKzcxLDYgQEAgTE9DQUxf U1JDX0ZJTEVTIDo9IFwKPiDCoAlod2N1dGlscy5jcHAgXAo+IMKgCXBsYXRmb3JtLmNwcCBcCj4g wqAJcGxhdGZvcm1kcm1nZW5lcmljLmNwcCBcCj4gLQlwbGF0Zm9ybW52LmNwcCBcCj4gwqAJc2Vw YXJhdGVfcmVjdHMuY3BwIFwKPiDCoAl2aXJ0dWFsY29tcG9zaXRvcndvcmtlci5jcHAgXAo+IMKg CXZzeW5jd29ya2VyLmNwcAo+IEBAIC04MCwxMSArNzksNyBAQCBMT0NBTF9DUFBGTEFHUyArPSBc Cj4gwqAJLURIV0MyX1VTRV9DUFAxMSBcCj4gwqAJLURIV0MyX0lOQ0xVREVfU1RSSU5HSUZJQ0FU SU9OCj4gwqAKPiAtaWZlcSAoJChzdHJpcCAkKEJPQVJEX0RSTV9IV0NPTVBPU0VSX0JVRkZFUl9J TVBPUlRFUikpLG52aWRpYS0KPiBncmFsbG9jKQo+IC1MT0NBTF9DUFBGTEFHUyArPSAtRFVTRV9O VklESUFfSU1QT1JURVIKPiAtZWxzZQo+IMKgTE9DQUxfQ1BQRkxBR1MgKz0gLURVU0VfRFJNX0dF TkVSSUNfSU1QT1JURVIKPiAtZW5kaWYKPiDCoAo+IMKgTE9DQUxfTU9EVUxFIDo9IGh3Y29tcG9z ZXIuZHJtCj4gwqBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAo+IGRpZmYgLS1naXQgYS9k cm1od2NncmFsbG9jLmggYi9kcm1od2NncmFsbG9jLmgKPiBpbmRleCBjNGE0MmVhZjFjNTQuLjc1 OTc0NmE2Nzk0OSAxMDA2NDQKPiAtLS0gYS9kcm1od2NncmFsbG9jLmgKPiArKysgYi9kcm1od2Nn cmFsbG9jLmgKPiBAQCAtMTksMzkgKzE5LDYgQEAKPiDCoAo+IMKgI2luY2x1ZGUgPHN0ZGludC5o Pgo+IMKgCj4gLWVudW0gewo+IC3CoMKgLyogcGVyZm9ybShjb25zdCBzdHJ1Y3QgZ3JhbGxvY19t b2R1bGVfdCAqbW9kLAo+IC3CoMKgwqAqCcKgwqDCoGludCBvcCwKPiAtwqDCoMKgKgnCoMKgwqBp bnQgZHJtX2ZkLAo+IC3CoMKgwqAqCcKgwqDCoGJ1ZmZlcl9oYW5kbGVfdCBidWZmZXIsCj4gLcKg wqDCoCoJwqDCoMKgc3RydWN0IGh3Y19kcm1fYm8gKmJvKTsKPiAtwqDCoMKgKi8KPiAtwqDCoEdS QUxMT0NfTU9EVUxFX1BFUkZPUk1fRFJNX0lNUE9SVCA9IDB4ZmZlZWZmMDAsCj4gLQo+IC3CoMKg LyogcGVyZm9ybShjb25zdCBzdHJ1Y3QgZ3JhbGxvY19tb2R1bGVfdCAqbW9kLAo+IC3CoMKgwqAq CcKgwqDCoGludCBvcCwKPiAtwqDCoMKgKgnCoMKgwqBidWZmZXJfaGFuZGxlX3QgYnVmZmVyLAo+ IC3CoMKgwqAqCcKgwqDCoHZvaWQgKCpmcmVlX2NhbGxiYWNrKSh2b2lkICopLAo+IC3CoMKgwqAq CcKgwqDCoHZvaWQgKnByaXYpOwo+IC3CoMKgwqAqLwo+IC3CoMKgR1JBTExPQ19NT0RVTEVfUEVS Rk9STV9TRVRfSU1QT1JURVJfUFJJVkFURSA9IDB4ZmZlZWZmMDEsCj4gLQo+IC3CoMKgLyogcGVy Zm9ybShjb25zdCBzdHJ1Y3QgZ3JhbGxvY19tb2R1bGVfdCAqbW9kLAo+IC3CoMKgwqAqCcKgwqDC oGludCBvcCwKPiAtwqDCoMKgKgnCoMKgwqBidWZmZXJfaGFuZGxlX3QgYnVmZmVyLAo+IC3CoMKg wqAqCcKgwqDCoHZvaWQgKCpmcmVlX2NhbGxiYWNrKSh2b2lkICopLAo+IC3CoMKgwqAqCcKgwqDC oHZvaWQgKipwcml2KTsKPiAtwqDCoMKgKi8KPiAtwqDCoEdSQUxMT0NfTU9EVUxFX1BFUkZPUk1f R0VUX0lNUE9SVEVSX1BSSVZBVEUgPSAweGZmZWVmZjAyLAo+IC0KPiAtwqDCoC8qIHBlcmZvcm0o Y29uc3Qgc3RydWN0IGdyYWxsb2NfbW9kdWxlX3QgKm1vZCwKPiAtwqDCoMKgKsKgwqDCoMKgwqBp bnQgb3AsCj4gLcKgwqDCoCrCoMKgwqDCoMKgYnVmZmVyX2hhbmRsZV90IGJ1ZmZlciwKPiAtwqDC oMKgKsKgwqDCoMKgwqBpbnQgKnVzYWdlKTsKPiAtwqDCoMKgKi8KPiAtwqDCoEdSQUxMT0NfTU9E VUxFX1BFUkZPUk1fR0VUX1VTQUdFID0gMHhmZmVlZmYwMywKPiAtfTsKPiAtCj4gwqB0eXBlZGVm IHN0cnVjdCBod2NfZHJtX2JvIHsKPiDCoMKgwqB1aW50MzJfdCB3aWR0aDsKPiDCoMKgwqB1aW50 MzJfdCBoZWlnaHQ7Cj4gZGlmZiAtLWdpdCBhL3BsYXRmb3JtbnYuY3BwIGIvcGxhdGZvcm1udi5j cHAKPiBkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCBlN2I2YmUzNDMwYTguLjAwMDAw MDAwMDAwMAo+IC0tLSBhL3BsYXRmb3JtbnYuY3BwCj4gKysrIC9kZXYvbnVsbAo+IEBAIC0xLDM3 NCArMCwwIEBACj4gLS8qCj4gLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVu IFNvdXJjZSBQcm9qZWN0Cj4gLSAqCj4gLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGlj ZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwo+IC0gKiB5b3UgbWF5IG5vdCB1c2Ug dGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCj4gLSAqIFlv dSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAo+IC0gKgo+IC0gKsKgwqDCoMKg wqDCoGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAo+IC0gKgo+IC0g KiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRp bmcsCj4gc29mdHdhcmUKPiAtICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlz dHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKPiAtICogV0lUSE9VVCBXQVJSQU5USUVTIE9S IENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCj4gaW1wbGllZC4KPiAt ICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBl cm1pc3Npb25zCj4gYW5kCj4gLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgo+IC0g Ki8KPiAtCj4gLSNkZWZpbmUgTE9HX1RBRyAiaHdjLXBsYXRmb3JtLW52Igo+IC0KPiAtI2luY2x1 ZGUgImRybXJlc291cmNlcy5oIgo+IC0jaW5jbHVkZSAicGxhdGZvcm0uaCIKPiAtI2luY2x1ZGUg InBsYXRmb3JtbnYuaCIKPiAtCj4gLSNpbmNsdWRlIDxjaW50dHlwZXM+Cj4gLSNpbmNsdWRlIDxz dGRhdG9taWMuaD4KPiAtI2luY2x1ZGUgPGRybS9kcm1fZm91cmNjLmg+Cj4gLSNpbmNsdWRlIDx4 Zjg2ZHJtLmg+Cj4gLSNpbmNsdWRlIDx4Zjg2ZHJtTW9kZS5oPgo+IC0KPiAtI2luY2x1ZGUgPGN1 dGlscy9sb2cuaD4KPiAtI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KPiAtCj4gLSNpZm5k ZWYgRUdMX05BVElWRV9IQU5ETEVfQU5EUk9JRF9OVlgKPiAtI2RlZmluZSBFR0xfTkFUSVZFX0hB TkRMRV9BTkRST0lEX05WWCAweDMyMkEKPiAtI2VuZGlmCj4gLQo+IC1uYW1lc3BhY2UgYW5kcm9p ZCB7Cj4gLQo+IC0jaWZkZWYgVVNFX05WSURJQV9JTVBPUlRFUgo+IC0vLyBzdGF0aWMKPiAtSW1w b3J0ZXIgKkltcG9ydGVyOjpDcmVhdGVJbnN0YW5jZShEcm1SZXNvdXJjZXMgKmRybSkgewo+IC3C oMKgTnZJbXBvcnRlciAqaW1wb3J0ZXIgPSBuZXcgTnZJbXBvcnRlcihkcm0pOwo+IC3CoMKgaWYg KCFpbXBvcnRlcikKPiAtwqDCoMKgwqByZXR1cm4gTlVMTDsKPiAtCj4gLcKgwqBpbnQgcmV0ID0g aW1wb3J0ZXItPkluaXQoKTsKPiAtwqDCoGlmIChyZXQpIHsKPiAtwqDCoMKgwqBBTE9HRSgiRmFp bGVkIHRvIGluaXRpYWxpemUgdGhlIG52IGltcG9ydGVyICVkIiwgcmV0KTsKPiAtwqDCoMKgwqBk ZWxldGUgaW1wb3J0ZXI7Cj4gLcKgwqDCoMKgcmV0dXJuIE5VTEw7Cj4gLcKgwqB9Cj4gLcKgwqBy ZXR1cm4gaW1wb3J0ZXI7Cj4gLX0KPiAtI2VuZGlmCj4gLQo+IC1OdkltcG9ydGVyOjpOdkltcG9y dGVyKERybVJlc291cmNlcyAqZHJtKSA6IGRybV8oZHJtKSB7Cj4gLX0KPiAtCj4gLU52SW1wb3J0 ZXI6On5OdkltcG9ydGVyKCkgewo+IC19Cj4gLQo+IC1pbnQgTnZJbXBvcnRlcjo6SW5pdCgpIHsK PiAtwqDCoGludCByZXQgPSBod19nZXRfbW9kdWxlKEdSQUxMT0NfSEFSRFdBUkVfTU9EVUxFX0lE LAo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg KGNvbnN0IGh3X21vZHVsZV90ICoqKSZncmFsbG9jXyk7Cj4gLcKgwqBpZiAocmV0KSB7Cj4gLcKg wqDCoMKgQUxPR0UoIkZhaWxlZCB0byBvcGVuIGdyYWxsb2MgbW9kdWxlICVkIiwgcmV0KTsKPiAt wqDCoMKgwqByZXR1cm4gcmV0Owo+IC3CoMKgfQo+IC0KPiAtwqDCoGlmIChzdHJjYXNlY21wKGdy YWxsb2NfLT5jb21tb24uYXV0aG9yLCAiTlZJRElBIikpCj4gLcKgwqDCoMKgQUxPR1coIlVzaW5n IG5vbi1OVklESUEgZ3JhbGxvYyBtb2R1bGU6ICVzLyVzXG4iLCBncmFsbG9jXy0KPiA+Y29tbW9u Lm5hbWUsCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgZ3JhbGxvY18tPmNvbW1vbi5hdXRob3IpOwo+ IC0KPiAtwqDCoHJldHVybiAwOwo+IC19Cj4gLQo+IC0KPiAtRUdMSW1hZ2VLSFIgTnZJbXBvcnRl cjo6SW1wb3J0SW1hZ2UoRUdMRGlzcGxheSBlZ2xfZGlzcGxheSwKPiBidWZmZXJfaGFuZGxlX3Qg aGFuZGxlKSB7Cj4gLcKgwqByZXR1cm4gZWdsQ3JlYXRlSW1hZ2VLSFIoCj4gLcKgwqDCoMKgwqDC oGVnbF9kaXNwbGF5LCBFR0xfTk9fQ09OVEVYVCwgRUdMX05BVElWRV9IQU5ETEVfQU5EUk9JRF9O VlgsCj4gLcKgwqDCoMKgwqDCoChFR0xDbGllbnRCdWZmZXIpaGFuZGxlLCBOVUxMIC8qIG5vIGF0 dHJpYnMgKi8pOwo+IC19Cj4gLQo+IC1pbnQgTnZJbXBvcnRlcjo6SW1wb3J0QnVmZmVyKGJ1ZmZl cl9oYW5kbGVfdCBoYW5kbGUsIGh3Y19kcm1fYm9fdAo+ICpibykgewo+IC3CoMKgbWVtc2V0KGJv LCAwLCBzaXplb2YoaHdjX2RybV9ib190KSk7Cj4gLcKgwqBOdkJ1ZmZlcl90ICpidWYgPSBHcmFs bG9jR2V0TnZCdWZmZXIoaGFuZGxlKTsKPiAtwqDCoGlmIChidWYpIHsKPiAtwqDCoMKgwqBhdG9t aWNfZmV0Y2hfYWRkKCZidWYtPnJlZiwgMSk7Cj4gLcKgwqDCoMKgKmJvID0gYnVmLT5ibzsKPiAt wqDCoMKgwqByZXR1cm4gMDsKPiAtwqDCoH0KPiAtCj4gLcKgwqBidWYgPSBuZXcgTnZCdWZmZXJf dCgpOwo+IC3CoMKgaWYgKCFidWYpIHsKPiAtwqDCoMKgwqBBTE9HRSgiRmFpbGVkIHRvIGFsbG9j YXRlIG5ldyBOdkJ1ZmZlcl90Iik7Cj4gLcKgwqDCoMKgcmV0dXJuIC1FTk9NRU07Cj4gLcKgwqB9 Cj4gLcKgwqBidWYtPmJvLnByaXYgPSBidWY7Cj4gLcKgwqBidWYtPmltcG9ydGVyID0gdGhpczsK PiAtCj4gLcKgwqAvLyBXZSBpbml0aWFsaXplIHRoZSByZWZlcmVuY2UgY291bnQgdG8gMiBzaW5j ZSBOdkdyYWxsb2MgaXMgc3RpbGwKPiB1c2luZyB0aGlzCj4gLcKgwqAvLyBidWZmZXIgKHdpbGwg YmUgY2xlYXJlZCBpbiB0aGUgTnZHcmFsbG9jUmVsZWFzZSksIGFuZCB0aGUgb3RoZXIKPiAtwqDC oC8vIHJlZmVyZW5jZSBpcyBmb3IgSFdDICh0aGlzIEltcG9ydEJ1ZmZlciBjYWxsKS4KPiAtwqDC oGF0b21pY19pbml0KCZidWYtPnJlZiwgMik7Cj4gLQo+IC3CoMKgaW50IHJldCA9IGdyYWxsb2Nf LT5wZXJmb3JtKGdyYWxsb2NfLAo+IEdSQUxMT0NfTU9EVUxFX1BFUkZPUk1fRFJNX0lNUE9SVCwK PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgZHJtXy0+ZmQoKSwgaGFuZGxlLCAmYnVmLT5ibyk7Cj4gLcKgwqBpZiAocmV0KSB7Cj4g LcKgwqDCoMKgQUxPR0UoIkdSQUxMT0NfTU9EVUxFX1BFUkZPUk1fRFJNX0lNUE9SVCBmYWlsZWQg JWQiLCByZXQpOwo+IC3CoMKgwqDCoGRlbGV0ZSBidWY7Cj4gLcKgwqDCoMKgcmV0dXJuIHJldDsK PiAtwqDCoH0KPiAtCj4gLcKgwqByZXQgPSBkcm1Nb2RlQWRkRkIyKGRybV8tPmZkKCksIGJ1Zi0+ Ym8ud2lkdGgsIGJ1Zi0+Ym8uaGVpZ2h0LAo+IGJ1Zi0+Ym8uZm9ybWF0LAo+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJ1Zi0+Ym8uZ2VtX2hhbmRsZXMsIGJ1 Zi0+Ym8ucGl0Y2hlcywgYnVmLQo+ID5iby5vZmZzZXRzLAo+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCZidWYtPmJvLmZiX2lkLCAwKTsKPiAtwqDCoGlmIChy ZXQpIHsKPiAtwqDCoMKgwqBBTE9HRSgiRmFpbGVkIHRvIGFkZCBmYiAlZCIsIHJldCk7Cj4gLcKg wqDCoMKgUmVsZWFzZUJ1ZmZlckltcGwoJmJ1Zi0+Ym8pOwo+IC3CoMKgwqDCoGRlbGV0ZSBidWY7 Cj4gLcKgwqDCoMKgcmV0dXJuIHJldDsKPiAtwqDCoH0KPiAtCj4gLcKgwqByZXQgPSBHcmFsbG9j U2V0TnZCdWZmZXIoaGFuZGxlLCBidWYpOwo+IC3CoMKgaWYgKHJldCkgewo+IC3CoMKgwqDCoC8q IFRoaXMgd2lsbCBoYXBwZW4gaXMgcGVyc2lzdC50ZWdyYS5ncHVfbWFwcGluZ19jYWNoZSBpcyAw L29mZiwKPiAtwqDCoMKgwqDCoCogb3IgaWYgTlYgZ3JhbGxvYyBydW5zIG91dCBvZiAicHJpdiBz bG90cyIgKGN1cnJlbnRseSAzIHBlcgo+IGJ1ZmZlciwKPiAtwqDCoMKgwqDCoCogb25seSBvbmUg b2Ygd2hpY2ggc2hvdWxkIGJlIHVzZWQgYnkgZHJtX2h3Y29tcG9zZXIpLiAqLwo+IC3CoMKgwqDC oEFMT0dFKCJGYWlsZWQgdG8gcmVnaXN0ZXIgZnJlZSBjYWxsYmFjayBmb3IgaW1wb3J0ZWQgYnVm ZmVyICVkIiwKPiByZXQpOwo+IC3CoMKgwqDCoFJlbGVhc2VCdWZmZXJJbXBsKCZidWYtPmJvKTsK PiAtwqDCoMKgwqBkZWxldGUgYnVmOwo+IC3CoMKgwqDCoHJldHVybiByZXQ7Cj4gLcKgwqB9Cj4g LcKgwqAqYm8gPSBidWYtPmJvOwo+IC3CoMKgcmV0dXJuIDA7Cj4gLX0KPiAtCj4gLWludCBOdklt cG9ydGVyOjpSZWxlYXNlQnVmZmVyKGh3Y19kcm1fYm9fdCAqYm8pIHsKPiAtwqDCoE52QnVmZmVy X3QgKmJ1ZiA9IChOdkJ1ZmZlcl90ICopYm8tPnByaXY7Cj4gLcKgwqBpZiAoIWJ1Zikgewo+IC3C oMKgwqDCoEFMT0dFKCJGcmVlaW5nIGJvICUiIFBSSXUzMiAiLCBidWYgaXMgTlVMTCEiLCBiby0+ ZmJfaWQpOwo+IC3CoMKgwqDCoHJldHVybiAwOwo+IC3CoMKgfQo+IC3CoMKgaWYgKGF0b21pY19m ZXRjaF9zdWIoJmJ1Zi0+cmVmLCAxKSA+IDEpCj4gLcKgwqDCoMKgcmV0dXJuIDA7Cj4gLQo+IC3C oMKgUmVsZWFzZUJ1ZmZlckltcGwoYm8pOwo+IC3CoMKgZGVsZXRlIGJ1ZjsKPiAtwqDCoHJldHVy biAwOwo+IC19Cj4gLQo+IC0vLyBzdGF0aWMKPiAtdm9pZCBOdkltcG9ydGVyOjpOdkdyYWxsb2NS ZWxlYXNlKHZvaWQgKm52X2J1ZmZlcikgewo+IC3CoMKgTnZCdWZmZXJfdCAqYnVmID0gKE52QnVm ZmVyICopbnZfYnVmZmVyOwo+IC3CoMKgYnVmLT5pbXBvcnRlci0+UmVsZWFzZUJ1ZmZlcigmYnVm LT5ibyk7Cj4gLX0KPiAtCj4gLXZvaWQgTnZJbXBvcnRlcjo6UmVsZWFzZUJ1ZmZlckltcGwoaHdj X2RybV9ib190ICpibykgewo+IC3CoMKgaWYgKGJvLT5mYl9pZCkgewo+IC3CoMKgwqDCoGludCBy ZXQgPSBkcm1Nb2RlUm1GQihkcm1fLT5mZCgpLCBiby0+ZmJfaWQpOwo+IC3CoMKgwqDCoGlmIChy ZXQpCj4gLcKgwqDCoMKgwqDCoEFMT0dFKCJGYWlsZWQgdG8gcm0gZmIgJWQiLCByZXQpOwo+IC3C oMKgfQo+IC0KPiAtwqDCoHN0cnVjdCBkcm1fZ2VtX2Nsb3NlIGdlbV9jbG9zZTsKPiAtwqDCoG1l bXNldCgmZ2VtX2Nsb3NlLCAwLCBzaXplb2YoZ2VtX2Nsb3NlKSk7Cj4gLcKgwqBpbnQgbnVtX2dl bV9oYW5kbGVzID0gc2l6ZW9mKGJvLT5nZW1faGFuZGxlcykgLyBzaXplb2YoYm8tCj4gPmdlbV9o YW5kbGVzWzBdKTsKPiAtwqDCoGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2dlbV9oYW5kbGVzOyBp KyspIHsKPiAtwqDCoMKgwqBpZiAoIWJvLT5nZW1faGFuZGxlc1tpXSkKPiAtwqDCoMKgwqDCoMKg Y29udGludWU7Cj4gLQo+IC3CoMKgwqDCoGdlbV9jbG9zZS5oYW5kbGUgPSBiby0+Z2VtX2hhbmRs ZXNbaV07Cj4gLcKgwqDCoMKgaW50IHJldCA9IGRybUlvY3RsKGRybV8tPmZkKCksIERSTV9JT0NU TF9HRU1fQ0xPU0UsICZnZW1fY2xvc2UpOwo+IC3CoMKgwqDCoGlmIChyZXQpIHsKPiAtwqDCoMKg wqDCoMKgQUxPR0UoIkZhaWxlZCB0byBjbG9zZSBnZW0gaGFuZGxlICVkICVkIiwgaSwgcmV0KTsK PiAtwqDCoMKgwqB9IGVsc2Ugewo+IC3CoMKgwqDCoMKgwqAvKiBDbGVhciBhbnkgZHVwbGljYXRl IGdlbSBoYW5kbGUgYXMgd2VsbCBidXQgZG9uJ3QgY2xvc2UKPiBhZ2FpbiAqLwo+IC3CoMKgwqDC oMKgwqBmb3IgKGludCBqID0gaSArIDE7IGogPCBudW1fZ2VtX2hhbmRsZXM7IGorKykKPiAtwqDC oMKgwqDCoMKgwqDCoGlmIChiby0+Z2VtX2hhbmRsZXNbal0gPT0gYm8tPmdlbV9oYW5kbGVzW2ld KQo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoGJvLT5nZW1faGFuZGxlc1tqXSA9IDA7Cj4gLcKgwqDC oMKgwqDCoGJvLT5nZW1faGFuZGxlc1tpXSA9IDA7Cj4gLcKgwqDCoMKgfQo+IC3CoMKgfQo+IC19 Cj4gLQo+IC1OdkltcG9ydGVyOjpOdkJ1ZmZlcl90Cj4gKk52SW1wb3J0ZXI6OkdyYWxsb2NHZXRO dkJ1ZmZlcihidWZmZXJfaGFuZGxlX3QgaGFuZGxlKSB7Cj4gLcKgwqB2b2lkICpwcml2ID0gTlVM TDsKPiAtwqDCoGludCByZXQgPQo+IC3CoMKgwqDCoMKgwqBncmFsbG9jXy0+cGVyZm9ybShncmFs bG9jXywKPiBHUkFMTE9DX01PRFVMRV9QRVJGT1JNX0dFVF9JTVBPUlRFUl9QUklWQVRFLAo+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBoYW5kbGUsIE52 R3JhbGxvY1JlbGVhc2UsICZwcml2KTsKPiAtwqDCoHJldHVybiByZXQgPyBOVUxMIDogKE52QnVm ZmVyX3QgKilwcml2Owo+IC19Cj4gLQo+IC1pbnQgTnZJbXBvcnRlcjo6R3JhbGxvY1NldE52QnVm ZmVyKGJ1ZmZlcl9oYW5kbGVfdCBoYW5kbGUsCj4gTnZCdWZmZXJfdCAqYnVmKSB7Cj4gLcKgwqBy ZXR1cm4gZ3JhbGxvY18tPnBlcmZvcm0oZ3JhbGxvY18sCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoEdSQUxMT0NfTU9EVUxFX1BFUkZPUk1f U0VUX0lNUE9SVEVSX1BSSVZBCj4gVEUsIGhhbmRsZSwKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgTnZHcmFsbG9jUmVsZWFzZSwgYnVmKTsK PiAtfQo+IC0KPiAtI2lmZGVmIFVTRV9OVklESUFfSU1QT1JURVIKPiAtLy8gc3RhdGljCj4gLXN0 ZDo6dW5pcXVlX3B0cjxQbGFubmVyPiBQbGFubmVyOjpDcmVhdGVJbnN0YW5jZShEcm1SZXNvdXJj ZXMgKikgewo+IC3CoMKgc3RkOjp1bmlxdWVfcHRyPFBsYW5uZXI+IHBsYW5uZXIobmV3IFBsYW5u ZXIpOwo+IC3CoMKgcGxhbm5lci0+QWRkU3RhZ2U8UGxhblN0YWdlTnZMaW1pdHM+KCk7Cj4gLcKg wqBwbGFubmVyLT5BZGRTdGFnZTxQbGFuU3RhZ2VQcm90ZWN0ZWRSb3RhdGVkPigpOwo+IC3CoMKg cGxhbm5lci0+QWRkU3RhZ2U8UGxhblN0YWdlUHJvdGVjdGVkPigpOwo+IC3CoMKgcGxhbm5lci0+ QWRkU3RhZ2U8UGxhblN0YWdlUHJlY29tcD4oKTsKPiAtwqDCoHBsYW5uZXItPkFkZFN0YWdlPFBs YW5TdGFnZUdyZWVkeT4oKTsKPiAtwqDCoHJldHVybiBwbGFubmVyOwo+IC19Cj4gLSNlbmRpZgo+ IC0KPiAtc3RhdGljIERybVBsYW5lICpHZXRDcnRjUHJpbWFyeVBsYW5lKERybUNydGMgKmNydGMs Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgc3RkOjp2ZWN0b3I8RHJtUGxhbmUgKj4KPiAqcGxhbmVzKSB7 Cj4gLcKgwqBmb3IgKGF1dG8gaSA9IHBsYW5lcy0+YmVnaW4oKTsgaSAhPSBwbGFuZXMtPmVuZCgp OyArK2kpIHsKPiAtwqDCoMKgwqBpZiAoKCppKS0+R2V0Q3J0Y1N1cHBvcnRlZCgqY3J0YykpIHsK PiAtwqDCoMKgwqDCoMKgRHJtUGxhbmUgKnBsYW5lID0gKmk7Cj4gLcKgwqDCoMKgwqDCoHBsYW5l cy0+ZXJhc2UoaSk7Cj4gLcKgwqDCoMKgwqDCoHJldHVybiBwbGFuZTsKPiAtwqDCoMKgwqB9Cj4g LcKgwqB9Cj4gLcKgwqByZXR1cm4gTlVMTDsKPiAtfQo+IC0KPiAtaW50IFBsYW5TdGFnZVByb3Rl Y3RlZFJvdGF0ZWQ6OlByb3Zpc2lvblBsYW5lcygKPiAtwqDCoMKgwqBzdGQ6OnZlY3RvcjxEcm1D b21wb3NpdGlvblBsYW5lPiAqY29tcG9zaXRpb24sCj4gLcKgwqDCoMKgc3RkOjptYXA8c2l6ZV90 LCBEcm1Id2NMYXllciAqPiAmbGF5ZXJzLCBEcm1DcnRjICpjcnRjLAo+IC3CoMKgwqDCoHN0ZDo6 dmVjdG9yPERybVBsYW5lICo+ICpwbGFuZXMpIHsKPiAtwqDCoGludCByZXQ7Cj4gLcKgwqBpbnQg cHJvdGVjdGVkX3pvcmRlciA9IC0xOwo+IC3CoMKgZm9yIChhdXRvIGkgPSBsYXllcnMuYmVnaW4o KTsgaSAhPSBsYXllcnMuZW5kKCk7KSB7Cj4gLcKgwqDCoMKgaWYgKCFpLT5zZWNvbmQtPnByb3Rl Y3RlZF91c2FnZSgpIHx8ICFpLT5zZWNvbmQtPnRyYW5zZm9ybSkgewo+IC3CoMKgwqDCoMKgwqAr K2k7Cj4gLcKgwqDCoMKgwqDCoGNvbnRpbnVlOwo+IC3CoMKgwqDCoH0KPiAtCj4gLcKgwqDCoMKg YXV0byBwcmltYXJ5X2l0ZXIgPSBwbGFuZXMtPmJlZ2luKCk7Cj4gLcKgwqDCoMKgZm9yICg7IHBy aW1hcnlfaXRlciAhPSBwbGFuZXMtPmVuZCgpOyArK3ByaW1hcnlfaXRlcikgewo+IC3CoMKgwqDC oMKgwqBpZiAoKCpwcmltYXJ5X2l0ZXIpLT50eXBlKCkgPT0gRFJNX1BMQU5FX1RZUEVfUFJJTUFS WSkKPiAtwqDCoMKgwqDCoMKgwqDCoGJyZWFrOwo+IC3CoMKgwqDCoH0KPiAtCj4gLcKgwqDCoMKg Ly8gV2UgY2hlYXQgYSBsaXR0bGUgaGVyZS4gU2luY2UgdGhlcmUgY2FuIG9ubHkgYmUgb25lIHBy aW1hcnkKPiBwbGFuZSBwZXIKPiAtwqDCoMKgwqAvLyBjcnRjLCB3ZSBrbm93IHdlJ2xsIG9ubHkg aGl0IHRoaXMgY2FzZSBvbmNlLiBTbyB3ZSBibGluZGx5Cj4gaW5zZXJ0IHRoZQo+IC3CoMKgwqDC oC8vIHByb3RlY3RlZCBjb250ZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbXBvc2l0aW9u LAo+IGtub3dpbmcgdGhpcyBwYXRoCj4gLcKgwqDCoMKgLy8gd29uJ3QgYmUgdGFrZW4gYSBzZWNv bmQgdGltZSBkdXJpbmcgdGhlIGxvb3AuCj4gLcKgwqDCoMKgaWYgKHByaW1hcnlfaXRlciAhPSBw bGFuZXMtPmVuZCgpKSB7Cj4gLcKgwqDCoMKgwqDCoGNvbXBvc2l0aW9uLT5lbXBsYWNlKGNvbXBv c2l0aW9uLT5iZWdpbigpLAo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBEcm1Db21wb3NpdGlvblBsYW5lOjpUeXBlOjprTGF5ZXIsCj4gKnBy aW1hcnlfaXRlciwKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgY3J0YywgaS0+Zmlyc3QpOwo+IC3CoMKgwqDCoMKgwqBwbGFuZXMtPmVyYXNl KHByaW1hcnlfaXRlcik7Cj4gLcKgwqDCoMKgwqDCoHByb3RlY3RlZF96b3JkZXIgPSBpLT5maXJz dDsKPiAtwqDCoMKgwqB9IGVsc2Ugewo+IC3CoMKgwqDCoMKgwqBBTE9HRSgiQ291bGQgbm90IHBy b3Zpc2lvbiBwcmltYXJ5IHBsYW5lIGZvciBwcm90ZWN0ZWQvcm90YXRlZAo+IGxheWVyIik7Cj4g LcKgwqDCoMKgfQo+IC3CoMKgwqDCoGkgPSBsYXllcnMuZXJhc2UoaSk7Cj4gLcKgwqB9Cj4gLQo+ IC3CoMKgaWYgKHByb3RlY3RlZF96b3JkZXIgPT0gLTEpCj4gLcKgwqDCoMKgcmV0dXJuIDA7Cj4g LQo+IC3CoMKgLy8gQWRkIGFueSBsYXllcnMgYmVsb3cgdGhlIHByb3RlY3RlZCBjb250ZW50IHRv IHRoZQo+IHByZWNvbXBvc2l0aW9uIHNpbmNlIHdlCj4gLcKgwqAvLyBuZWVkIHRvIHB1bmNoIGEg aG9sZSB0aHJvdWdoIHRoZW0uCj4gLcKgwqBmb3IgKGF1dG8gaSA9IGxheWVycy5iZWdpbigpOyBp ICE9IGxheWVycy5lbmQoKTspIHsKPiAtwqDCoMKgwqAvLyBTa2lwIGxheWVycyBhYm92ZSB0aGUg ei1vcmRlciBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKPiAtwqDCoMKgwqBpZiAoaS0+Zmlyc3Qg PiBzdGF0aWNfY2FzdDxzaXplX3Q+KHByb3RlY3RlZF96b3JkZXIpKSB7Cj4gLcKgwqDCoMKgwqDC oCsraTsKPiAtwqDCoMKgwqDCoMKgY29udGludWU7Cj4gLcKgwqDCoMKgfQo+IC0KPiAtwqDCoMKg wqAvLyBJZiB0aGVyZSdzIG5vIHByZWNvbXAgbGF5ZXIgYWxyZWFkeSBxdWV1ZWQsIHF1ZXVlIG9u ZSBub3cuCj4gLcKgwqDCoMKgRHJtQ29tcG9zaXRpb25QbGFuZSAqcHJlY29tcCA9IEdldFByZWNv bXAoY29tcG9zaXRpb24pOwo+IC3CoMKgwqDCoGlmIChwcmVjb21wKSB7Cj4gLcKgwqDCoMKgwqDC oHByZWNvbXAtPnNvdXJjZV9sYXllcnMoKS5lbXBsYWNlX2JhY2soaS0+Zmlyc3QpOwo+IC3CoMKg wqDCoH0gZWxzZSB7Cj4gLcKgwqDCoMKgwqDCoGlmIChwbGFuZXMtPnNpemUoKSkgewo+IC3CoMKg wqDCoMKgwqDCoMKgRHJtUGxhbmUgKnByZWNvbXBfcGxhbmUgPSBwbGFuZXMtPmJhY2soKTsKPiAt wqDCoMKgwqDCoMKgwqDCoHBsYW5lcy0+cG9wX2JhY2soKTsKPiAtwqDCoMKgwqDCoMKgwqDCoGNv bXBvc2l0aW9uLQo+ID5lbXBsYWNlX2JhY2soRHJtQ29tcG9zaXRpb25QbGFuZTo6VHlwZTo6a1By ZWNvbXAsCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgcHJlY29tcF9wbGFuZSwgY3J0YywgaS0+Zmlyc3QpOwo+IC3C oMKgwqDCoMKgwqB9IGVsc2Ugewo+IC3CoMKgwqDCoMKgwqDCoMKgQUxPR0UoIk5vdCBlbm91Z2gg cGxhbmVzIHRvIHJlc2VydmUgZm9yIHByZWNvbXAgZmIiKTsKPiAtwqDCoMKgwqDCoMKgfQo+IC3C oMKgwqDCoH0KPiAtwqDCoMKgwqBpID0gbGF5ZXJzLmVyYXNlKGkpOwo+IC3CoMKgfQo+IC3CoMKg cmV0dXJuIDA7Cj4gLX0KPiAtCj4gLWJvb2wgUGxhblN0YWdlTnZMaW1pdHM6OkNoZWNrTGF5ZXIo c2l6ZV90IHpvcmRlciwgRHJtSHdjTGF5ZXIKPiAqbGF5ZXIpIHsKPiAtwqDCoMKgwqBhdXRvIHNy Y193ID0gbGF5ZXItPnNvdXJjZV9jcm9wLndpZHRoKCk7Cj4gLcKgwqDCoMKgYXV0byBzcmNfaCA9 IGxheWVyLT5zb3VyY2VfY3JvcC5oZWlnaHQoKTsKPiAtwqDCoMKgwqBhdXRvIGRzdF93ID0gbGF5 ZXItPmRpc3BsYXlfZnJhbWUud2lkdGgoKTsKPiAtwqDCoMKgwqBhdXRvIGRzdF9oID0gbGF5ZXIt PmRpc3BsYXlfZnJhbWUuaGVpZ2h0KCk7Cj4gLcKgwqDCoMKgaW50IGhfbGltaXQgPSA0Owo+IC3C oMKgwqDCoGludCB2X2xpbWl0Owo+IC0KPiAtwqDCoMKgwqBzd2l0Y2ggKGxheWVyLT5idWZmZXIt PmZvcm1hdCkgewo+IC3CoMKgwqDCoMKgwqBjYXNlIERSTV9GT1JNQVRfQVJHQjg4ODg6Cj4gLcKg wqDCoMKgwqDCoGNhc2UgRFJNX0ZPUk1BVF9BQkdSODg4ODoKPiAtwqDCoMKgwqDCoMKgY2FzZSBE Uk1fRk9STUFUX1hCR1I4ODg4Ogo+IC3CoMKgwqDCoMKgwqBjYXNlIERSTV9GT1JNQVRfWFJHQjg4 ODg6Cj4gLcKgwqDCoMKgwqDCoMKgwqAvLyB0ZWdyYSBkcml2ZXIgYXNzdW1lcyBhbnkgbGF5ZXIg d2l0aCBhbHBoYSBjaGFubmVsIGhhcwo+IHByZW11bHQKPiAtwqDCoMKgwqDCoMKgwqDCoC8vIGJs ZW5kaW5nLCBhdm9pZCBoYW5kbGluZyBpdCB0aGlzIGlzIG5vdCB0aGUgY2FzZS4gVGhpcyBpcwo+ IG5vdCBhbgo+IC3CoMKgwqDCoMKgwqDCoMKgLy8gaXNzdWUgZm9yIGJvdHRvbS1tb3N0IGxheWVy IHNpbmNlIHRoZXJlJ3Mgbm90aGluZyB0bwo+IGJsZW5kIHdpdGgKPiAtwqDCoMKgwqDCoMKgwqDC oGlmICh6b3JkZXIgPiAwICYmIGxheWVyLT5ibGVuZGluZyAhPQo+IERybUh3Y0JsZW5kaW5nOjpr UHJlTXVsdCkKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gZmFsc2U7Cj4gLQo+IC3CoMKg wqDCoMKgwqDCoMKgdl9saW1pdCA9IDI7Cj4gLcKgwqDCoMKgwqDCoMKgwqBicmVhazsKPiAtwqDC oMKgwqDCoMKgY2FzZSBEUk1fRk9STUFUX1lWVTQyMDoKPiAtwqDCoMKgwqDCoMKgY2FzZSBEUk1f Rk9STUFUX1lVVjQyMDoKPiAtwqDCoMKgwqDCoMKgY2FzZSBEUk1fRk9STUFUX1lVVjQyMjoKPiAt wqDCoMKgwqDCoMKgY2FzZSBEUk1fRk9STUFUX1VZVlk6Cj4gLcKgwqDCoMKgwqDCoGNhc2UgRFJN X0ZPUk1BVF9ZVVlWOgo+IC3CoMKgwqDCoMKgwqBjYXNlIERSTV9GT1JNQVRfTlYxMjoKPiAtwqDC oMKgwqDCoMKgY2FzZSBEUk1fRk9STUFUX05WMjE6Cj4gLcKgwqDCoMKgwqDCoGNhc2UgRFJNX0ZP Uk1BVF9SR0I1NjU6Cj4gLcKgwqDCoMKgwqDCoGNhc2UgRFJNX0ZPUk1BVF9CR1I1NjU6Cj4gLcKg wqDCoMKgwqDCoMKgwqB2X2xpbWl0ID0gNDsKPiAtwqDCoMKgwqDCoMKgwqDCoGJyZWFrOwo+IC3C oMKgwqDCoMKgwqBkZWZhdWx0Ogo+IC3CoMKgwqDCoMKgwqDCoMKgdl9saW1pdCA9IDI7Cj4gLcKg wqDCoMKgwqDCoMKgwqBicmVhazsKPiAtwqDCoMKgwqB9Cj4gLQo+IC3CoMKgwqDCoGlmIChsYXll ci0+dHJhbnNmb3JtICYKPiAtwqDCoMKgwqDCoMKgwqDCoChEcm1Id2NUcmFuc2Zvcm06OmtSb3Rh dGU5MCB8IERybUh3Y1RyYW5zZm9ybTo6a1JvdGF0ZTI3MCkpCj4gLcKgwqDCoMKgwqDCoHN0ZDo6 c3dhcChkc3RfdywgZHN0X2gpOwo+IC0KPiAtwqDCoMKgwqAvLyBjaGVjayBmb3IgbWF4IHN1cHBv cnRlZCBkb3duIHNjYWxpbmcKPiAtwqDCoMKgwqBpZiAoKChzcmNfdyAvIGRzdF93KSA+IGhfbGlt aXQpIHx8ICgoc3JjX2ggLyBkc3RfaCkgPiB2X2xpbWl0KSkKPiAtwqDCoMKgwqDCoMKgcmV0dXJu IGZhbHNlOwo+IC0KPiAtwqDCoMKgwqByZXR1cm4gdHJ1ZTsKPiAtfQo+IC0KPiAtaW50IFBsYW5T dGFnZU52TGltaXRzOjpQcm92aXNpb25QbGFuZXMoCj4gLcKgwqDCoMKgc3RkOjp2ZWN0b3I8RHJt Q29tcG9zaXRpb25QbGFuZT4gKmNvbXBvc2l0aW9uLAo+IC3CoMKgwqDCoHN0ZDo6bWFwPHNpemVf dCwgRHJtSHdjTGF5ZXIgKj4gJmxheWVycywgRHJtQ3J0YyAqY3J0YywKPiAtwqDCoMKgwqBzdGQ6 OnZlY3RvcjxEcm1QbGFuZSAqPiAqcGxhbmVzKSB7Cj4gLcKgwqBpbnQgcmV0Owo+IC0KPiAtwqDC oGZvciAoYXV0byBpID0gbGF5ZXJzLmJlZ2luKCk7IGkgIT0gbGF5ZXJzLmVuZCgpOykgewo+IC3C oMKgwqDCoC8vIFNraXAgbGF5ZXIgaWYgc3VwcG9ydGVkCj4gLcKgwqDCoMKgaWYgKENoZWNrTGF5 ZXIoaS0+Zmlyc3QsIGktPnNlY29uZCkpIHsKPiAtwqDCoMKgwqDCoMKgaSsrOwo+IC3CoMKgwqDC oMKgwqBjb250aW51ZTsKPiAtwqDCoMKgwqB9Cj4gLQo+IC3CoMKgwqDCoGlmIChpLT5zZWNvbmQt PnByb3RlY3RlZF91c2FnZSgpKSB7Cj4gLcKgwqDCoMKgwqDCoC8vIERyb3AgdGhlIGxheWVyIGlm IHVuc3VwcG9ydGVkIGFuZCBwcm90ZWN0ZWQsIHRoaXMgd2lsbCBqdXN0Cj4gZGlzcGxheQo+IC3C oMKgwqDCoMKgwqAvLyBibGFjayBpbiB0aGUgYXJlYSBvZiB0aGlzIGxheWVyIGJ1dCBpdCdzIGJl dHRlciB0aGFuCj4gZmFpbGluZyBtaXNlcmFibHkKPiAtwqDCoMKgwqDCoMKgaSA9IGxheWVycy5l cmFzZShpKTsKPiAtwqDCoMKgwqDCoMKgY29udGludWU7Cj4gLcKgwqDCoMKgfQo+IC0KPiAtwqDC oMKgwqAvLyBJZiB0aGVyZSdzIG5vIHByZWNvbXAgbGF5ZXIgYWxyZWFkeSBxdWV1ZWQsIHF1ZXVl IG9uZSBub3cuCj4gLcKgwqDCoMKgRHJtQ29tcG9zaXRpb25QbGFuZSAqcHJlY29tcCA9IEdldFBy ZWNvbXAoY29tcG9zaXRpb24pOwo+IC3CoMKgwqDCoGlmIChwcmVjb21wKSB7Cj4gLcKgwqDCoMKg wqDCoHByZWNvbXAtPnNvdXJjZV9sYXllcnMoKS5lbXBsYWNlX2JhY2soaS0+Zmlyc3QpOwo+IC3C oMKgwqDCoH0gZWxzZSBpZiAoIXBsYW5lcy0+ZW1wdHkoKSkgewo+IC3CoMKgwqDCoMKgwqBEcm1Q bGFuZSAqcHJlY29tcF9wbGFuZSA9IHBsYW5lcy0+YmFjaygpOwo+IC3CoMKgwqDCoMKgwqBwbGFu ZXMtPnBvcF9iYWNrKCk7Cj4gLcKgwqDCoMKgwqDCoGNvbXBvc2l0aW9uLT5lbXBsYWNlX2JhY2so RHJtQ29tcG9zaXRpb25QbGFuZTo6VHlwZTo6a1ByZWNvbXAsCj4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwcmVjb21wX3Bs YW5lLCBjcnRjLCBpLT5maXJzdCk7Cj4gLcKgwqDCoMKgfSBlbHNlIHsKPiAtwqDCoMKgwqDCoMKg QUxPR0UoIk5vdCBlbm91Z2ggcGxhbmVzIHRvIHJlc2VydmUgZm9yIHByZWNvbXAgZmIiKTsKPiAt wqDCoMKgwqB9Cj4gLcKgwqDCoMKgaSA9IGxheWVycy5lcmFzZShpKTsKPiAtwqDCoH0KPiAtCj4g LcKgwqByZXR1cm4gMDsKPiAtfQo+IC19Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZy ZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2RyaS1kZXZlbAo=