From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-qt1-f194.google.com (mail-qt1-f194.google.com [209.85.160.194]) by gabe.freedesktop.org (Postfix) with ESMTPS id B2F516E245 for ; Tue, 29 Jan 2019 19:42:14 +0000 (UTC) Received: by mail-qt1-f194.google.com with SMTP id p17so23649764qtl.5 for ; Tue, 29 Jan 2019 11:42:14 -0800 (PST) Message-ID: <35080c7cbaabb5bc5fcae0e1c07ae1a850efec91.camel@redhat.com> From: Lyude Paul Date: Tue, 29 Jan 2019 14:42:11 -0500 In-Reply-To: <20190125145842.15738-4-maxime.ripard@bootlin.com> References: <20190125145842.15738-1-maxime.ripard@bootlin.com> <20190125145842.15738-4-maxime.ripard@bootlin.com> Mime-Version: 1.0 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 , igt-dev@lists.freedesktop.org Cc: Petri Latvala , Thomas Petazzoni , eben@raspberrypi.org List-ID: QWNrZWQtYnk6IEx5dWRlIFBhdWwgPGx5dWRlQHJlZGhhdC5jb20+CgpPbiBGcmksIDIwMTktMDEt MjUgYXQgMTU6NTggKzAxMDAsIE1heGltZSBSaXBhcmQgd3JvdGU6Cj4gVGhlIGN1cnJlbnQgd2F5 IHdlIHdvcmsgd2hlbiB3ZSB3YW50IHRvIHN1cHBvcnQgYSBuZXcgWVVWIGZvcm1hdCB0byBJR1Qs IHdlCj4gYWxzbyBuZWVkIHRvIGFkZCBuZXcgZnVuY3Rpb24gdG8gY29udmVydCB0byBhbmQgZnJv bSBYUkdCODg4OC4KPiAKPiBUaGlzIGRvZXNuJ3QgcmVhbGx5IHNjYWxlIGhvd2V2ZXIsIGFuZCBj cmVhdGVzIGEgbG90IG9mIGNvZGUgdG8gbWFpbnRhaW4uCj4gSW4gb3JkZXIgdG8gd29yayBhcm91 bmQgdGhpcywgY3JlYXRlIGEgZ2VuZXJpYyBmdW5jdGlvbiB0byBjb252ZXJ0IHRvIFJHQgo+IGFu ZCBvbmUgdG8gY29udmVydCBmcm9tIFJHQi4KPiAKPiBUaGUgb25seSB0aGluZyB0aGF0IGlzIG5l ZWRlZCBub3cgaXMgdG8gYWRkIG5ldyBwYXJhbWV0ZXJzLCBhbmQgdGhhdCdzIGl0Lgo+IAo+IFJl dmlld2VkLWJ5OiBQYXVsIEtvY2lhbGtvd3NraSA8cGF1bC5rb2NpYWxrb3dza2lAYm9vdGxpbi5j b20+Cj4gU2lnbmVkLW9mZi1ieTogTWF4aW1lIFJpcGFyZCA8bWF4aW1lLnJpcGFyZEBib290bGlu LmNvbT4KPiAtLS0KPiAgbGliL2lndF9mYi5jIHwgNTM3ICsrKysrKysrKysrKysrKystLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+ICAxIGZpbGUgY2hhbmdlZCwgMTcxIGluc2Vy dGlvbnMoKyksIDM2NiBkZWxldGlvbnMoLSkKPiAKPiBkaWZmIC0tZ2l0IGEvbGliL2lndF9mYi5j IGIvbGliL2lndF9mYi5jCj4gaW5kZXggMWE1YzMzOGVhNTMyLi40NTY5MWZkNDQxZDkgMTAwNjQ0 Cj4gLS0tIGEvbGliL2lndF9mYi5jCj4gKysrIGIvbGliL2lndF9mYi5jCj4gQEAgLTE1NzcsNDI0 ICsxNTc3LDIzNyBAQCBzdGF0aWMgdm9pZCBjb252ZXJ0X3NyY19wdXQoY29uc3Qgc3RydWN0Cj4g ZmJfY29udmVydCAqY3Z0LAo+ICAJCWZyZWUoc3JjX2J1Zik7Cj4gIH0KPiAgCj4gLXN0YXRpYyB2 b2lkIGNvbnZlcnRfbnYxMl90b19yZ2IyNChzdHJ1Y3QgZmJfY29udmVydCAqY3Z0KQo+ICtzdHJ1 Y3QgeXV2X3BhcmFtZXRlcnMgewo+ICsJdW5zaWduZWQJeV9pbmM7Cj4gKwl1bnNpZ25lZAl1dl9p bmM7Cj4gKwl1bnNpZ25lZAl5X3N0cmlkZTsKPiArCXVuc2lnbmVkCXV2X3N0cmlkZTsKPiArCXVu c2lnbmVkCXlfb2Zmc2V0Owo+ICsJdW5zaWduZWQJdV9vZmZzZXQ7Cj4gKwl1bnNpZ25lZAl2X29m ZnNldDsKPiArfTsKPiArCj4gK3N0YXRpYyB2b2lkIGdldF95dXZfcGFyYW1ldGVycyhzdHJ1Y3Qg aWd0X2ZiICpmYiwgc3RydWN0IHl1dl9wYXJhbWV0ZXJzCj4gKnBhcmFtcykKPiAgewo+IC0JaW50 IGksIGo7Cj4gLQljb25zdCB1aW50OF90ICp5LCAqdXY7Cj4gLQl1aW50OF90ICpyZ2IyNCA9IGN2 dC0+ZHN0LnB0cjsKPiAtCXVuc2lnbmVkIGludCByZ2IyNF9zdHJpZGUgPSBjdnQtPmRzdC5mYi0+ c3RyaWRlc1swXTsKPiAtCXVuc2lnbmVkIGludCBwbGFuYXJfc3RyaWRlID0gY3Z0LT5zcmMuZmIt PnN0cmlkZXNbMF07Cj4gLQlzdHJ1Y3QgaWd0X21hdDQgbSA9IGlndF95Y2Jjcl90b19yZ2JfbWF0 cml4KGN2dC0+c3JjLmZiLQo+ID5jb2xvcl9lbmNvZGluZywKPiAtCQkJCQkJICAgIGN2dC0+c3Jj LmZiLT5jb2xvcl9yYW5nZSk7Cj4gLQl1aW50OF90ICpidWY7Cj4gLQo+IC0JaWd0X2Fzc2VydChj dnQtPnNyYy5mYi0+ZHJtX2Zvcm1hdCA9PSBEUk1fRk9STUFUX05WMTIgJiYKPiAtCQkgICBjdnQt PmRzdC5mYi0+ZHJtX2Zvcm1hdCA9PSBEUk1fRk9STUFUX1hSR0I4ODg4KTsKPiAtCj4gLQlidWYg PSBjb252ZXJ0X3NyY19nZXQoY3Z0KTsKPiAtCXkgPSBidWYgKyBjdnQtPnNyYy5mYi0+b2Zmc2V0 c1swXTsKPiAtCXV2ID0gYnVmICsgY3Z0LT5zcmMuZmItPm9mZnNldHNbMV07Cj4gLQo+IC0JZm9y IChpID0gMDsgaSA8IGN2dC0+ZHN0LmZiLT5oZWlnaHQgLyAyOyBpKyspIHsKPiAtCQlmb3IgKGog PSAwOyBqIDwgY3Z0LT5kc3QuZmItPndpZHRoIC8gMjsgaisrKSB7Cj4gLQkJCS8qIENvbnZlcnQg MngyIHBpeGVsIGJsb2NrcyAqLwo+IC0JCQlzdHJ1Y3QgaWd0X3ZlYzQgeXV2WzRdOwo+IC0JCQlz dHJ1Y3QgaWd0X3ZlYzQgcmdiWzRdOwo+IC0KPiAtCQkJeXV2WzBdLmRbMF0gPSB5W2ogKiAyICsg MF07Cj4gLQkJCXl1dlsxXS5kWzBdID0geVtqICogMiArIDFdOwo+IC0JCQl5dXZbMl0uZFswXSA9 IHlbaiAqIDIgKyAwICsgcGxhbmFyX3N0cmlkZV07Cj4gLQkJCXl1dlszXS5kWzBdID0geVtqICog MiArIDEgKyBwbGFuYXJfc3RyaWRlXTsKPiAtCj4gLQkJCXl1dlswXS5kWzFdID0geXV2WzFdLmRb MV0gPSB5dXZbMl0uZFsxXSA9IHl1dlszXS5kWzFdCj4gPSB1dltqICogMiArIDBdOwo+IC0JCQl5 dXZbMF0uZFsyXSA9IHl1dlsxXS5kWzJdID0geXV2WzJdLmRbMl0gPSB5dXZbM10uZFsyXQo+ID0g dXZbaiAqIDIgKyAxXTsKPiAtCQkJeXV2WzBdLmRbM10gPSB5dXZbMV0uZFszXSA9IHl1dlsyXS5k WzNdID0geXV2WzNdLmRbM10KPiA9IDEuMGY7Cj4gLQo+IC0JCQlyZ2JbMF0gPSBpZ3RfbWF0cml4 X3RyYW5zZm9ybSgmbSwgJnl1dlswXSk7Cj4gLQkJCXJnYlsxXSA9IGlndF9tYXRyaXhfdHJhbnNm b3JtKCZtLCAmeXV2WzFdKTsKPiAtCQkJcmdiWzJdID0gaWd0X21hdHJpeF90cmFuc2Zvcm0oJm0s ICZ5dXZbMl0pOwo+IC0JCQlyZ2JbM10gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnl1dlsz XSk7Cj4gLQo+IC0JCQl3cml0ZV9yZ2IoJnJnYjI0W2ogKiA4ICsgMF0sICZyZ2JbMF0pOwo+IC0J CQl3cml0ZV9yZ2IoJnJnYjI0W2ogKiA4ICsgNF0sICZyZ2JbMV0pOwo+IC0JCQl3cml0ZV9yZ2Io JnJnYjI0W2ogKiA4ICsgMCArIHJnYjI0X3N0cmlkZV0sICZyZ2JbMl0pOwo+IC0JCQl3cml0ZV9y Z2IoJnJnYjI0W2ogKiA4ICsgNCArIHJnYjI0X3N0cmlkZV0sICZyZ2JbM10pOwo+IC0JCX0KPiAt Cj4gLQkJaWYgKGN2dC0+ZHN0LmZiLT53aWR0aCAmIDEpIHsKPiAtCQkJLyogQ29udmVydCAxeDIg cGl4ZWwgYmxvY2sgKi8KPiAtCQkJc3RydWN0IGlndF92ZWM0IHl1dlsyXTsKPiAtCQkJc3RydWN0 IGlndF92ZWM0IHJnYlsyXTsKPiAtCj4gLQkJCXl1dlswXS5kWzBdID0geVtqICogMiArIDBdOwo+ IC0JCQl5dXZbMV0uZFswXSA9IHlbaiAqIDIgKyAwICsgcGxhbmFyX3N0cmlkZV07Cj4gKwlpZ3Rf YXNzZXJ0KGlndF9mb3JtYXRfaXNfeXV2KGZiLT5kcm1fZm9ybWF0KSk7Cj4gIAo+IC0JCQl5dXZb MF0uZFsxXSA9IHl1dlsxXS5kWzFdID0gdXZbaiAqIDIgKyAwXTsKPiAtCQkJeXV2WzBdLmRbMl0g PSB5dXZbMV0uZFsyXSA9IHV2W2ogKiAyICsgMV07Cj4gLQkJCXl1dlswXS5kWzNdID0geXV2WzFd LmRbM10gPSAxLjBmOwo+ICsJc3dpdGNoIChmYi0+ZHJtX2Zvcm1hdCkgewo+ICsJY2FzZSBEUk1f Rk9STUFUX05WMTI6Cj4gKwkJcGFyYW1zLT55X2luYyA9IDE7Cj4gKwkJcGFyYW1zLT51dl9pbmMg PSAyOwo+ICsJCWJyZWFrOwo+ICAKPiAtCQkJcmdiWzBdID0gaWd0X21hdHJpeF90cmFuc2Zvcm0o Jm0sICZ5dXZbMF0pOwo+IC0JCQlyZ2JbMV0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnl1 dlsxXSk7Cj4gLQo+IC0JCQl3cml0ZV9yZ2IoJnJnYjI0W2ogKiA4ICsgMF0sICZyZ2JbMF0pOwo+ IC0JCQl3cml0ZV9yZ2IoJnJnYjI0W2ogKiA4ICsgMCArIHJnYjI0X3N0cmlkZV0sICZyZ2JbMV0p Owo+IC0JCX0KPiAtCj4gLQkJcmdiMjQgKz0gMiAqIHJnYjI0X3N0cmlkZTsKPiAtCQl5ICs9IDIg KiBwbGFuYXJfc3RyaWRlOwo+IC0JCXV2ICs9IHBsYW5hcl9zdHJpZGU7Cj4gKwljYXNlIERSTV9G T1JNQVRfWVVZVjoKPiArCWNhc2UgRFJNX0ZPUk1BVF9ZVllVOgo+ICsJY2FzZSBEUk1fRk9STUFU X1VZVlk6Cj4gKwljYXNlIERSTV9GT1JNQVRfVllVWToKPiArCQlwYXJhbXMtPnlfaW5jID0gMjsK PiArCQlwYXJhbXMtPnV2X2luYyA9IDQ7Cj4gKwkJYnJlYWs7Cj4gKwo+ICsJY2FzZSBEUk1fRk9S TUFUX1hZVVY4ODg4Ogo+ICsJCXBhcmFtcy0+eV9pbmMgPSA0Owo+ICsJCXBhcmFtcy0+dXZfaW5j ID0gNDsKPiArCQlicmVhazsKPiAgCX0KPiAgCj4gLQlpZiAoY3Z0LT5kc3QuZmItPmhlaWdodCAm IDEpIHsKPiAtCQkvKiBDb252ZXJ0IGxhc3Qgcm93ICovCj4gLQkJZm9yIChqID0gMDsgaiA8IGN2 dC0+ZHN0LmZiLT53aWR0aCAvIDI7IGorKykgewo+IC0JCQkvKiBDb252ZXJ0IDJ4MSBwaXhlbCBi bG9ja3MgKi8KPiAtCQkJc3RydWN0IGlndF92ZWM0IHl1dlsyXTsKPiAtCQkJc3RydWN0IGlndF92 ZWM0IHJnYlsyXTsKPiAtCj4gLQkJCXl1dlswXS5kWzBdID0geVtqICogMiArIDBdOwo+IC0JCQl5 dXZbMV0uZFswXSA9IHlbaiAqIDIgKyAxXTsKPiAtCQkJeXV2WzBdLmRbMV0gPSB5dXZbMV0uZFsx XSA9IHV2W2ogKiAyICsgMF07Cj4gLQkJCXl1dlswXS5kWzJdID0geXV2WzFdLmRbMl0gPSB1dltq ICogMiArIDFdOwo+IC0JCQl5dXZbMF0uZFszXSA9IHl1dlsxXS5kWzNdID0gMS4wZjsKPiArCXN3 aXRjaCAoZmItPmRybV9mb3JtYXQpIHsKPiArCWNhc2UgRFJNX0ZPUk1BVF9OVjEyOgo+ICsJCXBh cmFtcy0+eV9zdHJpZGUgPSBmYi0+c3RyaWRlc1swXTsKPiArCQlwYXJhbXMtPnV2X3N0cmlkZSA9 IGZiLT5zdHJpZGVzWzFdOwo+ICsJCWJyZWFrOwo+ICAKPiAtCQkJcmdiWzBdID0gaWd0X21hdHJp eF90cmFuc2Zvcm0oJm0sICZ5dXZbMF0pOwo+IC0JCQlyZ2JbMV0gPSBpZ3RfbWF0cml4X3RyYW5z Zm9ybSgmbSwgJnl1dlsxXSk7Cj4gKwljYXNlIERSTV9GT1JNQVRfWVVZVjoKPiArCWNhc2UgRFJN X0ZPUk1BVF9ZVllVOgo+ICsJY2FzZSBEUk1fRk9STUFUX1VZVlk6Cj4gKwljYXNlIERSTV9GT1JN QVRfVllVWToKPiArCWNhc2UgRFJNX0ZPUk1BVF9YWVVWODg4ODoKPiArCQlwYXJhbXMtPnlfc3Ry aWRlID0gZmItPnN0cmlkZXNbMF07Cj4gKwkJcGFyYW1zLT51dl9zdHJpZGUgPSBmYi0+c3RyaWRl c1swXTsKPiArCQlicmVhazsKPiArCX0KPiAgCj4gLQkJCXdyaXRlX3JnYigmcmdiMjRbaiAqIDgg KyAwXSwgJnJnYlswXSk7Cj4gLQkJCXdyaXRlX3JnYigmcmdiMjRbaiAqIDggKyA0XSwgJnJnYlsw XSk7Cj4gLQkJfQo+ICsJc3dpdGNoIChmYi0+ZHJtX2Zvcm1hdCkgewo+ICsJY2FzZSBEUk1fRk9S TUFUX05WMTI6Cj4gKwkJcGFyYW1zLT55X29mZnNldCA9IGZiLT5vZmZzZXRzWzBdOwo+ICsJCXBh cmFtcy0+dV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1sxXTsKPiArCQlwYXJhbXMtPnZfb2Zmc2V0ID0g ZmItPm9mZnNldHNbMV0gKyAxOwo+ICsJCWJyZWFrOwo+ICAKPiAtCQlpZiAoY3Z0LT5kc3QuZmIt PndpZHRoICYgMSkgewo+IC0JCQkvKiBDb252ZXJ0IHNpbmdsZSBwaXhlbCAqLwo+IC0JCQlzdHJ1 Y3QgaWd0X3ZlYzQgeXV2Owo+IC0JCQlzdHJ1Y3QgaWd0X3ZlYzQgcmdiOwo+ICsJY2FzZSBEUk1f Rk9STUFUX1lVWVY6Cj4gKwkJcGFyYW1zLT55X29mZnNldCA9IGZiLT5vZmZzZXRzWzBdOwo+ICsJ CXBhcmFtcy0+dV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDE7Cj4gKwkJcGFyYW1zLT52X29m ZnNldCA9IGZiLT5vZmZzZXRzWzBdICsgMzsKPiArCQlicmVhazsKPiAgCj4gLQkJCXl1di5kWzBd ID0geVtqICogMiArIDBdOwo+IC0JCQl5dXYuZFsxXSA9IHV2W2ogKiAyICsgMF07Cj4gLQkJCXl1 di5kWzJdID0gdXZbaiAqIDIgKyAxXTsKPiAtCQkJeXV2LmRbM10gPSAxLjBmOwo+ICsJY2FzZSBE Uk1fRk9STUFUX1lWWVU6Cj4gKwkJcGFyYW1zLT55X29mZnNldCA9IGZiLT5vZmZzZXRzWzBdOwo+ ICsJCXBhcmFtcy0+dV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDM7Cj4gKwkJcGFyYW1zLT52 X29mZnNldCA9IGZiLT5vZmZzZXRzWzBdICsgMTsKPiArCQlicmVhazsKPiAgCj4gLQkJCXJnYiA9 IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAmeXV2KTsKPiArCWNhc2UgRFJNX0ZPUk1BVF9VWVZZ Ogo+ICsJCXBhcmFtcy0+eV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDE7Cj4gKwkJcGFyYW1z LT51X29mZnNldCA9IGZiLT5vZmZzZXRzWzBdOwo+ICsJCXBhcmFtcy0+dl9vZmZzZXQgPSBmYi0+ b2Zmc2V0c1swXSArIDI7Cj4gKwkJYnJlYWs7Cj4gIAo+IC0JCQl3cml0ZV9yZ2IoJnJnYjI0W2og KiA4ICsgMF0sICZyZ2IpOwo+IC0JCX0KPiArCWNhc2UgRFJNX0ZPUk1BVF9WWVVZOgo+ICsJCXBh cmFtcy0+eV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDE7Cj4gKwkJcGFyYW1zLT51X29mZnNl dCA9IGZiLT5vZmZzZXRzWzBdICsgMjsKPiArCQlwYXJhbXMtPnZfb2Zmc2V0ID0gZmItPm9mZnNl dHNbMF07Cj4gKwkJYnJlYWs7Cj4gKwo+ICsJY2FzZSBEUk1fRk9STUFUX1hZVVY4ODg4Ogo+ICsJ CXBhcmFtcy0+eV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDE7Cj4gKwkJcGFyYW1zLT51X29m ZnNldCA9IGZiLT5vZmZzZXRzWzBdICsgMjsKPiArCQlwYXJhbXMtPnZfb2Zmc2V0ID0gZmItPm9m ZnNldHNbMF0gKyAzOwo+ICsJCWJyZWFrOwo+ICAJfQo+IC0KPiAtCWNvbnZlcnRfc3JjX3B1dChj dnQsIGJ1Zik7Cj4gIH0KPiAgCj4gLXN0YXRpYyB2b2lkIGNvbnZlcnRfeXV2NDQ0X3RvX3JnYjI0 KHN0cnVjdCBmYl9jb252ZXJ0ICpjdnQpCj4gK3N0YXRpYyB2b2lkIGNvbnZlcnRfeXV2X3RvX3Jn YjI0KHN0cnVjdCBmYl9jb252ZXJ0ICpjdnQpCj4gIHsKPiArCWNvbnN0IHN0cnVjdCBmb3JtYXRf ZGVzY19zdHJ1Y3QgKnNyY19mbXQgPQo+ICsJCWxvb2t1cF9kcm1fZm9ybWF0KGN2dC0+c3JjLmZi LT5kcm1fZm9ybWF0KTsKPiAgCWludCBpLCBqOwo+IC0JdWludDhfdCAqeXV2MjQ7Cj4gKwl1aW50 OF90IGJwcCA9IDQ7Cj4gKwl1aW50OF90ICp5LCAqdSwgKnY7Cj4gIAl1aW50OF90ICpyZ2IyNCA9 IGN2dC0+ZHN0LnB0cjsKPiAtCXVuc2lnbmVkIHJnYjI0X3N0cmlkZSA9IGN2dC0+ZHN0LmZiLT5z dHJpZGVzWzBdLCB4eXV2X3N0cmlkZSA9IGN2dC0KPiA+c3JjLmZiLT5zdHJpZGVzWzBdOwo+IC0J dWludDhfdCAqYnVmID0gbWFsbG9jKGN2dC0+c3JjLmZiLT5zaXplKTsKPiArCXVuc2lnbmVkIGlu dCByZ2IyNF9zdHJpZGUgPSBjdnQtPmRzdC5mYi0+c3RyaWRlc1swXTsKPiAgCXN0cnVjdCBpZ3Rf bWF0NCBtID0gaWd0X3ljYmNyX3RvX3JnYl9tYXRyaXgoY3Z0LT5zcmMuZmItCj4gPmNvbG9yX2Vu Y29kaW5nLAo+ICAJCQkJCQkgICAgY3Z0LT5zcmMuZmItPmNvbG9yX3JhbmdlKTsKPiArCXVpbnQ4 X3QgKmJ1ZjsKPiArCXN0cnVjdCB5dXZfcGFyYW1ldGVycyBwYXJhbXMgPSB7IH07Cj4gIAo+IC0J LyoKPiAtCSAqIFJlYWRpbmcgZnJvbSB0aGUgQk8gaXMgYXdmdWxseSBzbG93IGJlY2F1c2Ugb2Yg bGFjayBvZiByZWFkCj4gY2FjaGluZywKPiAtCSAqIGl0J3MgZmFzdGVyIHRvIGNvcHkgdGhlIHdo b2xlIEJPIHRvIGEgdGVtcG9yYXJ5IGJ1ZmZlciBhbmQgY29udmVydAo+IC0JICogZnJvbSB0aGVy ZS4KPiAtCSAqLwo+IC0JaWd0X21lbWNweV9mcm9tX3djKGJ1ZiwgY3Z0LT5zcmMucHRyICsgY3Z0 LT5zcmMuZmItPm9mZnNldHNbMF0sIGN2dC0KPiA+c3JjLmZiLT5zaXplKTsKPiAtCXl1djI0ID0g YnVmOwo+ICsJaWd0X2Fzc2VydChjdnQtPmRzdC5mYi0+ZHJtX2Zvcm1hdCA9PSBEUk1fRk9STUFU X1hSR0I4ODg4ICYmCj4gKwkJICAgaWd0X2Zvcm1hdF9pc195dXYoY3Z0LT5zcmMuZmItPmRybV9m b3JtYXQpKTsKPiArCj4gKwlidWYgPSBjb252ZXJ0X3NyY19nZXQoY3Z0KTsKPiArCWdldF95dXZf cGFyYW1ldGVycyhjdnQtPnNyYy5mYiwgJnBhcmFtcyk7Cj4gKwl5ID0gYnVmICsgcGFyYW1zLnlf b2Zmc2V0Owo+ICsJdSA9IGJ1ZiArIHBhcmFtcy51X29mZnNldDsKPiArCXYgPSBidWYgKyBwYXJh bXMudl9vZmZzZXQ7Cj4gIAo+ICAJZm9yIChpID0gMDsgaSA8IGN2dC0+ZHN0LmZiLT5oZWlnaHQ7 IGkrKykgewo+ICsJCWNvbnN0IHVpbnQ4X3QgKnlfdG1wID0geTsKPiArCQljb25zdCB1aW50OF90 ICp1X3RtcCA9IHU7Cj4gKwkJY29uc3QgdWludDhfdCAqdl90bXAgPSB2Owo+ICsJCXVpbnQ4X3Qg KnJnYl90bXAgPSByZ2IyNDsKPiArCj4gIAkJZm9yIChqID0gMDsgaiA8IGN2dC0+ZHN0LmZiLT53 aWR0aDsgaisrKSB7Cj4gLQkJCWZsb2F0IHksIHUsIHY7Cj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCB5 dXY7Cj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCByZ2I7Cj4gLQo+IC0JCQl2ID0geXV2MjRbaSAqIHh5 dXZfc3RyaWRlICsgaiAqIDRdOwo+IC0JCQl1ID0geXV2MjRbaSAqIHh5dXZfc3RyaWRlICsgaiAq IDQgKyAxXTsKPiAtCQkJeSA9IHl1djI0W2kgKiB4eXV2X3N0cmlkZSArIGogKiA0ICsgMl07Cj4g LQkJCXl1di5kWzBdID0geTsKPiAtCQkJeXV2LmRbMV0gPSB1Owo+IC0JCQl5dXYuZFsyXSA9IHY7 Cj4gKwkJCXN0cnVjdCBpZ3RfdmVjNCByZ2IsIHl1djsKPiArCj4gKwkJCXl1di5kWzBdID0gKnlf dG1wOwo+ICsJCQl5dXYuZFsxXSA9ICp1X3RtcDsKPiArCQkJeXV2LmRbMl0gPSAqdl90bXA7Cj4g IAkJCXl1di5kWzNdID0gMS4wZjsKPiAgCj4gIAkJCXJnYiA9IGlndF9tYXRyaXhfdHJhbnNmb3Jt KCZtLCAmeXV2KTsKPiArCQkJd3JpdGVfcmdiKHJnYl90bXAsICZyZ2IpOwo+ICAKPiAtCQkJd3Jp dGVfcmdiKCZyZ2IyNFtpICogcmdiMjRfc3RyaWRlICsgaiAqIDRdLCAmcmdiKTsKPiAtCQl9Cj4g LQl9Cj4gLQo+IC0JZnJlZShidWYpOwo+IC19Cj4gLQo+IC0KPiAtc3RhdGljIHZvaWQgY29udmVy dF9yZ2IyNF90b195dXY0NDQoc3RydWN0IGZiX2NvbnZlcnQgKmN2dCkKPiAtewo+IC0JaW50IGks IGo7Cj4gLQl1aW50OF90ICpyZ2IyNDsKPiAtCXVpbnQ4X3QgKnl1djQ0NCA9IGN2dC0+ZHN0LnB0 ciArIGN2dC0+ZHN0LmZiLT5vZmZzZXRzWzBdOwo+IC0JdW5zaWduZWQgaW50IHJnYjI0X3N0cmlk ZSA9IGN2dC0+c3JjLmZiLT5zdHJpZGVzWzBdLCB4eXV2X3N0cmlkZSA9Cj4gY3Z0LT5kc3QuZmIt PnN0cmlkZXNbMF07Cj4gLQlzdHJ1Y3QgaWd0X21hdDQgbSA9IGlndF9yZ2JfdG9feWNiY3JfbWF0 cml4KGN2dC0+ZHN0LmZiLQo+ID5jb2xvcl9lbmNvZGluZywKPiAtCQkJCQkJICAgIGN2dC0+ZHN0 LmZiLT5jb2xvcl9yYW5nZSk7Cj4gLQo+IC0JcmdiMjQgPSBjdnQtPnNyYy5wdHI7Cj4gKwkJCXJn Yl90bXAgKz0gYnBwOwo+ICsJCQl5X3RtcCArPSBwYXJhbXMueV9pbmM7Cj4gIAo+IC0JaWd0X2Fz c2VydF9mKGN2dC0+ZHN0LmZiLT5kcm1fZm9ybWF0ID09IERSTV9GT1JNQVRfWFlVVjg4ODgsCj4g LQkJICAgICAiQ29udmVyc2lvbiBub3QgaW1wbGVtZW50ZWQgZm9yICFYWVVWIHBhY2tlZCBmb3Jt YXRzXG4iKTsKPiAtCj4gLQlmb3IgKGkgPSAwOyBpIDwgY3Z0LT5kc3QuZmItPmhlaWdodDsgaSsr KSB7Cj4gLQkJZm9yIChqID0gMDsgaiA8IGN2dC0+ZHN0LmZiLT53aWR0aDsgaisrKSB7Cj4gLQkJ CXN0cnVjdCBpZ3RfdmVjNCByZ2I7Cj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCB5dXY7Cj4gLQo+IC0J CQlyZWFkX3JnYigmcmdiLCAmcmdiMjRbaSAqIHJnYjI0X3N0cmlkZSArIGogKiA0XSk7Cj4gKwkJ CWlmICgoc3JjX2ZtdC0+aHN1YiA9PSAxKSB8fCAoaiAlIHNyY19mbXQtPmhzdWIpKSB7Cj4gKwkJ CQl1X3RtcCArPSBwYXJhbXMudXZfaW5jOwo+ICsJCQkJdl90bXAgKz0gcGFyYW1zLnV2X2luYzsK PiArCQkJfQo+ICsJCX0KPiAgCj4gLQkJCXl1diA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAm cmdiKTsKPiArCQlyZ2IyNCArPSByZ2IyNF9zdHJpZGU7Cj4gKwkJeSArPSBwYXJhbXMueV9zdHJp ZGU7Cj4gIAo+IC0JCQl5dXY0NDRbaSAqIHh5dXZfc3RyaWRlICsgaiAqIDRdID0geXV2LmRbMl07 Cj4gLQkJCXl1djQ0NFtpICogeHl1dl9zdHJpZGUgKyBqICogNCArIDFdID0geXV2LmRbMV07Cj4g LQkJCXl1djQ0NFtpICogeHl1dl9zdHJpZGUgKyBqICogNCArIDJdID0geXV2LmRbMF07Cj4gKwkJ aWYgKChzcmNfZm10LT52c3ViID09IDEpIHx8IChpICUgc3JjX2ZtdC0+dnN1YikpIHsKPiArCQkJ dSArPSBwYXJhbXMudXZfc3RyaWRlOwo+ICsJCQl2ICs9IHBhcmFtcy51dl9zdHJpZGU7Cj4gIAkJ fQo+ICAJfQo+ICsKPiArCWNvbnZlcnRfc3JjX3B1dChjdnQsIGJ1Zik7Cj4gIH0KPiAgCj4gLXN0 YXRpYyB2b2lkIGNvbnZlcnRfcmdiMjRfdG9fbnYxMihzdHJ1Y3QgZmJfY29udmVydCAqY3Z0KQo+ ICtzdGF0aWMgdm9pZCBjb252ZXJ0X3JnYjI0X3RvX3l1dihzdHJ1Y3QgZmJfY29udmVydCAqY3Z0 KQo+ICB7Cj4gKwljb25zdCBzdHJ1Y3QgZm9ybWF0X2Rlc2Nfc3RydWN0ICpkc3RfZm10ID0KPiAr CQlsb29rdXBfZHJtX2Zvcm1hdChjdnQtPmRzdC5mYi0+ZHJtX2Zvcm1hdCk7Cj4gIAlpbnQgaSwg ajsKPiAtCXVpbnQ4X3QgKnkgPSBjdnQtPmRzdC5wdHIgKyBjdnQtPmRzdC5mYi0+b2Zmc2V0c1sw XTsKPiAtCXVpbnQ4X3QgKnV2ID0gY3Z0LT5kc3QucHRyICsgY3Z0LT5kc3QuZmItPm9mZnNldHNb MV07Cj4gKwl1aW50OF90ICp5LCAqdSwgKnY7Cj4gIAljb25zdCB1aW50OF90ICpyZ2IyNCA9IGN2 dC0+c3JjLnB0cjsKPiArCXVpbnQ4X3QgYnBwID0gNDsKPiAgCXVuc2lnbmVkIHJnYjI0X3N0cmlk ZSA9IGN2dC0+c3JjLmZiLT5zdHJpZGVzWzBdOwo+IC0JdW5zaWduZWQgcGxhbmFyX3N0cmlkZSA9 IGN2dC0+ZHN0LmZiLT5zdHJpZGVzWzBdOwo+ICAJc3RydWN0IGlndF9tYXQ0IG0gPSBpZ3Rfcmdi X3RvX3ljYmNyX21hdHJpeChjdnQtPmRzdC5mYi0KPiA+Y29sb3JfZW5jb2RpbmcsCj4gIAkJCQkJ CSAgICBjdnQtPmRzdC5mYi0+Y29sb3JfcmFuZ2UpOwo+ICsJc3RydWN0IHl1dl9wYXJhbWV0ZXJz IHBhcmFtcyA9IHsgfTsKPiAgCj4gIAlpZ3RfYXNzZXJ0KGN2dC0+c3JjLmZiLT5kcm1fZm9ybWF0 ID09IERSTV9GT1JNQVRfWFJHQjg4ODggJiYKPiAtCQkgICBjdnQtPmRzdC5mYi0+ZHJtX2Zvcm1h dCA9PSBEUk1fRk9STUFUX05WMTIpOwo+ICsJCSAgIGlndF9mb3JtYXRfaXNfeXV2KGN2dC0+ZHN0 LmZiLT5kcm1fZm9ybWF0KSk7Cj4gIAo+IC0JZm9yIChpID0gMDsgaSA8IGN2dC0+ZHN0LmZiLT5o ZWlnaHQgLyAyOyBpKyspIHsKPiAtCQlmb3IgKGogPSAwOyBqIDwgY3Z0LT5kc3QuZmItPndpZHRo IC8gMjsgaisrKSB7Cj4gLQkJCS8qIENvbnZlcnQgMngyIHBpeGVsIGJsb2NrcyAqLwo+IC0JCQlz dHJ1Y3QgaWd0X3ZlYzQgcmdiWzRdOwo+IC0JCQlzdHJ1Y3QgaWd0X3ZlYzQgeXV2WzRdOwo+ICsJ Z2V0X3l1dl9wYXJhbWV0ZXJzKGN2dC0+ZHN0LmZiLCAmcGFyYW1zKTsKPiArCXkgPSBjdnQtPmRz dC5wdHIgKyBwYXJhbXMueV9vZmZzZXQ7Cj4gKwl1ID0gY3Z0LT5kc3QucHRyICsgcGFyYW1zLnVf b2Zmc2V0Owo+ICsJdiA9IGN2dC0+ZHN0LnB0ciArIHBhcmFtcy52X29mZnNldDsKPiAgCj4gLQkJ CXJlYWRfcmdiKCZyZ2JbMF0sICZyZ2IyNFtqICogOCArIDBdKTsKPiAtCQkJcmVhZF9yZ2IoJnJn YlsxXSwgJnJnYjI0W2ogKiA4ICsgNF0pOwo+IC0JCQlyZWFkX3JnYigmcmdiWzJdLCAmcmdiMjRb aiAqIDggKyAwICsgcmdiMjRfc3RyaWRlXSk7Cj4gLQkJCXJlYWRfcmdiKCZyZ2JbM10sICZyZ2Iy NFtqICogOCArIDQgKyByZ2IyNF9zdHJpZGVdKTsKPiAtCj4gLQkJCXl1dlswXSA9IGlndF9tYXRy aXhfdHJhbnNmb3JtKCZtLCAmcmdiWzBdKTsKPiAtCQkJeXV2WzFdID0gaWd0X21hdHJpeF90cmFu c2Zvcm0oJm0sICZyZ2JbMV0pOwo+IC0JCQl5dXZbMl0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgm bSwgJnJnYlsyXSk7Cj4gLQkJCXl1dlszXSA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAmcmdi WzNdKTsKPiAtCj4gLQkJCXlbaiAqIDIgKyAwXSA9IHl1dlswXS5kWzBdOwo+IC0JCQl5W2ogKiAy ICsgMV0gPSB5dXZbMV0uZFswXTsKPiAtCQkJeVtqICogMiArIDAgKyBwbGFuYXJfc3RyaWRlXSA9 IHl1dlsyXS5kWzBdOwo+IC0JCQl5W2ogKiAyICsgMSArIHBsYW5hcl9zdHJpZGVdID0geXV2WzNd LmRbMF07Cj4gKwlmb3IgKGkgPSAwOyBpIDwgY3Z0LT5kc3QuZmItPmhlaWdodDsgaSsrKSB7Cj4g KwkJY29uc3QgdWludDhfdCAqcmdiX3RtcCA9IHJnYjI0Owo+ICsJCXVpbnQ4X3QgKnlfdG1wID0g eTsKPiArCQl1aW50OF90ICp1X3RtcCA9IHU7Cj4gKwkJdWludDhfdCAqdl90bXAgPSB2Owo+ICAK PiAtCQkJLyoKPiAtCQkJICogV2UgYXNzdW1lIHRoZSBNUEVHMiBjaHJvbWEgc2l0aW5nIGNvbnZl bnRpb24sIHdoZXJlCj4gLQkJCSAqIHBpeGVsIGNlbnRlciBmb3IgQ2InQ3InIGlzIGJldHdlZW4g dGhlIGxlZnQgdG9wIGFuZAo+IC0JCQkgKiBib3R0b20gcGl4ZWwgaW4gYSAyeDIgYmxvY2ssIHNv IHRha2UgdGhlIGF2ZXJhZ2UuCj4gLQkJCSAqLwo+IC0JCQl1dltqICogMiArIDBdID0gKHl1dlsw XS5kWzFdICsgeXV2WzJdLmRbMV0pIC8gMi4wZjsKPiAtCQkJdXZbaiAqIDIgKyAxXSA9ICh5dXZb MF0uZFsyXSArIHl1dlsyXS5kWzJdKSAvIDIuMGY7Cj4gLQkJfQo+ICsJCWZvciAoaiA9IDA7IGog PCBjdnQtPmRzdC5mYi0+d2lkdGg7IGorKykgewo+ICsJCQljb25zdCB1aW50OF90ICpwYWlyX3Jn YjI0ID0gcmdiX3RtcDsKPiArCQkJc3RydWN0IGlndF92ZWM0IHBhaXJfcmdiLCByZ2I7Cj4gKwkJ CXN0cnVjdCBpZ3RfdmVjNCBwYWlyX3l1diwgeXV2Owo+ICAKPiAtCQlpZiAoY3Z0LT5kc3QuZmIt PndpZHRoICYgMSkgewo+IC0JCQkvKiBDb252ZXJ0IDF4MiBwaXhlbCBibG9jayAqLwo+IC0JCQlz dHJ1Y3QgaWd0X3ZlYzQgcmdiWzJdOwo+IC0JCQlzdHJ1Y3QgaWd0X3ZlYzQgeXV2WzJdOwo+ICsJ CQlyZWFkX3JnYigmcmdiLCByZ2JfdG1wKTsKPiArCQkJeXV2ID0gaWd0X21hdHJpeF90cmFuc2Zv cm0oJm0sICZyZ2IpOwo+ICAKPiAtCQkJcmVhZF9yZ2IoJnJnYlswXSwgJnJnYjI0W2ogKiA4ICsg MF0pOwo+IC0JCQlyZWFkX3JnYigmcmdiWzFdLCAmcmdiMjRbaiAqIDggKyAwICsgcmdiMjRfc3Ry aWRlXSk7Cj4gKwkJCXJnYl90bXAgKz0gYnBwOwo+ICAKPiAtCQkJeXV2WzBdID0gaWd0X21hdHJp eF90cmFuc2Zvcm0oJm0sICZyZ2JbMF0pOwo+IC0JCQl5dXZbMV0gPSBpZ3RfbWF0cml4X3RyYW5z Zm9ybSgmbSwgJnJnYlsxXSk7Cj4gKwkJCSp5X3RtcCA9IHl1di5kWzBdOwo+ICsJCQl5X3RtcCAr PSBwYXJhbXMueV9pbmM7Cj4gIAo+IC0JCQl5W2ogKiAyICsgMF0gPSB5dXZbMF0uZFswXTsKPiAt CQkJeVtqICogMiArIDAgKyBwbGFuYXJfc3RyaWRlXSA9IHl1dlsxXS5kWzBdOwo+ICsJCQlpZiAo KGkgJSBkc3RfZm10LT52c3ViKSB8fCAoaiAlIGRzdF9mbXQtPmhzdWIpKQo+ICsJCQkJY29udGlu dWU7Cj4gIAo+ICAJCQkvKgo+ICAJCQkgKiBXZSBhc3N1bWUgdGhlIE1QRUcyIGNocm9tYSBzaXRp bmcgY29udmVudGlvbiwgd2hlcmUKPiAgCQkJICogcGl4ZWwgY2VudGVyIGZvciBDYidDcicgaXMg YmV0d2VlbiB0aGUgbGVmdCB0b3AgYW5kCj4gIAkJCSAqIGJvdHRvbSBwaXhlbCBpbiBhIDJ4MiBi bG9jaywgc28gdGFrZSB0aGUgYXZlcmFnZS4KPiArCQkJICoKPiArCQkJICogVGhlcmVmb3JlLCBp ZiB3ZSB1c2Ugc3Vic2FtcGxpbmcsIHdlIG9ubHkgcmVhbGx5Cj4gY2FyZQo+ICsJCQkgKiBhYm91 dCB0d28gcGl4ZWxzIGFsbCB0aGUgdGltZSwgZWl0aGVyIHRoZSB0d28KPiArCQkJICogc3Vic2Vx dWVudCBwaXhlbHMgaG9yaXpvbnRhbGx5LCB2ZXJ0aWNhbGx5LCBvciB0aGUKPiArCQkJICogdHdv IGNvcm5lcnMgaW4gYSAyeDIgYmxvY2suCj4gKwkJCSAqCj4gKwkJCSAqIFRoZSBvbmx5IGNvcm5l ciBjYXNlIGlzIHdoZW4gd2UgaGF2ZSBhbiBvZGQgbnVtYmVyCj4gb2YKPiArCQkJICogcGl4ZWxz LCBidXQgdGhpcyBjYW4gYmUgaGFuZGxlZCBwcmV0dHkgZWFzaWx5IGJ5Cj4gbm90Cj4gKwkJCSAq IGluY3JlbWVudGluZyB0aGUgcGFpcmVkIHBpeGVsIHBvaW50ZXIgaW4gdGhlCj4gKwkJCSAqIGRp cmVjdGlvbiBpdCdzIG9kZCBpbi4KPiAgCQkJICovCj4gLQkJCXV2W2ogKiAyICsgMF0gPSAoeXV2 WzBdLmRbMV0gKyB5dXZbMV0uZFsxXSkgLyAyLjBmOwo+IC0JCQl1dltqICogMiArIDFdID0gKHl1 dlswXS5kWzJdICsgeXV2WzFdLmRbMl0pIC8gMi4wZjsKPiAtCQl9Cj4gLQo+IC0JCXJnYjI0ICs9 IDIgKiByZ2IyNF9zdHJpZGU7Cj4gLQkJeSArPSAyICogcGxhbmFyX3N0cmlkZTsKPiAtCQl1diAr PSBwbGFuYXJfc3RyaWRlOwo+IC0JfQo+IC0KPiAtCS8qIExhc3Qgcm93IGNhbm5vdCBiZSBpbnRl cnBvbGF0ZWQgYmV0d2VlbiAyIHBpeGVscywgdGFrZSB0aGUgc2luZ2xlCj4gdmFsdWUgKi8KPiAt CWlmIChjdnQtPmRzdC5mYi0+aGVpZ2h0ICYgMSkgewo+IC0JCWZvciAoaiA9IDA7IGogPCBjdnQt PmRzdC5mYi0+d2lkdGggLyAyOyBqKyspIHsKPiAtCQkJLyogQ29udmVydCAyeDEgcGl4ZWwgYmxv Y2tzICovCj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCByZ2JbMl07Cj4gLQkJCXN0cnVjdCBpZ3RfdmVj NCB5dXZbMl07Cj4gLQo+IC0JCQlyZWFkX3JnYigmcmdiWzBdLCAmcmdiMjRbaiAqIDggKyAwXSk7 Cj4gLQkJCXJlYWRfcmdiKCZyZ2JbMV0sICZyZ2IyNFtqICogOCArIDRdKTsKPiAtCj4gLQkJCXl1 dlswXSA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAmcmdiWzBdKTsKPiAtCQkJeXV2WzFdID0g aWd0X21hdHJpeF90cmFuc2Zvcm0oJm0sICZyZ2JbMV0pOwo+ICsJCQlpZiAoaiAhPSAoY3Z0LT5k c3QuZmItPndpZHRoIC0gMSkpCj4gKwkJCQlwYWlyX3JnYjI0ICs9IChkc3RfZm10LT5oc3ViIC0g MSkgKiBicHA7Cj4gIAo+IC0JCQl5W2ogKiAyICsgMF0gPSB5dXZbMF0uZFswXTsKPiAtCQkJeVtq ICogMiArIDFdID0geXV2WzFdLmRbMF07Cj4gLQkJCXV2W2ogKiAyICsgMF0gPSB5dXZbMF0uZFsx XTsKPiAtCQkJdXZbaiAqIDIgKyAxXSA9IHl1dlswXS5kWzJdOwo+IC0JCX0KPiAtCj4gLQkJaWYg KGN2dC0+ZHN0LmZiLT53aWR0aCAmIDEpIHsKPiAtCQkJLyogQ29udmVydCBzaW5nbGUgcGl4ZWwg Ki8KPiAtCQkJc3RydWN0IGlndF92ZWM0IHJnYjsKPiAtCQkJc3RydWN0IGlndF92ZWM0IHl1djsK PiArCQkJaWYgKGkgIT0gKGN2dC0+ZHN0LmZiLT5oZWlnaHQgLSAxKSkKPiArCQkJCXBhaXJfcmdi MjQgKz0gcmdiMjRfc3RyaWRlICogKGRzdF9mbXQtPnZzdWIgLQo+IDEpOwo+ICAKPiAtCQkJcmVh ZF9yZ2IoJnJnYiwgJnJnYjI0W2ogKiA4ICsgMF0pOwo+ICsJCQlyZWFkX3JnYigmcGFpcl9yZ2Is IHBhaXJfcmdiMjQpOwo+ICsJCQlwYWlyX3l1diA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAm cGFpcl9yZ2IpOwo+ICAKPiAtCQkJeXV2ID0gaWd0X21hdHJpeF90cmFuc2Zvcm0oJm0sICZyZ2Ip Owo+ICsJCQkqdV90bXAgPSAoeXV2LmRbMV0gKyBwYWlyX3l1di5kWzFdKSAvIDIuMGY7Cj4gKwkJ CSp2X3RtcCA9ICh5dXYuZFsyXSArIHBhaXJfeXV2LmRbMl0pIC8gMi4wZjsKPiAgCj4gLQkJCXlb aiAqIDIgKyAwXSA9IHl1di5kWzBdOwo+IC0JCQl1dltqICogMiArIDBdID0geXV2LmRbMV07Cj4g LQkJCXV2W2ogKiAyICsgMV0gPSB5dXYuZFsyXTsKPiAtCQl9Cj4gLQl9Cj4gLX0KPiAtCj4gLS8q IHsgWTAsIFUsIFkxLCBWIH0gKi8KPiAtc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc3dpenps ZV95dXl2W10gPSB7IDAsIDEsIDIsIDMgfTsKPiAtc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIg c3dpenpsZV95dnl1W10gPSB7IDAsIDMsIDIsIDEgfTsKPiAtc3RhdGljIGNvbnN0IHVuc2lnbmVk IGNoYXIgc3dpenpsZV91eXZ5W10gPSB7IDEsIDAsIDMsIDIgfTsKPiAtc3RhdGljIGNvbnN0IHVu c2lnbmVkIGNoYXIgc3dpenpsZV92eXV5W10gPSB7IDEsIDIsIDMsIDAgfTsKPiAtCj4gLXN0YXRp YyBjb25zdCB1bnNpZ25lZCBjaGFyICp5dXl2X3N3aXp6bGUodWludDMyX3QgZm9ybWF0KQo+IC17 Cj4gLQlzd2l0Y2ggKGZvcm1hdCkgewo+IC0JZGVmYXVsdDoKPiAtCWNhc2UgRFJNX0ZPUk1BVF9Z VVlWOgo+IC0JCXJldHVybiBzd2l6emxlX3l1eXY7Cj4gLQljYXNlIERSTV9GT1JNQVRfWVZZVToK PiAtCQlyZXR1cm4gc3dpenpsZV95dnl1Owo+IC0JY2FzZSBEUk1fRk9STUFUX1VZVlk6Cj4gLQkJ cmV0dXJuIHN3aXp6bGVfdXl2eTsKPiAtCWNhc2UgRFJNX0ZPUk1BVF9WWVVZOgo+IC0JCXJldHVy biBzd2l6emxlX3Z5dXk7Cj4gLQl9Cj4gLX0KPiAtCj4gLXN0YXRpYyB2b2lkIGNvbnZlcnRfeXV5 dl90b19yZ2IyNChzdHJ1Y3QgZmJfY29udmVydCAqY3Z0KQo+IC17Cj4gLQlpbnQgaSwgajsKPiAt CWNvbnN0IHVpbnQ4X3QgKnl1eXY7Cj4gLQl1aW50OF90ICpyZ2IyNCA9IGN2dC0+ZHN0LnB0cjsK PiAtCXVuc2lnbmVkIGludCByZ2IyNF9zdHJpZGUgPSBjdnQtPmRzdC5mYi0+c3RyaWRlc1swXTsK PiAtCXVuc2lnbmVkIGludCB5dXl2X3N0cmlkZSA9IGN2dC0+c3JjLmZiLT5zdHJpZGVzWzBdOwo+ IC0Jc3RydWN0IGlndF9tYXQ0IG0gPSBpZ3RfeWNiY3JfdG9fcmdiX21hdHJpeChjdnQtPnNyYy5m Yi0KPiA+Y29sb3JfZW5jb2RpbmcsCj4gLQkJCQkJCSAgICBjdnQtPnNyYy5mYi0+Y29sb3JfcmFu Z2UpOwo+IC0JY29uc3QgdW5zaWduZWQgY2hhciAqc3d6ID0geXV5dl9zd2l6emxlKGN2dC0+c3Jj LmZiLT5kcm1fZm9ybWF0KTsKPiAtCXVpbnQ4X3QgKmJ1ZjsKPiAtCj4gLQlpZ3RfYXNzZXJ0KChj dnQtPnNyYy5mYi0+ZHJtX2Zvcm1hdCA9PSBEUk1fRk9STUFUX1lVWVYgfHwKPiAtCQkgICAgY3Z0 LT5zcmMuZmItPmRybV9mb3JtYXQgPT0gRFJNX0ZPUk1BVF9VWVZZIHx8Cj4gLQkJICAgIGN2dC0+ c3JjLmZiLT5kcm1fZm9ybWF0ID09IERSTV9GT1JNQVRfWVZZVSB8fAo+IC0JCSAgICBjdnQtPnNy Yy5mYi0+ZHJtX2Zvcm1hdCA9PSBEUk1fRk9STUFUX1ZZVVkpICYmCj4gLQkJICAgY3Z0LT5kc3Qu ZmItPmRybV9mb3JtYXQgPT0gRFJNX0ZPUk1BVF9YUkdCODg4OCk7Cj4gLQo+IC0JYnVmID0gY29u dmVydF9zcmNfZ2V0KGN2dCk7Cj4gLQl5dXl2ID0gYnVmOwo+IC0KPiAtCWZvciAoaSA9IDA7IGkg PCBjdnQtPmRzdC5mYi0+aGVpZ2h0OyBpKyspIHsKPiAtCQlmb3IgKGogPSAwOyBqIDwgY3Z0LT5k c3QuZmItPndpZHRoIC8gMjsgaisrKSB7Cj4gLQkJCS8qIENvbnZlcnQgMngxIHBpeGVsIGJsb2Nr cyAqLwo+IC0JCQlzdHJ1Y3QgaWd0X3ZlYzQgeXV2WzJdOwo+IC0JCQlzdHJ1Y3QgaWd0X3ZlYzQg cmdiWzJdOwo+IC0KPiAtCQkJeXV2WzBdLmRbMF0gPSB5dXl2W2ogKiA0ICsgc3d6WzBdXTsKPiAt CQkJeXV2WzFdLmRbMF0gPSB5dXl2W2ogKiA0ICsgc3d6WzJdXTsKPiAtCQkJeXV2WzBdLmRbMV0g PSB5dXZbMV0uZFsxXSA9IHl1eXZbaiAqIDQgKyBzd3pbMV1dOwo+IC0JCQl5dXZbMF0uZFsyXSA9 IHl1dlsxXS5kWzJdID0geXV5dltqICogNCArIHN3elszXV07Cj4gLQkJCXl1dlswXS5kWzNdID0g eXV2WzFdLmRbM10gPSAxLjBmOwo+IC0KPiAtCQkJcmdiWzBdID0gaWd0X21hdHJpeF90cmFuc2Zv cm0oJm0sICZ5dXZbMF0pOwo+IC0JCQlyZ2JbMV0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwg Jnl1dlsxXSk7Cj4gLQo+IC0JCQl3cml0ZV9yZ2IoJnJnYjI0W2ogKiA4ICsgMF0sICZyZ2JbMF0p Owo+IC0JCQl3cml0ZV9yZ2IoJnJnYjI0W2ogKiA4ICsgNF0sICZyZ2JbMV0pOwo+IC0JCX0KPiAt Cj4gLQkJaWYgKGN2dC0+ZHN0LmZiLT53aWR0aCAmIDEpIHsKPiAtCQkJc3RydWN0IGlndF92ZWM0 IHl1djsKPiAtCQkJc3RydWN0IGlndF92ZWM0IHJnYjsKPiAtCj4gLQkJCXl1di5kWzBdID0geXV5 dltqICogNCArIHN3elswXV07Cj4gLQkJCXl1di5kWzFdID0geXV5dltqICogNCArIHN3elsxXV07 Cj4gLQkJCXl1di5kWzJdID0geXV5dltqICogNCArIHN3elszXV07Cj4gLQkJCXl1di5kWzNdID0g MS4wZjsKPiAtCj4gLQkJCXJnYiA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAmeXV2KTsKPiAt Cj4gLQkJCXdyaXRlX3JnYigmcmdiMjRbaiAqIDggKyAwXSwgJnJnYik7Cj4gKwkJCXVfdG1wICs9 IHBhcmFtcy51dl9pbmM7Cj4gKwkJCXZfdG1wICs9IHBhcmFtcy51dl9pbmM7Cj4gIAkJfQo+ICAK PiAgCQlyZ2IyNCArPSByZ2IyNF9zdHJpZGU7Cj4gLQkJeXV5diArPSB5dXl2X3N0cmlkZTsKPiAt CX0KPiAtCj4gLQljb252ZXJ0X3NyY19wdXQoY3Z0LCBidWYpOwo+IC19Cj4gLQo+IC1zdGF0aWMg dm9pZCBjb252ZXJ0X3JnYjI0X3RvX3l1eXYoc3RydWN0IGZiX2NvbnZlcnQgKmN2dCkKPiAtewo+ IC0JaW50IGksIGo7Cj4gLQl1aW50OF90ICp5dXl2ID0gY3Z0LT5kc3QucHRyOwo+IC0JY29uc3Qg dWludDhfdCAqcmdiMjQgPSBjdnQtPnNyYy5wdHI7Cj4gLQl1bnNpZ25lZCByZ2IyNF9zdHJpZGUg PSBjdnQtPnNyYy5mYi0+c3RyaWRlc1swXTsKPiAtCXVuc2lnbmVkIHl1eXZfc3RyaWRlID0gY3Z0 LT5kc3QuZmItPnN0cmlkZXNbMF07Cj4gLQlzdHJ1Y3QgaWd0X21hdDQgbSA9IGlndF9yZ2JfdG9f eWNiY3JfbWF0cml4KGN2dC0+ZHN0LmZiLQo+ID5jb2xvcl9lbmNvZGluZywKPiAtCQkJCQkJICAg IGN2dC0+ZHN0LmZiLT5jb2xvcl9yYW5nZSk7Cj4gLQljb25zdCB1bnNpZ25lZCBjaGFyICpzd3og PSB5dXl2X3N3aXp6bGUoY3Z0LT5kc3QuZmItPmRybV9mb3JtYXQpOwo+IC0KPiAtCWlndF9hc3Nl cnQoY3Z0LT5zcmMuZmItPmRybV9mb3JtYXQgPT0gRFJNX0ZPUk1BVF9YUkdCODg4OCAmJgo+IC0J CSAgIChjdnQtPmRzdC5mYi0+ZHJtX2Zvcm1hdCA9PSBEUk1fRk9STUFUX1lVWVYgfHwKPiAtCQkg ICAgY3Z0LT5kc3QuZmItPmRybV9mb3JtYXQgPT0gRFJNX0ZPUk1BVF9VWVZZIHx8Cj4gLQkJICAg IGN2dC0+ZHN0LmZiLT5kcm1fZm9ybWF0ID09IERSTV9GT1JNQVRfWVZZVSB8fAo+IC0JCSAgICBj dnQtPmRzdC5mYi0+ZHJtX2Zvcm1hdCA9PSBEUk1fRk9STUFUX1ZZVVkpKTsKPiAtCj4gLQlmb3Ig KGkgPSAwOyBpIDwgY3Z0LT5kc3QuZmItPmhlaWdodDsgaSsrKSB7Cj4gLQkJZm9yIChqID0gMDsg aiA8IGN2dC0+ZHN0LmZiLT53aWR0aCAvIDI7IGorKykgewo+IC0JCQkvKiBDb252ZXJ0IDJ4MSBw aXhlbCBibG9ja3MgKi8KPiAtCQkJc3RydWN0IGlndF92ZWM0IHJnYlsyXTsKPiAtCQkJc3RydWN0 IGlndF92ZWM0IHl1dlsyXTsKPiAtCj4gLQkJCXJlYWRfcmdiKCZyZ2JbMF0sICZyZ2IyNFtqICog OCArIDBdKTsKPiAtCQkJcmVhZF9yZ2IoJnJnYlsxXSwgJnJnYjI0W2ogKiA4ICsgNF0pOwo+IC0K PiAtCQkJeXV2WzBdID0gaWd0X21hdHJpeF90cmFuc2Zvcm0oJm0sICZyZ2JbMF0pOwo+IC0JCQl5 dXZbMV0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnJnYlsxXSk7Cj4gKwkJeSArPSBwYXJh bXMueV9zdHJpZGU7Cj4gIAo+IC0JCQl5dXl2W2ogKiA0ICsgc3d6WzBdXSA9IHl1dlswXS5kWzBd Owo+IC0JCQl5dXl2W2ogKiA0ICsgc3d6WzJdXSA9IHl1dlsxXS5kWzBdOwo+IC0JCQl5dXl2W2og KiA0ICsgc3d6WzFdXSA9ICh5dXZbMF0uZFsxXSArIHl1dlsxXS5kWzFdKSAvCj4gMi4wZjsKPiAt CQkJeXV5dltqICogNCArIHN3elszXV0gPSAoeXV2WzBdLmRbMl0gKyB5dXZbMV0uZFsyXSkgLwo+ IDIuMGY7Cj4gKwkJaWYgKChpICUgZHN0X2ZtdC0+dnN1YikgPT0gKGRzdF9mbXQtPnZzdWIgLSAx KSkgewo+ICsJCQl1ICs9IHBhcmFtcy51dl9zdHJpZGU7Cj4gKwkJCXYgKz0gcGFyYW1zLnV2X3N0 cmlkZTsKPiAgCQl9Cj4gLQo+IC0JCWlmIChjdnQtPmRzdC5mYi0+d2lkdGggJiAxKSB7Cj4gLQkJ CXN0cnVjdCBpZ3RfdmVjNCByZ2I7Cj4gLQkJCXN0cnVjdCBpZ3RfdmVjNCB5dXY7Cj4gLQo+IC0J CQlyZWFkX3JnYigmcmdiLCAmcmdiMjRbaiAqIDggKyAwXSk7Cj4gLQo+IC0JCQl5dXYgPSBpZ3Rf bWF0cml4X3RyYW5zZm9ybSgmbSwgJnJnYik7Cj4gLQo+IC0JCQl5dXl2W2ogKiA0ICsgc3d6WzBd XSA9IHl1di5kWzBdOwo+IC0JCQl5dXl2W2ogKiA0ICsgc3d6WzFdXSA9IHl1di5kWzFdOwo+IC0J CQl5dXl2W2ogKiA0ICsgc3d6WzNdXSA9IHl1di5kWzJdOwo+IC0JCX0KPiAtCj4gLQkJcmdiMjQg Kz0gcmdiMjRfc3RyaWRlOwo+IC0JCXl1eXYgKz0geXV5dl9zdHJpZGU7Cj4gIAl9Cj4gIH0KPiAg Cj4gQEAgLTIwNDYsMzEgKzE4NTksMjMgQEAgc3RhdGljIHZvaWQgZmJfY29udmVydChzdHJ1Y3Qg ZmJfY29udmVydCAqY3Z0KQo+ICAJfSBlbHNlIGlmIChjdnQtPmRzdC5mYi0+ZHJtX2Zvcm1hdCA9 PSBEUk1fRk9STUFUX1hSR0I4ODg4KSB7Cj4gIAkJc3dpdGNoIChjdnQtPnNyYy5mYi0+ZHJtX2Zv cm1hdCkgewo+ICAJCWNhc2UgRFJNX0ZPUk1BVF9YWVVWODg4ODoKPiAtCQkJY29udmVydF95dXY0 NDRfdG9fcmdiMjQoY3Z0KTsKPiAtCQkJcmV0dXJuOwo+ICAJCWNhc2UgRFJNX0ZPUk1BVF9OVjEy Ogo+IC0JCQljb252ZXJ0X252MTJfdG9fcmdiMjQoY3Z0KTsKPiAtCQkJcmV0dXJuOwo+IC0JCWNh c2UgRFJNX0ZPUk1BVF9ZVVlWOgo+IC0JCWNhc2UgRFJNX0ZPUk1BVF9ZVllVOgo+ICAJCWNhc2Ug RFJNX0ZPUk1BVF9VWVZZOgo+ICAJCWNhc2UgRFJNX0ZPUk1BVF9WWVVZOgo+IC0JCQljb252ZXJ0 X3l1eXZfdG9fcmdiMjQoY3Z0KTsKPiArCQljYXNlIERSTV9GT1JNQVRfWVVZVjoKPiArCQljYXNl IERSTV9GT1JNQVRfWVZZVToKPiArCQkJY29udmVydF95dXZfdG9fcmdiMjQoY3Z0KTsKPiAgCQkJ cmV0dXJuOwo+ICAJCX0KPiAgCX0gZWxzZSBpZiAoY3Z0LT5zcmMuZmItPmRybV9mb3JtYXQgPT0g RFJNX0ZPUk1BVF9YUkdCODg4OCkgewo+ICAJCXN3aXRjaCAoY3Z0LT5kc3QuZmItPmRybV9mb3Jt YXQpIHsKPiAgCQljYXNlIERSTV9GT1JNQVRfWFlVVjg4ODg6Cj4gLQkJCWNvbnZlcnRfcmdiMjRf dG9feXV2NDQ0KGN2dCk7Cj4gLQkJCXJldHVybjsKPiAgCQljYXNlIERSTV9GT1JNQVRfTlYxMjoK PiAtCQkJY29udmVydF9yZ2IyNF90b19udjEyKGN2dCk7Cj4gLQkJCXJldHVybjsKPiAgCQljYXNl IERSTV9GT1JNQVRfWVVZVjoKPiAgCQljYXNlIERSTV9GT1JNQVRfWVZZVToKPiAgCQljYXNlIERS TV9GT1JNQVRfVVlWWToKPiAgCQljYXNlIERSTV9GT1JNQVRfVllVWToKPiAtCQkJY29udmVydF9y Z2IyNF90b195dXl2KGN2dCk7Cj4gKwkJCWNvbnZlcnRfcmdiMjRfdG9feXV2KGN2dCk7Cj4gIAkJ CXJldHVybjsKPiAgCQl9Cj4gIAl9Ci0tIApDaGVlcnMsCglMeXVkZSBQYXVsCgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwppZ3QtZGV2IG1haWxpbmcgbGlz dAppZ3QtZGV2QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9w Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2lndC1kZXYK