From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by gabe.freedesktop.org (Postfix) with ESMTPS id 3F6C86E291 for ; Tue, 29 Jan 2019 20:07:41 +0000 (UTC) Date: Tue, 29 Jan 2019 22:07:36 +0200 From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= Message-ID: <20190129200736.GI20097@intel.com> References: <20190125145842.15738-1-maxime.ripard@bootlin.com> <20190125145842.15738-4-maxime.ripard@bootlin.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20190125145842.15738-4-maxime.ripard@bootlin.com> Subject: Re: [igt-dev] [PATCH i-g-t v5 03/13] igt: fb: generic YUV convertion function List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" To: Maxime Ripard Cc: Petri Latvala , eben@raspberrypi.org, igt-dev@lists.freedesktop.org, Thomas Petazzoni List-ID: T24gRnJpLCBKYW4gMjUsIDIwMTkgYXQgMDM6NTg6MzJQTSArMDEwMCwgTWF4aW1lIFJpcGFyZCB3 cm90ZToKPiBUaGUgY3VycmVudCB3YXkgd2Ugd29yayB3aGVuIHdlIHdhbnQgdG8gc3VwcG9ydCBh IG5ldyBZVVYgZm9ybWF0IHRvIElHVCwgd2UKPiBhbHNvIG5lZWQgdG8gYWRkIG5ldyBmdW5jdGlv biB0byBjb252ZXJ0IHRvIGFuZCBmcm9tIFhSR0I4ODg4Lgo+IAo+IFRoaXMgZG9lc24ndCByZWFs bHkgc2NhbGUgaG93ZXZlciwgYW5kIGNyZWF0ZXMgYSBsb3Qgb2YgY29kZSB0byBtYWludGFpbi4K PiBJbiBvcmRlciB0byB3b3JrIGFyb3VuZCB0aGlzLCBjcmVhdGUgYSBnZW5lcmljIGZ1bmN0aW9u IHRvIGNvbnZlcnQgdG8gUkdCCj4gYW5kIG9uZSB0byBjb252ZXJ0IGZyb20gUkdCLgo+IAo+IFRo ZSBvbmx5IHRoaW5nIHRoYXQgaXMgbmVlZGVkIG5vdyBpcyB0byBhZGQgbmV3IHBhcmFtZXRlcnMs IGFuZCB0aGF0J3MgaXQuCgpXaGF0J3MgdGhlIHBlcmZvcm1hbmNlIGltcGFjdCBvZiB0aGlzPwoK PiAKPiBSZXZpZXdlZC1ieTogUGF1bCBLb2NpYWxrb3dza2kgPHBhdWwua29jaWFsa293c2tpQGJv b3RsaW4uY29tPgo+IFNpZ25lZC1vZmYtYnk6IE1heGltZSBSaXBhcmQgPG1heGltZS5yaXBhcmRA Ym9vdGxpbi5jb20+Cj4gLS0tCj4gIGxpYi9pZ3RfZmIuYyB8IDUzNyArKysrKysrKysrKysrKysr LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiAgMSBmaWxlIGNoYW5nZWQsIDE3 MSBpbnNlcnRpb25zKCspLCAzNjYgZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdpdCBhL2xpYi9p Z3RfZmIuYyBiL2xpYi9pZ3RfZmIuYwo+IGluZGV4IDFhNWMzMzhlYTUzMi4uNDU2OTFmZDQ0MWQ5 IDEwMDY0NAo+IC0tLSBhL2xpYi9pZ3RfZmIuYwo+ICsrKyBiL2xpYi9pZ3RfZmIuYwo+IEBAIC0x NTc3LDQyNCArMTU3NywyMzcgQEAgc3RhdGljIHZvaWQgY29udmVydF9zcmNfcHV0KGNvbnN0IHN0 cnVjdCBmYl9jb252ZXJ0ICpjdnQsCj4gIAkJZnJlZShzcmNfYnVmKTsKPiAgfQo+ICAKPiAtc3Rh dGljIHZvaWQgY29udmVydF9udjEyX3RvX3JnYjI0KHN0cnVjdCBmYl9jb252ZXJ0ICpjdnQpCj4g K3N0cnVjdCB5dXZfcGFyYW1ldGVycyB7Cj4gKwl1bnNpZ25lZAl5X2luYzsKPiArCXVuc2lnbmVk CXV2X2luYzsKPiArCXVuc2lnbmVkCXlfc3RyaWRlOwo+ICsJdW5zaWduZWQJdXZfc3RyaWRlOwo+ ICsJdW5zaWduZWQJeV9vZmZzZXQ7Cj4gKwl1bnNpZ25lZAl1X29mZnNldDsKPiArCXVuc2lnbmVk CXZfb2Zmc2V0Owo+ICt9Owo+ICsKPiArc3RhdGljIHZvaWQgZ2V0X3l1dl9wYXJhbWV0ZXJzKHN0 cnVjdCBpZ3RfZmIgKmZiLCBzdHJ1Y3QgeXV2X3BhcmFtZXRlcnMgKnBhcmFtcykKPiAgewo+IC0J aW50IGksIGo7Cj4gLQljb25zdCB1aW50OF90ICp5LCAqdXY7Cj4gLQl1aW50OF90ICpyZ2IyNCA9 IGN2dC0+ZHN0LnB0cjsKPiAtCXVuc2lnbmVkIGludCByZ2IyNF9zdHJpZGUgPSBjdnQtPmRzdC5m Yi0+c3RyaWRlc1swXTsKPiAtCXVuc2lnbmVkIGludCBwbGFuYXJfc3RyaWRlID0gY3Z0LT5zcmMu ZmItPnN0cmlkZXNbMF07Cj4gLQlzdHJ1Y3QgaWd0X21hdDQgbSA9IGlndF95Y2Jjcl90b19yZ2Jf bWF0cml4KGN2dC0+c3JjLmZiLT5jb2xvcl9lbmNvZGluZywKPiAtCQkJCQkJICAgIGN2dC0+c3Jj LmZiLT5jb2xvcl9yYW5nZSk7Cj4gLQl1aW50OF90ICpidWY7Cj4gLQo+IC0JaWd0X2Fzc2VydChj dnQtPnNyYy5mYi0+ZHJtX2Zvcm1hdCA9PSBEUk1fRk9STUFUX05WMTIgJiYKPiAtCQkgICBjdnQt PmRzdC5mYi0+ZHJtX2Zvcm1hdCA9PSBEUk1fRk9STUFUX1hSR0I4ODg4KTsKPiAtCj4gLQlidWYg PSBjb252ZXJ0X3NyY19nZXQoY3Z0KTsKPiAtCXkgPSBidWYgKyBjdnQtPnNyYy5mYi0+b2Zmc2V0 c1swXTsKPiAtCXV2ID0gYnVmICsgY3Z0LT5zcmMuZmItPm9mZnNldHNbMV07Cj4gLQo+IC0JZm9y IChpID0gMDsgaSA8IGN2dC0+ZHN0LmZiLT5oZWlnaHQgLyAyOyBpKyspIHsKPiAtCQlmb3IgKGog PSAwOyBqIDwgY3Z0LT5kc3QuZmItPndpZHRoIC8gMjsgaisrKSB7Cj4gLQkJCS8qIENvbnZlcnQg MngyIHBpeGVsIGJsb2NrcyAqLwo+IC0JCQlzdHJ1Y3QgaWd0X3ZlYzQgeXV2WzRdOwo+IC0JCQlz dHJ1Y3QgaWd0X3ZlYzQgcmdiWzRdOwo+IC0KPiAtCQkJeXV2WzBdLmRbMF0gPSB5W2ogKiAyICsg MF07Cj4gLQkJCXl1dlsxXS5kWzBdID0geVtqICogMiArIDFdOwo+IC0JCQl5dXZbMl0uZFswXSA9 IHlbaiAqIDIgKyAwICsgcGxhbmFyX3N0cmlkZV07Cj4gLQkJCXl1dlszXS5kWzBdID0geVtqICog MiArIDEgKyBwbGFuYXJfc3RyaWRlXTsKPiAtCj4gLQkJCXl1dlswXS5kWzFdID0geXV2WzFdLmRb MV0gPSB5dXZbMl0uZFsxXSA9IHl1dlszXS5kWzFdID0gdXZbaiAqIDIgKyAwXTsKPiAtCQkJeXV2 WzBdLmRbMl0gPSB5dXZbMV0uZFsyXSA9IHl1dlsyXS5kWzJdID0geXV2WzNdLmRbMl0gPSB1dltq ICogMiArIDFdOwo+IC0JCQl5dXZbMF0uZFszXSA9IHl1dlsxXS5kWzNdID0geXV2WzJdLmRbM10g PSB5dXZbM10uZFszXSA9IDEuMGY7Cj4gLQo+IC0JCQlyZ2JbMF0gPSBpZ3RfbWF0cml4X3RyYW5z Zm9ybSgmbSwgJnl1dlswXSk7Cj4gLQkJCXJnYlsxXSA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZt LCAmeXV2WzFdKTsKPiAtCQkJcmdiWzJdID0gaWd0X21hdHJpeF90cmFuc2Zvcm0oJm0sICZ5dXZb Ml0pOwo+IC0JCQlyZ2JbM10gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnl1dlszXSk7Cj4g LQo+IC0JCQl3cml0ZV9yZ2IoJnJnYjI0W2ogKiA4ICsgMF0sICZyZ2JbMF0pOwo+IC0JCQl3cml0 ZV9yZ2IoJnJnYjI0W2ogKiA4ICsgNF0sICZyZ2JbMV0pOwo+IC0JCQl3cml0ZV9yZ2IoJnJnYjI0 W2ogKiA4ICsgMCArIHJnYjI0X3N0cmlkZV0sICZyZ2JbMl0pOwo+IC0JCQl3cml0ZV9yZ2IoJnJn YjI0W2ogKiA4ICsgNCArIHJnYjI0X3N0cmlkZV0sICZyZ2JbM10pOwo+IC0JCX0KPiAtCj4gLQkJ aWYgKGN2dC0+ZHN0LmZiLT53aWR0aCAmIDEpIHsKPiAtCQkJLyogQ29udmVydCAxeDIgcGl4ZWwg YmxvY2sgKi8KPiAtCQkJc3RydWN0IGlndF92ZWM0IHl1dlsyXTsKPiAtCQkJc3RydWN0IGlndF92 ZWM0IHJnYlsyXTsKPiAtCj4gLQkJCXl1dlswXS5kWzBdID0geVtqICogMiArIDBdOwo+IC0JCQl5 dXZbMV0uZFswXSA9IHlbaiAqIDIgKyAwICsgcGxhbmFyX3N0cmlkZV07Cj4gKwlpZ3RfYXNzZXJ0 KGlndF9mb3JtYXRfaXNfeXV2KGZiLT5kcm1fZm9ybWF0KSk7Cj4gIAo+IC0JCQl5dXZbMF0uZFsx XSA9IHl1dlsxXS5kWzFdID0gdXZbaiAqIDIgKyAwXTsKPiAtCQkJeXV2WzBdLmRbMl0gPSB5dXZb MV0uZFsyXSA9IHV2W2ogKiAyICsgMV07Cj4gLQkJCXl1dlswXS5kWzNdID0geXV2WzFdLmRbM10g PSAxLjBmOwo+ICsJc3dpdGNoIChmYi0+ZHJtX2Zvcm1hdCkgewo+ICsJY2FzZSBEUk1fRk9STUFU X05WMTI6Cj4gKwkJcGFyYW1zLT55X2luYyA9IDE7Cj4gKwkJcGFyYW1zLT51dl9pbmMgPSAyOwo+ ICsJCWJyZWFrOwo+ICAKPiAtCQkJcmdiWzBdID0gaWd0X21hdHJpeF90cmFuc2Zvcm0oJm0sICZ5 dXZbMF0pOwo+IC0JCQlyZ2JbMV0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnl1dlsxXSk7 Cj4gLQo+IC0JCQl3cml0ZV9yZ2IoJnJnYjI0W2ogKiA4ICsgMF0sICZyZ2JbMF0pOwo+IC0JCQl3 cml0ZV9yZ2IoJnJnYjI0W2ogKiA4ICsgMCArIHJnYjI0X3N0cmlkZV0sICZyZ2JbMV0pOwo+IC0J CX0KPiAtCj4gLQkJcmdiMjQgKz0gMiAqIHJnYjI0X3N0cmlkZTsKPiAtCQl5ICs9IDIgKiBwbGFu YXJfc3RyaWRlOwo+IC0JCXV2ICs9IHBsYW5hcl9zdHJpZGU7Cj4gKwljYXNlIERSTV9GT1JNQVRf WVVZVjoKPiArCWNhc2UgRFJNX0ZPUk1BVF9ZVllVOgo+ICsJY2FzZSBEUk1fRk9STUFUX1VZVlk6 Cj4gKwljYXNlIERSTV9GT1JNQVRfVllVWToKPiArCQlwYXJhbXMtPnlfaW5jID0gMjsKPiArCQlw YXJhbXMtPnV2X2luYyA9IDQ7Cj4gKwkJYnJlYWs7Cj4gKwo+ICsJY2FzZSBEUk1fRk9STUFUX1hZ VVY4ODg4Ogo+ICsJCXBhcmFtcy0+eV9pbmMgPSA0Owo+ICsJCXBhcmFtcy0+dXZfaW5jID0gNDsK PiArCQlicmVhazsKPiAgCX0KPiAgCj4gLQlpZiAoY3Z0LT5kc3QuZmItPmhlaWdodCAmIDEpIHsK PiAtCQkvKiBDb252ZXJ0IGxhc3Qgcm93ICovCj4gLQkJZm9yIChqID0gMDsgaiA8IGN2dC0+ZHN0 LmZiLT53aWR0aCAvIDI7IGorKykgewo+IC0JCQkvKiBDb252ZXJ0IDJ4MSBwaXhlbCBibG9ja3Mg Ki8KPiAtCQkJc3RydWN0IGlndF92ZWM0IHl1dlsyXTsKPiAtCQkJc3RydWN0IGlndF92ZWM0IHJn YlsyXTsKPiAtCj4gLQkJCXl1dlswXS5kWzBdID0geVtqICogMiArIDBdOwo+IC0JCQl5dXZbMV0u ZFswXSA9IHlbaiAqIDIgKyAxXTsKPiAtCQkJeXV2WzBdLmRbMV0gPSB5dXZbMV0uZFsxXSA9IHV2 W2ogKiAyICsgMF07Cj4gLQkJCXl1dlswXS5kWzJdID0geXV2WzFdLmRbMl0gPSB1dltqICogMiAr IDFdOwo+IC0JCQl5dXZbMF0uZFszXSA9IHl1dlsxXS5kWzNdID0gMS4wZjsKPiArCXN3aXRjaCAo ZmItPmRybV9mb3JtYXQpIHsKPiArCWNhc2UgRFJNX0ZPUk1BVF9OVjEyOgo+ICsJCXBhcmFtcy0+ eV9zdHJpZGUgPSBmYi0+c3RyaWRlc1swXTsKPiArCQlwYXJhbXMtPnV2X3N0cmlkZSA9IGZiLT5z dHJpZGVzWzFdOwo+ICsJCWJyZWFrOwo+ICAKPiAtCQkJcmdiWzBdID0gaWd0X21hdHJpeF90cmFu c2Zvcm0oJm0sICZ5dXZbMF0pOwo+IC0JCQlyZ2JbMV0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgm bSwgJnl1dlsxXSk7Cj4gKwljYXNlIERSTV9GT1JNQVRfWVVZVjoKPiArCWNhc2UgRFJNX0ZPUk1B VF9ZVllVOgo+ICsJY2FzZSBEUk1fRk9STUFUX1VZVlk6Cj4gKwljYXNlIERSTV9GT1JNQVRfVllV WToKPiArCWNhc2UgRFJNX0ZPUk1BVF9YWVVWODg4ODoKPiArCQlwYXJhbXMtPnlfc3RyaWRlID0g ZmItPnN0cmlkZXNbMF07Cj4gKwkJcGFyYW1zLT51dl9zdHJpZGUgPSBmYi0+c3RyaWRlc1swXTsK PiArCQlicmVhazsKPiArCX0KPiAgCj4gLQkJCXdyaXRlX3JnYigmcmdiMjRbaiAqIDggKyAwXSwg JnJnYlswXSk7Cj4gLQkJCXdyaXRlX3JnYigmcmdiMjRbaiAqIDggKyA0XSwgJnJnYlswXSk7Cj4g LQkJfQo+ICsJc3dpdGNoIChmYi0+ZHJtX2Zvcm1hdCkgewo+ICsJY2FzZSBEUk1fRk9STUFUX05W MTI6Cj4gKwkJcGFyYW1zLT55X29mZnNldCA9IGZiLT5vZmZzZXRzWzBdOwo+ICsJCXBhcmFtcy0+ dV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1sxXTsKPiArCQlwYXJhbXMtPnZfb2Zmc2V0ID0gZmItPm9m ZnNldHNbMV0gKyAxOwo+ICsJCWJyZWFrOwo+ICAKPiAtCQlpZiAoY3Z0LT5kc3QuZmItPndpZHRo ICYgMSkgewo+IC0JCQkvKiBDb252ZXJ0IHNpbmdsZSBwaXhlbCAqLwo+IC0JCQlzdHJ1Y3QgaWd0 X3ZlYzQgeXV2Owo+IC0JCQlzdHJ1Y3QgaWd0X3ZlYzQgcmdiOwo+ICsJY2FzZSBEUk1fRk9STUFU X1lVWVY6Cj4gKwkJcGFyYW1zLT55X29mZnNldCA9IGZiLT5vZmZzZXRzWzBdOwo+ICsJCXBhcmFt cy0+dV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDE7Cj4gKwkJcGFyYW1zLT52X29mZnNldCA9 IGZiLT5vZmZzZXRzWzBdICsgMzsKPiArCQlicmVhazsKPiAgCj4gLQkJCXl1di5kWzBdID0geVtq ICogMiArIDBdOwo+IC0JCQl5dXYuZFsxXSA9IHV2W2ogKiAyICsgMF07Cj4gLQkJCXl1di5kWzJd ID0gdXZbaiAqIDIgKyAxXTsKPiAtCQkJeXV2LmRbM10gPSAxLjBmOwo+ICsJY2FzZSBEUk1fRk9S TUFUX1lWWVU6Cj4gKwkJcGFyYW1zLT55X29mZnNldCA9IGZiLT5vZmZzZXRzWzBdOwo+ICsJCXBh cmFtcy0+dV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDM7Cj4gKwkJcGFyYW1zLT52X29mZnNl dCA9IGZiLT5vZmZzZXRzWzBdICsgMTsKPiArCQlicmVhazsKPiAgCj4gLQkJCXJnYiA9IGlndF9t YXRyaXhfdHJhbnNmb3JtKCZtLCAmeXV2KTsKPiArCWNhc2UgRFJNX0ZPUk1BVF9VWVZZOgo+ICsJ CXBhcmFtcy0+eV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDE7Cj4gKwkJcGFyYW1zLT51X29m ZnNldCA9IGZiLT5vZmZzZXRzWzBdOwo+ICsJCXBhcmFtcy0+dl9vZmZzZXQgPSBmYi0+b2Zmc2V0 c1swXSArIDI7Cj4gKwkJYnJlYWs7Cj4gIAo+IC0JCQl3cml0ZV9yZ2IoJnJnYjI0W2ogKiA4ICsg MF0sICZyZ2IpOwo+IC0JCX0KPiArCWNhc2UgRFJNX0ZPUk1BVF9WWVVZOgo+ICsJCXBhcmFtcy0+ eV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDE7Cj4gKwkJcGFyYW1zLT51X29mZnNldCA9IGZi LT5vZmZzZXRzWzBdICsgMjsKPiArCQlwYXJhbXMtPnZfb2Zmc2V0ID0gZmItPm9mZnNldHNbMF07 Cj4gKwkJYnJlYWs7Cj4gKwo+ICsJY2FzZSBEUk1fRk9STUFUX1hZVVY4ODg4Ogo+ICsJCXBhcmFt cy0+eV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDE7Cj4gKwkJcGFyYW1zLT51X29mZnNldCA9 IGZiLT5vZmZzZXRzWzBdICsgMjsKPiArCQlwYXJhbXMtPnZfb2Zmc2V0ID0gZmItPm9mZnNldHNb MF0gKyAzOwo+ICsJCWJyZWFrOwo+ICAJfQo+IC0KPiAtCWNvbnZlcnRfc3JjX3B1dChjdnQsIGJ1 Zik7Cj4gIH0KPiAgCj4gLXN0YXRpYyB2b2lkIGNvbnZlcnRfeXV2NDQ0X3RvX3JnYjI0KHN0cnVj dCBmYl9jb252ZXJ0ICpjdnQpCj4gK3N0YXRpYyB2b2lkIGNvbnZlcnRfeXV2X3RvX3JnYjI0KHN0 cnVjdCBmYl9jb252ZXJ0ICpjdnQpCj4gIHsKPiArCWNvbnN0IHN0cnVjdCBmb3JtYXRfZGVzY19z dHJ1Y3QgKnNyY19mbXQgPQo+ICsJCWxvb2t1cF9kcm1fZm9ybWF0KGN2dC0+c3JjLmZiLT5kcm1f Zm9ybWF0KTsKPiAgCWludCBpLCBqOwo+IC0JdWludDhfdCAqeXV2MjQ7Cj4gKwl1aW50OF90IGJw cCA9IDQ7Cj4gKwl1aW50OF90ICp5LCAqdSwgKnY7Cj4gIAl1aW50OF90ICpyZ2IyNCA9IGN2dC0+ ZHN0LnB0cjsKPiAtCXVuc2lnbmVkIHJnYjI0X3N0cmlkZSA9IGN2dC0+ZHN0LmZiLT5zdHJpZGVz WzBdLCB4eXV2X3N0cmlkZSA9IGN2dC0+c3JjLmZiLT5zdHJpZGVzWzBdOwo+IC0JdWludDhfdCAq YnVmID0gbWFsbG9jKGN2dC0+c3JjLmZiLT5zaXplKTsKPiArCXVuc2lnbmVkIGludCByZ2IyNF9z dHJpZGUgPSBjdnQtPmRzdC5mYi0+c3RyaWRlc1swXTsKPiAgCXN0cnVjdCBpZ3RfbWF0NCBtID0g aWd0X3ljYmNyX3RvX3JnYl9tYXRyaXgoY3Z0LT5zcmMuZmItPmNvbG9yX2VuY29kaW5nLAo+ICAJ CQkJCQkgICAgY3Z0LT5zcmMuZmItPmNvbG9yX3JhbmdlKTsKPiArCXVpbnQ4X3QgKmJ1ZjsKPiAr CXN0cnVjdCB5dXZfcGFyYW1ldGVycyBwYXJhbXMgPSB7IH07Cj4gIAo+IC0JLyoKPiAtCSAqIFJl YWRpbmcgZnJvbSB0aGUgQk8gaXMgYXdmdWxseSBzbG93IGJlY2F1c2Ugb2YgbGFjayBvZiByZWFk IGNhY2hpbmcsCj4gLQkgKiBpdCdzIGZhc3RlciB0byBjb3B5IHRoZSB3aG9sZSBCTyB0byBhIHRl bXBvcmFyeSBidWZmZXIgYW5kIGNvbnZlcnQKPiAtCSAqIGZyb20gdGhlcmUuCj4gLQkgKi8KPiAt CWlndF9tZW1jcHlfZnJvbV93YyhidWYsIGN2dC0+c3JjLnB0ciArIGN2dC0+c3JjLmZiLT5vZmZz ZXRzWzBdLCBjdnQtPnNyYy5mYi0+c2l6ZSk7Cj4gLQl5dXYyNCA9IGJ1ZjsKPiArCWlndF9hc3Nl cnQoY3Z0LT5kc3QuZmItPmRybV9mb3JtYXQgPT0gRFJNX0ZPUk1BVF9YUkdCODg4OCAmJgo+ICsJ CSAgIGlndF9mb3JtYXRfaXNfeXV2KGN2dC0+c3JjLmZiLT5kcm1fZm9ybWF0KSk7Cj4gKwo+ICsJ YnVmID0gY29udmVydF9zcmNfZ2V0KGN2dCk7Cj4gKwlnZXRfeXV2X3BhcmFtZXRlcnMoY3Z0LT5z cmMuZmIsICZwYXJhbXMpOwo+ICsJeSA9IGJ1ZiArIHBhcmFtcy55X29mZnNldDsKPiArCXUgPSBi dWYgKyBwYXJhbXMudV9vZmZzZXQ7Cj4gKwl2ID0gYnVmICsgcGFyYW1zLnZfb2Zmc2V0Owo+ICAK PiAgCWZvciAoaSA9IDA7IGkgPCBjdnQtPmRzdC5mYi0+aGVpZ2h0OyBpKyspIHsKPiArCQljb25z dCB1aW50OF90ICp5X3RtcCA9IHk7Cj4gKwkJY29uc3QgdWludDhfdCAqdV90bXAgPSB1Owo+ICsJ CWNvbnN0IHVpbnQ4X3QgKnZfdG1wID0gdjsKPiArCQl1aW50OF90ICpyZ2JfdG1wID0gcmdiMjQ7 Cj4gKwo+ICAJCWZvciAoaiA9IDA7IGogPCBjdnQtPmRzdC5mYi0+d2lkdGg7IGorKykgewo+IC0J CQlmbG9hdCB5LCB1LCB2Owo+IC0JCQlzdHJ1Y3QgaWd0X3ZlYzQgeXV2Owo+IC0JCQlzdHJ1Y3Qg aWd0X3ZlYzQgcmdiOwo+IC0KPiAtCQkJdiA9IHl1djI0W2kgKiB4eXV2X3N0cmlkZSArIGogKiA0 XTsKPiAtCQkJdSA9IHl1djI0W2kgKiB4eXV2X3N0cmlkZSArIGogKiA0ICsgMV07Cj4gLQkJCXkg PSB5dXYyNFtpICogeHl1dl9zdHJpZGUgKyBqICogNCArIDJdOwo+IC0JCQl5dXYuZFswXSA9IHk7 Cj4gLQkJCXl1di5kWzFdID0gdTsKPiAtCQkJeXV2LmRbMl0gPSB2Owo+ICsJCQlzdHJ1Y3QgaWd0 X3ZlYzQgcmdiLCB5dXY7Cj4gKwo+ICsJCQl5dXYuZFswXSA9ICp5X3RtcDsKPiArCQkJeXV2LmRb MV0gPSAqdV90bXA7Cj4gKwkJCXl1di5kWzJdID0gKnZfdG1wOwo+ICAJCQl5dXYuZFszXSA9IDEu MGY7Cj4gIAo+ICAJCQlyZ2IgPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnl1dik7Cj4gKwkJ CXdyaXRlX3JnYihyZ2JfdG1wLCAmcmdiKTsKPiAgCj4gLQkJCXdyaXRlX3JnYigmcmdiMjRbaSAq IHJnYjI0X3N0cmlkZSArIGogKiA0XSwgJnJnYik7Cj4gLQkJfQo+IC0JfQo+IC0KPiAtCWZyZWUo YnVmKTsKPiAtfQo+IC0KPiAtCj4gLXN0YXRpYyB2b2lkIGNvbnZlcnRfcmdiMjRfdG9feXV2NDQ0 KHN0cnVjdCBmYl9jb252ZXJ0ICpjdnQpCj4gLXsKPiAtCWludCBpLCBqOwo+IC0JdWludDhfdCAq cmdiMjQ7Cj4gLQl1aW50OF90ICp5dXY0NDQgPSBjdnQtPmRzdC5wdHIgKyBjdnQtPmRzdC5mYi0+ b2Zmc2V0c1swXTsKPiAtCXVuc2lnbmVkIGludCByZ2IyNF9zdHJpZGUgPSBjdnQtPnNyYy5mYi0+ c3RyaWRlc1swXSwgeHl1dl9zdHJpZGUgPSBjdnQtPmRzdC5mYi0+c3RyaWRlc1swXTsKPiAtCXN0 cnVjdCBpZ3RfbWF0NCBtID0gaWd0X3JnYl90b195Y2Jjcl9tYXRyaXgoY3Z0LT5kc3QuZmItPmNv bG9yX2VuY29kaW5nLAo+IC0JCQkJCQkgICAgY3Z0LT5kc3QuZmItPmNvbG9yX3JhbmdlKTsKPiAt Cj4gLQlyZ2IyNCA9IGN2dC0+c3JjLnB0cjsKPiArCQkJcmdiX3RtcCArPSBicHA7Cj4gKwkJCXlf dG1wICs9IHBhcmFtcy55X2luYzsKPiAgCj4gLQlpZ3RfYXNzZXJ0X2YoY3Z0LT5kc3QuZmItPmRy bV9mb3JtYXQgPT0gRFJNX0ZPUk1BVF9YWVVWODg4OCwKPiAtCQkgICAgICJDb252ZXJzaW9uIG5v dCBpbXBsZW1lbnRlZCBmb3IgIVhZVVYgcGFja2VkIGZvcm1hdHNcbiIpOwo+IC0KPiAtCWZvciAo aSA9IDA7IGkgPCBjdnQtPmRzdC5mYi0+aGVpZ2h0OyBpKyspIHsKPiAtCQlmb3IgKGogPSAwOyBq IDwgY3Z0LT5kc3QuZmItPndpZHRoOyBqKyspIHsKPiAtCQkJc3RydWN0IGlndF92ZWM0IHJnYjsK PiAtCQkJc3RydWN0IGlndF92ZWM0IHl1djsKPiAtCj4gLQkJCXJlYWRfcmdiKCZyZ2IsICZyZ2Iy NFtpICogcmdiMjRfc3RyaWRlICsgaiAqIDRdKTsKPiArCQkJaWYgKChzcmNfZm10LT5oc3ViID09 IDEpIHx8IChqICUgc3JjX2ZtdC0+aHN1YikpIHsKPiArCQkJCXVfdG1wICs9IHBhcmFtcy51dl9p bmM7Cj4gKwkJCQl2X3RtcCArPSBwYXJhbXMudXZfaW5jOwo+ICsJCQl9Cj4gKwkJfQo+ICAKPiAt CQkJeXV2ID0gaWd0X21hdHJpeF90cmFuc2Zvcm0oJm0sICZyZ2IpOwo+ICsJCXJnYjI0ICs9IHJn YjI0X3N0cmlkZTsKPiArCQl5ICs9IHBhcmFtcy55X3N0cmlkZTsKPiAgCj4gLQkJCXl1djQ0NFtp ICogeHl1dl9zdHJpZGUgKyBqICogNF0gPSB5dXYuZFsyXTsKPiAtCQkJeXV2NDQ0W2kgKiB4eXV2 X3N0cmlkZSArIGogKiA0ICsgMV0gPSB5dXYuZFsxXTsKPiAtCQkJeXV2NDQ0W2kgKiB4eXV2X3N0 cmlkZSArIGogKiA0ICsgMl0gPSB5dXYuZFswXTsKPiArCQlpZiAoKHNyY19mbXQtPnZzdWIgPT0g MSkgfHwgKGkgJSBzcmNfZm10LT52c3ViKSkgewo+ICsJCQl1ICs9IHBhcmFtcy51dl9zdHJpZGU7 Cj4gKwkJCXYgKz0gcGFyYW1zLnV2X3N0cmlkZTsKPiAgCQl9Cj4gIAl9Cj4gKwo+ICsJY29udmVy dF9zcmNfcHV0KGN2dCwgYnVmKTsKPiAgfQo+ICAKPiAtc3RhdGljIHZvaWQgY29udmVydF9yZ2Iy NF90b19udjEyKHN0cnVjdCBmYl9jb252ZXJ0ICpjdnQpCj4gK3N0YXRpYyB2b2lkIGNvbnZlcnRf cmdiMjRfdG9feXV2KHN0cnVjdCBmYl9jb252ZXJ0ICpjdnQpCj4gIHsKPiArCWNvbnN0IHN0cnVj dCBmb3JtYXRfZGVzY19zdHJ1Y3QgKmRzdF9mbXQgPQo+ICsJCWxvb2t1cF9kcm1fZm9ybWF0KGN2 dC0+ZHN0LmZiLT5kcm1fZm9ybWF0KTsKPiAgCWludCBpLCBqOwo+IC0JdWludDhfdCAqeSA9IGN2 dC0+ZHN0LnB0ciArIGN2dC0+ZHN0LmZiLT5vZmZzZXRzWzBdOwo+IC0JdWludDhfdCAqdXYgPSBj dnQtPmRzdC5wdHIgKyBjdnQtPmRzdC5mYi0+b2Zmc2V0c1sxXTsKPiArCXVpbnQ4X3QgKnksICp1 LCAqdjsKPiAgCWNvbnN0IHVpbnQ4X3QgKnJnYjI0ID0gY3Z0LT5zcmMucHRyOwo+ICsJdWludDhf dCBicHAgPSA0Owo+ICAJdW5zaWduZWQgcmdiMjRfc3RyaWRlID0gY3Z0LT5zcmMuZmItPnN0cmlk ZXNbMF07Cj4gLQl1bnNpZ25lZCBwbGFuYXJfc3RyaWRlID0gY3Z0LT5kc3QuZmItPnN0cmlkZXNb MF07Cj4gIAlzdHJ1Y3QgaWd0X21hdDQgbSA9IGlndF9yZ2JfdG9feWNiY3JfbWF0cml4KGN2dC0+ ZHN0LmZiLT5jb2xvcl9lbmNvZGluZywKPiAgCQkJCQkJICAgIGN2dC0+ZHN0LmZiLT5jb2xvcl9y YW5nZSk7Cj4gKwlzdHJ1Y3QgeXV2X3BhcmFtZXRlcnMgcGFyYW1zID0geyB9Owo+ICAKPiAgCWln dF9hc3NlcnQoY3Z0LT5zcmMuZmItPmRybV9mb3JtYXQgPT0gRFJNX0ZPUk1BVF9YUkdCODg4OCAm Jgo+IC0JCSAgIGN2dC0+ZHN0LmZiLT5kcm1fZm9ybWF0ID09IERSTV9GT1JNQVRfTlYxMik7Cj4g KwkJICAgaWd0X2Zvcm1hdF9pc195dXYoY3Z0LT5kc3QuZmItPmRybV9mb3JtYXQpKTsKPiAgCj4g LQlmb3IgKGkgPSAwOyBpIDwgY3Z0LT5kc3QuZmItPmhlaWdodCAvIDI7IGkrKykgewo+IC0JCWZv ciAoaiA9IDA7IGogPCBjdnQtPmRzdC5mYi0+d2lkdGggLyAyOyBqKyspIHsKPiAtCQkJLyogQ29u dmVydCAyeDIgcGl4ZWwgYmxvY2tzICovCj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCByZ2JbNF07Cj4g LQkJCXN0cnVjdCBpZ3RfdmVjNCB5dXZbNF07Cj4gKwlnZXRfeXV2X3BhcmFtZXRlcnMoY3Z0LT5k c3QuZmIsICZwYXJhbXMpOwo+ICsJeSA9IGN2dC0+ZHN0LnB0ciArIHBhcmFtcy55X29mZnNldDsK PiArCXUgPSBjdnQtPmRzdC5wdHIgKyBwYXJhbXMudV9vZmZzZXQ7Cj4gKwl2ID0gY3Z0LT5kc3Qu cHRyICsgcGFyYW1zLnZfb2Zmc2V0Owo+ICAKPiAtCQkJcmVhZF9yZ2IoJnJnYlswXSwgJnJnYjI0 W2ogKiA4ICsgMF0pOwo+IC0JCQlyZWFkX3JnYigmcmdiWzFdLCAmcmdiMjRbaiAqIDggKyA0XSk7 Cj4gLQkJCXJlYWRfcmdiKCZyZ2JbMl0sICZyZ2IyNFtqICogOCArIDAgKyByZ2IyNF9zdHJpZGVd KTsKPiAtCQkJcmVhZF9yZ2IoJnJnYlszXSwgJnJnYjI0W2ogKiA4ICsgNCArIHJnYjI0X3N0cmlk ZV0pOwo+IC0KPiAtCQkJeXV2WzBdID0gaWd0X21hdHJpeF90cmFuc2Zvcm0oJm0sICZyZ2JbMF0p Owo+IC0JCQl5dXZbMV0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnJnYlsxXSk7Cj4gLQkJ CXl1dlsyXSA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAmcmdiWzJdKTsKPiAtCQkJeXV2WzNd ID0gaWd0X21hdHJpeF90cmFuc2Zvcm0oJm0sICZyZ2JbM10pOwo+IC0KPiAtCQkJeVtqICogMiAr IDBdID0geXV2WzBdLmRbMF07Cj4gLQkJCXlbaiAqIDIgKyAxXSA9IHl1dlsxXS5kWzBdOwo+IC0J CQl5W2ogKiAyICsgMCArIHBsYW5hcl9zdHJpZGVdID0geXV2WzJdLmRbMF07Cj4gLQkJCXlbaiAq IDIgKyAxICsgcGxhbmFyX3N0cmlkZV0gPSB5dXZbM10uZFswXTsKPiArCWZvciAoaSA9IDA7IGkg PCBjdnQtPmRzdC5mYi0+aGVpZ2h0OyBpKyspIHsKPiArCQljb25zdCB1aW50OF90ICpyZ2JfdG1w ID0gcmdiMjQ7Cj4gKwkJdWludDhfdCAqeV90bXAgPSB5Owo+ICsJCXVpbnQ4X3QgKnVfdG1wID0g dTsKPiArCQl1aW50OF90ICp2X3RtcCA9IHY7Cj4gIAo+IC0JCQkvKgo+IC0JCQkgKiBXZSBhc3N1 bWUgdGhlIE1QRUcyIGNocm9tYSBzaXRpbmcgY29udmVudGlvbiwgd2hlcmUKPiAtCQkJICogcGl4 ZWwgY2VudGVyIGZvciBDYidDcicgaXMgYmV0d2VlbiB0aGUgbGVmdCB0b3AgYW5kCj4gLQkJCSAq IGJvdHRvbSBwaXhlbCBpbiBhIDJ4MiBibG9jaywgc28gdGFrZSB0aGUgYXZlcmFnZS4KPiAtCQkJ ICovCj4gLQkJCXV2W2ogKiAyICsgMF0gPSAoeXV2WzBdLmRbMV0gKyB5dXZbMl0uZFsxXSkgLyAy LjBmOwo+IC0JCQl1dltqICogMiArIDFdID0gKHl1dlswXS5kWzJdICsgeXV2WzJdLmRbMl0pIC8g Mi4wZjsKPiAtCQl9Cj4gKwkJZm9yIChqID0gMDsgaiA8IGN2dC0+ZHN0LmZiLT53aWR0aDsgaisr KSB7Cj4gKwkJCWNvbnN0IHVpbnQ4X3QgKnBhaXJfcmdiMjQgPSByZ2JfdG1wOwo+ICsJCQlzdHJ1 Y3QgaWd0X3ZlYzQgcGFpcl9yZ2IsIHJnYjsKPiArCQkJc3RydWN0IGlndF92ZWM0IHBhaXJfeXV2 LCB5dXY7Cj4gIAo+IC0JCWlmIChjdnQtPmRzdC5mYi0+d2lkdGggJiAxKSB7Cj4gLQkJCS8qIENv bnZlcnQgMXgyIHBpeGVsIGJsb2NrICovCj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCByZ2JbMl07Cj4g LQkJCXN0cnVjdCBpZ3RfdmVjNCB5dXZbMl07Cj4gKwkJCXJlYWRfcmdiKCZyZ2IsIHJnYl90bXAp Owo+ICsJCQl5dXYgPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnJnYik7Cj4gIAo+IC0JCQly ZWFkX3JnYigmcmdiWzBdLCAmcmdiMjRbaiAqIDggKyAwXSk7Cj4gLQkJCXJlYWRfcmdiKCZyZ2Jb MV0sICZyZ2IyNFtqICogOCArIDAgKyByZ2IyNF9zdHJpZGVdKTsKPiArCQkJcmdiX3RtcCArPSBi cHA7Cj4gIAo+IC0JCQl5dXZbMF0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnJnYlswXSk7 Cj4gLQkJCXl1dlsxXSA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAmcmdiWzFdKTsKPiArCQkJ KnlfdG1wID0geXV2LmRbMF07Cj4gKwkJCXlfdG1wICs9IHBhcmFtcy55X2luYzsKPiAgCj4gLQkJ CXlbaiAqIDIgKyAwXSA9IHl1dlswXS5kWzBdOwo+IC0JCQl5W2ogKiAyICsgMCArIHBsYW5hcl9z dHJpZGVdID0geXV2WzFdLmRbMF07Cj4gKwkJCWlmICgoaSAlIGRzdF9mbXQtPnZzdWIpIHx8IChq ICUgZHN0X2ZtdC0+aHN1YikpCj4gKwkJCQljb250aW51ZTsKPiAgCj4gIAkJCS8qCj4gIAkJCSAq IFdlIGFzc3VtZSB0aGUgTVBFRzIgY2hyb21hIHNpdGluZyBjb252ZW50aW9uLCB3aGVyZQo+ICAJ CQkgKiBwaXhlbCBjZW50ZXIgZm9yIENiJ0NyJyBpcyBiZXR3ZWVuIHRoZSBsZWZ0IHRvcCBhbmQK PiAgCQkJICogYm90dG9tIHBpeGVsIGluIGEgMngyIGJsb2NrLCBzbyB0YWtlIHRoZSBhdmVyYWdl Lgo+ICsJCQkgKgo+ICsJCQkgKiBUaGVyZWZvcmUsIGlmIHdlIHVzZSBzdWJzYW1wbGluZywgd2Ug b25seSByZWFsbHkgY2FyZQo+ICsJCQkgKiBhYm91dCB0d28gcGl4ZWxzIGFsbCB0aGUgdGltZSwg ZWl0aGVyIHRoZSB0d28KPiArCQkJICogc3Vic2VxdWVudCBwaXhlbHMgaG9yaXpvbnRhbGx5LCB2 ZXJ0aWNhbGx5LCBvciB0aGUKPiArCQkJICogdHdvIGNvcm5lcnMgaW4gYSAyeDIgYmxvY2suCj4g KwkJCSAqCj4gKwkJCSAqIFRoZSBvbmx5IGNvcm5lciBjYXNlIGlzIHdoZW4gd2UgaGF2ZSBhbiBv ZGQgbnVtYmVyIG9mCj4gKwkJCSAqIHBpeGVscywgYnV0IHRoaXMgY2FuIGJlIGhhbmRsZWQgcHJl dHR5IGVhc2lseSBieSBub3QKPiArCQkJICogaW5jcmVtZW50aW5nIHRoZSBwYWlyZWQgcGl4ZWwg cG9pbnRlciBpbiB0aGUKPiArCQkJICogZGlyZWN0aW9uIGl0J3Mgb2RkIGluLgo+ICAJCQkgKi8K PiAtCQkJdXZbaiAqIDIgKyAwXSA9ICh5dXZbMF0uZFsxXSArIHl1dlsxXS5kWzFdKSAvIDIuMGY7 Cj4gLQkJCXV2W2ogKiAyICsgMV0gPSAoeXV2WzBdLmRbMl0gKyB5dXZbMV0uZFsyXSkgLyAyLjBm Owo+IC0JCX0KPiAtCj4gLQkJcmdiMjQgKz0gMiAqIHJnYjI0X3N0cmlkZTsKPiAtCQl5ICs9IDIg KiBwbGFuYXJfc3RyaWRlOwo+IC0JCXV2ICs9IHBsYW5hcl9zdHJpZGU7Cj4gLQl9Cj4gLQo+IC0J LyogTGFzdCByb3cgY2Fubm90IGJlIGludGVycG9sYXRlZCBiZXR3ZWVuIDIgcGl4ZWxzLCB0YWtl IHRoZSBzaW5nbGUgdmFsdWUgKi8KPiAtCWlmIChjdnQtPmRzdC5mYi0+aGVpZ2h0ICYgMSkgewo+ IC0JCWZvciAoaiA9IDA7IGogPCBjdnQtPmRzdC5mYi0+d2lkdGggLyAyOyBqKyspIHsKPiAtCQkJ LyogQ29udmVydCAyeDEgcGl4ZWwgYmxvY2tzICovCj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCByZ2Jb Ml07Cj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCB5dXZbMl07Cj4gLQo+IC0JCQlyZWFkX3JnYigmcmdi WzBdLCAmcmdiMjRbaiAqIDggKyAwXSk7Cj4gLQkJCXJlYWRfcmdiKCZyZ2JbMV0sICZyZ2IyNFtq ICogOCArIDRdKTsKPiAtCj4gLQkJCXl1dlswXSA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAm cmdiWzBdKTsKPiAtCQkJeXV2WzFdID0gaWd0X21hdHJpeF90cmFuc2Zvcm0oJm0sICZyZ2JbMV0p Owo+ICsJCQlpZiAoaiAhPSAoY3Z0LT5kc3QuZmItPndpZHRoIC0gMSkpCj4gKwkJCQlwYWlyX3Jn YjI0ICs9IChkc3RfZm10LT5oc3ViIC0gMSkgKiBicHA7Cj4gIAo+IC0JCQl5W2ogKiAyICsgMF0g PSB5dXZbMF0uZFswXTsKPiAtCQkJeVtqICogMiArIDFdID0geXV2WzFdLmRbMF07Cj4gLQkJCXV2 W2ogKiAyICsgMF0gPSB5dXZbMF0uZFsxXTsKPiAtCQkJdXZbaiAqIDIgKyAxXSA9IHl1dlswXS5k WzJdOwo+IC0JCX0KPiAtCj4gLQkJaWYgKGN2dC0+ZHN0LmZiLT53aWR0aCAmIDEpIHsKPiAtCQkJ LyogQ29udmVydCBzaW5nbGUgcGl4ZWwgKi8KPiAtCQkJc3RydWN0IGlndF92ZWM0IHJnYjsKPiAt CQkJc3RydWN0IGlndF92ZWM0IHl1djsKPiArCQkJaWYgKGkgIT0gKGN2dC0+ZHN0LmZiLT5oZWln aHQgLSAxKSkKPiArCQkJCXBhaXJfcmdiMjQgKz0gcmdiMjRfc3RyaWRlICogKGRzdF9mbXQtPnZz dWIgLSAxKTsKPiAgCj4gLQkJCXJlYWRfcmdiKCZyZ2IsICZyZ2IyNFtqICogOCArIDBdKTsKPiAr CQkJcmVhZF9yZ2IoJnBhaXJfcmdiLCBwYWlyX3JnYjI0KTsKPiArCQkJcGFpcl95dXYgPSBpZ3Rf bWF0cml4X3RyYW5zZm9ybSgmbSwgJnBhaXJfcmdiKTsKPiAgCj4gLQkJCXl1diA9IGlndF9tYXRy aXhfdHJhbnNmb3JtKCZtLCAmcmdiKTsKPiArCQkJKnVfdG1wID0gKHl1di5kWzFdICsgcGFpcl95 dXYuZFsxXSkgLyAyLjBmOwo+ICsJCQkqdl90bXAgPSAoeXV2LmRbMl0gKyBwYWlyX3l1di5kWzJd KSAvIDIuMGY7Cj4gIAo+IC0JCQl5W2ogKiAyICsgMF0gPSB5dXYuZFswXTsKPiAtCQkJdXZbaiAq IDIgKyAwXSA9IHl1di5kWzFdOwo+IC0JCQl1dltqICogMiArIDFdID0geXV2LmRbMl07Cj4gLQkJ fQo+IC0JfQo+IC19Cj4gLQo+IC0vKiB7IFkwLCBVLCBZMSwgViB9ICovCj4gLXN0YXRpYyBjb25z dCB1bnNpZ25lZCBjaGFyIHN3aXp6bGVfeXV5dltdID0geyAwLCAxLCAyLCAzIH07Cj4gLXN0YXRp YyBjb25zdCB1bnNpZ25lZCBjaGFyIHN3aXp6bGVfeXZ5dVtdID0geyAwLCAzLCAyLCAxIH07Cj4g LXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHN3aXp6bGVfdXl2eVtdID0geyAxLCAwLCAzLCAy IH07Cj4gLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHN3aXp6bGVfdnl1eVtdID0geyAxLCAy LCAzLCAwIH07Cj4gLQo+IC1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciAqeXV5dl9zd2l6emxl KHVpbnQzMl90IGZvcm1hdCkKPiAtewo+IC0Jc3dpdGNoIChmb3JtYXQpIHsKPiAtCWRlZmF1bHQ6 Cj4gLQljYXNlIERSTV9GT1JNQVRfWVVZVjoKPiAtCQlyZXR1cm4gc3dpenpsZV95dXl2Owo+IC0J Y2FzZSBEUk1fRk9STUFUX1lWWVU6Cj4gLQkJcmV0dXJuIHN3aXp6bGVfeXZ5dTsKPiAtCWNhc2Ug RFJNX0ZPUk1BVF9VWVZZOgo+IC0JCXJldHVybiBzd2l6emxlX3V5dnk7Cj4gLQljYXNlIERSTV9G T1JNQVRfVllVWToKPiAtCQlyZXR1cm4gc3dpenpsZV92eXV5Owo+IC0JfQo+IC19Cj4gLQo+IC1z dGF0aWMgdm9pZCBjb252ZXJ0X3l1eXZfdG9fcmdiMjQoc3RydWN0IGZiX2NvbnZlcnQgKmN2dCkK PiAtewo+IC0JaW50IGksIGo7Cj4gLQljb25zdCB1aW50OF90ICp5dXl2Owo+IC0JdWludDhfdCAq cmdiMjQgPSBjdnQtPmRzdC5wdHI7Cj4gLQl1bnNpZ25lZCBpbnQgcmdiMjRfc3RyaWRlID0gY3Z0 LT5kc3QuZmItPnN0cmlkZXNbMF07Cj4gLQl1bnNpZ25lZCBpbnQgeXV5dl9zdHJpZGUgPSBjdnQt PnNyYy5mYi0+c3RyaWRlc1swXTsKPiAtCXN0cnVjdCBpZ3RfbWF0NCBtID0gaWd0X3ljYmNyX3Rv X3JnYl9tYXRyaXgoY3Z0LT5zcmMuZmItPmNvbG9yX2VuY29kaW5nLAo+IC0JCQkJCQkgICAgY3Z0 LT5zcmMuZmItPmNvbG9yX3JhbmdlKTsKPiAtCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnN3eiA9IHl1 eXZfc3dpenpsZShjdnQtPnNyYy5mYi0+ZHJtX2Zvcm1hdCk7Cj4gLQl1aW50OF90ICpidWY7Cj4g LQo+IC0JaWd0X2Fzc2VydCgoY3Z0LT5zcmMuZmItPmRybV9mb3JtYXQgPT0gRFJNX0ZPUk1BVF9Z VVlWIHx8Cj4gLQkJICAgIGN2dC0+c3JjLmZiLT5kcm1fZm9ybWF0ID09IERSTV9GT1JNQVRfVVlW WSB8fAo+IC0JCSAgICBjdnQtPnNyYy5mYi0+ZHJtX2Zvcm1hdCA9PSBEUk1fRk9STUFUX1lWWVUg fHwKPiAtCQkgICAgY3Z0LT5zcmMuZmItPmRybV9mb3JtYXQgPT0gRFJNX0ZPUk1BVF9WWVVZKSAm Jgo+IC0JCSAgIGN2dC0+ZHN0LmZiLT5kcm1fZm9ybWF0ID09IERSTV9GT1JNQVRfWFJHQjg4ODgp Owo+IC0KPiAtCWJ1ZiA9IGNvbnZlcnRfc3JjX2dldChjdnQpOwo+IC0JeXV5diA9IGJ1ZjsKPiAt Cj4gLQlmb3IgKGkgPSAwOyBpIDwgY3Z0LT5kc3QuZmItPmhlaWdodDsgaSsrKSB7Cj4gLQkJZm9y IChqID0gMDsgaiA8IGN2dC0+ZHN0LmZiLT53aWR0aCAvIDI7IGorKykgewo+IC0JCQkvKiBDb252 ZXJ0IDJ4MSBwaXhlbCBibG9ja3MgKi8KPiAtCQkJc3RydWN0IGlndF92ZWM0IHl1dlsyXTsKPiAt CQkJc3RydWN0IGlndF92ZWM0IHJnYlsyXTsKPiAtCj4gLQkJCXl1dlswXS5kWzBdID0geXV5dltq ICogNCArIHN3elswXV07Cj4gLQkJCXl1dlsxXS5kWzBdID0geXV5dltqICogNCArIHN3elsyXV07 Cj4gLQkJCXl1dlswXS5kWzFdID0geXV2WzFdLmRbMV0gPSB5dXl2W2ogKiA0ICsgc3d6WzFdXTsK PiAtCQkJeXV2WzBdLmRbMl0gPSB5dXZbMV0uZFsyXSA9IHl1eXZbaiAqIDQgKyBzd3pbM11dOwo+ IC0JCQl5dXZbMF0uZFszXSA9IHl1dlsxXS5kWzNdID0gMS4wZjsKPiAtCj4gLQkJCXJnYlswXSA9 IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAmeXV2WzBdKTsKPiAtCQkJcmdiWzFdID0gaWd0X21h dHJpeF90cmFuc2Zvcm0oJm0sICZ5dXZbMV0pOwo+IC0KPiAtCQkJd3JpdGVfcmdiKCZyZ2IyNFtq ICogOCArIDBdLCAmcmdiWzBdKTsKPiAtCQkJd3JpdGVfcmdiKCZyZ2IyNFtqICogOCArIDRdLCAm cmdiWzFdKTsKPiAtCQl9Cj4gLQo+IC0JCWlmIChjdnQtPmRzdC5mYi0+d2lkdGggJiAxKSB7Cj4g LQkJCXN0cnVjdCBpZ3RfdmVjNCB5dXY7Cj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCByZ2I7Cj4gLQo+ IC0JCQl5dXYuZFswXSA9IHl1eXZbaiAqIDQgKyBzd3pbMF1dOwo+IC0JCQl5dXYuZFsxXSA9IHl1 eXZbaiAqIDQgKyBzd3pbMV1dOwo+IC0JCQl5dXYuZFsyXSA9IHl1eXZbaiAqIDQgKyBzd3pbM11d Owo+IC0JCQl5dXYuZFszXSA9IDEuMGY7Cj4gLQo+IC0JCQlyZ2IgPSBpZ3RfbWF0cml4X3RyYW5z Zm9ybSgmbSwgJnl1dik7Cj4gLQo+IC0JCQl3cml0ZV9yZ2IoJnJnYjI0W2ogKiA4ICsgMF0sICZy Z2IpOwo+ICsJCQl1X3RtcCArPSBwYXJhbXMudXZfaW5jOwo+ICsJCQl2X3RtcCArPSBwYXJhbXMu dXZfaW5jOwo+ICAJCX0KPiAgCj4gIAkJcmdiMjQgKz0gcmdiMjRfc3RyaWRlOwo+IC0JCXl1eXYg Kz0geXV5dl9zdHJpZGU7Cj4gLQl9Cj4gLQo+IC0JY29udmVydF9zcmNfcHV0KGN2dCwgYnVmKTsK PiAtfQo+IC0KPiAtc3RhdGljIHZvaWQgY29udmVydF9yZ2IyNF90b195dXl2KHN0cnVjdCBmYl9j b252ZXJ0ICpjdnQpCj4gLXsKPiAtCWludCBpLCBqOwo+IC0JdWludDhfdCAqeXV5diA9IGN2dC0+ ZHN0LnB0cjsKPiAtCWNvbnN0IHVpbnQ4X3QgKnJnYjI0ID0gY3Z0LT5zcmMucHRyOwo+IC0JdW5z aWduZWQgcmdiMjRfc3RyaWRlID0gY3Z0LT5zcmMuZmItPnN0cmlkZXNbMF07Cj4gLQl1bnNpZ25l ZCB5dXl2X3N0cmlkZSA9IGN2dC0+ZHN0LmZiLT5zdHJpZGVzWzBdOwo+IC0Jc3RydWN0IGlndF9t YXQ0IG0gPSBpZ3RfcmdiX3RvX3ljYmNyX21hdHJpeChjdnQtPmRzdC5mYi0+Y29sb3JfZW5jb2Rp bmcsCj4gLQkJCQkJCSAgICBjdnQtPmRzdC5mYi0+Y29sb3JfcmFuZ2UpOwo+IC0JY29uc3QgdW5z aWduZWQgY2hhciAqc3d6ID0geXV5dl9zd2l6emxlKGN2dC0+ZHN0LmZiLT5kcm1fZm9ybWF0KTsK PiAtCj4gLQlpZ3RfYXNzZXJ0KGN2dC0+c3JjLmZiLT5kcm1fZm9ybWF0ID09IERSTV9GT1JNQVRf WFJHQjg4ODggJiYKPiAtCQkgICAoY3Z0LT5kc3QuZmItPmRybV9mb3JtYXQgPT0gRFJNX0ZPUk1B VF9ZVVlWIHx8Cj4gLQkJICAgIGN2dC0+ZHN0LmZiLT5kcm1fZm9ybWF0ID09IERSTV9GT1JNQVRf VVlWWSB8fAo+IC0JCSAgICBjdnQtPmRzdC5mYi0+ZHJtX2Zvcm1hdCA9PSBEUk1fRk9STUFUX1lW WVUgfHwKPiAtCQkgICAgY3Z0LT5kc3QuZmItPmRybV9mb3JtYXQgPT0gRFJNX0ZPUk1BVF9WWVVZ KSk7Cj4gLQo+IC0JZm9yIChpID0gMDsgaSA8IGN2dC0+ZHN0LmZiLT5oZWlnaHQ7IGkrKykgewo+ IC0JCWZvciAoaiA9IDA7IGogPCBjdnQtPmRzdC5mYi0+d2lkdGggLyAyOyBqKyspIHsKPiAtCQkJ LyogQ29udmVydCAyeDEgcGl4ZWwgYmxvY2tzICovCj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCByZ2Jb Ml07Cj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCB5dXZbMl07Cj4gLQo+IC0JCQlyZWFkX3JnYigmcmdi WzBdLCAmcmdiMjRbaiAqIDggKyAwXSk7Cj4gLQkJCXJlYWRfcmdiKCZyZ2JbMV0sICZyZ2IyNFtq ICogOCArIDRdKTsKPiAtCj4gLQkJCXl1dlswXSA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAm cmdiWzBdKTsKPiAtCQkJeXV2WzFdID0gaWd0X21hdHJpeF90cmFuc2Zvcm0oJm0sICZyZ2JbMV0p Owo+ICsJCXkgKz0gcGFyYW1zLnlfc3RyaWRlOwo+ICAKPiAtCQkJeXV5dltqICogNCArIHN3elsw XV0gPSB5dXZbMF0uZFswXTsKPiAtCQkJeXV5dltqICogNCArIHN3elsyXV0gPSB5dXZbMV0uZFsw XTsKPiAtCQkJeXV5dltqICogNCArIHN3elsxXV0gPSAoeXV2WzBdLmRbMV0gKyB5dXZbMV0uZFsx XSkgLyAyLjBmOwo+IC0JCQl5dXl2W2ogKiA0ICsgc3d6WzNdXSA9ICh5dXZbMF0uZFsyXSArIHl1 dlsxXS5kWzJdKSAvIDIuMGY7Cj4gKwkJaWYgKChpICUgZHN0X2ZtdC0+dnN1YikgPT0gKGRzdF9m bXQtPnZzdWIgLSAxKSkgewo+ICsJCQl1ICs9IHBhcmFtcy51dl9zdHJpZGU7Cj4gKwkJCXYgKz0g cGFyYW1zLnV2X3N0cmlkZTsKPiAgCQl9Cj4gLQo+IC0JCWlmIChjdnQtPmRzdC5mYi0+d2lkdGgg JiAxKSB7Cj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCByZ2I7Cj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCB5 dXY7Cj4gLQo+IC0JCQlyZWFkX3JnYigmcmdiLCAmcmdiMjRbaiAqIDggKyAwXSk7Cj4gLQo+IC0J CQl5dXYgPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnJnYik7Cj4gLQo+IC0JCQl5dXl2W2og KiA0ICsgc3d6WzBdXSA9IHl1di5kWzBdOwo+IC0JCQl5dXl2W2ogKiA0ICsgc3d6WzFdXSA9IHl1 di5kWzFdOwo+IC0JCQl5dXl2W2ogKiA0ICsgc3d6WzNdXSA9IHl1di5kWzJdOwo+IC0JCX0KPiAt Cj4gLQkJcmdiMjQgKz0gcmdiMjRfc3RyaWRlOwo+IC0JCXl1eXYgKz0geXV5dl9zdHJpZGU7Cj4g IAl9Cj4gIH0KPiAgCj4gQEAgLTIwNDYsMzEgKzE4NTksMjMgQEAgc3RhdGljIHZvaWQgZmJfY29u dmVydChzdHJ1Y3QgZmJfY29udmVydCAqY3Z0KQo+ICAJfSBlbHNlIGlmIChjdnQtPmRzdC5mYi0+ ZHJtX2Zvcm1hdCA9PSBEUk1fRk9STUFUX1hSR0I4ODg4KSB7Cj4gIAkJc3dpdGNoIChjdnQtPnNy Yy5mYi0+ZHJtX2Zvcm1hdCkgewo+ICAJCWNhc2UgRFJNX0ZPUk1BVF9YWVVWODg4ODoKPiAtCQkJ Y29udmVydF95dXY0NDRfdG9fcmdiMjQoY3Z0KTsKPiAtCQkJcmV0dXJuOwo+ICAJCWNhc2UgRFJN X0ZPUk1BVF9OVjEyOgo+IC0JCQljb252ZXJ0X252MTJfdG9fcmdiMjQoY3Z0KTsKPiAtCQkJcmV0 dXJuOwo+IC0JCWNhc2UgRFJNX0ZPUk1BVF9ZVVlWOgo+IC0JCWNhc2UgRFJNX0ZPUk1BVF9ZVllV Ogo+ICAJCWNhc2UgRFJNX0ZPUk1BVF9VWVZZOgo+ICAJCWNhc2UgRFJNX0ZPUk1BVF9WWVVZOgo+ IC0JCQljb252ZXJ0X3l1eXZfdG9fcmdiMjQoY3Z0KTsKPiArCQljYXNlIERSTV9GT1JNQVRfWVVZ VjoKPiArCQljYXNlIERSTV9GT1JNQVRfWVZZVToKPiArCQkJY29udmVydF95dXZfdG9fcmdiMjQo Y3Z0KTsKPiAgCQkJcmV0dXJuOwo+ICAJCX0KPiAgCX0gZWxzZSBpZiAoY3Z0LT5zcmMuZmItPmRy bV9mb3JtYXQgPT0gRFJNX0ZPUk1BVF9YUkdCODg4OCkgewo+ICAJCXN3aXRjaCAoY3Z0LT5kc3Qu ZmItPmRybV9mb3JtYXQpIHsKPiAgCQljYXNlIERSTV9GT1JNQVRfWFlVVjg4ODg6Cj4gLQkJCWNv bnZlcnRfcmdiMjRfdG9feXV2NDQ0KGN2dCk7Cj4gLQkJCXJldHVybjsKPiAgCQljYXNlIERSTV9G T1JNQVRfTlYxMjoKPiAtCQkJY29udmVydF9yZ2IyNF90b19udjEyKGN2dCk7Cj4gLQkJCXJldHVy bjsKPiAgCQljYXNlIERSTV9GT1JNQVRfWVVZVjoKPiAgCQljYXNlIERSTV9GT1JNQVRfWVZZVToK PiAgCQljYXNlIERSTV9GT1JNQVRfVVlWWToKPiAgCQljYXNlIERSTV9GT1JNQVRfVllVWToKPiAt CQkJY29udmVydF9yZ2IyNF90b195dXl2KGN2dCk7Cj4gKwkJCWNvbnZlcnRfcmdiMjRfdG9feXV2 KGN2dCk7Cj4gIAkJCXJldHVybjsKPiAgCQl9Cj4gIAl9Cj4gLS0gCj4gMi4yMC4xCgotLSAKVmls bGUgU3lyasOkbMOkCkludGVsCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fCmlndC1kZXYgbWFpbGluZyBsaXN0CmlndC1kZXZAbGlzdHMuZnJlZWRlc2t0b3Au b3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaWd0LWRl dgo=