From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.bootlin.com (mail.bootlin.com [62.4.15.54]) by gabe.freedesktop.org (Postfix) with ESMTP id 848076EF90 for ; Tue, 8 Jan 2019 15:20:06 +0000 (UTC) From: Maxime Ripard Date: Tue, 8 Jan 2019 16:19:49 +0100 Message-Id: <20190108152001.5367-3-maxime.ripard@bootlin.com> In-Reply-To: References: MIME-Version: 1.0 Subject: [igt-dev] [PATCH i-g-t v2 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: igt-dev@lists.freedesktop.org Cc: Petri Latvala , eben@raspberrypi.org, Thomas Petazzoni List-ID: VGhlIGN1cnJlbnQgd2F5IHdlIHdvcmsgd2hlbiB3ZSB3YW50IHRvIHN1cHBvcnQgYSBuZXcgWVVW IGZvcm1hdCB0byBJR1QsIHdlCmFsc28gbmVlZCB0byBhZGQgbmV3IGZ1bmN0aW9uIHRvIGNvbnZl cnQgdG8gYW5kIGZyb20gWFJHQjg4ODguCgpUaGlzIGRvZXNuJ3QgcmVhbGx5IHNjYWxlIGhvd2V2 ZXIsIGFuZCBjcmVhdGVzIGEgbG90IG9mIGNvZGUgdG8gbWFpbnRhaW4uCkluIG9yZGVyIHRvIHdv cmsgYXJvdW5kIHRoaXMsIGNyZWF0ZSBhIGdlbmVyaWMgZnVuY3Rpb24gdG8gY29udmVydCB0byBS R0IKYW5kIG9uZSB0byBjb252ZXJ0IGZyb20gUkdCLgoKVGhlIG9ubHkgdGhpbmcgdGhhdCBpcyBu ZWVkZWQgbm93IGlzIHRvIGFkZCBuZXcgcGFyYW1ldGVycywgYW5kIHRoYXQncyBpdC4KClNpZ25l ZC1vZmYtYnk6IE1heGltZSBSaXBhcmQgPG1heGltZS5yaXBhcmRAYm9vdGxpbi5jb20+Ci0tLQog bGliL2lndF9mYi5jIHwgNTM3ICsrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDE3MSBpbnNlcnRpb25zKCspLCAzNjYgZGVs ZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvbGliL2lndF9mYi5jIGIvbGliL2lndF9mYi5jCmluZGV4 IDZhYjRlMzAzOTE2Ni4uNDU2OTFmZDQ0MWQ5IDEwMDY0NAotLS0gYS9saWIvaWd0X2ZiLmMKKysr IGIvbGliL2lndF9mYi5jCkBAIC0xNTc3LDQyNCArMTU3NywyMzcgQEAgc3RhdGljIHZvaWQgY29u dmVydF9zcmNfcHV0KGNvbnN0IHN0cnVjdCBmYl9jb252ZXJ0ICpjdnQsCiAJCWZyZWUoc3JjX2J1 Zik7CiB9CiAKLXN0YXRpYyB2b2lkIGNvbnZlcnRfbnYxMl90b19yZ2IyNChzdHJ1Y3QgZmJfY29u dmVydCAqY3Z0KQorc3RydWN0IHl1dl9wYXJhbWV0ZXJzIHsKKwl1bnNpZ25lZAl5X2luYzsKKwl1 bnNpZ25lZAl1dl9pbmM7CisJdW5zaWduZWQJeV9zdHJpZGU7CisJdW5zaWduZWQJdXZfc3RyaWRl OworCXVuc2lnbmVkCXlfb2Zmc2V0OworCXVuc2lnbmVkCXVfb2Zmc2V0OworCXVuc2lnbmVkCXZf b2Zmc2V0OworfTsKKworc3RhdGljIHZvaWQgZ2V0X3l1dl9wYXJhbWV0ZXJzKHN0cnVjdCBpZ3Rf ZmIgKmZiLCBzdHJ1Y3QgeXV2X3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKLQlpbnQgaSwgajsKLQlj b25zdCB1aW50OF90ICp5LCAqdXY7Ci0JdWludDhfdCAqcmdiMjQgPSBjdnQtPmRzdC5wdHI7Ci0J dW5zaWduZWQgaW50IHJnYjI0X3N0cmlkZSA9IGN2dC0+ZHN0LmZiLT5zdHJpZGVzWzBdOwotCXVu c2lnbmVkIGludCBwbGFuYXJfc3RyaWRlID0gY3Z0LT5zcmMuZmItPnN0cmlkZXNbMF07Ci0Jc3Ry dWN0IGlndF9tYXQ0IG0gPSBpZ3RfeWNiY3JfdG9fcmdiX21hdHJpeChjdnQtPnNyYy5mYi0+Y29s b3JfZW5jb2RpbmcsCi0JCQkJCQkgICAgY3Z0LT5zcmMuZmItPmNvbG9yX3JhbmdlKTsKLQl1aW50 OF90ICpidWY7Ci0KLQlpZ3RfYXNzZXJ0KGN2dC0+c3JjLmZiLT5kcm1fZm9ybWF0ID09IERSTV9G T1JNQVRfTlYxMiAmJgotCQkgICBjdnQtPmRzdC5mYi0+ZHJtX2Zvcm1hdCA9PSBEUk1fRk9STUFU X1hSR0I4ODg4KTsKLQotCWJ1ZiA9IGNvbnZlcnRfc3JjX2dldChjdnQpOwotCXkgPSBidWYgKyBj dnQtPnNyYy5mYi0+b2Zmc2V0c1swXTsKLQl1diA9IGJ1ZiArIGN2dC0+c3JjLmZiLT5vZmZzZXRz WzFdOwotCi0JZm9yIChpID0gMDsgaSA8IGN2dC0+ZHN0LmZiLT5oZWlnaHQgLyAyOyBpKyspIHsK LQkJZm9yIChqID0gMDsgaiA8IGN2dC0+ZHN0LmZiLT53aWR0aCAvIDI7IGorKykgewotCQkJLyog Q29udmVydCAyeDIgcGl4ZWwgYmxvY2tzICovCi0JCQlzdHJ1Y3QgaWd0X3ZlYzQgeXV2WzRdOwot CQkJc3RydWN0IGlndF92ZWM0IHJnYls0XTsKLQotCQkJeXV2WzBdLmRbMF0gPSB5W2ogKiAyICsg MF07Ci0JCQl5dXZbMV0uZFswXSA9IHlbaiAqIDIgKyAxXTsKLQkJCXl1dlsyXS5kWzBdID0geVtq ICogMiArIDAgKyBwbGFuYXJfc3RyaWRlXTsKLQkJCXl1dlszXS5kWzBdID0geVtqICogMiArIDEg KyBwbGFuYXJfc3RyaWRlXTsKLQotCQkJeXV2WzBdLmRbMV0gPSB5dXZbMV0uZFsxXSA9IHl1dlsy XS5kWzFdID0geXV2WzNdLmRbMV0gPSB1dltqICogMiArIDBdOwotCQkJeXV2WzBdLmRbMl0gPSB5 dXZbMV0uZFsyXSA9IHl1dlsyXS5kWzJdID0geXV2WzNdLmRbMl0gPSB1dltqICogMiArIDFdOwot CQkJeXV2WzBdLmRbM10gPSB5dXZbMV0uZFszXSA9IHl1dlsyXS5kWzNdID0geXV2WzNdLmRbM10g PSAxLjBmOwotCi0JCQlyZ2JbMF0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnl1dlswXSk7 Ci0JCQlyZ2JbMV0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnl1dlsxXSk7Ci0JCQlyZ2Jb Ml0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnl1dlsyXSk7Ci0JCQlyZ2JbM10gPSBpZ3Rf bWF0cml4X3RyYW5zZm9ybSgmbSwgJnl1dlszXSk7Ci0KLQkJCXdyaXRlX3JnYigmcmdiMjRbaiAq IDggKyAwXSwgJnJnYlswXSk7Ci0JCQl3cml0ZV9yZ2IoJnJnYjI0W2ogKiA4ICsgNF0sICZyZ2Jb MV0pOwotCQkJd3JpdGVfcmdiKCZyZ2IyNFtqICogOCArIDAgKyByZ2IyNF9zdHJpZGVdLCAmcmdi WzJdKTsKLQkJCXdyaXRlX3JnYigmcmdiMjRbaiAqIDggKyA0ICsgcmdiMjRfc3RyaWRlXSwgJnJn YlszXSk7Ci0JCX0KLQotCQlpZiAoY3Z0LT5kc3QuZmItPndpZHRoICYgMSkgewotCQkJLyogQ29u dmVydCAxeDIgcGl4ZWwgYmxvY2sgKi8KLQkJCXN0cnVjdCBpZ3RfdmVjNCB5dXZbMl07Ci0JCQlz dHJ1Y3QgaWd0X3ZlYzQgcmdiWzJdOwotCi0JCQl5dXZbMF0uZFswXSA9IHlbaiAqIDIgKyAwXTsK LQkJCXl1dlsxXS5kWzBdID0geVtqICogMiArIDAgKyBwbGFuYXJfc3RyaWRlXTsKKwlpZ3RfYXNz ZXJ0KGlndF9mb3JtYXRfaXNfeXV2KGZiLT5kcm1fZm9ybWF0KSk7CiAKLQkJCXl1dlswXS5kWzFd ID0geXV2WzFdLmRbMV0gPSB1dltqICogMiArIDBdOwotCQkJeXV2WzBdLmRbMl0gPSB5dXZbMV0u ZFsyXSA9IHV2W2ogKiAyICsgMV07Ci0JCQl5dXZbMF0uZFszXSA9IHl1dlsxXS5kWzNdID0gMS4w ZjsKKwlzd2l0Y2ggKGZiLT5kcm1fZm9ybWF0KSB7CisJY2FzZSBEUk1fRk9STUFUX05WMTI6CisJ CXBhcmFtcy0+eV9pbmMgPSAxOworCQlwYXJhbXMtPnV2X2luYyA9IDI7CisJCWJyZWFrOwogCi0J CQlyZ2JbMF0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnl1dlswXSk7Ci0JCQlyZ2JbMV0g PSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnl1dlsxXSk7Ci0KLQkJCXdyaXRlX3JnYigmcmdi MjRbaiAqIDggKyAwXSwgJnJnYlswXSk7Ci0JCQl3cml0ZV9yZ2IoJnJnYjI0W2ogKiA4ICsgMCAr IHJnYjI0X3N0cmlkZV0sICZyZ2JbMV0pOwotCQl9Ci0KLQkJcmdiMjQgKz0gMiAqIHJnYjI0X3N0 cmlkZTsKLQkJeSArPSAyICogcGxhbmFyX3N0cmlkZTsKLQkJdXYgKz0gcGxhbmFyX3N0cmlkZTsK KwljYXNlIERSTV9GT1JNQVRfWVVZVjoKKwljYXNlIERSTV9GT1JNQVRfWVZZVToKKwljYXNlIERS TV9GT1JNQVRfVVlWWToKKwljYXNlIERSTV9GT1JNQVRfVllVWToKKwkJcGFyYW1zLT55X2luYyA9 IDI7CisJCXBhcmFtcy0+dXZfaW5jID0gNDsKKwkJYnJlYWs7CisKKwljYXNlIERSTV9GT1JNQVRf WFlVVjg4ODg6CisJCXBhcmFtcy0+eV9pbmMgPSA0OworCQlwYXJhbXMtPnV2X2luYyA9IDQ7CisJ CWJyZWFrOwogCX0KIAotCWlmIChjdnQtPmRzdC5mYi0+aGVpZ2h0ICYgMSkgewotCQkvKiBDb252 ZXJ0IGxhc3Qgcm93ICovCi0JCWZvciAoaiA9IDA7IGogPCBjdnQtPmRzdC5mYi0+d2lkdGggLyAy OyBqKyspIHsKLQkJCS8qIENvbnZlcnQgMngxIHBpeGVsIGJsb2NrcyAqLwotCQkJc3RydWN0IGln dF92ZWM0IHl1dlsyXTsKLQkJCXN0cnVjdCBpZ3RfdmVjNCByZ2JbMl07Ci0KLQkJCXl1dlswXS5k WzBdID0geVtqICogMiArIDBdOwotCQkJeXV2WzFdLmRbMF0gPSB5W2ogKiAyICsgMV07Ci0JCQl5 dXZbMF0uZFsxXSA9IHl1dlsxXS5kWzFdID0gdXZbaiAqIDIgKyAwXTsKLQkJCXl1dlswXS5kWzJd ID0geXV2WzFdLmRbMl0gPSB1dltqICogMiArIDFdOwotCQkJeXV2WzBdLmRbM10gPSB5dXZbMV0u ZFszXSA9IDEuMGY7CisJc3dpdGNoIChmYi0+ZHJtX2Zvcm1hdCkgeworCWNhc2UgRFJNX0ZPUk1B VF9OVjEyOgorCQlwYXJhbXMtPnlfc3RyaWRlID0gZmItPnN0cmlkZXNbMF07CisJCXBhcmFtcy0+ dXZfc3RyaWRlID0gZmItPnN0cmlkZXNbMV07CisJCWJyZWFrOwogCi0JCQlyZ2JbMF0gPSBpZ3Rf bWF0cml4X3RyYW5zZm9ybSgmbSwgJnl1dlswXSk7Ci0JCQlyZ2JbMV0gPSBpZ3RfbWF0cml4X3Ry YW5zZm9ybSgmbSwgJnl1dlsxXSk7CisJY2FzZSBEUk1fRk9STUFUX1lVWVY6CisJY2FzZSBEUk1f Rk9STUFUX1lWWVU6CisJY2FzZSBEUk1fRk9STUFUX1VZVlk6CisJY2FzZSBEUk1fRk9STUFUX1ZZ VVk6CisJY2FzZSBEUk1fRk9STUFUX1hZVVY4ODg4OgorCQlwYXJhbXMtPnlfc3RyaWRlID0gZmIt PnN0cmlkZXNbMF07CisJCXBhcmFtcy0+dXZfc3RyaWRlID0gZmItPnN0cmlkZXNbMF07CisJCWJy ZWFrOworCX0KIAotCQkJd3JpdGVfcmdiKCZyZ2IyNFtqICogOCArIDBdLCAmcmdiWzBdKTsKLQkJ CXdyaXRlX3JnYigmcmdiMjRbaiAqIDggKyA0XSwgJnJnYlswXSk7Ci0JCX0KKwlzd2l0Y2ggKGZi LT5kcm1fZm9ybWF0KSB7CisJY2FzZSBEUk1fRk9STUFUX05WMTI6CisJCXBhcmFtcy0+eV9vZmZz ZXQgPSBmYi0+b2Zmc2V0c1swXTsKKwkJcGFyYW1zLT51X29mZnNldCA9IGZiLT5vZmZzZXRzWzFd OworCQlwYXJhbXMtPnZfb2Zmc2V0ID0gZmItPm9mZnNldHNbMV0gKyAxOworCQlicmVhazsKIAot CQlpZiAoY3Z0LT5kc3QuZmItPndpZHRoICYgMSkgewotCQkJLyogQ29udmVydCBzaW5nbGUgcGl4 ZWwgKi8KLQkJCXN0cnVjdCBpZ3RfdmVjNCB5dXY7Ci0JCQlzdHJ1Y3QgaWd0X3ZlYzQgcmdiOwor CWNhc2UgRFJNX0ZPUk1BVF9ZVVlWOgorCQlwYXJhbXMtPnlfb2Zmc2V0ID0gZmItPm9mZnNldHNb MF07CisJCXBhcmFtcy0+dV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDE7CisJCXBhcmFtcy0+ dl9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDM7CisJCWJyZWFrOwogCi0JCQl5dXYuZFswXSA9 IHlbaiAqIDIgKyAwXTsKLQkJCXl1di5kWzFdID0gdXZbaiAqIDIgKyAwXTsKLQkJCXl1di5kWzJd ID0gdXZbaiAqIDIgKyAxXTsKLQkJCXl1di5kWzNdID0gMS4wZjsKKwljYXNlIERSTV9GT1JNQVRf WVZZVToKKwkJcGFyYW1zLT55X29mZnNldCA9IGZiLT5vZmZzZXRzWzBdOworCQlwYXJhbXMtPnVf b2Zmc2V0ID0gZmItPm9mZnNldHNbMF0gKyAzOworCQlwYXJhbXMtPnZfb2Zmc2V0ID0gZmItPm9m ZnNldHNbMF0gKyAxOworCQlicmVhazsKIAotCQkJcmdiID0gaWd0X21hdHJpeF90cmFuc2Zvcm0o Jm0sICZ5dXYpOworCWNhc2UgRFJNX0ZPUk1BVF9VWVZZOgorCQlwYXJhbXMtPnlfb2Zmc2V0ID0g ZmItPm9mZnNldHNbMF0gKyAxOworCQlwYXJhbXMtPnVfb2Zmc2V0ID0gZmItPm9mZnNldHNbMF07 CisJCXBhcmFtcy0+dl9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDI7CisJCWJyZWFrOwogCi0J CQl3cml0ZV9yZ2IoJnJnYjI0W2ogKiA4ICsgMF0sICZyZ2IpOwotCQl9CisJY2FzZSBEUk1fRk9S TUFUX1ZZVVk6CisJCXBhcmFtcy0+eV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDE7CisJCXBh cmFtcy0+dV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDI7CisJCXBhcmFtcy0+dl9vZmZzZXQg PSBmYi0+b2Zmc2V0c1swXTsKKwkJYnJlYWs7CisKKwljYXNlIERSTV9GT1JNQVRfWFlVVjg4ODg6 CisJCXBhcmFtcy0+eV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDE7CisJCXBhcmFtcy0+dV9v ZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDI7CisJCXBhcmFtcy0+dl9vZmZzZXQgPSBmYi0+b2Zm c2V0c1swXSArIDM7CisJCWJyZWFrOwogCX0KLQotCWNvbnZlcnRfc3JjX3B1dChjdnQsIGJ1Zik7 CiB9CiAKLXN0YXRpYyB2b2lkIGNvbnZlcnRfeXV2NDQ0X3RvX3JnYjI0KHN0cnVjdCBmYl9jb252 ZXJ0ICpjdnQpCitzdGF0aWMgdm9pZCBjb252ZXJ0X3l1dl90b19yZ2IyNChzdHJ1Y3QgZmJfY29u dmVydCAqY3Z0KQogeworCWNvbnN0IHN0cnVjdCBmb3JtYXRfZGVzY19zdHJ1Y3QgKnNyY19mbXQg PQorCQlsb29rdXBfZHJtX2Zvcm1hdChjdnQtPnNyYy5mYi0+ZHJtX2Zvcm1hdCk7CiAJaW50IGks IGo7Ci0JdWludDhfdCAqeXV2MjQ7CisJdWludDhfdCBicHAgPSA0OworCXVpbnQ4X3QgKnksICp1 LCAqdjsKIAl1aW50OF90ICpyZ2IyNCA9IGN2dC0+ZHN0LnB0cjsKLQl1bnNpZ25lZCByZ2IyNF9z dHJpZGUgPSBjdnQtPmRzdC5mYi0+c3RyaWRlc1swXSwgeHl1dl9zdHJpZGUgPSBjdnQtPnNyYy5m Yi0+c3RyaWRlc1swXTsKLQl1aW50OF90ICpidWYgPSBtYWxsb2MoY3Z0LT5zcmMuZmItPnNpemUp OworCXVuc2lnbmVkIGludCByZ2IyNF9zdHJpZGUgPSBjdnQtPmRzdC5mYi0+c3RyaWRlc1swXTsK IAlzdHJ1Y3QgaWd0X21hdDQgbSA9IGlndF95Y2Jjcl90b19yZ2JfbWF0cml4KGN2dC0+c3JjLmZi LT5jb2xvcl9lbmNvZGluZywKIAkJCQkJCSAgICBjdnQtPnNyYy5mYi0+Y29sb3JfcmFuZ2UpOwor CXVpbnQ4X3QgKmJ1ZjsKKwlzdHJ1Y3QgeXV2X3BhcmFtZXRlcnMgcGFyYW1zID0geyB9OwogCi0J LyoKLQkgKiBSZWFkaW5nIGZyb20gdGhlIEJPIGlzIGF3ZnVsbHkgc2xvdyBiZWNhdXNlIG9mIGxh Y2sgb2YgcmVhZCBjYWNoaW5nLAotCSAqIGl0J3MgZmFzdGVyIHRvIGNvcHkgdGhlIHdob2xlIEJP IHRvIGEgdGVtcG9yYXJ5IGJ1ZmZlciBhbmQgY29udmVydAotCSAqIGZyb20gdGhlcmUuCi0JICov Ci0JaWd0X21lbWNweV9mcm9tX3djKGJ1ZiwgY3Z0LT5zcmMucHRyICsgY3Z0LT5zcmMuZmItPm9m ZnNldHNbMF0sIGN2dC0+c3JjLmZiLT5zaXplKTsKLQl5dXYyNCA9IGJ1ZjsKKwlpZ3RfYXNzZXJ0 KGN2dC0+ZHN0LmZiLT5kcm1fZm9ybWF0ID09IERSTV9GT1JNQVRfWFJHQjg4ODggJiYKKwkJICAg aWd0X2Zvcm1hdF9pc195dXYoY3Z0LT5zcmMuZmItPmRybV9mb3JtYXQpKTsKKworCWJ1ZiA9IGNv bnZlcnRfc3JjX2dldChjdnQpOworCWdldF95dXZfcGFyYW1ldGVycyhjdnQtPnNyYy5mYiwgJnBh cmFtcyk7CisJeSA9IGJ1ZiArIHBhcmFtcy55X29mZnNldDsKKwl1ID0gYnVmICsgcGFyYW1zLnVf b2Zmc2V0OworCXYgPSBidWYgKyBwYXJhbXMudl9vZmZzZXQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwg Y3Z0LT5kc3QuZmItPmhlaWdodDsgaSsrKSB7CisJCWNvbnN0IHVpbnQ4X3QgKnlfdG1wID0geTsK KwkJY29uc3QgdWludDhfdCAqdV90bXAgPSB1OworCQljb25zdCB1aW50OF90ICp2X3RtcCA9IHY7 CisJCXVpbnQ4X3QgKnJnYl90bXAgPSByZ2IyNDsKKwogCQlmb3IgKGogPSAwOyBqIDwgY3Z0LT5k c3QuZmItPndpZHRoOyBqKyspIHsKLQkJCWZsb2F0IHksIHUsIHY7Ci0JCQlzdHJ1Y3QgaWd0X3Zl YzQgeXV2OwotCQkJc3RydWN0IGlndF92ZWM0IHJnYjsKLQotCQkJdiA9IHl1djI0W2kgKiB4eXV2 X3N0cmlkZSArIGogKiA0XTsKLQkJCXUgPSB5dXYyNFtpICogeHl1dl9zdHJpZGUgKyBqICogNCAr IDFdOwotCQkJeSA9IHl1djI0W2kgKiB4eXV2X3N0cmlkZSArIGogKiA0ICsgMl07Ci0JCQl5dXYu ZFswXSA9IHk7Ci0JCQl5dXYuZFsxXSA9IHU7Ci0JCQl5dXYuZFsyXSA9IHY7CisJCQlzdHJ1Y3Qg aWd0X3ZlYzQgcmdiLCB5dXY7CisKKwkJCXl1di5kWzBdID0gKnlfdG1wOworCQkJeXV2LmRbMV0g PSAqdV90bXA7CisJCQl5dXYuZFsyXSA9ICp2X3RtcDsKIAkJCXl1di5kWzNdID0gMS4wZjsKIAog CQkJcmdiID0gaWd0X21hdHJpeF90cmFuc2Zvcm0oJm0sICZ5dXYpOworCQkJd3JpdGVfcmdiKHJn Yl90bXAsICZyZ2IpOwogCi0JCQl3cml0ZV9yZ2IoJnJnYjI0W2kgKiByZ2IyNF9zdHJpZGUgKyBq ICogNF0sICZyZ2IpOwotCQl9Ci0JfQotCi0JZnJlZShidWYpOwotfQotCi0KLXN0YXRpYyB2b2lk IGNvbnZlcnRfcmdiMjRfdG9feXV2NDQ0KHN0cnVjdCBmYl9jb252ZXJ0ICpjdnQpCi17Ci0JaW50 IGksIGo7Ci0JdWludDhfdCAqcmdiMjQ7Ci0JdWludDhfdCAqeXV2NDQ0ID0gY3Z0LT5kc3QucHRy ICsgY3Z0LT5kc3QuZmItPm9mZnNldHNbMF07Ci0JdW5zaWduZWQgaW50IHJnYjI0X3N0cmlkZSA9 IGN2dC0+c3JjLmZiLT5zdHJpZGVzWzBdLCB4eXV2X3N0cmlkZSA9IGN2dC0+ZHN0LmZiLT5zdHJp ZGVzWzBdOwotCXN0cnVjdCBpZ3RfbWF0NCBtID0gaWd0X3JnYl90b195Y2Jjcl9tYXRyaXgoY3Z0 LT5kc3QuZmItPmNvbG9yX2VuY29kaW5nLAotCQkJCQkJICAgIGN2dC0+ZHN0LmZiLT5jb2xvcl9y YW5nZSk7Ci0KLQlyZ2IyNCA9IGN2dC0+c3JjLnB0cjsKKwkJCXJnYl90bXAgKz0gYnBwOworCQkJ eV90bXAgKz0gcGFyYW1zLnlfaW5jOwogCi0JaWd0X2Fzc2VydF9mKGN2dC0+ZHN0LmZiLT5kcm1f Zm9ybWF0ID09IERSTV9GT1JNQVRfWFlVVjg4ODgsCi0JCSAgICAgIkNvbnZlcnNpb24gbm90IGlt cGxlbWVudGVkIGZvciAhWFlVViBwYWNrZWQgZm9ybWF0c1xuIik7Ci0KLQlmb3IgKGkgPSAwOyBp IDwgY3Z0LT5kc3QuZmItPmhlaWdodDsgaSsrKSB7Ci0JCWZvciAoaiA9IDA7IGogPCBjdnQtPmRz dC5mYi0+d2lkdGg7IGorKykgewotCQkJc3RydWN0IGlndF92ZWM0IHJnYjsKLQkJCXN0cnVjdCBp Z3RfdmVjNCB5dXY7Ci0KLQkJCXJlYWRfcmdiKCZyZ2IsICZyZ2IyNFtpICogcmdiMjRfc3RyaWRl ICsgaiAqIDRdKTsKKwkJCWlmICgoc3JjX2ZtdC0+aHN1YiA9PSAxKSB8fCAoaiAlIHNyY19mbXQt PmhzdWIpKSB7CisJCQkJdV90bXAgKz0gcGFyYW1zLnV2X2luYzsKKwkJCQl2X3RtcCArPSBwYXJh bXMudXZfaW5jOworCQkJfQorCQl9CiAKLQkJCXl1diA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZt LCAmcmdiKTsKKwkJcmdiMjQgKz0gcmdiMjRfc3RyaWRlOworCQl5ICs9IHBhcmFtcy55X3N0cmlk ZTsKIAotCQkJeXV2NDQ0W2kgKiB4eXV2X3N0cmlkZSArIGogKiA0XSA9IHl1di5kWzJdOwotCQkJ eXV2NDQ0W2kgKiB4eXV2X3N0cmlkZSArIGogKiA0ICsgMV0gPSB5dXYuZFsxXTsKLQkJCXl1djQ0 NFtpICogeHl1dl9zdHJpZGUgKyBqICogNCArIDJdID0geXV2LmRbMF07CisJCWlmICgoc3JjX2Zt dC0+dnN1YiA9PSAxKSB8fCAoaSAlIHNyY19mbXQtPnZzdWIpKSB7CisJCQl1ICs9IHBhcmFtcy51 dl9zdHJpZGU7CisJCQl2ICs9IHBhcmFtcy51dl9zdHJpZGU7CiAJCX0KIAl9CisKKwljb252ZXJ0 X3NyY19wdXQoY3Z0LCBidWYpOwogfQogCi1zdGF0aWMgdm9pZCBjb252ZXJ0X3JnYjI0X3RvX252 MTIoc3RydWN0IGZiX2NvbnZlcnQgKmN2dCkKK3N0YXRpYyB2b2lkIGNvbnZlcnRfcmdiMjRfdG9f eXV2KHN0cnVjdCBmYl9jb252ZXJ0ICpjdnQpCiB7CisJY29uc3Qgc3RydWN0IGZvcm1hdF9kZXNj X3N0cnVjdCAqZHN0X2ZtdCA9CisJCWxvb2t1cF9kcm1fZm9ybWF0KGN2dC0+ZHN0LmZiLT5kcm1f Zm9ybWF0KTsKIAlpbnQgaSwgajsKLQl1aW50OF90ICp5ID0gY3Z0LT5kc3QucHRyICsgY3Z0LT5k c3QuZmItPm9mZnNldHNbMF07Ci0JdWludDhfdCAqdXYgPSBjdnQtPmRzdC5wdHIgKyBjdnQtPmRz dC5mYi0+b2Zmc2V0c1sxXTsKKwl1aW50OF90ICp5LCAqdSwgKnY7CiAJY29uc3QgdWludDhfdCAq cmdiMjQgPSBjdnQtPnNyYy5wdHI7CisJdWludDhfdCBicHAgPSA0OwogCXVuc2lnbmVkIHJnYjI0 X3N0cmlkZSA9IGN2dC0+c3JjLmZiLT5zdHJpZGVzWzBdOwotCXVuc2lnbmVkIHBsYW5hcl9zdHJp ZGUgPSBjdnQtPmRzdC5mYi0+c3RyaWRlc1swXTsKIAlzdHJ1Y3QgaWd0X21hdDQgbSA9IGlndF9y Z2JfdG9feWNiY3JfbWF0cml4KGN2dC0+ZHN0LmZiLT5jb2xvcl9lbmNvZGluZywKIAkJCQkJCSAg ICBjdnQtPmRzdC5mYi0+Y29sb3JfcmFuZ2UpOworCXN0cnVjdCB5dXZfcGFyYW1ldGVycyBwYXJh bXMgPSB7IH07CiAKIAlpZ3RfYXNzZXJ0KGN2dC0+c3JjLmZiLT5kcm1fZm9ybWF0ID09IERSTV9G T1JNQVRfWFJHQjg4ODggJiYKLQkJICAgY3Z0LT5kc3QuZmItPmRybV9mb3JtYXQgPT0gRFJNX0ZP Uk1BVF9OVjEyKTsKKwkJICAgaWd0X2Zvcm1hdF9pc195dXYoY3Z0LT5kc3QuZmItPmRybV9mb3Jt YXQpKTsKIAotCWZvciAoaSA9IDA7IGkgPCBjdnQtPmRzdC5mYi0+aGVpZ2h0IC8gMjsgaSsrKSB7 Ci0JCWZvciAoaiA9IDA7IGogPCBjdnQtPmRzdC5mYi0+d2lkdGggLyAyOyBqKyspIHsKLQkJCS8q IENvbnZlcnQgMngyIHBpeGVsIGJsb2NrcyAqLwotCQkJc3RydWN0IGlndF92ZWM0IHJnYls0XTsK LQkJCXN0cnVjdCBpZ3RfdmVjNCB5dXZbNF07CisJZ2V0X3l1dl9wYXJhbWV0ZXJzKGN2dC0+ZHN0 LmZiLCAmcGFyYW1zKTsKKwl5ID0gY3Z0LT5kc3QucHRyICsgcGFyYW1zLnlfb2Zmc2V0OworCXUg PSBjdnQtPmRzdC5wdHIgKyBwYXJhbXMudV9vZmZzZXQ7CisJdiA9IGN2dC0+ZHN0LnB0ciArIHBh cmFtcy52X29mZnNldDsKIAotCQkJcmVhZF9yZ2IoJnJnYlswXSwgJnJnYjI0W2ogKiA4ICsgMF0p OwotCQkJcmVhZF9yZ2IoJnJnYlsxXSwgJnJnYjI0W2ogKiA4ICsgNF0pOwotCQkJcmVhZF9yZ2Io JnJnYlsyXSwgJnJnYjI0W2ogKiA4ICsgMCArIHJnYjI0X3N0cmlkZV0pOwotCQkJcmVhZF9yZ2Io JnJnYlszXSwgJnJnYjI0W2ogKiA4ICsgNCArIHJnYjI0X3N0cmlkZV0pOwotCi0JCQl5dXZbMF0g PSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnJnYlswXSk7Ci0JCQl5dXZbMV0gPSBpZ3RfbWF0 cml4X3RyYW5zZm9ybSgmbSwgJnJnYlsxXSk7Ci0JCQl5dXZbMl0gPSBpZ3RfbWF0cml4X3RyYW5z Zm9ybSgmbSwgJnJnYlsyXSk7Ci0JCQl5dXZbM10gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwg JnJnYlszXSk7Ci0KLQkJCXlbaiAqIDIgKyAwXSA9IHl1dlswXS5kWzBdOwotCQkJeVtqICogMiAr IDFdID0geXV2WzFdLmRbMF07Ci0JCQl5W2ogKiAyICsgMCArIHBsYW5hcl9zdHJpZGVdID0geXV2 WzJdLmRbMF07Ci0JCQl5W2ogKiAyICsgMSArIHBsYW5hcl9zdHJpZGVdID0geXV2WzNdLmRbMF07 CisJZm9yIChpID0gMDsgaSA8IGN2dC0+ZHN0LmZiLT5oZWlnaHQ7IGkrKykgeworCQljb25zdCB1 aW50OF90ICpyZ2JfdG1wID0gcmdiMjQ7CisJCXVpbnQ4X3QgKnlfdG1wID0geTsKKwkJdWludDhf dCAqdV90bXAgPSB1OworCQl1aW50OF90ICp2X3RtcCA9IHY7CiAKLQkJCS8qCi0JCQkgKiBXZSBh c3N1bWUgdGhlIE1QRUcyIGNocm9tYSBzaXRpbmcgY29udmVudGlvbiwgd2hlcmUKLQkJCSAqIHBp eGVsIGNlbnRlciBmb3IgQ2InQ3InIGlzIGJldHdlZW4gdGhlIGxlZnQgdG9wIGFuZAotCQkJICog Ym90dG9tIHBpeGVsIGluIGEgMngyIGJsb2NrLCBzbyB0YWtlIHRoZSBhdmVyYWdlLgotCQkJICov Ci0JCQl1dltqICogMiArIDBdID0gKHl1dlswXS5kWzFdICsgeXV2WzJdLmRbMV0pIC8gMi4wZjsK LQkJCXV2W2ogKiAyICsgMV0gPSAoeXV2WzBdLmRbMl0gKyB5dXZbMl0uZFsyXSkgLyAyLjBmOwot CQl9CisJCWZvciAoaiA9IDA7IGogPCBjdnQtPmRzdC5mYi0+d2lkdGg7IGorKykgeworCQkJY29u c3QgdWludDhfdCAqcGFpcl9yZ2IyNCA9IHJnYl90bXA7CisJCQlzdHJ1Y3QgaWd0X3ZlYzQgcGFp cl9yZ2IsIHJnYjsKKwkJCXN0cnVjdCBpZ3RfdmVjNCBwYWlyX3l1diwgeXV2OwogCi0JCWlmIChj dnQtPmRzdC5mYi0+d2lkdGggJiAxKSB7Ci0JCQkvKiBDb252ZXJ0IDF4MiBwaXhlbCBibG9jayAq LwotCQkJc3RydWN0IGlndF92ZWM0IHJnYlsyXTsKLQkJCXN0cnVjdCBpZ3RfdmVjNCB5dXZbMl07 CisJCQlyZWFkX3JnYigmcmdiLCByZ2JfdG1wKTsKKwkJCXl1diA9IGlndF9tYXRyaXhfdHJhbnNm b3JtKCZtLCAmcmdiKTsKIAotCQkJcmVhZF9yZ2IoJnJnYlswXSwgJnJnYjI0W2ogKiA4ICsgMF0p OwotCQkJcmVhZF9yZ2IoJnJnYlsyXSwgJnJnYjI0W2ogKiA4ICsgMCArIHJnYjI0X3N0cmlkZV0p OworCQkJcmdiX3RtcCArPSBicHA7CiAKLQkJCXl1dlswXSA9IGlndF9tYXRyaXhfdHJhbnNmb3Jt KCZtLCAmcmdiWzBdKTsKLQkJCXl1dlsxXSA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAmcmdi WzFdKTsKKwkJCSp5X3RtcCA9IHl1di5kWzBdOworCQkJeV90bXAgKz0gcGFyYW1zLnlfaW5jOwog Ci0JCQl5W2ogKiAyICsgMF0gPSB5dXZbMF0uZFswXTsKLQkJCXlbaiAqIDIgKyAwICsgcGxhbmFy X3N0cmlkZV0gPSB5dXZbMV0uZFswXTsKKwkJCWlmICgoaSAlIGRzdF9mbXQtPnZzdWIpIHx8IChq ICUgZHN0X2ZtdC0+aHN1YikpCisJCQkJY29udGludWU7CiAKIAkJCS8qCiAJCQkgKiBXZSBhc3N1 bWUgdGhlIE1QRUcyIGNocm9tYSBzaXRpbmcgY29udmVudGlvbiwgd2hlcmUKIAkJCSAqIHBpeGVs IGNlbnRlciBmb3IgQ2InQ3InIGlzIGJldHdlZW4gdGhlIGxlZnQgdG9wIGFuZAogCQkJICogYm90 dG9tIHBpeGVsIGluIGEgMngyIGJsb2NrLCBzbyB0YWtlIHRoZSBhdmVyYWdlLgorCQkJICoKKwkJ CSAqIFRoZXJlZm9yZSwgaWYgd2UgdXNlIHN1YnNhbXBsaW5nLCB3ZSBvbmx5IHJlYWxseSBjYXJl CisJCQkgKiBhYm91dCB0d28gcGl4ZWxzIGFsbCB0aGUgdGltZSwgZWl0aGVyIHRoZSB0d28KKwkJ CSAqIHN1YnNlcXVlbnQgcGl4ZWxzIGhvcml6b250YWxseSwgdmVydGljYWxseSwgb3IgdGhlCisJ CQkgKiB0d28gY29ybmVycyBpbiBhIDJ4MiBibG9jay4KKwkJCSAqCisJCQkgKiBUaGUgb25seSBj b3JuZXIgY2FzZSBpcyB3aGVuIHdlIGhhdmUgYW4gb2RkIG51bWJlciBvZgorCQkJICogcGl4ZWxz LCBidXQgdGhpcyBjYW4gYmUgaGFuZGxlZCBwcmV0dHkgZWFzaWx5IGJ5IG5vdAorCQkJICogaW5j cmVtZW50aW5nIHRoZSBwYWlyZWQgcGl4ZWwgcG9pbnRlciBpbiB0aGUKKwkJCSAqIGRpcmVjdGlv biBpdCdzIG9kZCBpbi4KIAkJCSAqLwotCQkJdXZbaiAqIDIgKyAwXSA9ICh5dXZbMF0uZFsxXSAr IHl1dlsxXS5kWzFdKSAvIDIuMGY7Ci0JCQl1dltqICogMiArIDFdID0gKHl1dlswXS5kWzJdICsg eXV2WzFdLmRbMl0pIC8gMi4wZjsKLQkJfQotCi0JCXJnYjI0ICs9IDIgKiByZ2IyNF9zdHJpZGU7 Ci0JCXkgKz0gMiAqIHBsYW5hcl9zdHJpZGU7Ci0JCXV2ICs9IHBsYW5hcl9zdHJpZGU7Ci0JfQot Ci0JLyogTGFzdCByb3cgY2Fubm90IGJlIGludGVycG9sYXRlZCBiZXR3ZWVuIDIgcGl4ZWxzLCB0 YWtlIHRoZSBzaW5nbGUgdmFsdWUgKi8KLQlpZiAoY3Z0LT5kc3QuZmItPmhlaWdodCAmIDEpIHsK LQkJZm9yIChqID0gMDsgaiA8IGN2dC0+ZHN0LmZiLT53aWR0aCAvIDI7IGorKykgewotCQkJLyog Q29udmVydCAyeDEgcGl4ZWwgYmxvY2tzICovCi0JCQlzdHJ1Y3QgaWd0X3ZlYzQgcmdiWzJdOwot CQkJc3RydWN0IGlndF92ZWM0IHl1dlsyXTsKLQotCQkJcmVhZF9yZ2IoJnJnYlswXSwgJnJnYjI0 W2ogKiA4ICsgMF0pOwotCQkJcmVhZF9yZ2IoJnJnYlsxXSwgJnJnYjI0W2ogKiA4ICsgNF0pOwot Ci0JCQl5dXZbMF0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnJnYlswXSk7Ci0JCQl5dXZb MV0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnJnYlsxXSk7CisJCQlpZiAoaiAhPSAoY3Z0 LT5kc3QuZmItPndpZHRoIC0gMSkpCisJCQkJcGFpcl9yZ2IyNCArPSAoZHN0X2ZtdC0+aHN1YiAt IDEpICogYnBwOwogCi0JCQl5W2ogKiAyICsgMF0gPSB5dXZbMF0uZFswXTsKLQkJCXlbaiAqIDIg KyAxXSA9IHl1dlsxXS5kWzBdOwotCQkJdXZbaiAqIDIgKyAwXSA9IHl1dlswXS5kWzFdOwotCQkJ dXZbaiAqIDIgKyAxXSA9IHl1dlswXS5kWzJdOwotCQl9Ci0KLQkJaWYgKGN2dC0+ZHN0LmZiLT53 aWR0aCAmIDEpIHsKLQkJCS8qIENvbnZlcnQgc2luZ2xlIHBpeGVsICovCi0JCQlzdHJ1Y3QgaWd0 X3ZlYzQgcmdiOwotCQkJc3RydWN0IGlndF92ZWM0IHl1djsKKwkJCWlmIChpICE9IChjdnQtPmRz dC5mYi0+aGVpZ2h0IC0gMSkpCisJCQkJcGFpcl9yZ2IyNCArPSByZ2IyNF9zdHJpZGUgKiAoZHN0 X2ZtdC0+dnN1YiAtIDEpOwogCi0JCQlyZWFkX3JnYigmcmdiLCAmcmdiMjRbaiAqIDggKyAwXSk7 CisJCQlyZWFkX3JnYigmcGFpcl9yZ2IsIHBhaXJfcmdiMjQpOworCQkJcGFpcl95dXYgPSBpZ3Rf bWF0cml4X3RyYW5zZm9ybSgmbSwgJnBhaXJfcmdiKTsKIAotCQkJeXV2ID0gaWd0X21hdHJpeF90 cmFuc2Zvcm0oJm0sICZyZ2IpOworCQkJKnVfdG1wID0gKHl1di5kWzFdICsgcGFpcl95dXYuZFsx XSkgLyAyLjBmOworCQkJKnZfdG1wID0gKHl1di5kWzJdICsgcGFpcl95dXYuZFsyXSkgLyAyLjBm OwogCi0JCQl5W2ogKiAyICsgMF0gPSB5dXYuZFswXTsKLQkJCXV2W2ogKiAyICsgMF0gPSB5dXYu ZFsxXTsKLQkJCXV2W2ogKiAyICsgMV0gPSB5dXYuZFsyXTsKLQkJfQotCX0KLX0KLQotLyogeyBZ MCwgVSwgWTEsIFYgfSAqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc3dpenpsZV95dXl2 W10gPSB7IDAsIDEsIDIsIDMgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHN3aXp6bGVf eXZ5dVtdID0geyAwLCAzLCAyLCAxIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBzd2l6 emxlX3V5dnlbXSA9IHsgMSwgMCwgMywgMiB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIg c3dpenpsZV92eXV5W10gPSB7IDEsIDIsIDMsIDAgfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVk IGNoYXIgKnl1eXZfc3dpenpsZSh1aW50MzJfdCBmb3JtYXQpCi17Ci0Jc3dpdGNoIChmb3JtYXQp IHsKLQlkZWZhdWx0OgotCWNhc2UgRFJNX0ZPUk1BVF9ZVVlWOgotCQlyZXR1cm4gc3dpenpsZV95 dXl2OwotCWNhc2UgRFJNX0ZPUk1BVF9ZVllVOgotCQlyZXR1cm4gc3dpenpsZV95dnl1OwotCWNh c2UgRFJNX0ZPUk1BVF9VWVZZOgotCQlyZXR1cm4gc3dpenpsZV91eXZ5OwotCWNhc2UgRFJNX0ZP Uk1BVF9WWVVZOgotCQlyZXR1cm4gc3dpenpsZV92eXV5OwotCX0KLX0KLQotc3RhdGljIHZvaWQg Y29udmVydF95dXl2X3RvX3JnYjI0KHN0cnVjdCBmYl9jb252ZXJ0ICpjdnQpCi17Ci0JaW50IGks IGo7Ci0JY29uc3QgdWludDhfdCAqeXV5djsKLQl1aW50OF90ICpyZ2IyNCA9IGN2dC0+ZHN0LnB0 cjsKLQl1bnNpZ25lZCBpbnQgcmdiMjRfc3RyaWRlID0gY3Z0LT5kc3QuZmItPnN0cmlkZXNbMF07 Ci0JdW5zaWduZWQgaW50IHl1eXZfc3RyaWRlID0gY3Z0LT5zcmMuZmItPnN0cmlkZXNbMF07Ci0J c3RydWN0IGlndF9tYXQ0IG0gPSBpZ3RfeWNiY3JfdG9fcmdiX21hdHJpeChjdnQtPnNyYy5mYi0+ Y29sb3JfZW5jb2RpbmcsCi0JCQkJCQkgICAgY3Z0LT5zcmMuZmItPmNvbG9yX3JhbmdlKTsKLQlj b25zdCB1bnNpZ25lZCBjaGFyICpzd3ogPSB5dXl2X3N3aXp6bGUoY3Z0LT5zcmMuZmItPmRybV9m b3JtYXQpOwotCXVpbnQ4X3QgKmJ1ZjsKLQotCWlndF9hc3NlcnQoKGN2dC0+c3JjLmZiLT5kcm1f Zm9ybWF0ID09IERSTV9GT1JNQVRfWVVZViB8fAotCQkgICAgY3Z0LT5zcmMuZmItPmRybV9mb3Jt YXQgPT0gRFJNX0ZPUk1BVF9VWVZZIHx8Ci0JCSAgICBjdnQtPnNyYy5mYi0+ZHJtX2Zvcm1hdCA9 PSBEUk1fRk9STUFUX1lWWVUgfHwKLQkJICAgIGN2dC0+c3JjLmZiLT5kcm1fZm9ybWF0ID09IERS TV9GT1JNQVRfVllVWSkgJiYKLQkJICAgY3Z0LT5kc3QuZmItPmRybV9mb3JtYXQgPT0gRFJNX0ZP Uk1BVF9YUkdCODg4OCk7Ci0KLQlidWYgPSBjb252ZXJ0X3NyY19nZXQoY3Z0KTsKLQl5dXl2ID0g YnVmOwotCi0JZm9yIChpID0gMDsgaSA8IGN2dC0+ZHN0LmZiLT5oZWlnaHQ7IGkrKykgewotCQlm b3IgKGogPSAwOyBqIDwgY3Z0LT5kc3QuZmItPndpZHRoIC8gMjsgaisrKSB7Ci0JCQkvKiBDb252 ZXJ0IDJ4MSBwaXhlbCBibG9ja3MgKi8KLQkJCXN0cnVjdCBpZ3RfdmVjNCB5dXZbMl07Ci0JCQlz dHJ1Y3QgaWd0X3ZlYzQgcmdiWzJdOwotCi0JCQl5dXZbMF0uZFswXSA9IHl1eXZbaiAqIDQgKyBz d3pbMF1dOwotCQkJeXV2WzFdLmRbMF0gPSB5dXl2W2ogKiA0ICsgc3d6WzJdXTsKLQkJCXl1dlsw XS5kWzFdID0geXV2WzFdLmRbMV0gPSB5dXl2W2ogKiA0ICsgc3d6WzFdXTsKLQkJCXl1dlswXS5k WzJdID0geXV2WzFdLmRbMl0gPSB5dXl2W2ogKiA0ICsgc3d6WzNdXTsKLQkJCXl1dlswXS5kWzNd ID0geXV2WzFdLmRbM10gPSAxLjBmOwotCi0JCQlyZ2JbMF0gPSBpZ3RfbWF0cml4X3RyYW5zZm9y bSgmbSwgJnl1dlswXSk7Ci0JCQlyZ2JbMV0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnl1 dlsxXSk7Ci0KLQkJCXdyaXRlX3JnYigmcmdiMjRbaiAqIDggKyAwXSwgJnJnYlswXSk7Ci0JCQl3 cml0ZV9yZ2IoJnJnYjI0W2ogKiA4ICsgNF0sICZyZ2JbMV0pOwotCQl9Ci0KLQkJaWYgKGN2dC0+ ZHN0LmZiLT53aWR0aCAmIDEpIHsKLQkJCXN0cnVjdCBpZ3RfdmVjNCB5dXY7Ci0JCQlzdHJ1Y3Qg aWd0X3ZlYzQgcmdiOwotCi0JCQl5dXYuZFswXSA9IHl1eXZbaiAqIDQgKyBzd3pbMF1dOwotCQkJ eXV2LmRbMV0gPSB5dXl2W2ogKiA0ICsgc3d6WzFdXTsKLQkJCXl1di5kWzJdID0geXV5dltqICog NCArIHN3elszXV07Ci0JCQl5dXYuZFszXSA9IDEuMGY7Ci0KLQkJCXJnYiA9IGlndF9tYXRyaXhf dHJhbnNmb3JtKCZtLCAmeXV2KTsKLQotCQkJd3JpdGVfcmdiKCZyZ2IyNFtqICogOCArIDBdLCAm cmdiKTsKKwkJCXVfdG1wICs9IHBhcmFtcy51dl9pbmM7CisJCQl2X3RtcCArPSBwYXJhbXMudXZf aW5jOwogCQl9CiAKIAkJcmdiMjQgKz0gcmdiMjRfc3RyaWRlOwotCQl5dXl2ICs9IHl1eXZfc3Ry aWRlOwotCX0KLQotCWNvbnZlcnRfc3JjX3B1dChjdnQsIGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lk IGNvbnZlcnRfcmdiMjRfdG9feXV5dihzdHJ1Y3QgZmJfY29udmVydCAqY3Z0KQotewotCWludCBp LCBqOwotCXVpbnQ4X3QgKnl1eXYgPSBjdnQtPmRzdC5wdHI7Ci0JY29uc3QgdWludDhfdCAqcmdi MjQgPSBjdnQtPnNyYy5wdHI7Ci0JdW5zaWduZWQgcmdiMjRfc3RyaWRlID0gY3Z0LT5zcmMuZmIt PnN0cmlkZXNbMF07Ci0JdW5zaWduZWQgeXV5dl9zdHJpZGUgPSBjdnQtPmRzdC5mYi0+c3RyaWRl c1swXTsKLQlzdHJ1Y3QgaWd0X21hdDQgbSA9IGlndF9yZ2JfdG9feWNiY3JfbWF0cml4KGN2dC0+ ZHN0LmZiLT5jb2xvcl9lbmNvZGluZywKLQkJCQkJCSAgICBjdnQtPmRzdC5mYi0+Y29sb3JfcmFu Z2UpOwotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnN3eiA9IHl1eXZfc3dpenpsZShjdnQtPmRzdC5m Yi0+ZHJtX2Zvcm1hdCk7Ci0KLQlpZ3RfYXNzZXJ0KGN2dC0+c3JjLmZiLT5kcm1fZm9ybWF0ID09 IERSTV9GT1JNQVRfWFJHQjg4ODggJiYKLQkJICAgKGN2dC0+ZHN0LmZiLT5kcm1fZm9ybWF0ID09 IERSTV9GT1JNQVRfWVVZViB8fAotCQkgICAgY3Z0LT5kc3QuZmItPmRybV9mb3JtYXQgPT0gRFJN X0ZPUk1BVF9VWVZZIHx8Ci0JCSAgICBjdnQtPmRzdC5mYi0+ZHJtX2Zvcm1hdCA9PSBEUk1fRk9S TUFUX1lWWVUgfHwKLQkJICAgIGN2dC0+ZHN0LmZiLT5kcm1fZm9ybWF0ID09IERSTV9GT1JNQVRf VllVWSkpOwotCi0JZm9yIChpID0gMDsgaSA8IGN2dC0+ZHN0LmZiLT5oZWlnaHQ7IGkrKykgewot CQlmb3IgKGogPSAwOyBqIDwgY3Z0LT5kc3QuZmItPndpZHRoIC8gMjsgaisrKSB7Ci0JCQkvKiBD b252ZXJ0IDJ4MSBwaXhlbCBibG9ja3MgKi8KLQkJCXN0cnVjdCBpZ3RfdmVjNCByZ2JbMl07Ci0J CQlzdHJ1Y3QgaWd0X3ZlYzQgeXV2WzJdOwotCi0JCQlyZWFkX3JnYigmcmdiWzBdLCAmcmdiMjRb aiAqIDggKyAwXSk7Ci0JCQlyZWFkX3JnYigmcmdiWzFdLCAmcmdiMjRbaiAqIDggKyA0XSk7Ci0K LQkJCXl1dlswXSA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAmcmdiWzBdKTsKLQkJCXl1dlsx XSA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAmcmdiWzFdKTsKKwkJeSArPSBwYXJhbXMueV9z dHJpZGU7CiAKLQkJCXl1eXZbaiAqIDQgKyBzd3pbMF1dID0geXV2WzBdLmRbMF07Ci0JCQl5dXl2 W2ogKiA0ICsgc3d6WzJdXSA9IHl1dlsxXS5kWzBdOwotCQkJeXV5dltqICogNCArIHN3elsxXV0g PSAoeXV2WzBdLmRbMV0gKyB5dXZbMV0uZFsxXSkgLyAyLjBmOwotCQkJeXV5dltqICogNCArIHN3 elszXV0gPSAoeXV2WzBdLmRbMl0gKyB5dXZbMV0uZFsyXSkgLyAyLjBmOworCQlpZiAoKGkgJSBk c3RfZm10LT52c3ViKSA9PSAoZHN0X2ZtdC0+dnN1YiAtIDEpKSB7CisJCQl1ICs9IHBhcmFtcy51 dl9zdHJpZGU7CisJCQl2ICs9IHBhcmFtcy51dl9zdHJpZGU7CiAJCX0KLQotCQlpZiAoY3Z0LT5k c3QuZmItPndpZHRoICYgMSkgewotCQkJc3RydWN0IGlndF92ZWM0IHJnYjsKLQkJCXN0cnVjdCBp Z3RfdmVjNCB5dXY7Ci0KLQkJCXJlYWRfcmdiKCZyZ2IsICZyZ2IyNFtqICogOCArIDBdKTsKLQot CQkJeXV2ID0gaWd0X21hdHJpeF90cmFuc2Zvcm0oJm0sICZyZ2IpOwotCi0JCQl5dXl2W2ogKiA0 ICsgc3d6WzBdXSA9IHl1di5kWzBdOwotCQkJeXV5dltqICogNCArIHN3elsxXV0gPSB5dXYuZFsx XTsKLQkJCXl1eXZbaiAqIDQgKyBzd3pbM11dID0geXV2LmRbMl07Ci0JCX0KLQotCQlyZ2IyNCAr PSByZ2IyNF9zdHJpZGU7Ci0JCXl1eXYgKz0geXV5dl9zdHJpZGU7CiAJfQogfQogCkBAIC0yMDQ2 LDMxICsxODU5LDIzIEBAIHN0YXRpYyB2b2lkIGZiX2NvbnZlcnQoc3RydWN0IGZiX2NvbnZlcnQg KmN2dCkKIAl9IGVsc2UgaWYgKGN2dC0+ZHN0LmZiLT5kcm1fZm9ybWF0ID09IERSTV9GT1JNQVRf WFJHQjg4ODgpIHsKIAkJc3dpdGNoIChjdnQtPnNyYy5mYi0+ZHJtX2Zvcm1hdCkgewogCQljYXNl IERSTV9GT1JNQVRfWFlVVjg4ODg6Ci0JCQljb252ZXJ0X3l1djQ0NF90b19yZ2IyNChjdnQpOwot CQkJcmV0dXJuOwogCQljYXNlIERSTV9GT1JNQVRfTlYxMjoKLQkJCWNvbnZlcnRfbnYxMl90b19y Z2IyNChjdnQpOwotCQkJcmV0dXJuOwotCQljYXNlIERSTV9GT1JNQVRfWVVZVjoKLQkJY2FzZSBE Uk1fRk9STUFUX1lWWVU6CiAJCWNhc2UgRFJNX0ZPUk1BVF9VWVZZOgogCQljYXNlIERSTV9GT1JN QVRfVllVWToKLQkJCWNvbnZlcnRfeXV5dl90b19yZ2IyNChjdnQpOworCQljYXNlIERSTV9GT1JN QVRfWVVZVjoKKwkJY2FzZSBEUk1fRk9STUFUX1lWWVU6CisJCQljb252ZXJ0X3l1dl90b19yZ2Iy NChjdnQpOwogCQkJcmV0dXJuOwogCQl9CiAJfSBlbHNlIGlmIChjdnQtPnNyYy5mYi0+ZHJtX2Zv cm1hdCA9PSBEUk1fRk9STUFUX1hSR0I4ODg4KSB7CiAJCXN3aXRjaCAoY3Z0LT5kc3QuZmItPmRy bV9mb3JtYXQpIHsKIAkJY2FzZSBEUk1fRk9STUFUX1hZVVY4ODg4OgotCQkJY29udmVydF9yZ2Iy NF90b195dXY0NDQoY3Z0KTsKLQkJCXJldHVybjsKIAkJY2FzZSBEUk1fRk9STUFUX05WMTI6Ci0J CQljb252ZXJ0X3JnYjI0X3RvX252MTIoY3Z0KTsKLQkJCXJldHVybjsKIAkJY2FzZSBEUk1fRk9S TUFUX1lVWVY6CiAJCWNhc2UgRFJNX0ZPUk1BVF9ZVllVOgogCQljYXNlIERSTV9GT1JNQVRfVVlW WToKIAkJY2FzZSBEUk1fRk9STUFUX1ZZVVk6Ci0JCQljb252ZXJ0X3JnYjI0X3RvX3l1eXYoY3Z0 KTsKKwkJCWNvbnZlcnRfcmdiMjRfdG9feXV2KGN2dCk7CiAJCQlyZXR1cm47CiAJCX0KIAl9Ci0t IAoyLjIwLjEKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f CmlndC1kZXYgbWFpbGluZyBsaXN0CmlndC1kZXZAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBz Oi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaWd0LWRldgo=