From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jason Wang Subject: Re: [RFC PATCH V3 5/5] vhost: access vq metadata through kernel virtual address Date: Mon, 7 Jan 2019 16:40:19 +0800 Message-ID: References: <20181229124656.3900-1-jasowang@redhat.com> <20181229124656.3900-6-jasowang@redhat.com> <20190104162600-mutt-send-email-mst@kernel.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Cc: netdev@vger.kernel.org, davem@davemloft.net, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, virtualization@lists.linux-foundation.org To: "Michael S. Tsirkin" Return-path: In-Reply-To: <20190104162600-mutt-send-email-mst@kernel.org> Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: virtualization-bounces@lists.linux-foundation.org Errors-To: virtualization-bounces@lists.linux-foundation.org List-Id: netdev.vger.kernel.org Ck9uIDIwMTkvMS81IOS4iuWNiDU6MzQsIE1pY2hhZWwgUy4gVHNpcmtpbiB3cm90ZToKPiBPbiBT YXQsIERlYyAyOSwgMjAxOCBhdCAwODo0Njo1NlBNICswODAwLCBKYXNvbiBXYW5nIHdyb3RlOgo+ PiBJdCB3YXMgbm90aWNlZCB0aGF0IHRoZSBjb3B5X3VzZXIoKSBmcmllbmRzIHRoYXQgd2FzIHVz ZWQgdG8gYWNjZXNzCj4+IHZpcnRxdWV1ZSBtZXRkYXRhIHRlbmRzIHRvIGJlIHZlcnkgZXhwZW5z aXZlIGZvciBkYXRhcGxhbmUKPj4gaW1wbGVtZW50YXRpb24gbGlrZSB2aG9zdCBzaW5jZSBpdCBp bnZvbHZlcyBsb3RzIG9mIHNvZnR3YXJlIGNoZWNrcywKPj4gc3BlY3VsYXRpb24gYmFycmllciwg aGFyZHdhcmUgZmVhdHVyZSB0b2dnbGluZyAoZS5nIFNNQVApLiBUaGUKPj4gZXh0cmEgY29zdCB3 aWxsIGJlIG1vcmUgb2J2aW91cyB3aGVuIHRyYW5zZmVycmluZyBzbWFsbCBwYWNrZXRzIHNpbmNl Cj4+IHRoZSB0aW1lIHNwZW50IG9uIG1ldGFkYXRhIGFjY2Vzc2luZyBiZWNvbWUgc2lnbmlmaWNh bnQuLgo+Pgo+PiBUaGlzIHBhdGNoIHRyaWVzIHRvIGVsaW1pbmF0ZSB0aG9zZSBvdmVyaGVhZCBi eSBhY2Nlc3NpbmcgdGhlbSB0aHJvdWdoCj4+IGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MgYnkgdm1h cCgpLiBUbyBtYWtlIHRoZSBwYWdlcyBjYW4gYmUgbWlncmF0ZWQsCj4+IGluc3RlYWQgb2YgcGlu bmluZyB0aGVtIHRocm91Z2ggR1VQLCB3ZSB1c2UgbW11IG5vdGlmaWVycyB0bwo+PiBpbnZhbGlk YXRlIHZtYXBzIGFuZCByZS1lc3RhYmxpc2ggdm1hcHMgZHVyaW5nIGVhY2ggcm91bmQgb2YgbWV0 YWRhdGEKPj4gcHJlZmV0Y2hpbmcgaW4gbmVjZXNzYXJ5LiBGb3IgZGV2aWNlcyB0aGF0IGRvZXNu J3QgdXNlIG1ldGFkYXRhCj4+IHByZWZldGNoaW5nLCB0aGUgbWVtb3J5IGFjZXNzb3JzIGZhbGxi YWNrIHRvIG5vcm1hbCBjb3B5X3VzZXIoKQo+PiBpbXBsZW1lbnRhdGlvbiBncmFjZWZ1bGx5LiBU aGUgaW52YWxpZGF0aW9uIHdhcyBzeW5jaHJvbml6ZWQgd2l0aAo+PiBkYXRhcGF0aCB0aHJvdWdo IHZxIG11dGV4LCBhbmQgaW4gb3JkZXIgdG8gYXZvaWQgaG9sZCB2cSBtdXRleCBkdXJpbmcKPj4g cmFuZ2UgY2hlY2tpbmcsIE1NVSBub3RpZmllciB3YXMgdGVhcmVkIGRvd24gd2hlbiB0cnlpbmcg dG8gbW9kaWZ5IHZxCj4+IG1ldGFkYXRhLgo+Pgo+PiBOb3RlIHRoYXQgdGhpcyB3YXMgb25seSBk b25lIHdoZW4gZGV2aWNlIElPVExCIGlzIG5vdCBlbmFibGVkLiBXZQo+PiBjb3VsZCB1c2Ugc2lt aWxhciBtZXRob2QgdG8gb3B0aW1pemUgaXQgaW4gdGhlIGZ1dHVyZS4KPj4KPj4gVGVzdHMgc2hv d3MgYWJvdXQgfjI0JSBpbXByb3ZlbWVudCBvbiBUWCBQUFMgd2hlbiB1c2luZyB2aXJ0aW8tdXNl ciArCj4+IHZob3N0X25ldCArIHhkcDEgb24gVEFQOgo+Pgo+PiBCZWZvcmU6IH41LjBNcHBzCj4+ IEFmdGVyOiAgfjYuMU1wcHMKPj4KPj4gU2lnbmVkLW9mZi1ieTogSmFzb24gV2FuZyA8amFzb3dh bmdAcmVkaGF0LmNvbT4KPj4gLS0tCj4+ICAgZHJpdmVycy92aG9zdC92aG9zdC5jIHwgMjYzICsr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLQo+PiAgIGRyaXZlcnMvdmhv c3Qvdmhvc3QuaCB8ICAxMyArKysKPj4gICAyIGZpbGVzIGNoYW5nZWQsIDI3NCBpbnNlcnRpb25z KCspLCAyIGRlbGV0aW9ucygtKQo+Pgo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy92aG9zdC92aG9z dC5jIGIvZHJpdmVycy92aG9zdC92aG9zdC5jCj4+IGluZGV4IDU0YjQzZmVlZjhkOS4uZTFlY2I4 YWNmOGEzIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmMKPj4gKysrIGIvZHJp dmVycy92aG9zdC92aG9zdC5jCj4+IEBAIC00NDAsNiArNDQwLDkgQEAgdm9pZCB2aG9zdF9kZXZf aW5pdChzdHJ1Y3Qgdmhvc3RfZGV2ICpkZXYsCj4+ICAgCQl2cS0+aW5kaXJlY3QgPSBOVUxMOwo+ PiAgIAkJdnEtPmhlYWRzID0gTlVMTDsKPj4gICAJCXZxLT5kZXYgPSBkZXY7Cj4+ICsJCW1lbXNl dCgmdnEtPmF2YWlsX3JpbmcsIDAsIHNpemVvZih2cS0+YXZhaWxfcmluZykpOwo+PiArCQltZW1z ZXQoJnZxLT51c2VkX3JpbmcsIDAsIHNpemVvZih2cS0+dXNlZF9yaW5nKSk7Cj4+ICsJCW1lbXNl dCgmdnEtPmRlc2NfcmluZywgMCwgc2l6ZW9mKHZxLT5kZXNjX3JpbmcpKTsKPj4gICAJCW11dGV4 X2luaXQoJnZxLT5tdXRleCk7Cj4+ICAgCQl2aG9zdF92cV9yZXNldChkZXYsIHZxKTsKPj4gICAJ CWlmICh2cS0+aGFuZGxlX2tpY2spCj4+IEBAIC01MTAsNiArNTEzLDczIEBAIHN0YXRpYyBzaXpl X3Qgdmhvc3RfZ2V0X2Rlc2Nfc2l6ZShzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSwgaW50IG51 bSkKPj4gICAJcmV0dXJuIHNpemVvZigqdnEtPmRlc2MpICogbnVtOwo+PiAgIH0KPj4gICAKPj4g K3N0YXRpYyB2b2lkIHZob3N0X3VuaW5pdF92bWFwKHN0cnVjdCB2aG9zdF92bWFwICptYXApCj4+ ICt7Cj4+ICsJaWYgKG1hcC0+YWRkcikKPj4gKwkJdnVubWFwKG1hcC0+dW5tYXBfYWRkcik7Cj4+ ICsKPj4gKwltYXAtPmFkZHIgPSBOVUxMOwo+PiArCW1hcC0+dW5tYXBfYWRkciA9IE5VTEw7Cj4+ ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgdmhvc3RfaW52YWxpZGF0ZV92bWFwKHN0cnVjdCB2aG9z dF92aXJ0cXVldWUgKnZxLAo+PiArCQkJCSBzdHJ1Y3Qgdmhvc3Rfdm1hcCAqbWFwLAo+PiArCQkJ CSB1bnNpZ25lZCBsb25nIHVzdGFydCwKPj4gKwkJCQkgc2l6ZV90IHNpemUsCj4+ICsJCQkJIHVu c2lnbmVkIGxvbmcgc3RhcnQsCj4+ICsJCQkJIHVuc2lnbmVkIGxvbmcgZW5kLAo+PiArCQkJCSBi b29sIGJsb2NrYWJsZSkKPj4gK3sKPj4gKwlpZiAoZW5kIDwgdXN0YXJ0IHx8IHN0YXJ0ID4gdXN0 YXJ0IC0gMSArIHNpemUpCj4+ICsJCXJldHVybiAwOwo+PiArCj4+ICsJaWYgKCFibG9ja2FibGUp Cj4+ICsJCXJldHVybiAtRUFHQUlOOwo+PiArCj4+ICsJbXV0ZXhfbG9jaygmdnEtPm11dGV4KTsK Pj4gKwl2aG9zdF91bmluaXRfdm1hcChtYXApOwo+PiArCW11dGV4X3VubG9jaygmdnEtPm11dGV4 KTsKPj4gKwo+PiArCXJldHVybiAwOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IHZob3N0X21t dV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0KHN0cnVjdCBtbXVfbm90aWZpZXIgKm1u LAo+PiArCQkJCQkJICAgICBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKPj4gKwkJCQkJCSAgICAgdW5z aWduZWQgbG9uZyBzdGFydCwKPj4gKwkJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBlbmQsCj4+ICsJ CQkJCQkgICAgIGJvb2wgYmxvY2thYmxlKQo+PiArewo+PiArCXN0cnVjdCB2aG9zdF9kZXYgKmRl diA9IGNvbnRhaW5lcl9vZihtbiwgc3RydWN0IHZob3N0X2RldiwKPj4gKwkJCQkJICAgICBtbXVf bm90aWZpZXIpOwo+PiArCWludCBpOwo+PiArCj4+ICsJZm9yIChpID0gMDsgaSA8IGRldi0+bnZx czsgaSsrKSB7Cj4+ICsJCXN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxID0gZGV2LT52cXNbaV07 Cj4+ICsKPj4gKwkJaWYgKHZob3N0X2ludmFsaWRhdGVfdm1hcCh2cSwgJnZxLT5hdmFpbF9yaW5n LAo+PiArCQkJCQkgICh1bnNpZ25lZCBsb25nKXZxLT5hdmFpbCwKPj4gKwkJCQkJICB2aG9zdF9n ZXRfYXZhaWxfc2l6ZSh2cSwgdnEtPm51bSksCj4+ICsJCQkJCSAgc3RhcnQsIGVuZCwgYmxvY2th YmxlKSkKPj4gKwkJCXJldHVybiAtRUFHQUlOOwo+PiArCQlpZiAodmhvc3RfaW52YWxpZGF0ZV92 bWFwKHZxLCAmdnEtPmRlc2NfcmluZywKPj4gKwkJCQkJICAodW5zaWduZWQgbG9uZyl2cS0+ZGVz YywKPj4gKwkJCQkJICB2aG9zdF9nZXRfZGVzY19zaXplKHZxLCB2cS0+bnVtKSwKPj4gKwkJCQkJ ICBzdGFydCwgZW5kLCBibG9ja2FibGUpKQo+PiArCQkJcmV0dXJuIC1FQUdBSU47Cj4+ICsJCWlm ICh2aG9zdF9pbnZhbGlkYXRlX3ZtYXAodnEsICZ2cS0+dXNlZF9yaW5nLAo+PiArCQkJCQkgICh1 bnNpZ25lZCBsb25nKXZxLT51c2VkLAo+PiArCQkJCQkgIHZob3N0X2dldF91c2VkX3NpemUodnEs IHZxLT5udW0pLAo+PiArCQkJCQkgIHN0YXJ0LCBlbmQsIGJsb2NrYWJsZSkpCj4+ICsJCQlyZXR1 cm4gLUVBR0FJTjsKPj4gKwl9Cj4+ICsKPj4gKwlyZXR1cm4gMDsKPj4gK30KPj4gKwo+PiArc3Rh dGljIGNvbnN0IHN0cnVjdCBtbXVfbm90aWZpZXJfb3BzIHZob3N0X21tdV9ub3RpZmllcl9vcHMg PSB7Cj4+ICsJLmludmFsaWRhdGVfcmFuZ2Vfc3RhcnQgPSB2aG9zdF9tbXVfbm90aWZpZXJfaW52 YWxpZGF0ZV9yYW5nZV9zdGFydCwKPj4gK307Cj4+ICsKPj4gICAvKiBDYWxsZXIgc2hvdWxkIGhh dmUgZGV2aWNlIG11dGV4ICovCj4+ICAgbG9uZyB2aG9zdF9kZXZfc2V0X293bmVyKHN0cnVjdCB2 aG9zdF9kZXYgKmRldikKPj4gICB7Cj4+IEBAIC01NDEsNyArNjExLDE0IEBAIGxvbmcgdmhvc3Rf ZGV2X3NldF9vd25lcihzdHJ1Y3Qgdmhvc3RfZGV2ICpkZXYpCj4+ICAgCWlmIChlcnIpCj4+ICAg CQlnb3RvIGVycl9jZ3JvdXA7Cj4+ICAgCj4+ICsJZGV2LT5tbXVfbm90aWZpZXIub3BzID0gJnZo b3N0X21tdV9ub3RpZmllcl9vcHM7Cj4+ICsJZXJyID0gbW11X25vdGlmaWVyX3JlZ2lzdGVyKCZk ZXYtPm1tdV9ub3RpZmllciwgZGV2LT5tbSk7Cj4+ICsJaWYgKGVycikKPj4gKwkJZ290byBlcnJf bW11X25vdGlmaWVyOwo+PiArCj4+ICAgCXJldHVybiAwOwo+PiArZXJyX21tdV9ub3RpZmllcjoK Pj4gKwl2aG9zdF9kZXZfZnJlZV9pb3ZlY3MoZGV2KTsKPj4gICBlcnJfY2dyb3VwOgo+PiAgIAlr dGhyZWFkX3N0b3Aod29ya2VyKTsKPj4gICAJZGV2LT53b3JrZXIgPSBOVUxMOwo+PiBAQCAtNjMy LDYgKzcwOSw3MiBAQCBzdGF0aWMgdm9pZCB2aG9zdF9jbGVhcl9tc2coc3RydWN0IHZob3N0X2Rl diAqZGV2KQo+PiAgIAlzcGluX3VubG9jaygmZGV2LT5pb3RsYl9sb2NrKTsKPj4gICB9Cj4+ICAg Cj4+ICtzdGF0aWMgaW50IHZob3N0X2luaXRfdm1hcChzdHJ1Y3Qgdmhvc3Rfdm1hcCAqbWFwLCB1 bnNpZ25lZCBsb25nIHVhZGRyLAo+PiArCQkJICAgc2l6ZV90IHNpemUsIGludCB3cml0ZSkKPj4g K3sKPj4gKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOwo+PiArCWludCBucGFnZXMgPSBESVZfUk9VTkRf VVAoc2l6ZSwgUEFHRV9TSVpFKTsKPj4gKwlpbnQgbnBpbm5lZDsKPj4gKwl2b2lkICp2YWRkcjsK Pj4gKwlpbnQgZXJyID0gMDsKPj4gKwo+PiArCXBhZ2VzID0ga21hbGxvY19hcnJheShucGFnZXMs IHNpemVvZihzdHJ1Y3QgcGFnZSAqKSwgR0ZQX0tFUk5FTCk7Cj4+ICsJaWYgKCFwYWdlcykKPj4g KwkJcmV0dXJuIC1FTk9NRU07Cj4+ICsKPj4gKwlucGlubmVkID0gZ2V0X3VzZXJfcGFnZXNfZmFz dCh1YWRkciwgbnBhZ2VzLCB3cml0ZSwgcGFnZXMpOwo+PiArCWlmIChucGlubmVkICE9IG5wYWdl cykgewo+PiArCQllcnIgPSAtRUZBVUxUOwo+PiArCQlnb3RvIGVycjsKPj4gKwl9Cj4+ICsKPj4g Kwl2YWRkciA9IHZtYXAocGFnZXMsIG5wYWdlcywgVk1fTUFQLCBQQUdFX0tFUk5FTCk7Cj4+ICsJ aWYgKCF2YWRkcikgewo+PiArCQllcnIgPSBFRkFVTFQ7Cj4+ICsJCWdvdG8gZXJyOwo+PiArCX0K Pj4gKwo+PiArCW1hcC0+YWRkciA9IHZhZGRyICsgKHVhZGRyICYgKFBBR0VfU0laRSAtIDEpKTsK Pj4gKwltYXAtPnVubWFwX2FkZHIgPSB2YWRkcjsKPj4gKwo+PiArZXJyOgo+PiArCS8qIERvbid0 IHBpbiBwYWdlcywgbW11IG5vdGlmaWVyIHdpbGwgbm90aWZ5IHVzIGFib3V0IHBhZ2UKPj4gKwkg KiBtaWdyYXRpb24uCj4+ICsJICovCj4+ICsJaWYgKG5waW5uZWQgPiAwKQo+PiArCQlyZWxlYXNl X3BhZ2VzKHBhZ2VzLCBucGlubmVkKTsKPj4gKwlrZnJlZShwYWdlcyk7Cj4+ICsJcmV0dXJuIGVy cjsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgdmhvc3RfY2xlYW5fdm1hcHMoc3RydWN0IHZo b3N0X3ZpcnRxdWV1ZSAqdnEpCj4+ICt7Cj4+ICsJdmhvc3RfdW5pbml0X3ZtYXAoJnZxLT5hdmFp bF9yaW5nKTsKPj4gKwl2aG9zdF91bmluaXRfdm1hcCgmdnEtPmRlc2NfcmluZyk7Cj4+ICsJdmhv c3RfdW5pbml0X3ZtYXAoJnZxLT51c2VkX3JpbmcpOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50 IHZob3N0X3NldHVwX2F2YWlsX3ZtYXAoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEsCj4+ICsJ CQkJICB1bnNpZ25lZCBsb25nIGF2YWlsKQo+PiArewo+PiArCXJldHVybiB2aG9zdF9pbml0X3Zt YXAoJnZxLT5hdmFpbF9yaW5nLCBhdmFpbCwKPj4gKwkJCSAgICAgICB2aG9zdF9nZXRfYXZhaWxf c2l6ZSh2cSwgdnEtPm51bSksIGZhbHNlKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCB2aG9z dF9zZXR1cF9kZXNjX3ZtYXAoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEsCj4+ICsJCQkJIHVu c2lnbmVkIGxvbmcgZGVzYykKPj4gK3sKPj4gKwlyZXR1cm4gdmhvc3RfaW5pdF92bWFwKCZ2cS0+ ZGVzY19yaW5nLCBkZXNjLAo+PiArCQkJICAgICAgIHZob3N0X2dldF9kZXNjX3NpemUodnEsIHZx LT5udW0pLCBmYWxzZSk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgdmhvc3Rfc2V0dXBfdXNl ZF92bWFwKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxLAo+PiArCQkJCSB1bnNpZ25lZCBsb25n IHVzZWQpCj4+ICt7Cj4+ICsJcmV0dXJuIHZob3N0X2luaXRfdm1hcCgmdnEtPnVzZWRfcmluZywg dXNlZCwKPj4gKwkJCSAgICAgICB2aG9zdF9nZXRfdXNlZF9zaXplKHZxLCB2cS0+bnVtKSwgdHJ1 ZSk7Cj4+ICt9Cj4+ICsKPj4gICB2b2lkIHZob3N0X2Rldl9jbGVhbnVwKHN0cnVjdCB2aG9zdF9k ZXYgKmRldikKPj4gICB7Cj4+ICAgCWludCBpOwo+PiBAQCAtNjYxLDggKzgwNCwxMiBAQCB2b2lk IHZob3N0X2Rldl9jbGVhbnVwKHN0cnVjdCB2aG9zdF9kZXYgKmRldikKPj4gICAJCWt0aHJlYWRf c3RvcChkZXYtPndvcmtlcik7Cj4+ICAgCQlkZXYtPndvcmtlciA9IE5VTEw7Cj4+ICAgCX0KPj4g LQlpZiAoZGV2LT5tbSkKPj4gKwlpZiAoZGV2LT5tbSkgewo+PiArCQltbXVfbm90aWZpZXJfdW5y ZWdpc3RlcigmZGV2LT5tbXVfbm90aWZpZXIsIGRldi0+bW0pOwo+PiAgIAkJbW1wdXQoZGV2LT5t bSk7Cj4+ICsJfQo+PiArCWZvciAoaSA9IDA7IGkgPCBkZXYtPm52cXM7IGkrKykKPj4gKwkJdmhv c3RfY2xlYW5fdm1hcHMoZGV2LT52cXNbaV0pOwo+PiAgIAlkZXYtPm1tID0gTlVMTDsKPj4gICB9 Cj4+ICAgRVhQT1JUX1NZTUJPTF9HUEwodmhvc3RfZGV2X2NsZWFudXApOwo+PiBAQCAtODkxLDYg KzEwMzgsMTYgQEAgc3RhdGljIGlubGluZSB2b2lkIF9fdXNlciAqX192aG9zdF9nZXRfdXNlcihz dHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSwKPj4gICAKPj4gICBzdGF0aWMgaW5saW5lIGludCB2 aG9zdF9wdXRfYXZhaWxfZXZlbnQoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEpCj4+ICAgewo+ PiArCWlmICghdnEtPmlvdGxiKSB7Cj4gRG8gd2UgaGF2ZSB0byBsaW1pdCB0aGlzIHRvICFpb3Rs Yj8KCgpObyBuZWVkLCBidXQgZm9yIHNpbXBsaWNpdHkgSSBsZWF2ZSB0aGlzIGZvciB0aGUgZnV0 dXJlLgoKCj4KPj4gKwkJc3RydWN0IHZyaW5nX3VzZWQgKnVzZWQgPSB2cS0+dXNlZF9yaW5nLmFk ZHI7Cj4+ICsKPj4gKwkJaWYgKGxpa2VseSh1c2VkKSkgewo+PiArCQkJKigoX192aXJ0aW8xNiAq KSZ1c2VkLT5yaW5nW3ZxLT5udW1dKSA9Cj4+ICsJCQkJY3B1X3RvX3Zob3N0MTYodnEsIHZxLT5h dmFpbF9pZHgpOwo+IFNvIGhlcmUgd2UgYXJlIG1vZGlmeWluZyB1c2Vyc3BhY2UgbWVtb3J5IHdp dGhvdXQgbWFya2luZyBpdCBkaXJ0eS4KPiBJcyB0aGlzIE9LPyBBbmQgd2h5PwoKClByb2JhYmx5 IG5vdCwgYW55IHN1Z2dlc3Rpb24gdG8gZml4IHRoaXM/CgoKPgo+Cj4+ICsJCQlyZXR1cm4gMDsK Pj4gKwkJfQo+PiArCX0KPj4gKwo+PiAgIAlyZXR1cm4gdmhvc3RfcHV0X3VzZXIodnEsIGNwdV90 b192aG9zdDE2KHZxLCB2cS0+YXZhaWxfaWR4KSwKPj4gICAJCQkgICAgICB2aG9zdF9hdmFpbF9l dmVudCh2cSkpOwo+PiAgIH0KPj4gQEAgLTg5OSw2ICsxMDU2LDE2IEBAIHN0YXRpYyBpbmxpbmUg aW50IHZob3N0X3B1dF91c2VkKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxLAo+PiAgIAkJCQkg c3RydWN0IHZyaW5nX3VzZWRfZWxlbSAqaGVhZCwgaW50IGlkeCwKPj4gICAJCQkJIGludCBjb3Vu dCkKPj4gICB7Cj4+ICsJaWYgKCF2cS0+aW90bGIpIHsKPj4gKwkJc3RydWN0IHZyaW5nX3VzZWQg KnVzZWQgPSB2cS0+dXNlZF9yaW5nLmFkZHI7Cj4+ICsKPj4gKwkJaWYgKGxpa2VseSh1c2VkKSkg ewo+PiArCQkJbWVtY3B5KHVzZWQtPnJpbmcgKyBpZHgsIGhlYWQsCj4+ICsJCQkgICAgICAgY291 bnQgKiBzaXplb2YoKmhlYWQpKTsKPj4gKwkJCXJldHVybiAwOwo+IFNhbWUgaGVyZS4KPgo+PiAr CQl9Cj4+ICsJfQo+PiArCj4+ICAgCXJldHVybiB2aG9zdF9jb3B5X3RvX3VzZXIodnEsIHZxLT51 c2VkLT5yaW5nICsgaWR4LCBoZWFkLAo+PiAgIAkJCQkgIGNvdW50ICogc2l6ZW9mKCpoZWFkKSk7 Cj4+ICAgfQo+PiBAQCAtOTA2LDYgKzEwNzMsMTUgQEAgc3RhdGljIGlubGluZSBpbnQgdmhvc3Rf cHV0X3VzZWQoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEsCj4+ICAgc3RhdGljIGlubGluZSBp bnQgdmhvc3RfcHV0X3VzZWRfZmxhZ3Moc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEpCj4+ICAg Cj4+ICAgewo+PiArCWlmICghdnEtPmlvdGxiKSB7Cj4+ICsJCXN0cnVjdCB2cmluZ191c2VkICp1 c2VkID0gdnEtPnVzZWRfcmluZy5hZGRyOwo+PiArCj4+ICsJCWlmIChsaWtlbHkodXNlZCkpIHsK Pj4gKwkJCXVzZWQtPmZsYWdzID0gY3B1X3RvX3Zob3N0MTYodnEsIHZxLT51c2VkX2ZsYWdzKTsK Pj4gKwkJCXJldHVybiAwOwo+PiArCQl9Cj4+ICsJfQo+PiArCj4+ICAgCXJldHVybiB2aG9zdF9w dXRfdXNlcih2cSwgY3B1X3RvX3Zob3N0MTYodnEsIHZxLT51c2VkX2ZsYWdzKSwKPj4gICAJCQkg ICAgICAmdnEtPnVzZWQtPmZsYWdzKTsKPj4gICB9Cj4+IEBAIC05MTMsNiArMTA4OSwxNSBAQCBz dGF0aWMgaW5saW5lIGludCB2aG9zdF9wdXRfdXNlZF9mbGFncyhzdHJ1Y3Qgdmhvc3RfdmlydHF1 ZXVlICp2cSkKPj4gICBzdGF0aWMgaW5saW5lIGludCB2aG9zdF9wdXRfdXNlZF9pZHgoc3RydWN0 IHZob3N0X3ZpcnRxdWV1ZSAqdnEpCj4+ICAgCj4+ICAgewo+PiArCWlmICghdnEtPmlvdGxiKSB7 Cj4+ICsJCXN0cnVjdCB2cmluZ191c2VkICp1c2VkID0gdnEtPnVzZWRfcmluZy5hZGRyOwo+PiAr Cj4+ICsJCWlmIChsaWtlbHkodXNlZCkpIHsKPj4gKwkJCXVzZWQtPmlkeCA9IGNwdV90b192aG9z dDE2KHZxLCB2cS0+bGFzdF91c2VkX2lkeCk7Cj4+ICsJCQlyZXR1cm4gMDsKPj4gKwkJfQo+PiAr CX0KPj4gKwo+PiAgIAlyZXR1cm4gdmhvc3RfcHV0X3VzZXIodnEsIGNwdV90b192aG9zdDE2KHZx LCB2cS0+bGFzdF91c2VkX2lkeCksCj4+ICAgCQkJICAgICAgJnZxLT51c2VkLT5pZHgpOwo+PiAg IH0KPj4gQEAgLTk1OCwxMiArMTE0MywzMCBAQCBzdGF0aWMgdm9pZCB2aG9zdF9kZXZfdW5sb2Nr X3ZxcyhzdHJ1Y3Qgdmhvc3RfZGV2ICpkKQo+PiAgIHN0YXRpYyBpbmxpbmUgaW50IHZob3N0X2dl dF9hdmFpbF9pZHgoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEsCj4+ICAgCQkJCSAgICAgIF9f dmlydGlvMTYgKmlkeCkKPj4gICB7Cj4+ICsJaWYgKCF2cS0+aW90bGIpIHsKPj4gKwkJc3RydWN0 IHZyaW5nX2F2YWlsICphdmFpbCA9IHZxLT5hdmFpbF9yaW5nLmFkZHI7Cj4+ICsKPj4gKwkJaWYg KGxpa2VseShhdmFpbCkpIHsKPj4gKwkJCSppZHggPSBhdmFpbC0+aWR4Owo+PiArCQkJcmV0dXJu IDA7Cj4+ICsJCX0KPj4gKwl9Cj4+ICsKPj4gICAJcmV0dXJuIHZob3N0X2dldF9hdmFpbCh2cSwg KmlkeCwgJnZxLT5hdmFpbC0+aWR4KTsKPj4gICB9Cj4+ICAgCj4+ICAgc3RhdGljIGlubGluZSBp bnQgdmhvc3RfZ2V0X2F2YWlsX2hlYWQoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEsCj4+ICAg CQkJCSAgICAgICBfX3ZpcnRpbzE2ICpoZWFkLCBpbnQgaWR4KQo+PiAgIHsKPj4gKwlpZiAoIXZx LT5pb3RsYikgewo+PiArCQlzdHJ1Y3QgdnJpbmdfYXZhaWwgKmF2YWlsID0gdnEtPmF2YWlsX3Jp bmcuYWRkcjsKPj4gKwo+PiArCQlpZiAobGlrZWx5KGF2YWlsKSkgewo+PiArCQkJKmhlYWQgPSBh dmFpbC0+cmluZ1tpZHggJiAodnEtPm51bSAtIDEpXTsKPj4gKwkJCXJldHVybiAwOwo+PiArCQl9 Cj4+ICsJfQo+PiArCj4+ICAgCXJldHVybiB2aG9zdF9nZXRfYXZhaWwodnEsICpoZWFkLAo+PiAg IAkJCSAgICAgICAmdnEtPmF2YWlsLT5yaW5nW2lkeCAmICh2cS0+bnVtIC0gMSldKTsKPj4gICB9 Cj4+IEBAIC05NzEsMjQgKzExNzQsNjAgQEAgc3RhdGljIGlubGluZSBpbnQgdmhvc3RfZ2V0X2F2 YWlsX2hlYWQoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEsCj4+ICAgc3RhdGljIGlubGluZSBp bnQgdmhvc3RfZ2V0X2F2YWlsX2ZsYWdzKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxLAo+PiAg IAkJCQkJX192aXJ0aW8xNiAqZmxhZ3MpCj4+ICAgewo+PiArCWlmICghdnEtPmlvdGxiKSB7Cj4+ ICsJCXN0cnVjdCB2cmluZ19hdmFpbCAqYXZhaWwgPSB2cS0+YXZhaWxfcmluZy5hZGRyOwo+PiAr Cj4+ICsJCWlmIChsaWtlbHkoYXZhaWwpKSB7Cj4+ICsJCQkqZmxhZ3MgPSBhdmFpbC0+ZmxhZ3M7 Cj4+ICsJCQlyZXR1cm4gMDsKPj4gKwkJfQo+PiArCX0KPj4gKwo+PiAgIAlyZXR1cm4gdmhvc3Rf Z2V0X2F2YWlsKHZxLCAqZmxhZ3MsICZ2cS0+YXZhaWwtPmZsYWdzKTsKPj4gICB9Cj4+ICAgCj4+ ICAgc3RhdGljIGlubGluZSBpbnQgdmhvc3RfZ2V0X3VzZWRfZXZlbnQoc3RydWN0IHZob3N0X3Zp cnRxdWV1ZSAqdnEsCj4+ICAgCQkJCSAgICAgICBfX3ZpcnRpbzE2ICpldmVudCkKPj4gICB7Cj4+ ICsJaWYgKCF2cS0+aW90bGIpIHsKPj4gKwkJc3RydWN0IHZyaW5nX2F2YWlsICphdmFpbCA9IHZx LT5hdmFpbF9yaW5nLmFkZHI7Cj4+ICsKPj4gKwkJaWYgKGxpa2VseShhdmFpbCkpIHsKPj4gKwkJ CSpldmVudCA9IChfX3ZpcnRpbzE2KWF2YWlsLT5yaW5nW3ZxLT5udW1dOwo+PiArCQkJcmV0dXJu IDA7Cj4+ICsJCX0KPj4gKwl9Cj4+ICsKPj4gICAJcmV0dXJuIHZob3N0X2dldF9hdmFpbCh2cSwg KmV2ZW50LCB2aG9zdF91c2VkX2V2ZW50KHZxKSk7Cj4+ICAgfQo+PiAgIAo+PiAgIHN0YXRpYyBp bmxpbmUgaW50IHZob3N0X2dldF91c2VkX2lkeChzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICp2cSwK Pj4gICAJCQkJICAgICBfX3ZpcnRpbzE2ICppZHgpCj4+ICAgewo+PiArCWlmICghdnEtPmlvdGxi KSB7Cj4+ICsJCXN0cnVjdCB2cmluZ191c2VkICp1c2VkID0gdnEtPnVzZWRfcmluZy5hZGRyOwo+ PiArCj4+ICsJCWlmIChsaWtlbHkodXNlZCkpIHsKPj4gKwkJCSppZHggPSB1c2VkLT5pZHg7Cj4+ ICsJCQlyZXR1cm4gMDsKPj4gKwkJfQo+PiArCX0KPj4gKwo+PiAgIAlyZXR1cm4gdmhvc3RfZ2V0 X3VzZWQodnEsICppZHgsICZ2cS0+dXNlZC0+aWR4KTsKPj4gICB9Cj4+ICAgCj4+ICAgc3RhdGlj IGlubGluZSBpbnQgdmhvc3RfZ2V0X2Rlc2Moc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEsCj4+ ICAgCQkJCSBzdHJ1Y3QgdnJpbmdfZGVzYyAqZGVzYywgaW50IGlkeCkKPj4gICB7Cj4+ICsJaWYg KCF2cS0+aW90bGIpIHsKPj4gKwkJc3RydWN0IHZyaW5nX2Rlc2MgKmQgPSB2cS0+ZGVzY19yaW5n LmFkZHI7Cj4+ICsKPj4gKwkJaWYgKGxpa2VseShkKSkgewo+PiArCQkJKmRlc2MgPSAqKGQgKyBp ZHgpOwo+PiArCQkJcmV0dXJuIDA7Cj4+ICsJCX0KPj4gKwl9Cj4+ICsKPj4gICAJcmV0dXJuIHZo b3N0X2NvcHlfZnJvbV91c2VyKHZxLCBkZXNjLCB2cS0+ZGVzYyArIGlkeCwgc2l6ZW9mKCpkZXNj KSk7Cj4+ICAgfQo+PiAgIAo+PiBAQCAtMTMyNSw4ICsxNTY0LDE2IEBAIGludCB2cV9tZXRhX3By ZWZldGNoKHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxKQo+PiAgIHsKPj4gICAJdW5zaWduZWQg aW50IG51bSA9IHZxLT5udW07Cj4+ICAgCj4+IC0JaWYgKCF2cS0+aW90bGIpCj4+ICsJaWYgKCF2 cS0+aW90bGIpIHsKPj4gKwkJaWYgKHVubGlrZWx5KCF2cS0+YXZhaWxfcmluZy5hZGRyKSkKPj4g KwkJCXZob3N0X3NldHVwX2F2YWlsX3ZtYXAodnEsICh1bnNpZ25lZCBsb25nKXZxLT5hdmFpbCk7 Cj4+ICsJCWlmICh1bmxpa2VseSghdnEtPmRlc2NfcmluZy5hZGRyKSkKPj4gKwkJCXZob3N0X3Nl dHVwX2Rlc2Nfdm1hcCh2cSwgKHVuc2lnbmVkIGxvbmcpdnEtPmRlc2MpOwo+PiArCQlpZiAodW5s aWtlbHkoIXZxLT51c2VkX3JpbmcuYWRkcikpCj4+ICsJCQl2aG9zdF9zZXR1cF91c2VkX3ZtYXAo dnEsICh1bnNpZ25lZCBsb25nKXZxLT51c2VkKTsKPj4gKwo+PiAgIAkJcmV0dXJuIDE7Cj4+ICsJ fQo+PiAgIAo+PiAgIAlyZXR1cm4gaW90bGJfYWNjZXNzX29rKHZxLCBWSE9TVF9BQ0NFU1NfUk8s ICh1NjQpKHVpbnRwdHJfdCl2cS0+ZGVzYywKPj4gICAJCQkgICAgICAgdmhvc3RfZ2V0X2Rlc2Nf c2l6ZSh2cSwgbnVtKSwgVkhPU1RfQUREUl9ERVNDKSAmJgo+PiBAQCAtMTQ3OCw2ICsxNzI1LDEz IEBAIGxvbmcgdmhvc3RfdnJpbmdfaW9jdGwoc3RydWN0IHZob3N0X2RldiAqZCwgdW5zaWduZWQg aW50IGlvY3RsLCB2b2lkIF9fdXNlciAqYXJnCj4+ICAgCj4+ICAgCW11dGV4X2xvY2soJnZxLT5t dXRleCk7Cj4+ICAgCj4+ICsJLyogVW5yZWdpc3RlciBNTVUgbm90aWZlciB0byBhbGxvdyBpbnZh bGlkYXRpb24gY2FsbGJhY2sKPj4gKwkgKiBjYW4gYWNjZXNzIHZxLT5hdmFpbCwgdnEtPmRlc2Mg LCB2cS0+dXNlZCBhbmQgdnEtPm51bQo+PiArCSAqIHdpdGhvdXQgaG9sZGluZyB2cS0+bXV0ZXgu Cj4+ICsJICovCj4+ICsJaWYgKGQtPm1tKQo+PiArCQltbXVfbm90aWZpZXJfdW5yZWdpc3Rlcigm ZC0+bW11X25vdGlmaWVyLCBkLT5tbSk7Cj4+ICsKPj4gICAJc3dpdGNoIChpb2N0bCkgewo+PiAg IAljYXNlIFZIT1NUX1NFVF9WUklOR19OVU06Cj4+ICAgCQkvKiBSZXNpemluZyByaW5nIHdpdGgg YW4gYWN0aXZlIGJhY2tlbmQ/Cj4+IEBAIC0xNDk0LDYgKzE3NDgsNyBAQCBsb25nIHZob3N0X3Zy aW5nX2lvY3RsKHN0cnVjdCB2aG9zdF9kZXYgKmQsIHVuc2lnbmVkIGludCBpb2N0bCwgdm9pZCBf X3VzZXIgKmFyZwo+PiAgIAkJCXIgPSAtRUlOVkFMOwo+PiAgIAkJCWJyZWFrOwo+PiAgIAkJfQo+ PiArCQl2aG9zdF9jbGVhbl92bWFwcyh2cSk7Cj4+ICAgCQl2cS0+bnVtID0gcy5udW07Cj4+ICAg CQlicmVhazsKPj4gICAJY2FzZSBWSE9TVF9TRVRfVlJJTkdfQkFTRToKPj4gQEAgLTE1NzEsNiAr MTgyNiw4IEBAIGxvbmcgdmhvc3RfdnJpbmdfaW9jdGwoc3RydWN0IHZob3N0X2RldiAqZCwgdW5z aWduZWQgaW50IGlvY3RsLCB2b2lkIF9fdXNlciAqYXJnCj4+ICAgCQkJfQo+PiAgIAkJfQo+PiAg IAo+PiArCQl2aG9zdF9jbGVhbl92bWFwcyh2cSk7Cj4+ICsKPj4gICAJCXZxLT5sb2dfdXNlZCA9 ICEhKGEuZmxhZ3MgJiAoMHgxIDw8IFZIT1NUX1ZSSU5HX0ZfTE9HKSk7Cj4+ICAgCQl2cS0+ZGVz YyA9ICh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWEuZGVzY191c2VyX2FkZHI7Cj4+ICAg CQl2cS0+YXZhaWwgPSAodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZylhLmF2YWlsX3VzZXJf YWRkcjsKPj4gQEAgLTE2NTEsNiArMTkwOCw4IEBAIGxvbmcgdmhvc3RfdnJpbmdfaW9jdGwoc3Ry dWN0IHZob3N0X2RldiAqZCwgdW5zaWduZWQgaW50IGlvY3RsLCB2b2lkIF9fdXNlciAqYXJnCj4+ ICAgCWlmIChwb2xsc3RhcnQgJiYgdnEtPmhhbmRsZV9raWNrKQo+PiAgIAkJciA9IHZob3N0X3Bv bGxfc3RhcnQoJnZxLT5wb2xsLCB2cS0+a2ljayk7Cj4+ICAgCj4+ICsJaWYgKGQtPm1tKQo+PiAr CQltbXVfbm90aWZpZXJfcmVnaXN0ZXIoJmQtPm1tdV9ub3RpZmllciwgZC0+bW0pOwo+PiAgIAlt dXRleF91bmxvY2soJnZxLT5tdXRleCk7Cj4+ICAgCj4+ICAgCWlmIChwb2xsc3RvcCAmJiB2cS0+ aGFuZGxlX2tpY2spCj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3Zob3N0L3Zob3N0LmggYi9kcml2 ZXJzL3Zob3N0L3Zob3N0LmgKPj4gaW5kZXggMGQxZmY5NzdhNDNlLi4wMGYwMTZhNGYxOTggMTAw NjQ0Cj4+IC0tLSBhL2RyaXZlcnMvdmhvc3Qvdmhvc3QuaAo+PiArKysgYi9kcml2ZXJzL3Zob3N0 L3Zob3N0LmgKPj4gQEAgLTEyLDYgKzEyLDggQEAKPj4gICAjaW5jbHVkZSA8bGludXgvdmlydGlv X2NvbmZpZy5oPgo+PiAgICNpbmNsdWRlIDxsaW51eC92aXJ0aW9fcmluZy5oPgo+PiAgICNpbmNs dWRlIDxsaW51eC9hdG9taWMuaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+Cj4+ICsj aW5jbHVkZSA8bGludXgvbW11X25vdGlmaWVyLmg+Cj4+ICAgCj4+ICAgc3RydWN0IHZob3N0X3dv cms7Cj4+ICAgdHlwZWRlZiB2b2lkICgqdmhvc3Rfd29ya19mbl90KShzdHJ1Y3Qgdmhvc3Rfd29y ayAqd29yayk7Cj4+IEBAIC04MCw2ICs4MiwxMSBAQCBlbnVtIHZob3N0X3VhZGRyX3R5cGUgewo+ PiAgIAlWSE9TVF9OVU1fQUREUlMgPSAzLAo+PiAgIH07Cj4+ICAgCj4+ICtzdHJ1Y3Qgdmhvc3Rf dm1hcCB7Cj4+ICsJdm9pZCAqYWRkcjsKPj4gKwl2b2lkICp1bm1hcF9hZGRyOwo+PiArfTsKPj4g Kwo+IEhvdyBhYm91dCB1c2luZyBhY3R1YWwgdHlwZXMgbGlrZSBzdHJ1Y3QgdnJpbmdfdXNlZCBl dGMgc28gd2UgZ2V0IHR5cGUKPiBzYWZldHkgYW5kIGRvIG5vdCBuZWVkIHRvIGNhc3Qgb24gYWNj ZXNzPwoKClllcywgd2UgY2FuLgoKVGhhbmtzCgoKPgo+Cj4+ICAgLyogVGhlIHZpcnRxdWV1ZSBz dHJ1Y3R1cmUgZGVzY3JpYmVzIGEgcXVldWUgYXR0YWNoZWQgdG8gYSBkZXZpY2UuICovCj4+ICAg c3RydWN0IHZob3N0X3ZpcnRxdWV1ZSB7Cj4+ICAgCXN0cnVjdCB2aG9zdF9kZXYgKmRldjsKPj4g QEAgLTkwLDYgKzk3LDExIEBAIHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgewo+PiAgIAlzdHJ1Y3Qg dnJpbmdfZGVzYyBfX3VzZXIgKmRlc2M7Cj4+ICAgCXN0cnVjdCB2cmluZ19hdmFpbCBfX3VzZXIg KmF2YWlsOwo+PiAgIAlzdHJ1Y3QgdnJpbmdfdXNlZCBfX3VzZXIgKnVzZWQ7Cj4+ICsKPj4gKwlz dHJ1Y3Qgdmhvc3Rfdm1hcCBhdmFpbF9yaW5nOwo+PiArCXN0cnVjdCB2aG9zdF92bWFwIGRlc2Nf cmluZzsKPj4gKwlzdHJ1Y3Qgdmhvc3Rfdm1hcCB1c2VkX3Jpbmc7Cj4+ICsKPj4gICAJY29uc3Qg c3RydWN0IHZob3N0X3VtZW1fbm9kZSAqbWV0YV9pb3RsYltWSE9TVF9OVU1fQUREUlNdOwo+PiAg IAlzdHJ1Y3QgZmlsZSAqa2ljazsKPj4gICAJc3RydWN0IGV2ZW50ZmRfY3R4ICpjYWxsX2N0eDsK Pj4gQEAgLTE1OCw2ICsxNzAsNyBAQCBzdHJ1Y3Qgdmhvc3RfbXNnX25vZGUgewo+PiAgIAo+PiAg IHN0cnVjdCB2aG9zdF9kZXYgewo+PiAgIAlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKPj4gKwlzdHJ1 Y3QgbW11X25vdGlmaWVyIG1tdV9ub3RpZmllcjsKPj4gICAJc3RydWN0IG11dGV4IG11dGV4Owo+ PiAgIAlzdHJ1Y3Qgdmhvc3RfdmlydHF1ZXVlICoqdnFzOwo+PiAgIAlpbnQgbnZxczsKPj4gLS0g Cj4+IDIuMTcuMQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f XwpWaXJ0dWFsaXphdGlvbiBtYWlsaW5nIGxpc3QKVmlydHVhbGl6YXRpb25AbGlzdHMubGludXgt Zm91bmRhdGlvbi5vcmcKaHR0cHM6Ly9saXN0cy5saW51eGZvdW5kYXRpb24ub3JnL21haWxtYW4v bGlzdGluZm8vdmlydHVhbGl6YXRpb24=