From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ramalingam C Subject: Re: [Intel-gfx] [RFC PATCH 3/6] drm/i915: Add HDCP framework + base implementation Date: Fri, 1 Dec 2017 14:06:03 +0530 Message-ID: <906eedb0-8d1d-52c9-dd95-8e1d34d11317@intel.com> References: <20171130030907.26848-1-seanpaul@chromium.org> <20171130030907.26848-4-seanpaul@chromium.org> <20171201073627.mhxsxgjdwycpzth5@phenom.ffwll.local> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20171201073627.mhxsxgjdwycpzth5@phenom.ffwll.local> Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Sean Paul , dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org, David Airlie , linux-kernel@vger.kernel.org, Rodrigo Vivi List-Id: intel-gfx@lists.freedesktop.org CgpPbiBGcmlkYXkgMDEgRGVjZW1iZXIgMjAxNyAwMTowNiBQTSwgRGFuaWVsIFZldHRlciB3cm90 ZToKPiBPbiBGcmksIERlYyAwMSwgMjAxNyBhdCAxMjo1MzozMVBNICswNTMwLCBSYW1hbGluZ2Ft IEMgd3JvdGU6Cj4+IFNlYW4sCj4+Cj4+IElNSE8sIGl0IHdpbGwgZ29vZCBpZiB3ZSBjYW4gaGF2 ZSBhbGwgZ2VuZXJpYyBoZGNwMS40IGF1dGhlbnRpY2F0aW9uIGZsb3cgaW4KPj4gZHJtIGhlbHBl cnMgYW5kIGFsbCBpbnRlcmVzdGVkIGRpc3BsYXkgZHJpdmVycyB0byB1c2UgdGhlbS4KPj4KPj4g VGhpcyBEZXNpZ24gd2lsbCBtYWtlIHRoZSBleHRlbmRpbmcgb2YgaGRjcCBlYXN5IGZvciBvdGhl ciBkaXNwbGF5IGRyaXZlcnMKPj4gYmFzZWQgb24gRFJNLgo+Pgo+PiBXZSBjYW4gaGF2ZSB0aGUg cmVxdWlyZWQgZHJtX2hkY3Bfc2hpbSB0eXBlIG9mIGltcGxlbWVudGF0aW9uIGF0IGRybQo+PiBz dHJ1Y3R1cmUgd2hpY2ggd2lsbCBiZSBjYWxsZWQgZm9yIHBsYXRmb3JtIHNwZWNpZmljIG9wZXJh dGlvbnMgKGxpa2UKPj4gcHJlcGFyZSBhbiwgc2VuZCBha3N2LCBwcm9ncmFtIGJrc3YvcmVwZWF0 ZXIvcjAgYW5kIHZlcmlmeSBzaGExIGV0Yyk/Cj4gSSBkaXNjdXNzZWQgdGhpcyBleGFjdCBxdWVz dGlvbiB3aXRoIFNlYW4gUGF1bCwgYW5kIGFwcGFyZW50bHkgdGhlCj4gaGFyZHdhcmUgZGVzaWdu cyBhcmUgdG9vIGRpdmVyc2UgdG8gbWFrZSBzaGFyZWQgY29kZSBtdWNoIHVzZWZ1bC4gU29tZSBo dwo+IGhhcyB0aGUgZW50aXJlIGhkY3AgZmxvdyBpbiBodywgc29tZSBhbG1vc3Qgbm90aGluZyAo bGlrZSBpOTE1IGhlcmUpLCBhbmQKPiB0aGVuIHRoZXJlJ3MgZXZlcnl0aGluZyBpbiBiZXR3ZWVu LgpKdXN0IHRyeWluZyB0byB1bmRlcnN0YW5kIHRoZSBvdGhlciBleHRyZW1lIG9mIEhXIChmdWxs KXN1cHBvcnQgZm9yIEhEQ1AgCmhlcmUuCgpXaGVuIHlvdSBzYXkgZXZlcnl0aGluZyBhYm91dCBI RENQIGlzIGltcGxlbWVudGVkIGluIEhXLCBkbyB5b3UgbWVhbiAKdGhhdCB3aG9sZSBwcm90b2Nv bCBjb21tIG9uIEhEQ1AgbGluayBhbHNvIGRyaXZlbiBieSBIVz8KCi0tUmFtCj4KPiBHaXZlbiB0 aGF0IFNlYW4gaGFzIHNlZW4gYSBsb3QgbW9yZSBoZGNwIGltcGxlbWVudGF0aW9ucyB0aGFuIHdl IGhhdmUsCj4gdGhhdCB3ZSByaWdodCBub3cgaGF2ZSBubyBvdGhlciBpbXBsZW1lbnRhdGlvbiB0 aGFuIGk5MTUgaW4gdXBzdHJlYW0gYW5kCj4gdGhhbiB3cm9uZyBhYnN0cmFjdGlvbiBpcyBtdWNo IGhhcmRlciB0byBmaXggdGhhbiBubyBhYnN0cmFjdGlvbiBJJ20gZ29pbmcKPiB3aXRoIFNlYW4n cyBhcHByb2FjaCBvZiAibm8gZ2VuZXJpYyBhYnN0cmFjdGlvbiIgaGVyZS4gUGVyc29uYWxseSBJ J20gbm90Cj4gZXZlbiBmdWxseSBzb2xkIG9uIHRoZSBzaGltIGFic3RyYWN0aW9uLCBidXQgSSB0 aGluayBieSZsYXJnZSB0aGF0IG9uZSBpcwo+IGZpbmUuCj4KPj4gT24gVGh1cnNkYXkgMzAgTm92 ZW1iZXIgMjAxNyAwODozOCBBTSwgU2VhbiBQYXVsIHdyb3RlOgo+Pj4gVGhpcyBwYXRjaCBhZGRz IHRoZSBmcmFtZXdvcmsgcmVxdWlyZWQgdG8gYWRkIEhEQ1Agc3VwcG9ydCB0byBpbnRlbAo+Pj4g Y29ubmVjdG9ycy4gSXQgaW1wbGVtZW50cyBBa3N2IGxvYWRpbmcgZnJvbSBmdXNlLCBhbmQgcGFy dHMgMS8yLzMKPj4+IG9mIHRoZSBIRENQIGF1dGhlbnRpY2F0aW9uIHNjaGVtZS4KPj4+Cj4+PiBO b3RlIHRoYXQgd2l0aG91dCBzaGltIGltcGxlbWVudGF0aW9ucywgdGhpcyBkb2VzIG5vdCBhY3R1 YWxseSBpbXBsZW1lbnQKPj4+IEhEQ1AuIFRoYXQgd2lsbCBjb21lIGluIHN1YnNlcXVlbnQgcGF0 Y2hlcy4KPj4+Cj4+PiBTaWduZWQtb2ZmLWJ5OiBTZWFuIFBhdWwgPHNlYW5wYXVsQGNocm9taXVt Lm9yZz4KPj4+IC0tLQo+Pj4gICAgZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUgICAgICAg fCAgIDEgKwo+Pj4gICAgZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaCAgICAgfCAgODMg KysrKysKPj4+ICAgIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2F0b21pYy5jIHwgIDI2ICst Cj4+PiAgICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kZGkuYyAgICB8ICAxNCArCj4+PiAg ICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcnYuaCAgICB8ICA1MyArKysKPj4+ICAgIGRy aXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2hkY3AuYyAgIHwgNjM2ICsrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKwo+Pj4gICAgNiBmaWxlcyBjaGFuZ2VkLCA4MTEgaW5zZXJ0aW9u cygrKSwgMiBkZWxldGlvbnMoLSkKPj4+ICAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dw dS9kcm0vaTkxNS9pbnRlbF9oZGNwLmMKPj4+Cj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUv ZHJtL2k5MTUvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZQo+Pj4gaW5k ZXggNmMzYjA0ODFlZjgyLi4xZTc0NTUwOGU0MzcgMTAwNjQ0Cj4+PiAtLS0gYS9kcml2ZXJzL2dw dS9kcm0vaTkxNS9NYWtlZmlsZQo+Pj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZp bGUKPj4+IEBAIC04Nyw2ICs4Nyw3IEBAIGk5MTUteSArPSBpbnRlbF9hdWRpby5vIFwKPj4+ICAg IAkgIGludGVsX2ZiYy5vIFwKPj4+ICAgIAkgIGludGVsX2ZpZm9fdW5kZXJydW4ubyBcCj4+PiAg ICAJICBpbnRlbF9mcm9udGJ1ZmZlci5vIFwKPj4+ICsJICBpbnRlbF9oZGNwLm8gXAo+Pj4gICAg CSAgaW50ZWxfaG90cGx1Zy5vIFwKPj4+ICAgIAkgIGludGVsX21vZGVzLm8gXAo+Pj4gICAgCSAg aW50ZWxfb3ZlcmxheS5vIFwKPj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9p OTE1X3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaAo+Pj4gaW5kZXggNjhh NThjY2U2YWIxLi40MzEyODAzMDE3MWQgMTAwNjQ0Cj4+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0v aTkxNS9pOTE1X3JlZy5oCj4+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5o Cj4+PiBAQCAtNzk5MSw2ICs3OTkxLDcgQEAgZW51bSB7Cj4+PiAgICAjZGVmaW5lICAgICBHRU45 X01FTV9MQVRFTkNZX0xFVkVMXzFfNV9TSElGVAk4Cj4+PiAgICAjZGVmaW5lICAgICBHRU45X01F TV9MQVRFTkNZX0xFVkVMXzJfNl9TSElGVAkxNgo+Pj4gICAgI2RlZmluZSAgICAgR0VOOV9NRU1f TEFURU5DWV9MRVZFTF8zXzdfU0hJRlQJMjQKPj4+ICsjZGVmaW5lICAgU0tMX1BDT0RFX0xPQURf SERDUF9LRVlTCQkweDUKPj4+ICAgICNkZWZpbmUgICBTS0xfUENPREVfQ0RDTEtfQ09OVFJPTAkJ MHg3Cj4+PiAgICAjZGVmaW5lICAgICBTS0xfQ0RDTEtfUFJFUEFSRV9GT1JfQ0hBTkdFCTB4Mwo+ Pj4gICAgI2RlZmluZSAgICAgU0tMX0NEQ0xLX1JFQURZX0ZPUl9DSEFOR0UJCTB4MQo+Pj4gQEAg LTgyODUsNiArODI4Niw4OCBAQCBlbnVtIHNrbF9wb3dlcl9nYXRlIHsKPj4+ICAgICNkZWZpbmUg IFNLTF9QV19UT19QRyhwdykJCQkoKHB3KSAtIFNLTF9ESVNQX1BXXzEgKyBTS0xfUEcxKQo+Pj4g ICAgI2RlZmluZSAgU0tMX0ZVU0VfUEdfRElTVF9TVEFUVVMocGcpCQkoMSA8PCAoMjcgLSAocGcp KSkKPj4+ICsKPj4+ICsvKiBIRENQIEtleSBSZWdpc3RlcnMgKi8KPj4+ICsjZGVmaW5lIFNLTF9I RENQX0tFWV9DT05GCQlfTU1JTygweDY2YzAwKQo+Pj4gKyNkZWZpbmUJIFNLTF9IRENQX0FLU1Zf U0VORF9UUklHR0VSCUJJVCgzMSkKPj4+ICsjZGVmaW5lICBTS0xfSERDUF9DTEVBUl9LRVlTX1RS SUdHRVIJQklUKDMwKQo+Pj4gKyNkZWZpbmUgU0tMX0hEQ1BfS0VZX1NUQVRVUwkJX01NSU8oMHg2 NmMwNCkKPj4+ICsjZGVmaW5lICBTS0xfSERDUF9GVVNFX0lOX1BST0dSRVNTCUJJVCg3KQo+Pj4g KyNkZWZpbmUgIFNLTF9IRENQX0ZVU0VfRVJST1IJCUJJVCg2KQo+Pj4gKyNkZWZpbmUgIFNLTF9I RENQX0ZVU0VfRE9ORQkJQklUKDUpCj4+PiArI2RlZmluZSAgU0tMX0hEQ1BfS0VZX0xPQURfU1RB VFVTCUJJVCgxKQo+Pj4gKyNkZWZpbmUgIFNLTF9IRENQX0tFWV9MT0FEX0RPTkUJCUJJVCgwKQo+ Pj4gKyNkZWZpbmUgU0tMX0hEQ1BfQUtTVl9MTwkJX01NSU8oMHg2NmMxMCkKPj4+ICsjZGVmaW5l IFNLTF9IRENQX0FLU1ZfSEkJCV9NTUlPKDB4NjZjMTQpCj4+PiArCj4+PiArLyogSERDUCBSZXBl YXRlciBSZWdpc3RlcnMgKi8KPj4+ICsjZGVmaW5lIFNLTF9IRENQX1JFUF9DVEwJCV9NTUlPKDB4 NjZkMDApCj4+PiArI2RlZmluZSAgU0tMX0hEQ1BfRERJQl9SRVBfUFJFU0VOVAlCSVQoMzApCj4+ PiArI2RlZmluZSAgU0tMX0hEQ1BfRERJQV9SRVBfUFJFU0VOVAlCSVQoMjkpCj4+PiArI2RlZmlu ZSAgU0tMX0hEQ1BfRERJQ19SRVBfUFJFU0VOVAlCSVQoMjgpCj4+PiArI2RlZmluZSAgU0tMX0hE Q1BfRERJRF9SRVBfUFJFU0VOVAlCSVQoMjcpCj4+PiArI2RlZmluZSAgU0tMX0hEQ1BfRERJRl9S RVBfUFJFU0VOVAlCSVQoMjYpCj4+PiArI2RlZmluZSAgU0tMX0hEQ1BfRERJRV9SRVBfUFJFU0VO VAlCSVQoMjUpCj4+PiArI2RlZmluZSAgU0tMX0hEQ1BfRERJQl9TSEExX00wCQkoMSA8PCAyMCkK Pj4+ICsjZGVmaW5lICBTS0xfSERDUF9ERElBX1NIQTFfTTAJCSgyIDw8IDIwKQo+Pj4gKyNkZWZp bmUgIFNLTF9IRENQX0RESUNfU0hBMV9NMAkJKDMgPDwgMjApCj4+PiArI2RlZmluZSAgU0tMX0hE Q1BfRERJRF9TSEExX00wCQkoNCA8PCAyMCkKPj4+ICsjZGVmaW5lICBTS0xfSERDUF9ERElGX1NI QTFfTTAJCSg1IDw8IDIwKQo+Pj4gKyNkZWZpbmUgIFNLTF9IRENQX0RESUVfU0hBMV9NMAkJKDYg PDwgMjApIC8vIEJzcGVjIHNheXMgNT8KPj4+ICsjZGVmaW5lICBTS0xfSERDUF9TSEExX0JVU1kJ CUJJVCgxNikKPj4+ICsjZGVmaW5lICBTS0xfSERDUF9TSEExX1JFQURZCQlCSVQoMTcpCj4+PiAr I2RlZmluZSAgU0tMX0hEQ1BfU0hBMV9DT01QTEVURQkJQklUKDE4KQo+Pj4gKyNkZWZpbmUgIFNL TF9IRENQX1NIQTFfVl9NQVRDSAkJQklUKDE5KQo+Pj4gKyNkZWZpbmUgIFNLTF9IRENQX1NIQTFf VEVYVF8zMgkJKDEgPDwgMSkKPj4+ICsjZGVmaW5lICBTS0xfSERDUF9TSEExX0NPTVBMRVRFX0hB U0gJKDIgPDwgMSkKPj4+ICsjZGVmaW5lICBTS0xfSERDUF9TSEExX1RFWFRfMjQJCSg0IDw8IDEp Cj4+PiArI2RlZmluZSAgU0tMX0hEQ1BfU0hBMV9URVhUXzE2CQkoNSA8PCAxKQo+Pj4gKyNkZWZp bmUgIFNLTF9IRENQX1NIQTFfVEVYVF84CQkoNiA8PCAxKQo+Pj4gKyNkZWZpbmUgIFNLTF9IRENQ X1NIQTFfVEVYVF8wCQkoNyA8PCAxKQo+Pj4gKyNkZWZpbmUgU0tMX0hEQ1BfU0hBX1ZfUFJJTUVf SDAJCV9NTUlPKDB4NjZkMDQpCj4+PiArI2RlZmluZSBTS0xfSERDUF9TSEFfVl9QUklNRV9IMQkJ X01NSU8oMHg2NmQwOCkKPj4+ICsjZGVmaW5lIFNLTF9IRENQX1NIQV9WX1BSSU1FX0gyCQlfTU1J TygweDY2ZDBDKQo+Pj4gKyNkZWZpbmUgU0tMX0hEQ1BfU0hBX1ZfUFJJTUVfSDMJCV9NTUlPKDB4 NjZkMTApCj4+PiArI2RlZmluZSBTS0xfSERDUF9TSEFfVl9QUklNRV9INAkJX01NSU8oMHg2NmQx NCkKPj4+ICsjZGVmaW5lIFNLTF9IRENQX1NIQV9WX1BSSU1FKGgpCQlfTU1JTygoMHg2NmQwNCAr IGggKiA0KSkKPj4+ICsjZGVmaW5lIFNLTF9IRENQX1NIQV9URVhUCQlfTU1JTygweDY2ZDE4KQo+ Pj4gKwo+Pj4gKy8qIEhEQ1AgQXV0aCBSZWdpc3RlcnMgKi8KPj4+ICsjZGVmaW5lIF9TS0xfUE9S VEFfSERDUF9BVVRIRU5DCQkweDY2ODAwCj4+PiArI2RlZmluZSBfU0tMX1BPUlRCX0hEQ1BfQVVU SEVOQwkJMHg2NjUwMAo+Pj4gKyNkZWZpbmUgX1NLTF9QT1JUQ19IRENQX0FVVEhFTkMJCTB4NjY2 MDAKPj4+ICsjZGVmaW5lIF9TS0xfUE9SVERfSERDUF9BVVRIRU5DCQkweDY2NzAwCj4+PiArI2Rl ZmluZSBfU0tMX1BPUlRFX0hEQ1BfQVVUSEVOQwkJMHg2NkEwMAo+Pj4gKyNkZWZpbmUgX1NLTF9Q T1JURl9IRENQX0FVVEhFTkMJCTB4NjY5MDAKPj4+ICsjZGVmaW5lIF9TS0xfUE9SVF9IRENQX0FV VEhFTkMocG9ydCwgeCkJX01NSU8oX1BJQ0socG9ydCwgXAo+Pj4gKwkJCQkJICBfU0tMX1BPUlRB X0hEQ1BfQVVUSEVOQywgXAo+Pj4gKwkJCQkJICBfU0tMX1BPUlRCX0hEQ1BfQVVUSEVOQywgXAo+ Pj4gKwkJCQkJICBfU0tMX1BPUlRDX0hEQ1BfQVVUSEVOQywgXAo+Pj4gKwkJCQkJICBfU0tMX1BP UlREX0hEQ1BfQVVUSEVOQywgXAo+Pj4gKwkJCQkJICBfU0tMX1BPUlRFX0hEQ1BfQVVUSEVOQywg XAo+Pj4gKwkJCQkJICBfU0tMX1BPUlRGX0hEQ1BfQVVUSEVOQykgKyB4KQo+Pj4gKyNkZWZpbmUg U0tMX1BPUlRfSERDUF9DT05GKHBvcnQpCV9TS0xfUE9SVF9IRENQX0FVVEhFTkMocG9ydCwgMHgw KQo+Pj4gKyNkZWZpbmUgIFNLTF9IRENQX0NPTkZfQ0FQVFVSRV9BTglCSVQoMCkKPj4+ICsjZGVm aW5lICBTS0xfSERDUF9DT05GX0FVVEhfQU5EX0VOQwkoQklUKDEpIHwgQklUKDApKQo+Pj4gKyNk ZWZpbmUgU0tMX1BPUlRfSERDUF9BTklOSVQocG9ydCkJX1NLTF9QT1JUX0hEQ1BfQVVUSEVOQyhw b3J0LCAweDQpCj4+PiArI2RlZmluZSBTS0xfUE9SVF9IRENQX0FOTE8ocG9ydCkJX1NLTF9QT1JU X0hEQ1BfQVVUSEVOQyhwb3J0LCAweDgpCj4+PiArI2RlZmluZSBTS0xfUE9SVF9IRENQX0FOSEko cG9ydCkJX1NLTF9QT1JUX0hEQ1BfQVVUSEVOQyhwb3J0LCAweEMpCj4+PiArI2RlZmluZSBTS0xf UE9SVF9IRENQX0JLU1ZMTyhwb3J0KQlfU0tMX1BPUlRfSERDUF9BVVRIRU5DKHBvcnQsIDB4MTAp Cj4+PiArI2RlZmluZSBTS0xfUE9SVF9IRENQX0JLU1ZISShwb3J0KQlfU0tMX1BPUlRfSERDUF9B VVRIRU5DKHBvcnQsIDB4MTQpCj4+PiArI2RlZmluZSBTS0xfUE9SVF9IRENQX1JQUklNRShwb3J0 KQlfU0tMX1BPUlRfSERDUF9BVVRIRU5DKHBvcnQsIDB4MTgpCj4+PiArI2RlZmluZSBTS0xfUE9S VF9IRENQX1NUQVRVUyhwb3J0KQlfU0tMX1BPUlRfSERDUF9BVVRIRU5DKHBvcnQsIDB4MUMpCj4+ PiArI2RlZmluZSAgU0tMX0hEQ1BfU1RBVFVTX1NUUkVBTV9BX0VOQwlCSVQoMzEpCj4+PiArI2Rl ZmluZSAgU0tMX0hEQ1BfU1RBVFVTX1NUUkVBTV9CX0VOQwlCSVQoMzApCj4+PiArI2RlZmluZSAg U0tMX0hEQ1BfU1RBVFVTX1NUUkVBTV9DX0VOQwlCSVQoMjkpCj4+PiArI2RlZmluZSAgU0tMX0hE Q1BfU1RBVFVTX1NUUkVBTV9EX0VOQwlCSVQoMjgpCj4+PiArI2RlZmluZSAgU0tMX0hEQ1BfU1RB VFVTX0FVVEgJCUJJVCgyMSkKPj4+ICsjZGVmaW5lICBTS0xfSERDUF9TVEFUVVNfRU5DCQlCSVQo MjApCj4+PiArI2RlZmluZSAgU0tMX0hEQ1BfU1RBVFVTX1JJX01BVENICUJJVCgxOSkKPj4+ICsj ZGVmaW5lICBTS0xfSERDUF9TVEFUVVNfUjBfUkVBRFkJQklUKDE4KQo+Pj4gKyNkZWZpbmUgIFNL TF9IRENQX1NUQVRVU19BTl9SRUFEWQlCSVQoMTcpCj4+PiArI2RlZmluZSAgU0tMX0hEQ1BfU1RB VFVTX0NJUEhFUgkJQklUKDE2KQo+Pj4gKyNkZWZpbmUgIFNLTF9IRENQX1NUQVRVU19GUkFNRV9D TlQoeCkJKCh4ID4+IDgpICYgMHhmZikKPj4+ICsKPj4+ICAgIC8qIFBlci1waXBlIERESSBGdW5j dGlvbiBDb250cm9sICovCj4+PiAgICAjZGVmaW5lIF9UUkFOU19ERElfRlVOQ19DVExfQQkJMHg2 MDQwMAo+Pj4gICAgI2RlZmluZSBfVFJBTlNfRERJX0ZVTkNfQ1RMX0IJCTB4NjE0MDAKPj4+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9hdG9taWMuYyBiL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2ludGVsX2F0b21pYy5jCj4+PiBpbmRleCAzNmQ0ZTYzNWU0Y2UuLmRkZjA4 MjI3ZDljYiAxMDA2NDQKPj4+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2F0b21p Yy5jCj4+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9hdG9taWMuYwo+Pj4gQEAg LTEwOSwxMiArMTA5LDM0IEBAIGludCBpbnRlbF9kaWdpdGFsX2Nvbm5lY3Rvcl9hdG9taWNfY2hl Y2soc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm4sCj4+PiAgICAJc3RydWN0IGludGVsX2RpZ2l0 YWxfY29ubmVjdG9yX3N0YXRlICpvbGRfY29ubl9zdGF0ZSA9Cj4+PiAgICAJCXRvX2ludGVsX2Rp Z2l0YWxfY29ubmVjdG9yX3N0YXRlKG9sZF9zdGF0ZSk7Cj4+PiAgICAJc3RydWN0IGRybV9jcnRj X3N0YXRlICpjcnRjX3N0YXRlOwo+Pj4gLQo+Pj4gLQlpZiAoIW5ld19zdGF0ZS0+Y3J0YykKPj4+ ICsJdWludDY0X3Qgb2xkX2NwID0gb2xkX2Nvbm5fc3RhdGUtPmJhc2UuY29udGVudF9wcm90ZWN0 aW9uOwo+Pj4gKwl1aW50NjRfdCBuZXdfY3AgPSBuZXdfc3RhdGUtPmNvbnRlbnRfcHJvdGVjdGlv bjsKPj4+ICsKPj4+ICsJaWYgKCFuZXdfc3RhdGUtPmNydGMpIHsKPj4+ICsJCS8qCj4+PiArCQkg KiBJZiB0aGUgY29ubmVjdG9yIGlzIGJlaW5nIGRpc2FibGVkIHdpdGggQ1AgZW5hYmxlZCwgbWFy ayBpdAo+Pj4gKwkJICogZGVzaXJlZCBzbyBpdCdzIHJlLWVuYWJsZWQgd2hlbiB0aGUgY29ubmVj dG9yIGlzIGJyb3VnaHQgYmFjawo+Pj4gKwkJICovCj4+PiArCQlpZiAob2xkX2NwID09IERSTV9N T0RFX0NPTlRFTlRfUFJPVEVDVElPTl9FTkFCTEVEKQo+Pj4gKwkJCW5ld19zdGF0ZS0+Y29udGVu dF9wcm90ZWN0aW9uID0KPj4+ICsJCQkJRFJNX01PREVfQ09OVEVOVF9QUk9URUNUSU9OX0RFU0lS RUQ7Cj4+PiAgICAJCXJldHVybiAwOwo+Pj4gKwl9Cj4+PiAgICAJY3J0Y19zdGF0ZSA9IGRybV9h dG9taWNfZ2V0X25ld19jcnRjX3N0YXRlKG5ld19zdGF0ZS0+c3RhdGUsIG5ld19zdGF0ZS0+Y3J0 Yyk7Cj4+PiArCWlmIChuZXdfY3AgIT0gb2xkX2NwKSB7Cj4+PiArCQkvKiBPbmx5IGRyaXZlcnMg Y2FuIHNldCBjb250ZW50IHByb3RlY3Rpb24gZW5hYmxlZCAqLwo+Pj4gKwkJaWYgKG5ld19jcCA9 PSBEUk1fTU9ERV9DT05URU5UX1BST1RFQ1RJT05fRU5BQkxFRCkKPj4+ICsJCQluZXdfc3RhdGUt PmNvbnRlbnRfcHJvdGVjdGlvbiA9Cj4+PiArCQkJCURSTV9NT0RFX0NPTlRFTlRfUFJPVEVDVElP Tl9ERVNJUkVEOwo+Pj4gKwo+Pj4gKwkJLyogSW52b2x2ZSB0aGUgZW5jb2Rlci9jb25uZWN0b3Ig dG8gZW5hYmxlL2Rpc2FibGUgQ1AgKi8KPj4+ICsJCWlmIChuZXdfY3AgPT0gRFJNX01PREVfQ09O VEVOVF9QUk9URUNUSU9OX09GRiB8fAo+Pj4gKwkJICAgIG9sZF9jcCA9PSBEUk1fTU9ERV9DT05U RU5UX1BST1RFQ1RJT05fT0ZGKQo+Pj4gKwkJCWNydGNfc3RhdGUtPm1vZGVfY2hhbmdlZCA9IHRy dWU7Cj4+IFdlIG5lZWQgbm90IHBlcmZvcm0gdGhlIG1vZGUgc2V0IGZvciBoZGNwIGVuYWJsZS9k aXNhYmxlLgo+PiBBdXRoZW50aWNhdGlvbiBhbmQgZW5jcnlwdGlvbiBjYW4gYmUgc3RhcnRlZCBv biBhY3RpdmUgcG9ydC4KPiBXYXMgc2ltcGxlciB0byBpbXBsZW1lbnQgdGhpcyB3YXkgOi0pIFdl IGNhbiBmaXggdGhpcyBieSBwdXNoaW5nIHRoZSBoZGNwCj4gZW5hYmxlL2Rpc2FibGUgY29kZSBp bnRvIGEgcG9zdC1tb2Rlc2V0IG9wZXJhdGlvbi4gVmlsbGUgaGFkIHdyaXR0ZW4gdGhlCj4gaW5m cmFzdHJ1Y3R1cmUgZm9yIHRoYXQgdG8gZml4IGEgZmV3IGZhc3Rib290IGNvcm5lciBjYXNlcy4g QnV0IHRoYXQKPiBpbmZyYXN0cnVjdHVyZSBoYXNuJ3QgbGFuZGVkIHlldCwgc28gcHJvYmFibHkg YmV0dGVyIHRvIGRvIHRoYXQgaW4gYQo+IGZvbGxvdy11cC4KPgo+IEkgYWxzbyBndWVzcyB0aGF0 IENyT1Mgc2ltcGx5IHNldCB0aGlzIHRvIGRlc2lyZWQgZXZlcnkgdGltZSB0aGV5IGVuYWJsZQo+ IGFuIGV4dGVybmFsIHNjcmVlbiwgc28gaXQgd29uJ3QgcmVzdWx0IGluIGFuIHVuZWNlc3Nhcnkg bW9kZXNldC4KPgo+Pj4gKwl9Cj4+PiArCj4+PiAgICAJLyoKPj4+ICAgIAkgKiBUaGVzZSBwcm9w ZXJ0aWVzIGFyZSBoYW5kbGVkIGJ5IGZhc3RzZXQsIGFuZCBtaWdodCBub3QgZW5kCj4+PiAgICAJ ICogdXAgaW4gYSBtb2Rlc2V0Lgo+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1 L2ludGVsX2RkaS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGRpLmMKPj4+IGluZGV4 IDkzM2MxOGZkNDI1OC4uMGU2OTMzN2Y0MTBkIDEwMDY0NAo+Pj4gLS0tIGEvZHJpdmVycy9ncHUv ZHJtL2k5MTUvaW50ZWxfZGRpLmMKPj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVs X2RkaS5jCj4+PiBAQCAtMjQzMiwxMCArMjQzMiwxNyBAQCBzdGF0aWMgdm9pZCBpbnRlbF9lbmFi bGVfZGRpKHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyLAo+Pj4gICAgCQkJICAgICBjb25z dCBzdHJ1Y3QgaW50ZWxfY3J0Y19zdGF0ZSAqY3J0Y19zdGF0ZSwKPj4+ICAgIAkJCSAgICAgY29u c3Qgc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKmNvbm5fc3RhdGUpCj4+PiAgICB7Cj4+PiAr CXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSBjb25uX3N0YXRlLT5jb25uZWN0b3I7 Cj4+PiArCXN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmludGVsX2Nvbm5lY3RvciA9IHRvX2ludGVs X2Nvbm5lY3Rvcihjb25uZWN0b3IpOwo+Pj4gKwo+Pj4gICAgCWlmIChpbnRlbF9jcnRjX2hhc190 eXBlKGNydGNfc3RhdGUsIElOVEVMX09VVFBVVF9IRE1JKSkKPj4+ICAgIAkJaW50ZWxfZW5hYmxl X2RkaV9oZG1pKGVuY29kZXIsIGNydGNfc3RhdGUsIGNvbm5fc3RhdGUpOwo+Pj4gICAgCWVsc2UK Pj4+ICAgIAkJaW50ZWxfZW5hYmxlX2RkaV9kcChlbmNvZGVyLCBjcnRjX3N0YXRlLCBjb25uX3N0 YXRlKTsKPj4+ICsKPj4+ICsJaWYgKGNvbm5fc3RhdGUtPmNvbnRlbnRfcHJvdGVjdGlvbiA9PQo+ Pj4gKwkJCURSTV9NT0RFX0NPTlRFTlRfUFJPVEVDVElPTl9ERVNJUkVEKQo+Pj4gKwkJaW50ZWxf aGRjcF9lbmFibGUoaW50ZWxfY29ubmVjdG9yKTsKPj4+ICAgIH0KPj4+ICAgIHN0YXRpYyB2b2lk IGludGVsX2Rpc2FibGVfZGRpX2RwKHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyLAo+Pj4g QEAgLTI0NjgsMTAgKzI0NzUsMTcgQEAgc3RhdGljIHZvaWQgaW50ZWxfZGlzYWJsZV9kZGkoc3Ry dWN0IGludGVsX2VuY29kZXIgKmVuY29kZXIsCj4+PiAgICAJCQkgICAgICBjb25zdCBzdHJ1Y3Qg aW50ZWxfY3J0Y19zdGF0ZSAqb2xkX2NydGNfc3RhdGUsCj4+PiAgICAJCQkgICAgICBjb25zdCBz dHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqb2xkX2Nvbm5fc3RhdGUpCj4+PiAgICB7Cj4+PiAr CXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IgPSBvbGRfY29ubl9zdGF0ZS0+Y29ubmVj dG9yOwo+Pj4gKwlzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICppbnRlbF9jb25uZWN0b3IgPSB0b19p bnRlbF9jb25uZWN0b3IoY29ubmVjdG9yKTsKPj4+ICsKPj4+ICAgIAlpZiAoaW50ZWxfY3J0Y19o YXNfdHlwZShvbGRfY3J0Y19zdGF0ZSwgSU5URUxfT1VUUFVUX0hETUkpKQo+Pj4gICAgCQlpbnRl bF9kaXNhYmxlX2RkaV9oZG1pKGVuY29kZXIsIG9sZF9jcnRjX3N0YXRlLCBvbGRfY29ubl9zdGF0 ZSk7Cj4+PiAgICAJZWxzZQo+Pj4gICAgCQlpbnRlbF9kaXNhYmxlX2RkaV9kcChlbmNvZGVyLCBv bGRfY3J0Y19zdGF0ZSwgb2xkX2Nvbm5fc3RhdGUpOwo+Pj4gKwo+Pj4gKwlpZiAob2xkX2Nvbm5f c3RhdGUtPmNvbnRlbnRfcHJvdGVjdGlvbiAhPQo+Pj4gKwkJCURSTV9NT0RFX0NPTlRFTlRfUFJP VEVDVElPTl9PRkYpCj4+PiArCQlpbnRlbF9oZGNwX2Rpc2FibGUoaW50ZWxfY29ubmVjdG9yKTsK Pj4gV2UgbWlnaHQgd2FudCB0byBkaXNhYmxlIHRoZSBoZGNwIGJlZm9yZSBkaXNhYmxpbmcgdGhl IERESS4gQWN0dWFsbHkgd2UKPj4gY291bGQgdHJpZ2dlciBoZGNwIGRpc2FibGUgYXQgY29ubmVj dG9yIHN0YXRlIGNoYW5nZShkdWUgdG8gaG90LXVucGx1ZykKPj4gYWxzby4KPiBZZWFoIHRoaXMg cGFydCBuZWVkcyB0byBiZSByZXdvcmtlZCBhIGJpdCwgYWxzbyBiZWNhdXNlIHRoZSBsb2NraW5n Cj4gZG9lc24ndCB3b3JrIHlldC4gSSB0aGluayBob3QtdW5wbHVnIGlzIGhhbmRsZWQgYnkgdGhl IHdvcmtlciB0aHJlYWQKPiBhbHJlYWR5LCBpdCBkb2VzIHRoZSBtYW5kYXRvcnkgcmVndWxhciBw b2xsaW5nLgo+IC1EYW5pZWwKPgo+PiBUaGFua3MsCj4+IC0tUmFtCj4+PiAgICB9Cj4+PiAgICBz dGF0aWMgdm9pZCBieHRfZGRpX3ByZV9wbGxfZW5hYmxlKHN0cnVjdCBpbnRlbF9lbmNvZGVyICpl bmNvZGVyLAo+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5o IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKPj4+IGluZGV4IDQ3ZDAyMmQ0ODcx OC4uODkyNDAwNDU3NWI4IDEwMDY0NAo+Pj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50 ZWxfZHJ2LmgKPj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oCj4+PiBA QCAtMjk5LDYgKzI5OSw0OSBAQCBzdHJ1Y3QgaW50ZWxfcGFuZWwgewo+Pj4gICAgCX0gYmFja2xp Z2h0Owo+Pj4gICAgfTsKPj4+ICtzdHJ1Y3QgaW50ZWxfaGRjcF9zaGltIHsKPj4+ICsJLyogT3V0 cHV0cyB0aGUgdHJhbnNtaXR0ZXIncyBBbiBhbmQgQWtzdiB2YWx1ZXMgdG8gdGhlIHJlY2VpdmVy LiAqLwo+Pj4gKwlpbnQgKCp3cml0ZV9hbl9ha3N2KShzdHJ1Y3QgaW50ZWxfZGlnaXRhbF9wb3J0 ICppbnRlbF9kaWdfcG9ydCwgdTggKmFuKTsKPj4+ICsKPj4+ICsJLyogUmVhZHMgdGhlIHJlY2Vp dmVyJ3Mga2V5IHNlbGVjdGlvbiB2ZWN0b3IgKi8KPj4+ICsJaW50ICgqcmVhZF9ia3N2KShzdHJ1 Y3QgaW50ZWxfZGlnaXRhbF9wb3J0ICppbnRlbF9kaWdfcG9ydCwgdTggKmJrc3YpOwo+Pj4gKwo+ Pj4gKwkvKgo+Pj4gKwkgKiBSZWFkcyBCSU5GTyBmcm9tIERQIHJlY2VpdmVycyBhbmQgQlNUQVRV UyBmcm9tIEhETUkgcmVjZWl2ZXJzLiBUaGUKPj4+ICsJICogZGVmaW5pdGlvbnMgYXJlIHRoZSBz YW1lIGluIHRoZSByZXNwZWN0aXZlIHNwZWNzLCBidXQgdGhlIG5hbWVzIGFyZQo+Pj4gKwkgKiBk aWZmZXJlbnQuIENhbGwgaXQgQlNUQVRVUyBzaW5jZSB0aGF0J3MgdGhlIG5hbWUgdGhlIEhETUkg c3BlYwo+Pj4gKwkgKiB1c2VzIGFuZCBpdCB3YXMgdGhlcmUgZmlyc3QuCj4+PiArCSAqLwo+Pj4g KwlpbnQgKCpyZWFkX2JzdGF0dXMpKHN0cnVjdCBpbnRlbF9kaWdpdGFsX3BvcnQgKmludGVsX2Rp Z19wb3J0LAo+Pj4gKwkJCSAgICB1OCAqYnN0YXR1cyk7Cj4+PiArCj4+PiArCS8qIERldGVybWlu ZXMgd2hldGhlciBhIHJlcGVhdGVyIGlzIHByZXNlbnQgZG93bnN0cmVhbSAqLwo+Pj4gKwlpbnQg KCpyZXBlYXRlcl9wcmVzZW50KShzdHJ1Y3QgaW50ZWxfZGlnaXRhbF9wb3J0ICppbnRlbF9kaWdf cG9ydCwKPj4+ICsJCQkJYm9vbCAqcmVwZWF0ZXJfcHJlc2VudCk7Cj4+PiArCj4+PiArCS8qIFJl YWRzIHRoZSByZWNlaXZlcidzIFJpJyB2YWx1ZSAqLwo+Pj4gKwlpbnQgKCpyZWFkX3JpX3ByaW1l KShzdHJ1Y3QgaW50ZWxfZGlnaXRhbF9wb3J0ICppbnRlbF9kaWdfcG9ydCwgdTggKnJpKTsKPj4+ ICsKPj4+ICsJLyogRGV0ZXJtaW5lcyBpZiB0aGUgcmVjZWl2ZXIncyBLU1YgRklGTyBpcyByZWFk eSBmb3IgY29uc3VtcHRpb24gKi8KPj4+ICsJaW50ICgqcmVhZF9rc3ZfcmVhZHkpKHN0cnVjdCBp bnRlbF9kaWdpdGFsX3BvcnQgKmludGVsX2RpZ19wb3J0LAo+Pj4gKwkJCSAgICAgIGJvb2wgKmtz dl9yZWFkeSk7Cj4+PiArCj4+PiArCS8qIFJlYWRzIHRoZSBrc3YgZmlmbyBmb3IgbnVtX2Rvd25z dHJlYW0gZGV2aWNlcyAqLwo+Pj4gKwlpbnQgKCpyZWFkX2tzdl9maWZvKShzdHJ1Y3QgaW50ZWxf ZGlnaXRhbF9wb3J0ICppbnRlbF9kaWdfcG9ydCwKPj4+ICsJCQkgICAgIGludCBudW1fZG93bnN0 cmVhbSwgdTggKmtzdl9maWZvKTsKPj4+ICsKPj4+ICsJLyogUmVhZHMgYSAzMi1iaXQgcGFydCBv ZiBWJyBmcm9tIHRoZSByZWNlaXZlciAqLwo+Pj4gKwlpbnQgKCpyZWFkX3ZfcHJpbWVfcGFydCko c3RydWN0IGludGVsX2RpZ2l0YWxfcG9ydCAqaW50ZWxfZGlnX3BvcnQsCj4+PiArCQkJCSBpbnQg aSwgdTMyICpwYXJ0KTsKPj4+ICsKPj4+ICsJLyogRW5hYmxlcyBIRENQIHNpZ25hbGxpbmcgb24g dGhlIHBvcnQgKi8KPj4+ICsJaW50ICgqdG9nZ2xlX3NpZ25hbGxpbmcpKHN0cnVjdCBpbnRlbF9k aWdpdGFsX3BvcnQgKmludGVsX2RpZ19wb3J0LAo+Pj4gKwkJCQkgYm9vbCBlbmFibGUpOwo+Pj4g Kwo+Pj4gKwkvKiBFbnN1cmVzIHRoZSBsaW5rIGlzIHN0aWxsIHByb3RlY3RlZCAqLwo+Pj4gKwli b29sICgqY2hlY2tfbGluaykoc3RydWN0IGludGVsX2RpZ2l0YWxfcG9ydCAqaW50ZWxfZGlnX3Bv cnQpOwo+Pj4gK307Cj4+PiArCj4+PiAgICBzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yIHsKPj4+ICAg IAlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciBiYXNlOwo+Pj4gICAgCS8qCj4+PiBAQCAtMzMwLDYgKzM3 Myw5IEBAIHN0cnVjdCBpbnRlbF9jb25uZWN0b3Igewo+Pj4gICAgCS8qIFdvcmsgc3RydWN0IHRv IHNjaGVkdWxlIGEgdWV2ZW50IG9uIGxpbmsgdHJhaW4gZmFpbHVyZSAqLwo+Pj4gICAgCXN0cnVj dCB3b3JrX3N0cnVjdCBtb2Rlc2V0X3JldHJ5X3dvcms7Cj4+PiArCj4+PiArCWNvbnN0IHN0cnVj dCBpbnRlbF9oZGNwX3NoaW0gKmhkY3Bfc2hpbTsKPj4+ICsJc3RydWN0IGRlbGF5ZWRfd29yayBo ZGNwX3dvcms7Cj4+PiAgICB9Owo+Pj4gICAgc3RydWN0IGludGVsX2RpZ2l0YWxfY29ubmVjdG9y X3N0YXRlIHsKPj4+IEBAIC0xMjk1LDYgKzEzNDEsOCBAQCB2b2lkIGludGVsX2RkaV9zZXRfdmNf cGF5bG9hZF9hbGxvYyhjb25zdCBzdHJ1Y3QgaW50ZWxfY3J0Y19zdGF0ZSAqY3J0Y19zdGF0ZSwK Pj4+ICAgIAkJCQkgICAgYm9vbCBzdGF0ZSk7Cj4+PiAgICB1MzIgYnh0X3NpZ25hbF9sZXZlbHMo c3RydWN0IGludGVsX2RwICppbnRlbF9kcCk7Cj4+PiAgICB1aW50MzJfdCBkZGlfc2lnbmFsX2xl dmVscyhzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwKTsKPj4+ICtpbnQgaW50ZWxfZGRpX2VuYWJs ZV9oZGNwX3NpZ25hbGxpbmcoc3RydWN0IGludGVsX2VuY29kZXIgKmludGVsX2VuY29kZXIpOwo+ Pj4gK2ludCBpbnRlbF9kZGlfZGlzYWJsZV9oZGNwX3NpZ25hbGxpbmcoc3RydWN0IGludGVsX2Vu Y29kZXIgKmludGVsX2VuY29kZXIpOwo+Pj4gICAgdTggaW50ZWxfZGRpX2RwX3ZvbHRhZ2VfbWF4 KHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyKTsKPj4+ICAgIHVuc2lnbmVkIGludCBpbnRl bF9mYl9hbGlnbl9oZWlnaHQoY29uc3Qgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCj4+PiBA QCAtMTc0Niw2ICsxNzk0LDExIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBpbnRlbF9iYWNrbGlnaHRf ZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGludGVsX2Nvbm5lY3RvciAqY29uCj4+PiAgICB9Cj4+ PiAgICAjZW5kaWYgLyogQ09ORklHX0JBQ0tMSUdIVF9DTEFTU19ERVZJQ0UgKi8KPj4+ICsvKiBp bnRlbF9oZGNwLmMgKi8KPj4+ICtpbnQgaW50ZWxfaGRjcF9lbmFibGUoc3RydWN0IGludGVsX2Nv bm5lY3RvciAqY29ubmVjdG9yKTsKPj4+ICtpbnQgaW50ZWxfaGRjcF9kaXNhYmxlKHN0cnVjdCBp bnRlbF9jb25uZWN0b3IgKmNvbm5lY3Rvcik7Cj4+PiAraW50IGludGVsX2hkY3BfY2hlY2tfbGlu ayhzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICpjb25uZWN0b3IpOwo+Pj4gK3ZvaWQgaW50ZWxfaGRj cF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Cj4+PiAgICAvKiBpbnRlbF9wc3IuYyAq Lwo+Pj4gICAgdm9pZCBpbnRlbF9wc3JfZW5hYmxlKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAs Cj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaGRjcC5jIGIvZHJp dmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaGRjcC5jCj4+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ Pj4gaW5kZXggMDAwMDAwMDAwMDAwLi5hMmE1NzVlZDY1N2UKPj4+IC0tLSAvZGV2L251bGwKPj4+ ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2hkY3AuYwo+Pj4gQEAgLTAsMCArMSw2 MzYgQEAKPj4+ICsvKgo+Pj4gKyAqIENvcHlyaWdodCAoQykgMjAxNyBHb29nbGUsIEluYy4KPj4+ ICsgKgo+Pj4gKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9m IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKPj4+ICsgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVi bGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAo+Pj4gKyAqIG1heSBi ZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCj4+ PiArICoKPj4+ICsgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh dCBpdCB3aWxsIGJlIHVzZWZ1bCwKPj4+ICsgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgo+Pj4gKyAqIE1FUkNIQU5UQUJJTElU WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKPj4+ICsgKiBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+Pj4gKyAqLwo+Pj4g Kwo+Pj4gKyNpbmNsdWRlIDxkcm0vZHJtUC5oPgo+Pj4gKyNpbmNsdWRlIDxkcm0vZHJtX2hkY3Au aD4KPj4+ICsjaW5jbHVkZSA8bGludXgvaTJjLmg+Cj4+PiArI2luY2x1ZGUgPGxpbnV4L3JhbmRv bS5oPgo+Pj4gKwo+Pj4gKyNpbmNsdWRlICJpbnRlbF9kcnYuaCIKPj4+ICsjaW5jbHVkZSAiaTkx NV9yZWcuaCIKPj4+ICsKPj4+ICsjZGVmaW5lIEtFWV9MT0FEX1RSSUVTCTUKPj4+ICsKPj4+ICtz dGF0aWMgaW50IGludGVsX2hkY3BfcG9sbF9rc3ZfZmlmbyhzdHJ1Y3QgaW50ZWxfZGlnaXRhbF9w b3J0ICppbnRlbF9kaWdfcG9ydCwKPj4+ICsJCQkJICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9oZGNw X3NoaW0gKnNoaW0pCj4+PiArewo+Pj4gKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVz ICsgbXNlY3NfdG9famlmZmllc190aW1lb3V0KDUwMCk7Cj4+PiArCWludCByZXQ7Cj4+PiArCWJv b2wga3N2X3JlYWR5Owo+Pj4gKwo+Pj4gKwl3aGlsZSAodHJ1ZSkgewo+Pj4gKwkJcmV0ID0gc2hp bS0+cmVhZF9rc3ZfcmVhZHkoaW50ZWxfZGlnX3BvcnQsICZrc3ZfcmVhZHkpOwo+Pj4gKwkJaWYg KHJldCkKPj4+ICsJCQlyZXR1cm4gcmV0Owo+Pj4gKwkJaWYgKGtzdl9yZWFkeSkKPj4+ICsJCQli cmVhazsKPj4+ICsJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQo+Pj4gKwkJCXJl dHVybiAtRVRJTUVET1VUOwo+Pj4gKwkJbXNsZWVwKDEwMCk7Cj4+PiArCX0KPj4+ICsJcmV0dXJu IDA7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyB2b2lkIGludGVsX2hkY3BfY2xlYXJfa2V5cyhz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCj4+PiArewo+Pj4gKwlJOTE1X1dSSVRF KFNLTF9IRENQX0tFWV9DT05GLCBTS0xfSERDUF9DTEVBUl9LRVlTX1RSSUdHRVIpOwo+Pj4gKwlJ OTE1X1dSSVRFKFNLTF9IRENQX0tFWV9TVEFUVVMsCj4+PiArCQkgICBTS0xfSERDUF9LRVlfTE9B RF9ET05FIHwgU0tMX0hEQ1BfS0VZX0xPQURfU1RBVFVTIHwKPj4+ICsJCSAgIFNLTF9IRENQX0ZV U0VfSU5fUFJPR1JFU1MgfCBTS0xfSERDUF9GVVNFX0VSUk9SIHwKPj4+ICsJCSAgIFNLTF9IRENQ X0ZVU0VfRE9ORSk7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQgaW50ZWxfaGRjcF9sb2Fk X2tleXMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQo+Pj4gK3sKPj4+ICsJdW5z aWduZWQgbG9uZyB0aW1lb3V0Owo+Pj4gKwlpbnQgcmV0Owo+Pj4gKwl1MzIgdmFsOwo+Pj4gKwo+ Pj4gKwkvLyBJbml0aWF0ZSBsb2FkaW5nIHRoZSBIRENQIGtleSBmcm9tIGZ1c2VzCj4+PiArCW11 dGV4X2xvY2soJmRldl9wcml2LT5wY3VfbG9jayk7Cj4+PiArCXJldCA9IHNhbmR5YnJpZGdlX3Bj b2RlX3dyaXRlKGRldl9wcml2LCBTS0xfUENPREVfTE9BRF9IRENQX0tFWVMsIDEpOwo+Pj4gKwlt dXRleF91bmxvY2soJmRldl9wcml2LT5wY3VfbG9jayk7Cj4+PiArCWlmIChyZXQpIHsKPj4+ICsJ CURSTV9FUlJPUigiRmFpbGVkIHRvIGluaXRpYXRlIEhEQ1Aga2V5IGxvYWQgKCVkKVxuIiwgcmV0 KTsKPj4+ICsJCXJldHVybiByZXQ7Cj4+PiArCX0KPj4+ICsKPj4+ICsJLy8gV2FpdCBmb3IgdGhl IGtleXMgdG8gbG9hZCAoNTAwdXMpCj4+PiArCXRpbWVvdXQgPSBqaWZmaWVzICsgbnNlY3NfdG9f amlmZmllc190aW1lb3V0KDUwMCAqIDEwMDApOwo+Pj4gKwl3aGlsZSAodHJ1ZSkgewo+Pj4gKwkJ dmFsID0gSTkxNV9SRUFEKFNLTF9IRENQX0tFWV9TVEFUVVMpOwo+Pj4gKwkJaWYgKHZhbCAmIFNL TF9IRENQX0tFWV9MT0FEX0RPTkUpCj4+PiArCQkJYnJlYWs7Cj4+PiArCQlpZiAodGltZV9hZnRl cihqaWZmaWVzLCB0aW1lb3V0KSkKPj4+ICsJCQlyZXR1cm4gLUVUSU1FRE9VVDsKPj4+ICsJCXVz bGVlcF9yYW5nZSg1MCwgMTAwKTsKPj4+ICsJfQo+Pj4gKwlpZiAoISh2YWwgJiBTS0xfSERDUF9L RVlfTE9BRF9TVEFUVVMpKQo+Pj4gKwkJcmV0dXJuIC1FTlhJTzsKPj4+ICsKPj4+ICsJLy8gU2Vu ZCBBa3N2IG92ZXIgdG8gUENIIGRpc3BsYXkgZm9yIHVzZSBpbiBhdXRoZW50aWNhdGlvbgo+Pj4g KwlJOTE1X1dSSVRFKFNLTF9IRENQX0tFWV9DT05GLCBTS0xfSERDUF9BS1NWX1NFTkRfVFJJR0dF Uik7Cj4+PiArCj4+PiArCXJldHVybiAwOwo+Pj4gK30KPj4+ICsKPj4+ICsvKiBSZXR1cm5zIHVw ZGF0ZWQgU0hBLTEgaW5kZXggKi8KPj4+ICtzdGF0aWMgaW50IGludGVsX3dyaXRlX3NoYV90ZXh0 KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTMyIHNoYV90ZXh0KQo+Pj4gK3sK Pj4+ICsJSTkxNV9XUklURShTS0xfSERDUF9TSEFfVEVYVCwgc2hhX3RleHQpOwo+Pj4gKwlpZiAo d2FpdF9mb3IoSTkxNV9SRUFEKFNLTF9IRENQX1JFUF9DVEwpICYgU0tMX0hEQ1BfU0hBMV9SRUFE WSwgMSkpIHsKPj4+ICsJCURSTV9FUlJPUigiVGltZWQgb3V0IHdhaXRpbmcgZm9yIFNIQTEgcmVh ZHlcbiIpOwo+Pj4gKwkJcmV0dXJuIC1FVElNRURPVVQ7Cj4+PiArCX0KPj4+ICsJcmV0dXJuIDA7 Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYwo+Pj4gK3UzMiBpbnRlbF9oZGNwX2dldF9yZXBlYXRl cl9jdGwoc3RydWN0IGludGVsX2RpZ2l0YWxfcG9ydCAqaW50ZWxfZGlnX3BvcnQpCj4+PiArewo+ Pj4gKwllbnVtIHBvcnQgcG9ydCA9IGludGVsX2RpZ19wb3J0LT5wb3J0Owo+Pj4gKwlzd2l0Y2go cG9ydCkgewo+Pj4gKwljYXNlIFBPUlRfQToKPj4+ICsJCXJldHVybiBTS0xfSERDUF9ERElBX1JF UF9QUkVTRU5UIHwgU0tMX0hEQ1BfRERJQV9TSEExX00wOwo+Pj4gKwljYXNlIFBPUlRfQjoKPj4+ ICsJCXJldHVybiBTS0xfSERDUF9ERElCX1JFUF9QUkVTRU5UIHwgU0tMX0hEQ1BfRERJQl9TSEEx X00wOwo+Pj4gKwljYXNlIFBPUlRfQzoKPj4+ICsJCXJldHVybiBTS0xfSERDUF9ERElDX1JFUF9Q UkVTRU5UIHwgU0tMX0hEQ1BfRERJQ19TSEExX00wOwo+Pj4gKwljYXNlIFBPUlRfRDoKPj4+ICsJ CXJldHVybiBTS0xfSERDUF9ERElEX1JFUF9QUkVTRU5UIHwgU0tMX0hEQ1BfRERJRF9TSEExX00w Owo+Pj4gKwljYXNlIFBPUlRfRToKPj4+ICsJCXJldHVybiBTS0xfSERDUF9ERElFX1JFUF9QUkVT RU5UIHwgU0tMX0hEQ1BfRERJRV9TSEExX00wOwo+Pj4gKwlkZWZhdWx0Ogo+Pj4gKwkJYnJlYWs7 Cj4+PiArCX0KPj4+ICsJRFJNX0VSUk9SKCJVbmtub3duIHBvcnQgJWRcbiIsIHBvcnQpOwo+Pj4g KwlyZXR1cm4gLUVJTlZBTDsKPj4+ICt9Cj4+PiArCj4+PiArLyogSW1wbGVtZW50cyBQYXJ0IDIg b2YgdGhlIEhEQ1AgYXV0aG9yaXphdGlvbiBwcm9jZWR1cmUgKi8KPj4+ICtzdGF0aWMKPj4+ICtp bnQgaW50ZWxfaGRjcF9hdXRoX2Rvd25zdHJlYW0oc3RydWN0IGludGVsX2RpZ2l0YWxfcG9ydCAq aW50ZWxfZGlnX3BvcnQsCj4+PiArCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9oZGNwX3No aW0gKnNoaW0pCj4+PiArewo+Pj4gKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXY7 Cj4+PiArCXUzMiB2cHJpbWUsIHNoYV90ZXh0LCBzaGFfbGVmdG92ZXJzLCByZXBfY3RsOwo+Pj4g Kwl1OCBic3RhdHVzWzJdLCBudW1fZG93bnN0cmVhbSwgKmtzdl9maWZvOwo+Pj4gKwlpbnQgcmV0 LCBpLCBqLCBzaGFfaWR4Owo+Pj4gKwo+Pj4gKwlkZXZfcHJpdiA9IGludGVsX2RpZ19wb3J0LT5i YXNlLmJhc2UuZGV2LT5kZXZfcHJpdmF0ZTsKPj4+ICsKPj4+ICsJcmV0ID0gc2hpbS0+cmVhZF9i c3RhdHVzKGludGVsX2RpZ19wb3J0LCBic3RhdHVzKTsKPj4+ICsJaWYgKHJldCkKPj4+ICsJCXJl dHVybiByZXQ7Cj4+PiArCj4+PiArCS8qIElmIHRoZXJlIGFyZSBubyBkb3duc3RyZWFtIGRldmlj ZXMsIHdlJ3JlIGFsbCBkb25lLiAqLwo+Pj4gKwludW1fZG93bnN0cmVhbSA9IERSTV9IRENQX05V TV9ET1dOU1RSRUFNKGJzdGF0dXNbMF0pOwo+Pj4gKwlpZiAobnVtX2Rvd25zdHJlYW0gPT0gMCkg ewo+Pj4gKwkJRFJNX0lORk8oIkhEQ1AgaXMgZW5hYmxlZCAobm8gZG93bnN0cmVhbSBkZXZpY2Vz KVxuIik7Cj4+PiArCQlyZXR1cm4gMDsKPj4+ICsJfQo+Pj4gKwo+Pj4gKwkvLyBQb2xsIGZvciBr c3YgbGlzdCByZWFkeSAoc3BlYyBzYXlzIG1heCB0aW1lIGFsbG93ZWQgaXMgNXMpCj4+PiArCXJl dCA9IGludGVsX2hkY3BfcG9sbF9rc3ZfZmlmbyhpbnRlbF9kaWdfcG9ydCwgc2hpbSk7Cj4+PiAr CWlmIChyZXQpIHsKPj4+ICsJCURSTV9FUlJPUigiS1NWIGxpc3QgZmFpbGVkIHRvIGJlY29tZSBy ZWFkeSAoJWQpXG4iLCByZXQpOwo+Pj4gKwkJcmV0dXJuIHJldDsKPj4+ICsJfQo+Pj4gKwo+Pj4g Kwlrc3ZfZmlmbyA9IGt6YWxsb2MobnVtX2Rvd25zdHJlYW0gKiBEUk1fSERDUF9LU1ZfTEVOLCBH RlBfS0VSTkVMKTsKPj4+ICsJaWYgKCFrc3ZfZmlmbykKPj4+ICsJCXJldHVybiAtRU5PTUVNOwo+ Pj4gKwo+Pj4gKwlyZXQgPSBzaGltLT5yZWFkX2tzdl9maWZvKGludGVsX2RpZ19wb3J0LCBudW1f ZG93bnN0cmVhbSwga3N2X2ZpZm8pOwo+Pj4gKwlpZiAocmV0KQo+Pj4gKwkJcmV0dXJuIHJldDsK Pj4+ICsKPj4+ICsJLy8gUHJvY2VzcyBWJyB2YWx1ZXMgZnJvbSB0aGUgcmVjZWl2ZXIKPj4+ICsJ Zm9yIChpID0gMDsgaSA8IERSTV9IRENQX1ZfUFJJTUVfTlVNX1BBUlRTOyBpKyspIHsKPj4+ICsJ CXJldCA9IHNoaW0tPnJlYWRfdl9wcmltZV9wYXJ0KGludGVsX2RpZ19wb3J0LCBpLCAmdnByaW1l KTsKPj4+ICsJCWlmIChyZXQpCj4+PiArCQkJcmV0dXJuIHJldDsKPj4+ICsJCUk5MTVfV1JJVEUo U0tMX0hEQ1BfU0hBX1ZfUFJJTUUoaSksIHZwcmltZSk7Cj4+PiArCX0KPj4+ICsKPj4+ICsJLyoK Pj4+ICsJICogV2UgbmVlZCB0byB3cml0ZSB0aGUgY29uY2F0ZW5hdGlvbiBvZiBhbGwgZGV2aWNl IEtTVnMsIEJJTkZPIChEUCkgfHwKPj4+ICsJICogQlNUQVRVUyAoSERNSSksIGFuZCBNMCAod2hp Y2ggaXMgYWRkZWQgdmlhIEhEQ1BfUkVQX0NUTCkuIFRoaXMgYnl0ZQo+Pj4gKwkgKiBzdHJlYW0g aXMgd3JpdHRlbiB2aWEgdGhlIEhEQ1BfU0hBX1RFWFQgcmVnaXN0ZXIgaW4gMzItYml0Cj4+PiAr CSAqIGluY3JlbWVudHMuIEV2ZXJ5IDY0IGJ5dGVzLCB3ZSBuZWVkIHRvIHdyaXRlIEhEQ1BfUkVQ X0NUTCBhZ2Fpbi4gVGhpcwo+Pj4gKwkgKiBpbmRleCB3aWxsIGtlZXAgdHJhY2sgb2Ygb3VyIHBy b2dyZXNzIHRocm91Z2ggdGhlIDY0IGJ5dGVzIGFzIHdlbGwgYXMKPj4+ICsJICogaGVscGluZyB1 cyB3b3JrIHRoZSA0MC1iaXQgS1NWcyB0aHJvdWdoIG91ciAzMi1iaXQgcmVnaXN0ZXIuCj4+PiAr CSAqCj4+PiArCSAqIE5PVEU6IGRhdGEgcGFzc2VkIHZpYSBIRENQX1NIQV9URVhUIHNob3VsZCBi ZSBiaWctZW5kaWFuCj4+PiArCSAqLwo+Pj4gKwlzaGFfaWR4ID0gMDsKPj4+ICsJc2hhX3RleHQg PSAwOwo+Pj4gKwlzaGFfbGVmdG92ZXJzID0gMDsKPj4+ICsJcmVwX2N0bCA9IGludGVsX2hkY3Bf Z2V0X3JlcGVhdGVyX2N0bChpbnRlbF9kaWdfcG9ydCk7Cj4+PiArCUk5MTVfV1JJVEUoU0tMX0hE Q1BfUkVQX0NUTCwgcmVwX2N0bCB8IFNLTF9IRENQX1NIQTFfVEVYVF8zMik7Cj4+PiArCWZvciAo aSA9IDA7IGkgPCBudW1fZG93bnN0cmVhbTsgaSsrKSB7Cj4+PiArCQl1bnNpZ25lZCBzaGFfZW1w dHk7Cj4+PiArCQl1OCAqa3N2ID0gJmtzdl9maWZvW2kgKiBEUk1fSERDUF9LU1ZfTEVOXTsKPj4+ ICsKPj4+ICsJCS8vIEZpbGwgdXAgdGhlIGVtcHR5IHNsb3RzIGluIHNoYV90ZXh0IGFuZCB3cml0 ZSBpdCBvdXQKPj4+ICsJCXNoYV9lbXB0eSA9IHNpemVvZihzaGFfdGV4dCkgLSBzaGFfbGVmdG92 ZXJzOwo+Pj4gKwkJZm9yIChqID0gMDsgaiA8IHNoYV9lbXB0eTsgaisrKQo+Pj4gKwkJCXNoYV90 ZXh0IHw9IGtzdltqXSA8PCAoKHNpemVvZihzaGFfdGV4dCkgLSBqIC0gMSkgKiA4KTsKPj4+ICsK Pj4+ICsJCXJldCA9IGludGVsX3dyaXRlX3NoYV90ZXh0KGRldl9wcml2LCBzaGFfdGV4dCk7Cj4+ PiArCQlpZiAocmV0IDwgMCkKPj4+ICsJCQlyZXR1cm4gcmV0Owo+Pj4gKwo+Pj4gKwkJLy8gUHJv Z3JhbW1pbmcgZ3VpZGUgd3JpdGVzIHRoaXMgZXZlcnkgNjQgYnl0ZXMKPj4+ICsJCXNoYV9pZHgg Kz0gc2l6ZW9mKHNoYV90ZXh0KTsKPj4+ICsJCWlmICghKHNoYV9pZHggJSA2NCkpCj4+PiArCQkJ STkxNV9XUklURShTS0xfSERDUF9SRVBfQ1RMLAo+Pj4gKwkJCQkgICByZXBfY3RsIHwgU0tMX0hE Q1BfU0hBMV9URVhUXzMyKTsKPj4+ICsKPj4+ICsJCS8vIFN0b3JlIHRoZSBsZWZ0b3ZlciBieXRl cyBmcm9tIHRoZSBrc3YgaW4gc2hhX3RleHQKPj4+ICsJCXNoYV9sZWZ0b3ZlcnMgPSBEUk1fSERD UF9LU1ZfTEVOIC0gc2hhX2VtcHR5Owo+Pj4gKwkJc2hhX3RleHQgPSAwOwo+Pj4gKwkJZm9yIChq ID0gMDsgaiA8IHNoYV9sZWZ0b3ZlcnM7IGorKykKPj4+ICsJCQlzaGFfdGV4dCB8PSBrc3Zbc2hh X2VtcHR5ICsgal0gPDwKPj4+ICsJCQkJCSgoc2l6ZW9mKHNoYV90ZXh0KSAtIGogLSAxKSAqIDgp Owo+Pj4gKwo+Pj4gKwkJLyoKPj4+ICsJCSAqIElmIHdlIHN0aWxsIGhhdmUgcm9vbSBpbiBzaGFf dGV4dCBmb3IgbW9yZSBkYXRhLCBjb250aW51ZS4KPj4+ICsJCSAqIE90aGVyd2lzZSwgd3JpdGUg aXQgb3V0IGltbWVkaWF0ZWx5Lgo+Pj4gKwkJICovCj4+PiArCQlpZiAoc2l6ZW9mKHNoYV90ZXh0 KSA+IHNoYV9sZWZ0b3ZlcnMpCj4+PiArCQkJY29udGludWU7Cj4+PiArCj4+PiArCQlyZXQgPSBp bnRlbF93cml0ZV9zaGFfdGV4dChkZXZfcHJpdiwgc2hhX3RleHQpOwo+Pj4gKwkJaWYgKHJldCA8 IDApCj4+PiArCQkJcmV0dXJuIHJldDsKPj4+ICsJCXNoYV9sZWZ0b3ZlcnMgPSAwOwo+Pj4gKwkJ c2hhX3RleHQgPSAwOwo+Pj4gKwkJc2hhX2lkeCArPSBzaXplb2Yoc2hhX3RleHQpOwo+Pj4gKwl9 Cj4+PiArCj4+PiArCS8qCj4+PiArCSAqIFdlIG5lZWQgdG8gd3JpdGUgQklORk8vQlNUQVRVUywg YW5kIE0wIG5vdy4gRGVwZW5kaW5nIG9uIGhvdyBtYW55Cj4+PiArCSAqIGJ5dGVzIGFyZSBsZWZ0 b3ZlciBmcm9tIHRoZSBsYXN0IGtzdiwgd2UgbWlnaHQgYmUgYWJsZSB0byBmaXQgdGhlbQo+Pj4g KwkgKiBhbGwgaW4gc2hhX3RleHQgKGZpcnN0IDIgY2FzZXMpLCBvciB3ZSBtaWdodCBuZWVkIHRv IHNwbGl0IHRoZW0gdXAKPj4+ICsJICogaW50byAyIHdyaXRlcyAobGFzdCAyIGNhc2VzKS4KPj4+ ICsJICovCj4+PiArCWlmIChzaGFfbGVmdG92ZXJzID09IDApIHsKPj4+ICsJCS8vIFdyaXRlIDE2 IGJpdHMgb2YgdGV4dCwgMTYgYml0cyBvZiBNMAo+Pj4gKwkJSTkxNV9XUklURShTS0xfSERDUF9S RVBfQ1RMLCByZXBfY3RsIHwgU0tMX0hEQ1BfU0hBMV9URVhUXzE2KTsKPj4+ICsJCXJldCA9IGlu dGVsX3dyaXRlX3NoYV90ZXh0KGRldl9wcml2LAo+Pj4gKwkJCQkJICAgYnN0YXR1c1swXSA8PCA4 IHwgYnN0YXR1c1sxXSk7Cj4+PiArCQlpZiAocmV0IDwgMCkKPj4+ICsJCQlyZXR1cm4gcmV0Owo+ Pj4gKwkJc2hhX2lkeCArPSBzaXplb2Yoc2hhX3RleHQpOwo+Pj4gKwo+Pj4gKwkJLy8gV3JpdGUg MzIgYml0cyBvZiBNMAo+Pj4gKwkJSTkxNV9XUklURShTS0xfSERDUF9SRVBfQ1RMLCByZXBfY3Rs IHwgU0tMX0hEQ1BfU0hBMV9URVhUXzApOwo+Pj4gKwkJcmV0ID0gaW50ZWxfd3JpdGVfc2hhX3Rl eHQoZGV2X3ByaXYsIDApOwo+Pj4gKwkJaWYgKHJldCA8IDApCj4+PiArCQkJcmV0dXJuIHJldDsK Pj4+ICsJCXNoYV9pZHggKz0gc2l6ZW9mKHNoYV90ZXh0KTsKPj4+ICsKPj4+ICsJCS8vIFdyaXRl IDE2IGJpdHMgb2YgTTAKPj4+ICsJCUk5MTVfV1JJVEUoU0tMX0hEQ1BfUkVQX0NUTCwgcmVwX2N0 bCB8IFNLTF9IRENQX1NIQTFfVEVYVF8xNik7Cj4+PiArCQlyZXQgPSBpbnRlbF93cml0ZV9zaGFf dGV4dChkZXZfcHJpdiwgMCk7Cj4+PiArCQlpZiAocmV0IDwgMCkKPj4+ICsJCQlyZXR1cm4gcmV0 Owo+Pj4gKwkJc2hhX2lkeCArPSBzaXplb2Yoc2hhX3RleHQpOwo+Pj4gKwo+Pj4gKwl9IGVsc2Ug aWYgKHNoYV9sZWZ0b3ZlcnMgPT0gMSkgewo+Pj4gKwkJLy8gV3JpdGUgMjQgYml0cyBvZiB0ZXh0 LCA4IGJpdHMgb2YgTTAKPj4+ICsJCUk5MTVfV1JJVEUoU0tMX0hEQ1BfUkVQX0NUTCwgcmVwX2N0 bCB8IFNLTF9IRENQX1NIQTFfVEVYVF8yNCk7Cj4+PiArCQlzaGFfdGV4dCB8PSBic3RhdHVzWzBd IDw8IDE2IHwgYnN0YXR1c1sxXSA8PCA4Owo+Pj4gKwkJLy8gT25seSAyNC1iaXRzIG9mIGRhdGEs IG11c3QgYmUgaW4gdGhlIExTQgo+Pj4gKwkJc2hhX3RleHQgPSAoc2hhX3RleHQgJiAweGZmZmZm ZjAwKSA+PiA4Owo+Pj4gKwkJcmV0ID0gaW50ZWxfd3JpdGVfc2hhX3RleHQoZGV2X3ByaXYsIHNo YV90ZXh0KTsKPj4+ICsJCWlmIChyZXQgPCAwKQo+Pj4gKwkJCXJldHVybiByZXQ7Cj4+PiArCQlz aGFfaWR4ICs9IHNpemVvZihzaGFfdGV4dCk7Cj4+PiArCj4+PiArCQkvLyBXcml0ZSAzMiBiaXRz IG9mIE0wCj4+PiArCQlJOTE1X1dSSVRFKFNLTF9IRENQX1JFUF9DVEwsIHJlcF9jdGwgfCBTS0xf SERDUF9TSEExX1RFWFRfMCk7Cj4+PiArCQlyZXQgPSBpbnRlbF93cml0ZV9zaGFfdGV4dChkZXZf cHJpdiwgMCk7Cj4+PiArCQlpZiAocmV0IDwgMCkKPj4+ICsJCQlyZXR1cm4gcmV0Owo+Pj4gKwkJ c2hhX2lkeCArPSBzaXplb2Yoc2hhX3RleHQpOwo+Pj4gKwo+Pj4gKwkJLy8gV3JpdGUgMjQgYml0 cyBvZiBNMAo+Pj4gKwkJSTkxNV9XUklURShTS0xfSERDUF9SRVBfQ1RMLCByZXBfY3RsIHwgU0tM X0hEQ1BfU0hBMV9URVhUXzgpOwo+Pj4gKwkJcmV0ID0gaW50ZWxfd3JpdGVfc2hhX3RleHQoZGV2 X3ByaXYsIDApOwo+Pj4gKwkJaWYgKHJldCA8IDApCj4+PiArCQkJcmV0dXJuIHJldDsKPj4+ICsJ CXNoYV9pZHggKz0gc2l6ZW9mKHNoYV90ZXh0KTsKPj4+ICsKPj4+ICsJfSBlbHNlIGlmIChzaGFf bGVmdG92ZXJzID09IDIpIHsKPj4+ICsJCS8vIFdyaXRlIDMyIGJpdHMgb2YgdGV4dAo+Pj4gKwkJ STkxNV9XUklURShTS0xfSERDUF9SRVBfQ1RMLCByZXBfY3RsIHwgU0tMX0hEQ1BfU0hBMV9URVhU XzMyKTsKPj4+ICsJCXNoYV90ZXh0IHw9IGJzdGF0dXNbMF0gPDwgMjQgfCBic3RhdHVzWzFdIDw8 IDE2Owo+Pj4gKwkJcmV0ID0gaW50ZWxfd3JpdGVfc2hhX3RleHQoZGV2X3ByaXYsIHNoYV90ZXh0 KTsKPj4+ICsJCWlmIChyZXQgPCAwKQo+Pj4gKwkJCXJldHVybiByZXQ7Cj4+PiArCQlzaGFfaWR4 ICs9IHNpemVvZihzaGFfdGV4dCk7Cj4+PiArCj4+PiArCQkvLyBXcml0ZSA2NCBiaXRzIG9mIE0w Cj4+PiArCQlJOTE1X1dSSVRFKFNLTF9IRENQX1JFUF9DVEwsIHJlcF9jdGwgfCBTS0xfSERDUF9T SEExX1RFWFRfMCk7Cj4+PiArCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Cj4+PiArCQkJcmV0 ID0gaW50ZWxfd3JpdGVfc2hhX3RleHQoZGV2X3ByaXYsIDApOwo+Pj4gKwkJCWlmIChyZXQgPCAw KQo+Pj4gKwkJCQlyZXR1cm4gcmV0Owo+Pj4gKwkJCXNoYV9pZHggKz0gc2l6ZW9mKHNoYV90ZXh0 KTsKPj4+ICsJCX0KPj4+ICsJfSBlbHNlIGlmIChzaGFfbGVmdG92ZXJzID09IDMpIHsKPj4+ICsJ CS8vIFdyaXRlIDMyIGJpdHMgb2YgdGV4dAo+Pj4gKwkJSTkxNV9XUklURShTS0xfSERDUF9SRVBf Q1RMLCByZXBfY3RsIHwgU0tMX0hEQ1BfU0hBMV9URVhUXzMyKTsKPj4+ICsJCXNoYV90ZXh0IHw9 IGJzdGF0dXNbMF0gPDwgMjQ7Cj4+PiArCQlyZXQgPSBpbnRlbF93cml0ZV9zaGFfdGV4dChkZXZf cHJpdiwgc2hhX3RleHQpOwo+Pj4gKwkJaWYgKHJldCA8IDApCj4+PiArCQkJcmV0dXJuIHJldDsK Pj4+ICsJCXNoYV9pZHggKz0gc2l6ZW9mKHNoYV90ZXh0KTsKPj4+ICsKPj4+ICsJCS8vIFdyaXRl IDggYml0cyBvZiB0ZXh0LCAyNCBiaXRzIG9mIE0wCj4+PiArCQlJOTE1X1dSSVRFKFNLTF9IRENQ X1JFUF9DVEwsIHJlcF9jdGwgfCBTS0xfSERDUF9TSEExX1RFWFRfOCk7Cj4+PiArCQlyZXQgPSBp bnRlbF93cml0ZV9zaGFfdGV4dChkZXZfcHJpdiwgYnN0YXR1c1sxXSk7Cj4+PiArCQlpZiAocmV0 IDwgMCkKPj4+ICsJCQlyZXR1cm4gcmV0Owo+Pj4gKwkJc2hhX2lkeCArPSBzaXplb2Yoc2hhX3Rl eHQpOwo+Pj4gKwo+Pj4gKwkJLy8gV3JpdGUgMzIgYml0cyBvZiBNMAo+Pj4gKwkJSTkxNV9XUklU RShTS0xfSERDUF9SRVBfQ1RMLCByZXBfY3RsIHwgU0tMX0hEQ1BfU0hBMV9URVhUXzApOwo+Pj4g KwkJcmV0ID0gaW50ZWxfd3JpdGVfc2hhX3RleHQoZGV2X3ByaXYsIDApOwo+Pj4gKwkJaWYgKHJl dCA8IDApCj4+PiArCQkJcmV0dXJuIHJldDsKPj4+ICsJCXNoYV9pZHggKz0gc2l6ZW9mKHNoYV90 ZXh0KTsKPj4+ICsKPj4+ICsJCS8vIFdyaXRlIDggYml0cyBvZiBNMAo+Pj4gKwkJSTkxNV9XUklU RShTS0xfSERDUF9SRVBfQ1RMLCByZXBfY3RsIHwgU0tMX0hEQ1BfU0hBMV9URVhUXzI0KTsKPj4+ ICsJCXJldCA9IGludGVsX3dyaXRlX3NoYV90ZXh0KGRldl9wcml2LCAwKTsKPj4+ICsJCWlmIChy ZXQgPCAwKQo+Pj4gKwkJCXJldHVybiByZXQ7Cj4+PiArCQlzaGFfaWR4ICs9IHNpemVvZihzaGFf dGV4dCk7Cj4+PiArCX0gZWxzZSB7Cj4+PiArCQlEUk1fRVJST1IoIkludmFsaWQgbnVtYmVyIG9m IGxlZnRvdmVycyAlZFxuIiwgc2hhX2xlZnRvdmVycyk7Cj4+PiArCQlyZXR1cm4gLUVJTlZBTDsK Pj4+ICsJfQo+Pj4gKwo+Pj4gKwlJOTE1X1dSSVRFKFNLTF9IRENQX1JFUF9DVEwsIHJlcF9jdGwg fCBTS0xfSERDUF9TSEExX1RFWFRfMzIpOwo+Pj4gKwkvLyBGaWxsIHVwIHRvIDY0IC0gNCBieXRl cyB3aXRoIHplcm9zIChsZWF2ZSB0aGUgbGFzdCB3cml0ZSBmb3IgbGVuZ3RoKQo+Pj4gKwl3aGls ZSAoKHNoYV9pZHggJSA2NCkgPCAoNjQgLSBzaXplb2Yoc2hhX3RleHQpKSkgewo+Pj4gKwkJcmV0 ID0gaW50ZWxfd3JpdGVfc2hhX3RleHQoZGV2X3ByaXYsIDApOwo+Pj4gKwkJaWYgKHJldCA8IDAp Cj4+PiArCQkJcmV0dXJuIHJldDsKPj4+ICsJCXNoYV9pZHggKz0gc2l6ZW9mKHNoYV90ZXh0KTsK Pj4+ICsJfQo+Pj4gKwo+Pj4gKwkvKgo+Pj4gKwkgKiBMYXN0IHdyaXRlIGdldHMgdGhlIGxlbmd0 aCBvZiB0aGUgY29uY2F0ZW5hdGlvbiBpbiBiaXRzLiBUaGF0IGlzOgo+Pj4gKwkgKiAgLSA1IGJ5 dGVzIHBlciBkZXZpY2UKPj4+ICsJICogIC0gMTAgYnl0ZXMgZm9yIEJJTkZPL0JTVEFUVVMoMiks IE0wKDgpCj4+PiArCSAqLwo+Pj4gKwlzaGFfdGV4dCA9IChudW1fZG93bnN0cmVhbSAqIDUgKyAx MCkgKiA4Owo+Pj4gKwlyZXQgPSBpbnRlbF93cml0ZV9zaGFfdGV4dChkZXZfcHJpdiwgc2hhX3Rl eHQpOwo+Pj4gKwlpZiAocmV0IDwgMCkKPj4+ICsJCXJldHVybiByZXQ7Cj4+PiArCj4+PiArCS8v IEZpbmFsbHksIHRlbGwgdGhlIEhXIHdlJ3JlIGRvbmUgd2l0aCB0aGUgaGFzaCBhbmQgd2FpdCBm b3IgaXQgdG8gQUNLCj4+PiArCUk5MTVfV1JJVEUoU0tMX0hEQ1BfUkVQX0NUTCwgcmVwX2N0bCB8 IFNLTF9IRENQX1NIQTFfQ09NUExFVEVfSEFTSCk7Cj4+PiArCWlmICh3YWl0X2ZvcihJOTE1X1JF QUQoU0tMX0hEQ1BfUkVQX0NUTCkgJiBTS0xfSERDUF9TSEExX0NPTVBMRVRFLCAxKSkgewo+Pj4g KwkJRFJNX0VSUk9SKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgU0hBMSBjb21wbGV0ZVxuIik7Cj4+ PiArCQlyZXR1cm4gLUVUSU1FRE9VVDsKPj4+ICsJfQo+Pj4gKwlpZiAoIShJOTE1X1JFQUQoU0tM X0hEQ1BfUkVQX0NUTCkgJiBTS0xfSERDUF9TSEExX1ZfTUFUQ0gpKSB7Cj4+PiArCQlEUk1fRVJS T1IoIlNIQS0xIG1pc21hdGNoLCBIRENQIGZhaWxlZFxuIik7Cj4+PiArCQlyZXR1cm4gLUVOWElP Owo+Pj4gKwl9Cj4+PiArCj4+PiArCURSTV9JTkZPKCJIRENQIGlzIGVuYWJsZWQgKCVkIGRvd25z dHJlYW0gZGV2aWNlcylcbiIsIG51bV9kb3duc3RyZWFtKTsKPj4+ICsJcmV0dXJuIDA7Cj4+PiAr fQo+Pj4gKwo+Pj4gKy8qIEltcGxlbWVudHMgUGFydCAxIG9mIHRoZSBIRENQIGF1dGhvcml6YXRp b24gcHJvY2VkdXJlICovCj4+PiArc3RhdGljIGludCBpbnRlbF9oZGNwX2F1dGgoc3RydWN0IGlu dGVsX2RpZ2l0YWxfcG9ydCAqaW50ZWxfZGlnX3BvcnQsCj4+PiArCQkJICAgY29uc3Qgc3RydWN0 IGludGVsX2hkY3Bfc2hpbSAqc2hpbSkKPj4+ICt7Cj4+PiArCXN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICpkZXZfcHJpdjsKPj4+ICsJZW51bSBwb3J0IHBvcnQ7Cj4+PiArCXVuc2lnbmVkIGxvbmcg cjBfcHJpbWVfZ2VuX3N0YXJ0Owo+Pj4gKwlpbnQgcmV0LCBpOwo+Pj4gKwl1bmlvbiB7Cj4+PiAr CQl1MzIgcmVnWzJdOwo+Pj4gKwkJdTggc2hpbVtEUk1fSERDUF9BTl9MRU5dOwo+Pj4gKwl9IGFu Owo+Pj4gKwl1bmlvbiB7Cj4+PiArCQl1MzIgcmVnWzJdOwo+Pj4gKwkJdTggc2hpbVtEUk1fSERD UF9LU1ZfTEVOXTsKPj4+ICsJfSBia3N2Owo+Pj4gKwl1bmlvbiB7Cj4+PiArCQl1MzIgcmVnOwo+ Pj4gKwkJdTggc2hpbVtEUk1fSERDUF9SSV9MRU5dOwo+Pj4gKwl9IHJpOwo+Pj4gKwlib29sIHJl cGVhdGVyX3ByZXNlbnQ7Cj4+PiArCj4+PiArCWRldl9wcml2ID0gaW50ZWxfZGlnX3BvcnQtPmJh c2UuYmFzZS5kZXYtPmRldl9wcml2YXRlOwo+Pj4gKwo+Pj4gKwlwb3J0ID0gaW50ZWxfZGlnX3Bv cnQtPnBvcnQ7Cj4+PiArCj4+PiArCS8vIEluaXRpYWxpemUgQW4gd2l0aCAyIHJhbmRvbSB2YWx1 ZXMgYW5kIGFjcXVpcmUgaXQKPj4+ICsJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKPj4+ICsJCUk5 MTVfV1JJVEUoU0tMX1BPUlRfSERDUF9BTklOSVQocG9ydCksIGdldF9yYW5kb21fbG9uZygpKTsK Pj4+ICsJSTkxNV9XUklURShTS0xfUE9SVF9IRENQX0NPTkYocG9ydCksIFNLTF9IRENQX0NPTkZf Q0FQVFVSRV9BTik7Cj4+PiArCj4+PiArCS8vIFdhaXQgZm9yIEFuIHRvIGJlIGFjcXVpcmVkCj4+ PiArCWlmICh3YWl0X2ZvcihJOTE1X1JFQUQoU0tMX1BPUlRfSERDUF9TVEFUVVMocG9ydCkpICYK Pj4+ICsJCSAgICAgU0tMX0hEQ1BfU1RBVFVTX0FOX1JFQURZLCAxKSkgewo+Pj4gKwkJRFJNX0VS Uk9SKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgQW5cbiIpOwo+Pj4gKwkJcmV0dXJuIC1FVElNRURP VVQ7Cj4+PiArCX0KPj4+ICsKPj4+ICsJYW4ucmVnWzBdID0gSTkxNV9SRUFEKFNLTF9QT1JUX0hE Q1BfQU5MTyhwb3J0KSk7Cj4+PiArCWFuLnJlZ1sxXSA9IEk5MTVfUkVBRChTS0xfUE9SVF9IRENQ X0FOSEkocG9ydCkpOwo+Pj4gKwlyZXQgPSBzaGltLT53cml0ZV9hbl9ha3N2KGludGVsX2RpZ19w b3J0LCBhbi5zaGltKTsKPj4+ICsJaWYgKHJldCkKPj4+ICsJCXJldHVybiByZXQ7Cj4+PiArCj4+ PiArCXIwX3ByaW1lX2dlbl9zdGFydCA9IGppZmZpZXM7Cj4+PiArCj4+PiArCW1lbXNldCgmYmtz diwgMCwgc2l6ZW9mKGJrc3YpKTsKPj4+ICsJcmV0ID0gc2hpbS0+cmVhZF9ia3N2KGludGVsX2Rp Z19wb3J0LCBia3N2LnNoaW0pOwo+Pj4gKwlpZiAocmV0KQo+Pj4gKwkJcmV0dXJuIHJldDsKPj4+ ICsKPj4+ICsJSTkxNV9XUklURShTS0xfUE9SVF9IRENQX0JLU1ZMTyhwb3J0KSwgYmtzdi5yZWdb MF0pOwo+Pj4gKwlJOTE1X1dSSVRFKFNLTF9QT1JUX0hEQ1BfQktTVkhJKHBvcnQpLCBia3N2LnJl Z1sxXSk7Cj4+PiArCj4+PiArCXJldCA9IHNoaW0tPnJlcGVhdGVyX3ByZXNlbnQoaW50ZWxfZGln X3BvcnQsICZyZXBlYXRlcl9wcmVzZW50KTsKPj4+ICsJaWYgKHJldCkKPj4+ICsJCXJldHVybiBy ZXQ7Cj4+PiArCWlmIChyZXBlYXRlcl9wcmVzZW50KQo+Pj4gKwkJSTkxNV9XUklURShTS0xfSERD UF9SRVBfQ1RMLAo+Pj4gKwkJCSAgIGludGVsX2hkY3BfZ2V0X3JlcGVhdGVyX2N0bChpbnRlbF9k aWdfcG9ydCkpOwo+Pj4gKwo+Pj4gKwlyZXQgPSBzaGltLT50b2dnbGVfc2lnbmFsbGluZyhpbnRl bF9kaWdfcG9ydCwgdHJ1ZSk7Cj4+PiArCWlmIChyZXQpCj4+PiArCQlyZXR1cm4gcmV0Owo+Pj4g Kwo+Pj4gKwlJOTE1X1dSSVRFKFNLTF9QT1JUX0hEQ1BfQ09ORihwb3J0KSwgU0tMX0hEQ1BfQ09O Rl9BVVRIX0FORF9FTkMpOwo+Pj4gKwo+Pj4gKwkvLyBXYWl0IGZvciBSMCByZWFkeQo+Pj4gKwlp ZiAod2FpdF9mb3IoSTkxNV9SRUFEKFNLTF9QT1JUX0hEQ1BfU1RBVFVTKHBvcnQpKSAmCj4+PiAr CQkgICAgIChTS0xfSERDUF9TVEFUVVNfUjBfUkVBRFkgfCBTS0xfSERDUF9TVEFUVVNfRU5DKSwg MSkpIHsKPj4+ICsJCURSTV9FUlJPUigiVGltZWQgb3V0IHdhaXRpbmcgZm9yIFIwIHJlYWR5XG4i KTsKPj4+ICsJCXJldHVybiAtRVRJTUVET1VUOwo+Pj4gKwl9Cj4+PiArCj4+PiArCS8qCj4+PiAr CSAqIFdhaXQgZm9yIFIwJyB0byBiZWNvbWUgYXZhaWxhYmxlLCB0aGUgc3BlYyBzYXlzIDEwMG1z IGZyb20gQWtzdgo+Pj4gKwkgKiB3cml0ZS4gT24gRFAsIHRoZXJlJ3MgYW4gUjBfUkVBRFkgYml0 IGF2YWlsYWJsZSBidXQgbm8gc3VjaCBiaXQKPj4+ICsJICogZXhpc3RzIG9uIEhETUkuIFNpbmNl IHRoZSB1cHBlci1ib3VuZCBpcyB0aGUgc2FtZSwgd2UnbGwganVzdCBkbwo+Pj4gKwkgKiB0aGUg c3R1cGlkIHRoaW5nIGluc3RlYWQgb2YgcG9sbGluZyBvbiBvbmUgYW5kIG5vdCB0aGUgb3RoZXIu Cj4+PiArCSAqLwo+Pj4gKwl3YWl0X3JlbWFpbmluZ19tc19mcm9tX2ppZmZpZXMocjBfcHJpbWVf Z2VuX3N0YXJ0LCAxMDApOwo+Pj4gKwo+Pj4gKwlyaS5yZWcgPSAwOwo+Pj4gKwlyZXQgPSBzaGlt LT5yZWFkX3JpX3ByaW1lKGludGVsX2RpZ19wb3J0LCByaS5zaGltKTsKPj4+ICsJaWYgKHJldCkK Pj4+ICsJCXJldHVybiByZXQ7Cj4+PiArCUk5MTVfV1JJVEUoU0tMX1BPUlRfSERDUF9SUFJJTUUo cG9ydCksIHJpLnJlZyk7Cj4+PiArCj4+PiArCS8vIFdhaXQgZm9yIFJpIHByaW1lIG1hdGNoCj4+ PiArCWlmICh3YWl0X2ZvcihJOTE1X1JFQUQoU0tMX1BPUlRfSERDUF9TVEFUVVMocG9ydCkpICYK Pj4+ICsJCSAgICAgKFNLTF9IRENQX1NUQVRVU19SSV9NQVRDSCB8IFNLTF9IRENQX1NUQVRVU19F TkMpLCAxKSkgewo+Pj4gKwkJRFJNX0VSUk9SKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgUmkgcHJp bWUgbWF0Y2ggKCV4KVxuIiwKPj4+ICsJCQkgIEk5MTVfUkVBRChTS0xfUE9SVF9IRENQX1NUQVRV Uyhwb3J0KSkpOwo+Pj4gKwkJcmV0dXJuIC1FVElNRURPVVQ7Cj4+PiArCX0KPj4+ICsKPj4+ICsJ Ly8gV2FpdCBmb3IgZW5jcnlwdGlvbiBjb25maXJtYXRpb24KPj4+ICsJaWYgKHdhaXRfZm9yKEk5 MTVfUkVBRChTS0xfUE9SVF9IRENQX1NUQVRVUyhwb3J0KSkgJgo+Pj4gKwkJICAgICAgU0tMX0hE Q1BfU1RBVFVTX0VOQywgMjApKSB7Cj4+PiArCQlEUk1fRVJST1IoIlRpbWVkIG91dCB3YWl0aW5n IGZvciBlbmNyeXB0aW9uXG4iKTsKPj4+ICsJCXJldHVybiAtRVRJTUVET1VUOwo+Pj4gKwl9Cj4+ PiArCj4+PiArCS8qCj4+PiArCSAqIFhYWDogSWYgd2UgaGF2ZSBNU1QtY29ubmVjdGVkIGRldmlj ZXMsIHdlIG5lZWQgdG8gZW5hYmxlIGVuY3J5cHRpb24KPj4+ICsJICogb24gdGhvc2UgYXMgd2Vs bC4KPj4+ICsJICovCj4+PiArCj4+PiArCXJldHVybiBpbnRlbF9oZGNwX2F1dGhfZG93bnN0cmVh bShpbnRlbF9kaWdfcG9ydCwgc2hpbSk7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYwo+Pj4gK3N0 cnVjdCBpbnRlbF9kaWdpdGFsX3BvcnQgKmNvbm5fdG9fZGlnX3BvcnQoc3RydWN0IGludGVsX2Nv bm5lY3RvciAqY29ubmVjdG9yKQo+Pj4gK3sKPj4+ICsJcmV0dXJuIGVuY190b19kaWdfcG9ydCgm aW50ZWxfYXR0YWNoZWRfZW5jb2RlcigmY29ubmVjdG9yLT5iYXNlKS0+YmFzZSk7Cj4+PiArfQo+ Pj4gKwo+Pj4gK3N0YXRpYyBpbnQgX2ludGVsX2hkY3BfZGlzYWJsZShzdHJ1Y3QgaW50ZWxfY29u bmVjdG9yICpjb25uZWN0b3IpCj4+PiArewo+Pj4gKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq ZGV2X3ByaXYgPSBjb25uZWN0b3ItPmJhc2UuZGV2LT5kZXZfcHJpdmF0ZTsKPj4+ICsJc3RydWN0 IGludGVsX2RpZ2l0YWxfcG9ydCAqaW50ZWxfZGlnX3BvcnQgPSBjb25uX3RvX2RpZ19wb3J0KGNv bm5lY3Rvcik7Cj4+PiArCWVudW0gcG9ydCBwb3J0ID0gaW50ZWxfZGlnX3BvcnQtPnBvcnQ7Cj4+ PiArCWludCByZXQ7Cj4+PiArCj4+PiArCUk5MTVfV1JJVEUoU0tMX1BPUlRfSERDUF9DT05GKHBv cnQpLCAwKTsKPj4+ICsJaWYgKHdhaXRfZm9yKEk5MTVfUkVBRChTS0xfUE9SVF9IRENQX1NUQVRV Uyhwb3J0KSkgPT0gMCwgMjApKSB7Cj4+PiArCQlEUk1fRVJST1IoIkZhaWxlZCB0byBkaXNhYmxl IEhEQ1AsIHRpbWVvdXQgY2xlYXJpbmcgc3RhdHVzXG4iKTsKPj4+ICsJCXJldHVybiAtRVRJTUVE T1VUOwo+Pj4gKwl9Cj4+PiArCj4+PiArCWludGVsX2hkY3BfY2xlYXJfa2V5cyhkZXZfcHJpdik7 Cj4+PiArCj4+PiArCXJldCA9IGNvbm5lY3Rvci0+aGRjcF9zaGltLT50b2dnbGVfc2lnbmFsbGlu ZyhpbnRlbF9kaWdfcG9ydCwgZmFsc2UpOwo+Pj4gKwlpZiAocmV0KSB7Cj4+PiArCQlEUk1fRVJS T1IoIkZhaWxlZCB0byBkaXNhYmxlIEhEQ1Agc2lnbmFsbGluZ1xuIik7Cj4+PiArCQlyZXR1cm4g cmV0Owo+Pj4gKwl9Cj4+PiArCj4+PiArCURSTV9JTkZPKCJIRENQIGlzIGRpc2FibGVkXG4iKTsK Pj4+ICsJcmV0dXJuIDA7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQgX2ludGVsX2hkY3Bf ZW5hYmxlKHN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3RvcikKPj4+ICt7Cj4+PiArCXN0 cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGNvbm5lY3Rvci0+YmFzZS5kZXYtPmRl dl9wcml2YXRlOwo+Pj4gKwlpbnQgaSwgcmV0Owo+Pj4gKwo+Pj4gKwlpZiAoIShJOTE1X1JFQUQo U0tMX0ZVU0VfU1RBVFVTKSAmIFNLTF9GVVNFX1BHX0RJU1RfU1RBVFVTKDEpKSkgewo+Pj4gKwkJ RFJNX0VSUk9SKCJQRzEgaXMgZGlzYWJsZWQsIGNhbm5vdCBsb2FkIGtleXNcbiIpOwo+Pj4gKwkJ cmV0dXJuIC1FTlhJTzsKPj4+ICsJfQo+Pj4gKwo+Pj4gKwlmb3IgKGkgPSAwOyBpIDwgS0VZX0xP QURfVFJJRVM7IGkrKykgewo+Pj4gKwkJcmV0ID0gaW50ZWxfaGRjcF9sb2FkX2tleXMoZGV2X3By aXYpOwo+Pj4gKwkJaWYgKCFyZXQpCj4+PiArCQkJYnJlYWs7Cj4+PiArCQlpbnRlbF9oZGNwX2Ns ZWFyX2tleXMoZGV2X3ByaXYpOwo+Pj4gKwl9Cj4+PiArCWlmIChyZXQpIHsKPj4+ICsJCURSTV9F UlJPUigiQ291bGQgbm90IGxvYWQgSERDUCBrZXlzLCAoJWQpXG4iLCByZXQpOwo+Pj4gKwkJcmV0 dXJuIHJldDsKPj4+ICsJfQo+Pj4gKwo+Pj4gKwlyZXQgPSBpbnRlbF9oZGNwX2F1dGgoY29ubl90 b19kaWdfcG9ydChjb25uZWN0b3IpLAo+Pj4gKwkJCSAgICAgIGNvbm5lY3Rvci0+aGRjcF9zaGlt KTsKPj4+ICsJaWYgKHJldCkgewo+Pj4gKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYXV0aGVudGlj YXRlIEhEQ1AgKCVkKVxuIiwgcmV0KTsKPj4+ICsJCXJldHVybiByZXQ7Cj4+PiArCX0KPj4+ICsK Pj4+ICsJcmV0dXJuIDA7Cj4+PiArfQo+Pj4gKwo+Pj4gK3ZvaWQgaW50ZWxfaGRjcF93b3JrKHN0 cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKPj4+ICt7Cj4+PiArCXN0cnVjdCBpbnRlbF9jb25uZWN0 b3IgKmNvbm5lY3RvciA9IGNvbnRhaW5lcl9vZih0b19kZWxheWVkX3dvcmsod29yayksCj4+PiAr CQkJCQkJCSBzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yLAo+Pj4gKwkJCQkJCSAgICAgICAgIGhkY3Bf d29yayk7Cj4+PiArCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmJhc2UuZGV2 Owo+Pj4gKwlpbnQgcmV0Owo+Pj4gKwo+Pj4gKwlkcm1fbW9kZXNldF9sb2NrKCZkZXYtPm1vZGVf Y29uZmlnLmNvbm5lY3Rpb25fbXV0ZXgsIE5VTEwpOwo+Pj4gKwo+Pj4gKwlyZXQgPSBpbnRlbF9o ZGNwX2NoZWNrX2xpbmsoY29ubmVjdG9yKTsKPj4+ICsJaWYgKCFyZXQpCj4+PiArCQlzY2hlZHVs ZV9kZWxheWVkX3dvcmsoJmNvbm5lY3Rvci0+aGRjcF93b3JrLAo+Pj4gKwkJCQkgICAgICBEUk1f SERDUF9DSEVDS19QRVJJT0RfTVMpOwo+Pj4gKwo+Pj4gKwlkcm1fbW9kZXNldF91bmxvY2soJmRl di0+bW9kZV9jb25maWcuY29ubmVjdGlvbl9tdXRleCk7Cj4+PiArfQo+Pj4gKwo+Pj4gK2ludCBp bnRlbF9oZGNwX2VuYWJsZShzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICpjb25uZWN0b3IpCj4+PiAr ewo+Pj4gKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjb25uZWN0b3ItPmJh c2UuZGV2LT5kZXZfcHJpdmF0ZTsKPj4+ICsJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9ICZkZXZf cHJpdi0+ZHJtOwo+Pj4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqc3RhdGUgPSBjb25u ZWN0b3ItPmJhc2Uuc3RhdGU7Cj4+PiArCWludCByZXQ7Cj4+PiArCj4+PiArCVdBUk5fT04oIWRy bV9tb2Rlc2V0X2lzX2xvY2tlZCgmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0aW9uX211dGV4KSk7 Cj4+PiArCj4+PiArCWlmICghY29ubmVjdG9yLT5oZGNwX3NoaW0pCj4+PiArCQlyZXR1cm4gLUVO T0VOVDsKPj4+ICsKPj4+ICsJcmV0ID0gX2ludGVsX2hkY3BfZW5hYmxlKGNvbm5lY3Rvcik7Cj4+ PiArCWlmIChyZXQpCj4+PiArCQlyZXR1cm4gcmV0Owo+Pj4gKwo+Pj4gKwlzdGF0ZS0+Y29udGVu dF9wcm90ZWN0aW9uID0gRFJNX01PREVfQ09OVEVOVF9QUk9URUNUSU9OX0VOQUJMRUQ7Cj4+PiAr Cj4+PiArCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY29ubmVjdG9yLT5oZGNwX3dvcmssIERSTV9I RENQX0NIRUNLX1BFUklPRF9NUyk7Cj4+PiArCXJldHVybiAwOwo+Pj4gK30KPj4+ICsKPj4+ICtp bnQgaW50ZWxfaGRjcF9kaXNhYmxlKHN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3RvcikK Pj4+ICt7Cj4+PiArCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGNvbm5lY3Rv ci0+YmFzZS5kZXYtPmRldl9wcml2YXRlOwo+Pj4gKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0g JmRldl9wcml2LT5kcm07Cj4+PiArCj4+PiArCVdBUk5fT04oIWRybV9tb2Rlc2V0X2lzX2xvY2tl ZCgmZGV2LT5tb2RlX2NvbmZpZy5jb25uZWN0aW9uX211dGV4KSk7Cj4+PiArCj4+PiArCWlmICgh Y29ubmVjdG9yLT5oZGNwX3NoaW0pCj4+PiArCQlyZXR1cm4gLUVOT0VOVDsKPj4+ICsKPj4+ICsJ Y2FuY2VsX2RlbGF5ZWRfd29yaygmY29ubmVjdG9yLT5oZGNwX3dvcmspOwo+Pj4gKwo+Pj4gKwly ZXR1cm4gX2ludGVsX2hkY3BfZGlzYWJsZShjb25uZWN0b3IpOwo+Pj4gK30KPj4+ICsKPj4+ICsv KiBJbXBsZW1lbnRzIFBhcnQgMyBvZiB0aGUgSERDUCBhdXRob3JpemF0aW9uIHByb2NlZHVyZSAq Lwo+Pj4gK2ludCBpbnRlbF9oZGNwX2NoZWNrX2xpbmsoc3RydWN0IGludGVsX2Nvbm5lY3RvciAq Y29ubmVjdG9yKQo+Pj4gK3sKPj4+ICsJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2 ID0gY29ubmVjdG9yLT5iYXNlLmRldi0+ZGV2X3ByaXZhdGU7Cj4+PiArCXN0cnVjdCBkcm1fZGV2 aWNlICpkZXYgPSAmZGV2X3ByaXYtPmRybTsKPj4+ICsJc3RydWN0IGRybV9jb25uZWN0b3Jfc3Rh dGUgKnN0YXRlID0gY29ubmVjdG9yLT5iYXNlLnN0YXRlOwo+Pj4gKwlzdHJ1Y3QgaW50ZWxfZGln aXRhbF9wb3J0ICppbnRlbF9kaWdfcG9ydCA9IGNvbm5fdG9fZGlnX3BvcnQoY29ubmVjdG9yKTsK Pj4+ICsJZW51bSBwb3J0IHBvcnQgPSBpbnRlbF9kaWdfcG9ydC0+cG9ydDsKPj4+ICsJaW50IHJl dDsKPj4+ICsKPj4+ICsJV0FSTl9PTighZHJtX21vZGVzZXRfaXNfbG9ja2VkKCZkZXYtPm1vZGVf Y29uZmlnLmNvbm5lY3Rpb25fbXV0ZXgpKTsKPj4+ICsKPj4+ICsJaWYgKHN0YXRlLT5jb250ZW50 X3Byb3RlY3Rpb24gIT0gRFJNX01PREVfQ09OVEVOVF9QUk9URUNUSU9OX0VOQUJMRUQpCj4+PiAr CQlyZXR1cm4gMDsKPj4+ICsKPj4+ICsJaWYgKCFjb25uZWN0b3ItPmhkY3Bfc2hpbSkKPj4+ICsJ CXJldHVybiAtRU5PRU5UOwo+Pj4gKwo+Pj4gKwlpZiAoIShJOTE1X1JFQUQoU0tMX1BPUlRfSERD UF9TVEFUVVMocG9ydCkpICYgU0tMX0hEQ1BfU1RBVFVTX0VOQykpIHsKPj4+ICsJCURSTV9FUlJP UigiSERDUCBjaGVjayBmYWlsZWQ6IGxpbmsgaXMgbm90IGVuY3J5cHRlZCwgJXhcbiIsCj4+PiAr CQkJICAgSTkxNV9SRUFEKFNLTF9QT1JUX0hEQ1BfU1RBVFVTKHBvcnQpKSk7Cj4+PiArCQlyZXQg PSAtRU5YSU87Cj4+PiArCQlnb3RvIGZhaWw7Cj4+PiArCX0KPj4+ICsKPj4+ICsJaWYgKGNvbm5l Y3Rvci0+aGRjcF9zaGltLT5jaGVja19saW5rKGludGVsX2RpZ19wb3J0KSkKPj4+ICsJCXJldHVy biAwOwo+Pj4gKwo+Pj4gKwlEUk1fSU5GTygiSERDUCBsaW5rIGZhaWxlZCwgcmV0cnlpbmcgYXV0 aGVudGljYXRpb25cbiIpOwo+Pj4gKwo+Pj4gKwlyZXQgPSBfaW50ZWxfaGRjcF9kaXNhYmxlKGNv bm5lY3Rvcik7Cj4+PiArCWlmIChyZXQpIHsKPj4+ICsJCURSTV9FUlJPUigiRmFpbGVkIHRvIGRp c2FibGUgaGRjcCAoJWQpXG4iLCByZXQpOwo+Pj4gKwkJZ290byBmYWlsOwo+Pj4gKwl9Cj4+PiAr Cj4+PiArCXJldCA9IF9pbnRlbF9oZGNwX2VuYWJsZShjb25uZWN0b3IpOwo+Pj4gKwlpZiAocmV0 KSB7Cj4+PiArCQlEUk1fRVJST1IoIkZhaWxlZCB0byBlbmFibGUgaGRjcCAoJWQpXG4iLCByZXQp Owo+Pj4gKwkJZ290byBmYWlsOwo+Pj4gKwl9Cj4+PiArCj4+PiArCXJldHVybiAwOwo+Pj4gKwo+ Pj4gK2ZhaWw6Cj4+PiArCXN0YXRlLT5jb250ZW50X3Byb3RlY3Rpb24gPSBEUk1fTU9ERV9DT05U RU5UX1BST1RFQ1RJT05fREVTSVJFRDsKPj4+ICsJcmV0dXJuIHJldDsKPj4+ICt9Cj4+IF9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCj4+IEludGVsLWdmeCBt YWlsaW5nIGxpc3QKPj4gSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwo+PiBodHRwczov L2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAoKX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxp bmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJl ZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==