From mboxrd@z Thu Jan 1 00:00:00 1970 From: Yakir Yang Subject: [PATCH v8.1 1/2] drm/rockchip: hdmi: add Innosilicon HDMI support Date: Wed, 3 Feb 2016 17:44:57 +0800 Message-ID: <1454492697-7837-1-git-send-email-ykk@rock-chips.com> References: <1454049768-30872-1-git-send-email-ykk@rock-chips.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1454049768-30872-1-git-send-email-ykk@rock-chips.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Mark Yao , Heiko Stuebner Cc: Mark Rutland , devicetree@vger.kernel.org, Pawel Moll , Ian Campbell , Ben Chan , Ken Mixte , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-rockchip@lists.infradead.org, Rob Herring , Kumar Gala , Thierry Reding , linux-arm-kernel@lists.infradead.org, Zheng Yang List-Id: devicetree@vger.kernel.org VGhlIElubm9zaWxpY29uIEhETUkgaXMgYSBsb3cgcG93ZXIgSERNSSAxLjQgdHJhbnNtaXR0ZXIK SVAsIGFuZCBpdCBoYXZlIGJlZW4gaW50ZWdyYXRlZCBvbiBzb21lIHJvY2tjaGlwIENQVXMKKGxp a2UgUkszMDM2LCBSSzMxMngpLgoKU2lnbmVkLW9mZi1ieTogWWFraXIgWWFuZyA8eWtrQHJvY2st Y2hpcHMuY29tPgotLS0KQ2hhbmdlcyBpbiB2OC4xOgotIFJlbW92ZWQgdGhlIHVudXNlZCAiZHJt X2VuY29kZXJfc2xhdmUuaCIgaGVhZCBmaWxlLiAoSmVhbikKCkNoYW5nZXMgaW4gdjg6Ci0gRG9u J3QgY2hlY2sgd2hldGhlciBlbmNvZGVyIG91dHB1dCBmb3JtYXQgaXMgUkdCIGNvbG9yc3BhY2Us IGNhdXNlIGRyaXZlcgogIGRlZmF1bHQgY29uZmlndXJlIHRoZSBvdXRwdXQgY29sb3JzcGFjZSB0 byBSR0IuIChaaGVuZ1lhbmcpCi0gQ29ycmVjdCB0aGUgY2hlY2sgY29uZGl0aW9uIGluIGlubm9f aGRtaV9jb25maWdfdmlkZW9fY3NjKCkgKFpoZW5nWWFuZykKICAgIC0gaWYgKGRhdGEtPmVuY19v dXRfZm9ybWF0ID09IGRhdGEtPmVuY19vdXRfZm9ybWF0KSB7CiAgICArIGlmIChkYXRhLT5lbmNf aW5fZm9ybWF0ID09IGRhdGEtPmVuY19vdXRfZm9ybWF0KSB7CgpDaGFuZ2VzIGluIHY3OgotIENv cnJlY3QgdGhlIG1vZHVsZSBsaWNuZXNlIHN0YXRlbWVudCAoUGF1bCkKICAgICAtIE1PRFVMRV9M SUNFTlNFKCJHUEwiKTsKICAgICArIE1PRFVMRV9MSUNFTlNFKCJHUEx2MiIpOwotIFN0YXJ0IGlu ZGVudGF0aW9uIHdpdGggdGFicyBhbmQgZml4IHRoZSBtaXNzcGVsbCBpbiBLY29uZmlnIChQYXVs KQotIENhcnJ5IHRoZSBsb3N0IGRldmljZS1iaW5kaW5nIGRvY3VtZW50IChIZWlrbykKCkNoYW5n ZXMgaW4gdjY6Ci0gUmViYXNlIHRoZSBNYWtlZmlsZS9LY29uZmlnIGZpbGVzIHdoaWNoIGFkZCBi eSBDaHJpcydzIHJvY2tjaGlwLW1pcGkgZHJpdmVyIChDYWVzZXIpCgpDaGFuZ2VzIGluIHY1Ogot IFVzZSBoZG1pX2luZm9mcmFtZSBoZWxwZXIgZnVuY3Rpb25zIHRvIHBhY2tlZCB0aGUgaW5mb2Zy YW1lIChSdXNzZWxsKQotIFJlbW92ZSB0aGUgdW51c2VkIGRvdWJsZSB3YWl0X2Zvcl9jb21wbGV0 aW9uX3RpbWVvdXQgZm9yIGRkYyB0cmFuc2ZlciAoUnVzc2VsbCkKLSBSZW1vdmUgdGhlIHVudXNl ZCBsb2NhbCB2YXJpYWJsZSBpbiAiaW5ub19oZG1pX2kyY193cml0ZSgpIiBmdW5jdGlvbiAoUnVz c2VsbCkKCkNoYW5nZXMgaW4gdjQ6Ci0gTW9kaWZ5IHRoZSBjb21taXQgdGl0bGUgImRybS9yb2Nr Y2hpcDogaGRtaTogLi4uIiAoTWFyaykKLSBDb3JyZWN0IHRoZSAiREtNUyIgdG8gIkRQTVMiIChN YXJrKQotIEZpeCBvdmVyIDgwIGNoYXJhY3RlcnMgcHJvYmxlbXMgKE1hcmspCi0gUmVtb3ZlIGVu Y29kZXIgLnByZXBhcmUvLmNvbW1pdCBoZWxwZXIgZnVuY3Rpb25zLCBhbmQgbW92ZSB0aGUgdm9w IG1vZGUKY29uZmlndXJlIGZ1bmN0aW9uIGludG8gZW5jb2RlciAuZW5hYmxlIGhlbHBlciBmdW5j dGlvbnMuIChNYXJrKQoKQ2hhbmdlcyBpbiB2MzoKLSBVc2UgZW5jb2RlciBlbmFibGUvZGlzYWJs ZSBmdW5jdGlvbiwgYW5kIHJlbW92ZSB0aGUgZW5jb2RlciBEUE1TIGZ1bmN0aW9uCi0gS2VlcCBI RE1JIFBMTCBwb3dlciBvbiBpbiBzdGFuZGJ5IG1vZGUKCkNoYW5nZXMgaW4gdjI6Ci0gVXNpbmcg RFJNIGF0b21pYyBoZWxwZXIgZnVuY3Rpb25zIGZvciBjb25uZWN0b3IgaW5pdCAoTWFyaykKLSBS ZW1vdmUgImhkbWktPmNvbm5lY3Rvci5lbmNvZGVyID0gZW5jb2RlcjsiIChNYXJrKQoKIGRyaXZl cnMvZ3B1L2RybS9yb2NrY2hpcC9LY29uZmlnICAgICB8ICAgOCArCiBkcml2ZXJzL2dwdS9kcm0v cm9ja2NoaXAvTWFrZWZpbGUgICAgfCAgIDEgKwogZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2lu bm9faGRtaS5jIHwgOTM4ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBkcml2 ZXJzL2dwdS9kcm0vcm9ja2NoaXAvaW5ub19oZG1pLmggfCAzNjIgKysrKysrKysrKysrKysKIDQg ZmlsZXMgY2hhbmdlZCwgMTMwOSBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJp dmVycy9ncHUvZHJtL3JvY2tjaGlwL2lubm9faGRtaS5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJp dmVycy9ncHUvZHJtL3JvY2tjaGlwL2lubm9faGRtaS5oCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL3JvY2tjaGlwL0tjb25maWcgYi9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvS2NvbmZp ZwppbmRleCA4NTczOTg1Li43NmIzMzYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcm9j a2NoaXAvS2NvbmZpZworKysgYi9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvS2NvbmZpZwpAQCAt MzUsMyArMzUsMTEgQEAgY29uZmlnIFJPQ0tDSElQX0RXX01JUElfRFNJCiAJIGZvciB0aGUgU3lu b3BzeXMgRGVzaWduV2FyZSBIRE1JIGRyaXZlci4gSWYgeW91IHdhbnQgdG8KIAkgZW5hYmxlIE1J UEkgRFNJIG9uIFJLMzI4OCBiYXNlZCBTb0MsIHlvdSBzaG91bGQgc2VsZXQgdGhpcwogCSBvcHRp b24uCisKK2NvbmZpZyBST0NLQ0hJUF9JTk5PX0hETUkKKwl0cmlzdGF0ZSAiUm9ja2NoaXAgc3Bl Y2lmaWMgZXh0ZW5zaW9ucyBmb3IgSW5ub3NpbGljb24gSERNSSIKKwlkZXBlbmRzIG9uIERSTV9S T0NLQ0hJUAorCWhlbHAKKwkgIFRoaXMgc2VsZWN0cyBzdXBwb3J0IGZvciBSb2NrY2hpcCBTb0Mg c3BlY2lmaWMgZXh0ZW5zaW9ucworCSAgZm9yIHRoZSBJbm5vc2lsaWNvbiBIRE1JIGRyaXZlci4g SWYgeW91IHdhbnQgdG8gZW5hYmxlCisJICBIRE1JIG9uIFJLMzAzNiBiYXNlZCBTb0MsIHlvdSBz aG91bGQgc2VsZWN0IHRoaXMgb3B0aW9uLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Jv Y2tjaGlwL01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL01ha2VmaWxlCmluZGV4 IGY2YTgwOWEuLmRmOGZiZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9N YWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vcm9ja2NoaXAvTWFrZWZpbGUKQEAgLTgsNSAr OCw2IEBAIHJvY2tjaGlwZHJtLSQoQ09ORklHX0RSTV9GQkRFVl9FTVVMQVRJT04pICs9IHJvY2tj aGlwX2RybV9mYmRldi5vCiAKIG9iai0kKENPTkZJR19ST0NLQ0hJUF9EV19IRE1JKSArPSBkd19o ZG1pLXJvY2tjaGlwLm8KIG9iai0kKENPTkZJR19ST0NLQ0hJUF9EV19NSVBJX0RTSSkgKz0gZHct bWlwaS1kc2kubworb2JqLSQoQ09ORklHX1JPQ0tDSElQX0lOTk9fSERNSSkgKz0gaW5ub19oZG1p Lm8KIAogb2JqLSQoQ09ORklHX0RSTV9ST0NLQ0hJUCkgKz0gcm9ja2NoaXBkcm0ubyByb2NrY2hp cF92b3BfcmVnLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9pbm5vX2hk bWkuYyBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9pbm5vX2hkbWkuYwpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGQ2MmZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVy cy9ncHUvZHJtL3JvY2tjaGlwL2lubm9faGRtaS5jCkBAIC0wLDAgKzEsOTM4IEBACisvKgorICog Q29weXJpZ2h0IChDKSBGdXpob3UgUm9ja2NoaXAgRWxlY3Ryb25pY3MgQ28uTHRkCisgKiAgICBa aGVuZyBZYW5nIDx6aGVuZ3lhbmdAcm9jay1jaGlwcy5jb20+CisgKiAgICBZYWtpciBZYW5nIDx5 a2tAcm9jay1jaGlwcy5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRl ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9u IDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAq IG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVy bXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg aXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaXJx Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNp bmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9oZG1pLmg+CisjaW5jbHVkZSA8 bGludXgvbWZkL3N5c2Nvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUg PGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisKKyNpbmNsdWRl IDxkcm0vZHJtX29mLmg+CisjaW5jbHVkZSA8ZHJtL2RybVAuaD4KKyNpbmNsdWRlIDxkcm0vZHJt X2F0b21pY19oZWxwZXIuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX2NydGNfaGVscGVyLmg+CisjaW5j bHVkZSA8ZHJtL2RybV9lZGlkLmg+CisKKyNpbmNsdWRlICJyb2NrY2hpcF9kcm1fZHJ2LmgiCisj aW5jbHVkZSAicm9ja2NoaXBfZHJtX3ZvcC5oIgorCisjaW5jbHVkZSAiaW5ub19oZG1pLmgiCisK KyNkZWZpbmUgdG9faW5ub19oZG1pKHgpCWNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgaW5ub19oZG1p LCB4KQorCitzdHJ1Y3QgaGRtaV9kYXRhX2luZm8geworCWludCB2aWM7CisJYm9vbCBzaW5rX2lz X2hkbWk7CisJYm9vbCBzaW5rX2hhc19hdWRpbzsKKwl1bnNpZ25lZCBpbnQgZW5jX2luX2Zvcm1h dDsKKwl1bnNpZ25lZCBpbnQgZW5jX291dF9mb3JtYXQ7CisJdW5zaWduZWQgaW50IGNvbG9yaW1l dHJ5OworfTsKKworc3RydWN0IGlubm9faGRtaV9pMmMgeworCXN0cnVjdCBpMmNfYWRhcHRlciBh ZGFwOworCisJdTggZGRjX2FkZHI7CisJdTggc2VnbWVudF9hZGRyOworCisJc3RydWN0IG11dGV4 IGxvY2s7CisJc3RydWN0IGNvbXBsZXRpb24gY21wOworfTsKKworc3RydWN0IGlubm9faGRtaSB7 CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlICpkcm1fZGV2OworCisJ aW50IGlycTsKKwlzdHJ1Y3QgY2xrICpwY2xrOworCXZvaWQgX19pb21lbSAqcmVnczsKKworCXN0 cnVjdCBkcm1fY29ubmVjdG9yCWNvbm5lY3RvcjsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIJZW5jb2Rl cjsKKworCXN0cnVjdCBpbm5vX2hkbWlfaTJjICppMmM7CisJc3RydWN0IGkyY19hZGFwdGVyICpk ZGM7CisKKwl1bnNpZ25lZCBpbnQgdG1kc19yYXRlOworCisJc3RydWN0IGhkbWlfZGF0YV9pbmZv CWhkbWlfZGF0YTsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSBwcmV2aW91c19tb2RlOworfTsK KworZW51bSB7CisJQ1NDX0lUVTYwMV8xNl8yMzVfVE9fUkdCXzBfMjU1XzhCSVQsCisJQ1NDX0lU VTYwMV8wXzI1NV9UT19SR0JfMF8yNTVfOEJJVCwKKwlDU0NfSVRVNzA5XzE2XzIzNV9UT19SR0Jf MF8yNTVfOEJJVCwKKwlDU0NfUkdCXzBfMjU1X1RPX0lUVTYwMV8xNl8yMzVfOEJJVCwKKwlDU0Nf UkdCXzBfMjU1X1RPX0lUVTcwOV8xNl8yMzVfOEJJVCwKKwlDU0NfUkdCXzBfMjU1X1RPX1JHQl8x Nl8yMzVfOEJJVCwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyIGNvZWZmX2NzY1tdWzI0XSA9IHsK KwkvKgorCSAqIFlVVjJSR0I6NjAxIFNEIG1vZGUoWVsxNjoyMzVdLCBVVlsxNjoyNDBdLCBSR0Jb MDoyNTVdKToKKwkgKiAgIFIgPSAxLjE2NCpZICsgMS41OTYqViAtIDIwNAorCSAqICAgRyA9IDEu MTY0KlkgLSAwLjM5MSpVIC0gMC44MTMqViArIDE1NAorCSAqICAgQiA9IDEuMTY0KlkgKyAyLjAx OCpVIC0gMjU4CisJICovCisJeworCQkweDA0LCAweGE3LCAweDAwLCAweDAwLCAweDA2LCAweDYy LCAweDAyLCAweGNjLAorCQkweDA0LCAweGE3LCAweDExLCAweDkwLCAweDEzLCAweDQwLCAweDAw LCAweDlhLAorCQkweDA0LCAweGE3LCAweDA4LCAweDEyLCAweDAwLCAweDAwLCAweDAzLCAweDAy CisJfSwKKwkvKgorCSAqIFlVVjJSR0I6NjAxIFNEIG1vZGUoWVVWWzA6MjU1XSxSR0JbMDoyNTVd KToKKwkgKiAgIFIgPSBZICsgMS40MDIqViAtIDI0OAorCSAqICAgRyA9IFkgLSAwLjM0NCpVIC0g MC43MTQqViArIDEzNQorCSAqICAgQiA9IFkgKyAxLjc3MipVIC0gMjI3CisJICovCisJeworCQkw eDA0LCAweDAwLCAweDAwLCAweDAwLCAweDA1LCAweDliLCAweDAyLCAweGY4LAorCQkweDA0LCAw eDAwLCAweDExLCAweDYwLCAweDEyLCAweGRiLCAweDAwLCAweDg3LAorCQkweDA0LCAweDAwLCAw eDA3LCAweDE2LCAweDAwLCAweDAwLCAweDAyLCAweGUzCisJfSwKKwkvKgorCSAqIFlVVjJSR0I6 NzA5IEhEIG1vZGUoWVsxNjoyMzVdLFVWWzE2OjI0MF0sUkdCWzA6MjU1XSk6CisJICogICBSID0g MS4xNjQqWSArIDEuNzkzKlYgLSAyNDgKKwkgKiAgIEcgPSAxLjE2NCpZIC0gMC4yMTMqVSAtIDAu NTM0KlYgKyA3NworCSAqICAgQiA9IDEuMTY0KlkgKyAyLjExNSpVIC0gMjg5CisJICovCisJewor CQkweDA0LCAweGE3LCAweDAwLCAweDAwLCAweDA3LCAweDJjLCAweDAyLCAweGY4LAorCQkweDA0 LCAweGE3LCAweDEwLCAweGRhLCAweDEyLCAweDIyLCAweDAwLCAweDRkLAorCQkweDA0LCAweGE3 LCAweDA4LCAweDc0LCAweDAwLCAweDAwLCAweDAzLCAweDIxCisJfSwKKworCS8qCisJICogUkdC MllVVjo2MDEgU0QgbW9kZToKKwkgKiAgIENiID0gLTAuMjkxRyAtIDAuMTQ4UiArIDAuNDM5QiAr IDEyOAorCSAqICAgWSAgPSAwLjUwNEcgICsgMC4yNTdSICsgMC4wOThCICsgMTYKKwkgKiAgIENy ID0gLTAuMzY4RyArIDAuNDM5UiAtIDAuMDcxQiArIDEyOAorCSAqLworCXsKKwkJMHgxMSwgMHg1 ZiwgMHgwMSwgMHg4MiwgMHgxMCwgMHgyMywgMHgwMCwgMHg4MCwKKwkJMHgwMiwgMHgxYywgMHgw MCwgMHhhMSwgMHgwMCwgMHgzNiwgMHgwMCwgMHgxZSwKKwkJMHgxMSwgMHgyOSwgMHgxMCwgMHg1 OSwgMHgwMSwgMHg4MiwgMHgwMCwgMHg4MAorCX0sCisJLyoKKwkgKiBSR0IyWVVWOjcwOSBIRCBt b2RlOgorCSAqICAgQ2IgPSAtIDAuMzM4RyAtIDAuMTAxUiArIDAuNDM5QiArIDEyOAorCSAqICAg WSAgPSAwLjYxNEcgICArIDAuMTgzUiArIDAuMDYyQiArIDE2CisJICogICBDciA9IC0gMC4zOTlH ICsgMC40MzlSIC0gMC4wNDBCICsgMTI4CisJICovCisJeworCQkweDExLCAweDk4LCAweDAxLCAw eGMxLCAweDEwLCAweDI4LCAweDAwLCAweDgwLAorCQkweDAyLCAweDc0LCAweDAwLCAweGJiLCAw eDAwLCAweDNmLCAweDAwLCAweDEwLAorCQkweDExLCAweDVhLCAweDEwLCAweDY3LCAweDAxLCAw eGMxLCAweDAwLCAweDgwCisJfSwKKwkvKgorCSAqIFJHQlswOjI1NV0yUkdCWzE2OjIzNV06CisJ ICogICBSJyA9IFIgeCAoMjM1LTE2KS8yNTUgKyAxNjsKKwkgKiAgIEcnID0gRyB4ICgyMzUtMTYp LzI1NSArIDE2OworCSAqICAgQicgPSBCIHggKDIzNS0xNikvMjU1ICsgMTY7CisJICovCisJewor CQkweDAwLCAweDAwLCAweDAzLCAweDZGLCAweDAwLCAweDAwLCAweDAwLCAweDEwLAorCQkweDAz LCAweDZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLAorCQkweDAwLCAweDAw LCAweDAwLCAweDAwLCAweDAzLCAweDZGLCAweDAwLCAweDEwCisJfSwKK307CisKK3N0YXRpYyBp bmxpbmUgdTggaGRtaV9yZWFkYihzdHJ1Y3QgaW5ub19oZG1pICpoZG1pLCB1MTYgb2Zmc2V0KQor eworCXJldHVybiByZWFkbF9yZWxheGVkKGhkbWktPnJlZ3MgKyAob2Zmc2V0KSAqIDB4MDQpOwor fQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGRtaV93cml0ZWIoc3RydWN0IGlubm9faGRtaSAqaGRt aSwgdTE2IG9mZnNldCwgdTMyIHZhbCkKK3sKKwl3cml0ZWxfcmVsYXhlZCh2YWwsIGhkbWktPnJl Z3MgKyAob2Zmc2V0KSAqIDB4MDQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGRtaV9tb2Ri KHN0cnVjdCBpbm5vX2hkbWkgKmhkbWksIHUxNiBvZmZzZXQsCisJCQkgICAgIHUzMiBtc2ssIHUz MiB2YWwpCit7CisJdTggdGVtcCA9IGhkbWlfcmVhZGIoaGRtaSwgb2Zmc2V0KSAmIH5tc2s7CisK Kwl0ZW1wIHw9IHZhbCAmIG1zazsKKwloZG1pX3dyaXRlYihoZG1pLCBvZmZzZXQsIHRlbXApOwor fQorCitzdGF0aWMgdm9pZCBpbm5vX2hkbWlfaTJjX2luaXQoc3RydWN0IGlubm9faGRtaSAqaGRt aSkKK3sKKwlpbnQgZGRjX2J1c19mcmVxOworCisJZGRjX2J1c19mcmVxID0gKGhkbWktPnRtZHNf cmF0ZSA+PiAyKSAvIEhETUlfU0NMX1JBVEU7CisKKwloZG1pX3dyaXRlYihoZG1pLCBERENfQlVT X0ZSRVFfTCwgZGRjX2J1c19mcmVxICYgMHhGRik7CisJaGRtaV93cml0ZWIoaGRtaSwgRERDX0JV U19GUkVRX0gsIChkZGNfYnVzX2ZyZXEgPj4gOCkgJiAweEZGKTsKKworCS8qIENsZWFyIHRoZSBF RElEIGludGVycnVwdCBmbGFnIGFuZCBtdXRlIHRoZSBpbnRlcnJ1cHQgKi8KKwloZG1pX3dyaXRl YihoZG1pLCBIRE1JX0lOVEVSUlVQVF9NQVNLMSwgMCk7CisJaGRtaV93cml0ZWIoaGRtaSwgSERN SV9JTlRFUlJVUFRfU1RBVFVTMSwgbV9JTlRfRURJRF9SRUFEWSk7Cit9CisKK3N0YXRpYyB2b2lk IGlubm9faGRtaV9zeXNfcG93ZXIoc3RydWN0IGlubm9faGRtaSAqaGRtaSwgYm9vbCBlbmFibGUp Cit7CisJaWYgKGVuYWJsZSkKKwkJaGRtaV9tb2RiKGhkbWksIEhETUlfU1lTX0NUUkwsIG1fUE9X RVIsIHZfUFdSX09OKTsKKwllbHNlCisJCWhkbWlfbW9kYihoZG1pLCBIRE1JX1NZU19DVFJMLCBt X1BPV0VSLCB2X1BXUl9PRkYpOworfQorCitzdGF0aWMgdm9pZCBpbm5vX2hkbWlfc2V0X3B3cl9t b2RlKHN0cnVjdCBpbm5vX2hkbWkgKmhkbWksIGludCBtb2RlKQoreworCXN3aXRjaCAobW9kZSkg eworCWNhc2UgTk9STUFMOgorCQlpbm5vX2hkbWlfc3lzX3Bvd2VyKGhkbWksIGZhbHNlKTsKKwor CQloZG1pX3dyaXRlYihoZG1pLCBIRE1JX1BIWV9QUkVfRU1QSEFTSVMsIDB4NmYpOworCQloZG1p X3dyaXRlYihoZG1pLCBIRE1JX1BIWV9EUklWRVIsIDB4YmIpOworCisJCWhkbWlfd3JpdGViKGhk bWksIEhETUlfUEhZX1NZU19DVEwsIDB4MTUpOworCQloZG1pX3dyaXRlYihoZG1pLCBIRE1JX1BI WV9TWVNfQ1RMLCAweDE0KTsKKwkJaGRtaV93cml0ZWIoaGRtaSwgSERNSV9QSFlfU1lTX0NUTCwg MHgxMCk7CisJCWhkbWlfd3JpdGViKGhkbWksIEhETUlfUEhZX0NIR19QV1IsIDB4MGYpOworCQlo ZG1pX3dyaXRlYihoZG1pLCBIRE1JX1BIWV9TWU5DLCAweDAwKTsKKwkJaGRtaV93cml0ZWIoaGRt aSwgSERNSV9QSFlfU1lOQywgMHgwMSk7CisKKwkJaW5ub19oZG1pX3N5c19wb3dlcihoZG1pLCB0 cnVlKTsKKwkJYnJlYWs7CisKKwljYXNlIExPV0VSX1BXUjoKKwkJaW5ub19oZG1pX3N5c19wb3dl cihoZG1pLCBmYWxzZSk7CisJCWhkbWlfd3JpdGViKGhkbWksIEhETUlfUEhZX0RSSVZFUiwgMHgw MCk7CisJCWhkbWlfd3JpdGViKGhkbWksIEhETUlfUEhZX1BSRV9FTVBIQVNJUywgMHgwMCk7CisJ CWhkbWlfd3JpdGViKGhkbWksIEhETUlfUEhZX0NIR19QV1IsIDB4MDApOworCQloZG1pX3dyaXRl YihoZG1pLCBIRE1JX1BIWV9TWVNfQ1RMLCAweDE1KTsKKworCQlicmVhazsKKworCWRlZmF1bHQ6 CisJCWRldl9lcnIoaGRtaS0+ZGV2LCAiVW5rbm93biBwb3dlciBtb2RlICVkXG4iLCBtb2RlKTsK Kwl9Cit9CisKK3N0YXRpYyB2b2lkIGlubm9faGRtaV9yZXNldChzdHJ1Y3QgaW5ub19oZG1pICpo ZG1pKQoreworCXUzMiB2YWw7CisJdTMyIG1zazsKKworCWhkbWlfbW9kYihoZG1pLCBIRE1JX1NZ U19DVFJMLCBtX1JTVF9ESUdJVEFMLCB2X05PVF9SU1RfRElHSVRBTCk7CisJdWRlbGF5KDEwMCk7 CisKKwloZG1pX21vZGIoaGRtaSwgSERNSV9TWVNfQ1RSTCwgbV9SU1RfQU5BTE9HLCB2X05PVF9S U1RfQU5BTE9HKTsKKwl1ZGVsYXkoMTAwKTsKKworCW1zayA9IG1fUkVHX0NMS19JTlYgfCBtX1JF R19DTEtfU09VUkNFIHwgbV9QT1dFUiB8IG1fSU5UX1BPTDsKKwl2YWwgPSB2X1JFR19DTEtfSU5W IHwgdl9SRUdfQ0xLX1NPVVJDRV9TWVMgfCB2X1BXUl9PTiB8IHZfSU5UX1BPTF9ISUdIOworCWhk bWlfbW9kYihoZG1pLCBIRE1JX1NZU19DVFJMLCBtc2ssIHZhbCk7CisKKwlpbm5vX2hkbWlfc2V0 X3B3cl9tb2RlKGhkbWksIE5PUk1BTCk7Cit9CisKK3N0YXRpYyBpbnQgaW5ub19oZG1pX3VwbG9h ZF9mcmFtZShzdHJ1Y3QgaW5ub19oZG1pICpoZG1pLCBpbnQgc2V0dXBfcmMsCisJCQkJICB1bmlv biBoZG1pX2luZm9mcmFtZSAqZnJhbWUsIHUzMiBmcmFtZV9pbmRleCwKKwkJCQkgIHUzMiBtYXNr LCB1MzIgZGlzYWJsZSwgdTMyIGVuYWJsZSkKK3sKKwlpZiAobWFzaykKKwkJaGRtaV9tb2RiKGhk bWksIEhETUlfUEFDS0VUX1NFTkRfQVVUTywgbWFzaywgZGlzYWJsZSk7CisKKwloZG1pX3dyaXRl YihoZG1pLCBIRE1JX0NPTlRST0xfUEFDS0VUX0JVRl9JTkRFWCwgZnJhbWVfaW5kZXgpOworCisJ aWYgKHNldHVwX3JjID49IDApIHsKKwkJdTggcGFja2VkX2ZyYW1lW0hETUlfTUFYSU1VTV9JTkZP X0ZSQU1FX1NJWkVdOworCQlzc2l6ZV90IHJjLCBpOworCisJCXJjID0gaGRtaV9pbmZvZnJhbWVf cGFjayhmcmFtZSwgcGFja2VkX2ZyYW1lLAorCQkJCQkgc2l6ZW9mKHBhY2tlZF9mcmFtZSkpOwor CQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCisJCWZvciAoaSA9IDA7IGkgPCByYzsgaSsr KQorCQkJaGRtaV93cml0ZWIoaGRtaSwgSERNSV9DT05UUk9MX1BBQ0tFVF9BRERSICsgaSwKKwkJ CQkgICAgcGFja2VkX2ZyYW1lW2ldKTsKKworCQlpZiAobWFzaykKKwkJCWhkbWlfbW9kYihoZG1p LCBIRE1JX1BBQ0tFVF9TRU5EX0FVVE8sIG1hc2ssIGVuYWJsZSk7CisJfQorCisJcmV0dXJuIHNl dHVwX3JjOworfQorCitzdGF0aWMgaW50IGlubm9faGRtaV9jb25maWdfdmlkZW9fdnNpKHN0cnVj dCBpbm5vX2hkbWkgKmhkbWksCisJCQkJICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1v ZGUpCit7CisJdW5pb24gaGRtaV9pbmZvZnJhbWUgZnJhbWU7CisJaW50IHJjOworCisJcmMgPSBk cm1faGRtaV92ZW5kb3JfaW5mb2ZyYW1lX2Zyb21fZGlzcGxheV9tb2RlKCZmcmFtZS52ZW5kb3Iu aGRtaSwKKwkJCQkJCQkgbW9kZSk7CisKKwlyZXR1cm4gaW5ub19oZG1pX3VwbG9hZF9mcmFtZSho ZG1pLCByYywgJmZyYW1lLCBJTkZPRlJBTUVfVlNJLAorCQltX1BBQ0tFVF9WU0lfRU4sIHZfUEFD S0VUX1ZTSV9FTigwKSwgdl9QQUNLRVRfVlNJX0VOKDEpKTsKK30KKworc3RhdGljIGludCBpbm5v X2hkbWlfY29uZmlnX3ZpZGVvX2F2aShzdHJ1Y3QgaW5ub19oZG1pICpoZG1pLAorCQkJCSAgICAg IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQoreworCXVuaW9uIGhkbWlfaW5mb2ZyYW1l IGZyYW1lOworCWludCByYzsKKworCXJjID0gZHJtX2hkbWlfYXZpX2luZm9mcmFtZV9mcm9tX2Rp c3BsYXlfbW9kZSgmZnJhbWUuYXZpLCBtb2RlKTsKKworCWlmIChoZG1pLT5oZG1pX2RhdGEuZW5j X291dF9mb3JtYXQgPT0gSERNSV9DT0xPUlNQQUNFX1lVVjQ0NCkKKwkJZnJhbWUuYXZpLmNvbG9y c3BhY2UgPSBIRE1JX0NPTE9SU1BBQ0VfWVVWNDQ0OworCWVsc2UgaWYgKGhkbWktPmhkbWlfZGF0 YS5lbmNfb3V0X2Zvcm1hdCA9PSBIRE1JX0NPTE9SU1BBQ0VfWVVWNDIyKQorCQlmcmFtZS5hdmku Y29sb3JzcGFjZSA9IEhETUlfQ09MT1JTUEFDRV9ZVVY0MjI7CisJZWxzZQorCQlmcmFtZS5hdmku Y29sb3JzcGFjZSA9IEhETUlfQ09MT1JTUEFDRV9SR0I7CisKKwlyZXR1cm4gaW5ub19oZG1pX3Vw bG9hZF9mcmFtZShoZG1pLCByYywgJmZyYW1lLCBJTkZPRlJBTUVfQVZJLCAwLCAwLCAwKTsKK30K Kworc3RhdGljIGludCBpbm5vX2hkbWlfY29uZmlnX3ZpZGVvX2NzYyhzdHJ1Y3QgaW5ub19oZG1p ICpoZG1pKQoreworCXN0cnVjdCBoZG1pX2RhdGFfaW5mbyAqZGF0YSA9ICZoZG1pLT5oZG1pX2Rh dGE7CisJaW50IGMwX2MyX2NoYW5nZSA9IDA7CisJaW50IGNzY19lbmFibGUgPSAwOworCWludCBj c2NfbW9kZSA9IDA7CisJaW50IGF1dG9fY3NjID0gMDsKKwlpbnQgdmFsdWU7CisJaW50IGk7CisK KwkvKiBJbnB1dCB2aWRlbyBtb2RlIGlzIFNEUiBSR0IyNGJpdCwgZGF0YSBlbmFibGUgc2lnbmFs IGZyb20gZXh0ZXJuYWwgKi8KKwloZG1pX3dyaXRlYihoZG1pLCBIRE1JX1ZJREVPX0NPTlRSTDEs IHZfREVfRVhURVJOQUwgfAorCQkgICAgdl9WSURFT19JTlBVVF9GT1JNQVQoVklERU9fSU5QVVRf U0RSX1JHQjQ0NCkpOworCisJLyogSW5wdXQgY29sb3IgaGFyZGNvZGUgdG8gUkdCLCBhbmQgb3V0 cHV0IGNvbG9yIGhhcmRjb2RlIHRvIFJHQjg4OCAqLworCXZhbHVlID0gdl9WSURFT19JTlBVVF9C SVRTKFZJREVPX0lOUFVUXzhCSVRTKSB8CisJCXZfVklERU9fT1VUUFVUX0NPTE9SKDApIHwKKwkJ dl9WSURFT19JTlBVVF9DU1AoMCk7CisJaGRtaV93cml0ZWIoaGRtaSwgSERNSV9WSURFT19DT05U UkwyLCB2YWx1ZSk7CisKKwlpZiAoZGF0YS0+ZW5jX2luX2Zvcm1hdCA9PSBkYXRhLT5lbmNfb3V0 X2Zvcm1hdCkgeworCQlpZiAoKGRhdGEtPmVuY19pbl9mb3JtYXQgPT0gSERNSV9DT0xPUlNQQUNF X1JHQikgfHwKKwkJICAgIChkYXRhLT5lbmNfaW5fZm9ybWF0ID49IEhETUlfQ09MT1JTUEFDRV9Z VVY0NDQpKSB7CisJCQl2YWx1ZSA9IHZfU09GX0RJU0FCTEUgfCB2X0NPTE9SX0RFUFRIX05PVF9J TkRJQ0FURUQoMSk7CisJCQloZG1pX3dyaXRlYihoZG1pLCBIRE1JX1ZJREVPX0NPTlRSTDMsIHZh bHVlKTsKKworCQkJaGRtaV9tb2RiKGhkbWksIEhETUlfVklERU9fQ09OVFJMLAorCQkJCSAgbV9W SURFT19BVVRPX0NTQyB8IG1fVklERU9fQzBfQzJfU1dBUCwKKwkJCQkgIHZfVklERU9fQVVUT19D U0MoQVVUT19DU0NfRElTQUJMRSkgfAorCQkJCSAgdl9WSURFT19DMF9DMl9TV0FQKEMwX0MyX0NI QU5HRV9ESVNBQkxFKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmIChkYXRhLT5jb2xv cmltZXRyeSA9PSBIRE1JX0NPTE9SSU1FVFJZX0lUVV82MDEpIHsKKwkJaWYgKChkYXRhLT5lbmNf aW5fZm9ybWF0ID09IEhETUlfQ09MT1JTUEFDRV9SR0IpICYmCisJCSAgICAoZGF0YS0+ZW5jX291 dF9mb3JtYXQgPT0gSERNSV9DT0xPUlNQQUNFX1lVVjQ0NCkpIHsKKwkJCWNzY19tb2RlID0gQ1ND X1JHQl8wXzI1NV9UT19JVFU2MDFfMTZfMjM1XzhCSVQ7CisJCQlhdXRvX2NzYyA9IEFVVE9fQ1ND X0RJU0FCTEU7CisJCQljMF9jMl9jaGFuZ2UgPSBDMF9DMl9DSEFOR0VfRElTQUJMRTsKKwkJCWNz Y19lbmFibGUgPSB2X0NTQ19FTkFCTEU7CisJCX0gZWxzZSBpZiAoKGRhdGEtPmVuY19pbl9mb3Jt YXQgPT0gSERNSV9DT0xPUlNQQUNFX1lVVjQ0NCkgJiYKKwkJCSAgIChkYXRhLT5lbmNfb3V0X2Zv cm1hdCA9PSBIRE1JX0NPTE9SU1BBQ0VfUkdCKSkgeworCQkJY3NjX21vZGUgPSBDU0NfSVRVNjAx XzE2XzIzNV9UT19SR0JfMF8yNTVfOEJJVDsKKwkJCWF1dG9fY3NjID0gQVVUT19DU0NfRU5BQkxF OworCQkJYzBfYzJfY2hhbmdlID0gQzBfQzJfQ0hBTkdFX0RJU0FCTEU7CisJCQljc2NfZW5hYmxl ID0gdl9DU0NfRElTQUJMRTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgoZGF0YS0+ZW5jX2luX2Zv cm1hdCA9PSBIRE1JX0NPTE9SU1BBQ0VfUkdCKSAmJgorCQkgICAgKGRhdGEtPmVuY19vdXRfZm9y bWF0ID09IEhETUlfQ09MT1JTUEFDRV9ZVVY0NDQpKSB7CisJCQljc2NfbW9kZSA9IENTQ19SR0Jf MF8yNTVfVE9fSVRVNzA5XzE2XzIzNV84QklUOworCQkJYXV0b19jc2MgPSBBVVRPX0NTQ19ESVNB QkxFOworCQkJYzBfYzJfY2hhbmdlID0gQzBfQzJfQ0hBTkdFX0RJU0FCTEU7CisJCQljc2NfZW5h YmxlID0gdl9DU0NfRU5BQkxFOworCQl9IGVsc2UgaWYgKChkYXRhLT5lbmNfaW5fZm9ybWF0ID09 IEhETUlfQ09MT1JTUEFDRV9ZVVY0NDQpICYmCisJCQkgICAoZGF0YS0+ZW5jX291dF9mb3JtYXQg PT0gSERNSV9DT0xPUlNQQUNFX1JHQikpIHsKKwkJCWNzY19tb2RlID0gQ1NDX0lUVTcwOV8xNl8y MzVfVE9fUkdCXzBfMjU1XzhCSVQ7CisJCQlhdXRvX2NzYyA9IEFVVE9fQ1NDX0VOQUJMRTsKKwkJ CWMwX2MyX2NoYW5nZSA9IEMwX0MyX0NIQU5HRV9ESVNBQkxFOworCQkJY3NjX2VuYWJsZSA9IHZf Q1NDX0RJU0FCTEU7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMjQ7IGkrKykKKwkJaGRt aV93cml0ZWIoaGRtaSwgSERNSV9WSURFT19DU0NfQ09FRiArIGksCisJCQkgICAgY29lZmZfY3Nj W2NzY19tb2RlXVtpXSk7CisKKwl2YWx1ZSA9IHZfU09GX0RJU0FCTEUgfCBjc2NfZW5hYmxlIHwg dl9DT0xPUl9ERVBUSF9OT1RfSU5ESUNBVEVEKDEpOworCWhkbWlfd3JpdGViKGhkbWksIEhETUlf VklERU9fQ09OVFJMMywgdmFsdWUpOworCWhkbWlfbW9kYihoZG1pLCBIRE1JX1ZJREVPX0NPTlRS TCwgbV9WSURFT19BVVRPX0NTQyB8CisJCSAgbV9WSURFT19DMF9DMl9TV0FQLCB2X1ZJREVPX0FV VE9fQ1NDKGF1dG9fY3NjKSB8CisJCSAgdl9WSURFT19DMF9DMl9TV0FQKGMwX2MyX2NoYW5nZSkp OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5ub19oZG1pX2NvbmZpZ192aWRlb190 aW1pbmcoc3RydWN0IGlubm9faGRtaSAqaGRtaSwKKwkJCQkJIHN0cnVjdCBkcm1fZGlzcGxheV9t b2RlICptb2RlKQoreworCWludCB2YWx1ZTsKKworCS8qIFNldCBkZXRhaWwgZXh0ZXJuYWwgdmlk ZW8gdGltaW5nIHBvbGFyaXR5IGFuZCBpbnRlcmxhY2UgbW9kZSAqLworCXZhbHVlID0gdl9FWFRF UkFOTF9WSURFTygxKTsKKwl2YWx1ZSB8PSBtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfUEhT WU5DID8KKwkJIHZfSFNZTkNfUE9MQVJJVFkoMSkgOiB2X0hTWU5DX1BPTEFSSVRZKDApOworCXZh bHVlIHw9IG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19QVlNZTkMgPworCQkgdl9WU1lOQ19Q T0xBUklUWSgxKSA6IHZfVlNZTkNfUE9MQVJJVFkoMCk7CisJdmFsdWUgfD0gbW9kZS0+ZmxhZ3Mg JiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSA/CisJCSB2X0lORVRMQUNFKDEpIDogdl9JTkVUTEFD RSgwKTsKKwloZG1pX3dyaXRlYihoZG1pLCBIRE1JX1ZJREVPX1RJTUlOR19DVEwsIHZhbHVlKTsK KworCS8qIFNldCBkZXRhaWwgZXh0ZXJuYWwgdmlkZW8gdGltaW5nICovCisJdmFsdWUgPSBtb2Rl LT5odG90YWw7CisJaGRtaV93cml0ZWIoaGRtaSwgSERNSV9WSURFT19FWFRfSFRPVEFMX0wsIHZh bHVlICYgMHhGRik7CisJaGRtaV93cml0ZWIoaGRtaSwgSERNSV9WSURFT19FWFRfSFRPVEFMX0gs ICh2YWx1ZSA+PiA4KSAmIDB4RkYpOworCisJdmFsdWUgPSBtb2RlLT5odG90YWwgLSBtb2RlLT5o ZGlzcGxheTsKKwloZG1pX3dyaXRlYihoZG1pLCBIRE1JX1ZJREVPX0VYVF9IQkxBTktfTCwgdmFs dWUgJiAweEZGKTsKKwloZG1pX3dyaXRlYihoZG1pLCBIRE1JX1ZJREVPX0VYVF9IQkxBTktfSCwg KHZhbHVlID4+IDgpICYgMHhGRik7CisKKwl2YWx1ZSA9IG1vZGUtPmhzeW5jX3N0YXJ0IC0gbW9k ZS0+aGRpc3BsYXk7CisJaGRtaV93cml0ZWIoaGRtaSwgSERNSV9WSURFT19FWFRfSERFTEFZX0ws IHZhbHVlICYgMHhGRik7CisJaGRtaV93cml0ZWIoaGRtaSwgSERNSV9WSURFT19FWFRfSERFTEFZ X0gsICh2YWx1ZSA+PiA4KSAmIDB4RkYpOworCisJdmFsdWUgPSBtb2RlLT5oc3luY19lbmQgLSBt b2RlLT5oc3luY19zdGFydDsKKwloZG1pX3dyaXRlYihoZG1pLCBIRE1JX1ZJREVPX0VYVF9IRFVS QVRJT05fTCwgdmFsdWUgJiAweEZGKTsKKwloZG1pX3dyaXRlYihoZG1pLCBIRE1JX1ZJREVPX0VY VF9IRFVSQVRJT05fSCwgKHZhbHVlID4+IDgpICYgMHhGRik7CisKKwl2YWx1ZSA9IG1vZGUtPnZ0 b3RhbDsKKwloZG1pX3dyaXRlYihoZG1pLCBIRE1JX1ZJREVPX0VYVF9WVE9UQUxfTCwgdmFsdWUg JiAweEZGKTsKKwloZG1pX3dyaXRlYihoZG1pLCBIRE1JX1ZJREVPX0VYVF9WVE9UQUxfSCwgKHZh bHVlID4+IDgpICYgMHhGRik7CisKKwl2YWx1ZSA9IG1vZGUtPnZ0b3RhbCAtIG1vZGUtPnZkaXNw bGF5OworCWhkbWlfd3JpdGViKGhkbWksIEhETUlfVklERU9fRVhUX1ZCTEFOSywgdmFsdWUgJiAw eEZGKTsKKworCXZhbHVlID0gbW9kZS0+dnN5bmNfc3RhcnQgLSBtb2RlLT52ZGlzcGxheTsKKwlo ZG1pX3dyaXRlYihoZG1pLCBIRE1JX1ZJREVPX0VYVF9WREVMQVksIHZhbHVlICYgMHhGRik7CisK Kwl2YWx1ZSA9IG1vZGUtPnZzeW5jX2VuZCAtIG1vZGUtPnZzeW5jX3N0YXJ0OworCWhkbWlfd3Jp dGViKGhkbWksIEhETUlfVklERU9fRVhUX1ZEVVJBVElPTiwgdmFsdWUgJiAweEZGKTsKKworCWhk bWlfd3JpdGViKGhkbWksIEhETUlfUEhZX1BSRV9ESVZfUkFUSU8sIDB4MWUpOworCWhkbWlfd3Jp dGViKGhkbWksIEhETUlfUEhZX0ZFRURCQUNLX0RJVl9SQVRJT19MT1csIDB4MmMpOworCWhkbWlf d3JpdGViKGhkbWksIEhETUlfUEhZX0ZFRURCQUNLX0RJVl9SQVRJT19ISUdILCAweDAxKTsKKwor CXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlubm9faGRtaV9zZXR1cChzdHJ1Y3QgaW5ub19o ZG1pICpoZG1pLAorCQkJICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJaGRt aS0+aGRtaV9kYXRhLnZpYyA9IGRybV9tYXRjaF9jZWFfbW9kZShtb2RlKTsKKworCWhkbWktPmhk bWlfZGF0YS5lbmNfaW5fZm9ybWF0ID0gSERNSV9DT0xPUlNQQUNFX1JHQjsKKwloZG1pLT5oZG1p X2RhdGEuZW5jX291dF9mb3JtYXQgPSBIRE1JX0NPTE9SU1BBQ0VfUkdCOworCisJaWYgKChoZG1p LT5oZG1pX2RhdGEudmljID09IDYpIHx8IChoZG1pLT5oZG1pX2RhdGEudmljID09IDcpIHx8CisJ ICAgIChoZG1pLT5oZG1pX2RhdGEudmljID09IDIxKSB8fCAoaGRtaS0+aGRtaV9kYXRhLnZpYyA9 PSAyMikgfHwKKwkgICAgKGhkbWktPmhkbWlfZGF0YS52aWMgPT0gMikgfHwgKGhkbWktPmhkbWlf ZGF0YS52aWMgPT0gMykgfHwKKwkgICAgKGhkbWktPmhkbWlfZGF0YS52aWMgPT0gMTcpIHx8ICho ZG1pLT5oZG1pX2RhdGEudmljID09IDE4KSkKKwkJaGRtaS0+aGRtaV9kYXRhLmNvbG9yaW1ldHJ5 ID0gSERNSV9DT0xPUklNRVRSWV9JVFVfNjAxOworCWVsc2UKKwkJaGRtaS0+aGRtaV9kYXRhLmNv bG9yaW1ldHJ5ID0gSERNSV9DT0xPUklNRVRSWV9JVFVfNzA5OworCisJLyogTXV0ZSB2aWRlbyBh bmQgYXVkaW8gb3V0cHV0ICovCisJaGRtaV9tb2RiKGhkbWksIEhETUlfQVZfTVVURSwgbV9BVURJ T19NVVRFIHwgbV9WSURFT19CTEFDSywKKwkJICB2X0FVRElPX01VVEUoMSkgfCB2X1ZJREVPX01V VEUoMSkpOworCisJLyogU2V0IEhETUkgTW9kZSAqLworCWhkbWlfd3JpdGViKGhkbWksIEhETUlf SERDUF9DVFJMLAorCQkgICAgdl9IRE1JX0RWSShoZG1pLT5oZG1pX2RhdGEuc2lua19pc19oZG1p KSk7CisKKwlpbm5vX2hkbWlfY29uZmlnX3ZpZGVvX3RpbWluZyhoZG1pLCBtb2RlKTsKKworCWlu bm9faGRtaV9jb25maWdfdmlkZW9fY3NjKGhkbWkpOworCisJaWYgKGhkbWktPmhkbWlfZGF0YS5z aW5rX2lzX2hkbWkpIHsKKwkJaW5ub19oZG1pX2NvbmZpZ192aWRlb19hdmkoaGRtaSwgbW9kZSk7 CisJCWlubm9faGRtaV9jb25maWdfdmlkZW9fdnNpKGhkbWksIG1vZGUpOworCX0KKworCS8qCisJ ICogV2hlbiBJUCBjb250cm9sbGVyIGhhdmUgY29uZmlndXJlZCB0byBhbiBhY2N1cmF0ZSB2aWRl bworCSAqIHRpbWluZywgdGhlbiB0aGUgVE1EUyBjbG9jayBzb3VyY2Ugd291bGQgYmUgc3dpdGNo ZWQgdG8KKwkgKiBEQ0xLX0xDREMsIHNvIHdlIG5lZWQgdG8gaW5pdCB0aGUgVE1EUyByYXRlIHRv IG1vZGUgcGl4ZWwKKwkgKiBjbG9jayByYXRlLCBhbmQgcmVjb25maWd1cmUgdGhlIEREQyBjbG9j ay4KKwkgKi8KKwloZG1pLT50bWRzX3JhdGUgPSBtb2RlLT5jbG9jayAqIDEwMDA7CisJaW5ub19o ZG1pX2kyY19pbml0KGhkbWkpOworCisJLyogVW5tdXRlIHZpZGVvIGFuZCBhdWRpbyBvdXRwdXQg Ki8KKwloZG1pX21vZGIoaGRtaSwgSERNSV9BVl9NVVRFLCBtX0FVRElPX01VVEUgfCBtX1ZJREVP X0JMQUNLLAorCQkgIHZfQVVESU9fTVVURSgwKSB8IHZfVklERU9fTVVURSgwKSk7CisKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW5ub19oZG1pX2VuY29kZXJfbW9kZV9zZXQoc3RydWN0 IGRybV9lbmNvZGVyICplbmNvZGVyLAorCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9k ZSAqbW9kZSwKKwkJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkal9tb2RlKQor eworCXN0cnVjdCBpbm5vX2hkbWkgKmhkbWkgPSB0b19pbm5vX2hkbWkoZW5jb2Rlcik7CisKKwlp bm5vX2hkbWlfc2V0dXAoaGRtaSwgYWRqX21vZGUpOworCisJLyogU3RvcmUgdGhlIGRpc3BsYXkg bW9kZSBmb3IgcGx1Z2luL0RQTVMgcG93ZXJvbiBldmVudHMgKi8KKwltZW1jcHkoJmhkbWktPnBy ZXZpb3VzX21vZGUsIGFkal9tb2RlLCBzaXplb2YoaGRtaS0+cHJldmlvdXNfbW9kZSkpOworfQor CitzdGF0aWMgdm9pZCBpbm5vX2hkbWlfZW5jb2Rlcl9lbmFibGUoc3RydWN0IGRybV9lbmNvZGVy ICplbmNvZGVyKQoreworCXN0cnVjdCBpbm5vX2hkbWkgKmhkbWkgPSB0b19pbm5vX2hkbWkoZW5j b2Rlcik7CisKKwlyb2NrY2hpcF9kcm1fY3J0Y19tb2RlX2NvbmZpZyhlbmNvZGVyLT5jcnRjLCBE Uk1fTU9ERV9DT05ORUNUT1JfSERNSUEsCisJCQkJICAgICAgUk9DS0NISVBfT1VUX01PREVfUDg4 OCk7CisKKwlpbm5vX2hkbWlfc2V0X3B3cl9tb2RlKGhkbWksIE5PUk1BTCk7Cit9CisKK3N0YXRp YyB2b2lkIGlubm9faGRtaV9lbmNvZGVyX2Rpc2FibGUoc3RydWN0IGRybV9lbmNvZGVyICplbmNv ZGVyKQoreworCXN0cnVjdCBpbm5vX2hkbWkgKmhkbWkgPSB0b19pbm5vX2hkbWkoZW5jb2Rlcik7 CisKKwlpbm5vX2hkbWlfc2V0X3B3cl9tb2RlKGhkbWksIExPV0VSX1BXUik7Cit9CisKK3N0YXRp YyBib29sIGlubm9faGRtaV9lbmNvZGVyX21vZGVfZml4dXAoc3RydWN0IGRybV9lbmNvZGVyICpl bmNvZGVyLAorCQkJCQkgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkJ CSBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqX21vZGUpCit7CisJcmV0dXJuIHRydWU7Cit9 CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIGlubm9faGRtaV9lbmNv ZGVyX2hlbHBlcl9mdW5jcyA9IHsKKwkuZW5hYmxlICAgICA9IGlubm9faGRtaV9lbmNvZGVyX2Vu YWJsZSwKKwkuZGlzYWJsZSAgICA9IGlubm9faGRtaV9lbmNvZGVyX2Rpc2FibGUsCisJLm1vZGVf Zml4dXAgPSBpbm5vX2hkbWlfZW5jb2Rlcl9tb2RlX2ZpeHVwLAorCS5tb2RlX3NldCAgID0gaW5u b19oZG1pX2VuY29kZXJfbW9kZV9zZXQsCit9OworCitzdGF0aWMgc3RydWN0IGRybV9lbmNvZGVy X2Z1bmNzIGlubm9faGRtaV9lbmNvZGVyX2Z1bmNzID0geworCS5kZXN0cm95ID0gZHJtX2VuY29k ZXJfY2xlYW51cCwKK307CisKK3N0YXRpYyBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzCitpbm5v X2hkbWlfY29ubmVjdG9yX2RldGVjdChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBi b29sIGZvcmNlKQoreworCXN0cnVjdCBpbm5vX2hkbWkgKmhkbWkgPSB0b19pbm5vX2hkbWkoY29u bmVjdG9yKTsKKworCXJldHVybiAoaGRtaV9yZWFkYihoZG1pLCBIRE1JX1NUQVRVUykgJiBtX0hP VFBMVUcpID8KKwkJY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQgOiBjb25uZWN0b3Jfc3RhdHVz X2Rpc2Nvbm5lY3RlZDsKK30KKworc3RhdGljIGludCBpbm5vX2hkbWlfY29ubmVjdG9yX2dldF9t b2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBpbm5vX2hk bWkgKmhkbWkgPSB0b19pbm5vX2hkbWkoY29ubmVjdG9yKTsKKwlzdHJ1Y3QgZWRpZCAqZWRpZDsK KwlpbnQgcmV0ID0gMDsKKworCWlmICghaGRtaS0+ZGRjKQorCQlyZXR1cm4gMDsKKworCWVkaWQg PSBkcm1fZ2V0X2VkaWQoY29ubmVjdG9yLCBoZG1pLT5kZGMpOworCWlmIChlZGlkKSB7CisJCWhk bWktPmhkbWlfZGF0YS5zaW5rX2lzX2hkbWkgPSBkcm1fZGV0ZWN0X2hkbWlfbW9uaXRvcihlZGlk KTsKKwkJaGRtaS0+aGRtaV9kYXRhLnNpbmtfaGFzX2F1ZGlvID0gZHJtX2RldGVjdF9tb25pdG9y X2F1ZGlvKGVkaWQpOworCQlkcm1fbW9kZV9jb25uZWN0b3JfdXBkYXRlX2VkaWRfcHJvcGVydHko Y29ubmVjdG9yLCBlZGlkKTsKKwkJcmV0ID0gZHJtX2FkZF9lZGlkX21vZGVzKGNvbm5lY3Rvciwg ZWRpZCk7CisJCWtmcmVlKGVkaWQpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBl bnVtIGRybV9tb2RlX3N0YXR1cworaW5ub19oZG1pX2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkKHN0cnVj dCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5 X21vZGUgKm1vZGUpCit7CisJcmV0dXJuIE1PREVfT0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHJt X2VuY29kZXIgKgoraW5ub19oZG1pX2Nvbm5lY3Rvcl9iZXN0X2VuY29kZXIoc3RydWN0IGRybV9j b25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgaW5ub19oZG1pICpoZG1pID0gdG9faW5u b19oZG1pKGNvbm5lY3Rvcik7CisKKwlyZXR1cm4gJmhkbWktPmVuY29kZXI7Cit9CisKK3N0YXRp YyBpbnQKK2lubm9faGRtaV9wcm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzKHN0cnVjdCBkcm1f Y29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJICAgICAgIHVpbnQzMl90IG1heFgsIHVpbnQzMl90 IG1heFkpCit7CisJcmV0dXJuIGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2Rl cyhjb25uZWN0b3IsIDE5MjAsIDEwODApOworfQorCitzdGF0aWMgdm9pZCBpbm5vX2hkbWlfY29u bmVjdG9yX2Rlc3Ryb3koc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlkcm1f Y29ubmVjdG9yX3VucmVnaXN0ZXIoY29ubmVjdG9yKTsKKwlkcm1fY29ubmVjdG9yX2NsZWFudXAo Y29ubmVjdG9yKTsKK30KKworc3RhdGljIHN0cnVjdCBkcm1fY29ubmVjdG9yX2Z1bmNzIGlubm9f aGRtaV9jb25uZWN0b3JfZnVuY3MgPSB7CisJLmRwbXMgPSBkcm1fYXRvbWljX2hlbHBlcl9jb25u ZWN0b3JfZHBtcywKKwkuZmlsbF9tb2RlcyA9IGlubm9faGRtaV9wcm9iZV9zaW5nbGVfY29ubmVj dG9yX21vZGVzLAorCS5kZXRlY3QgPSBpbm5vX2hkbWlfY29ubmVjdG9yX2RldGVjdCwKKwkuZGVz dHJveSA9IGlubm9faGRtaV9jb25uZWN0b3JfZGVzdHJveSwKKwkucmVzZXQgPSBkcm1fYXRvbWlj X2hlbHBlcl9jb25uZWN0b3JfcmVzZXQsCisJLmF0b21pY19kdXBsaWNhdGVfc3RhdGUgPSBkcm1f YXRvbWljX2hlbHBlcl9jb25uZWN0b3JfZHVwbGljYXRlX3N0YXRlLAorCS5hdG9taWNfZGVzdHJv eV9zdGF0ZSA9IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9kZXN0cm95X3N0YXRlLAorfTsK Kworc3RhdGljIHN0cnVjdCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcyBpbm5vX2hkbWlfY29u bmVjdG9yX2hlbHBlcl9mdW5jcyA9IHsKKwkuZ2V0X21vZGVzID0gaW5ub19oZG1pX2Nvbm5lY3Rv cl9nZXRfbW9kZXMsCisJLm1vZGVfdmFsaWQgPSBpbm5vX2hkbWlfY29ubmVjdG9yX21vZGVfdmFs aWQsCisJLmJlc3RfZW5jb2RlciA9IGlubm9faGRtaV9jb25uZWN0b3JfYmVzdF9lbmNvZGVyLAor fTsKKworc3RhdGljIGludCBpbm5vX2hkbWlfcmVnaXN0ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRy bSwgc3RydWN0IGlubm9faGRtaSAqaGRtaSkKK3sKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29k ZXIgPSAmaGRtaS0+ZW5jb2RlcjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBoZG1pLT5kZXY7CisK KwllbmNvZGVyLT5wb3NzaWJsZV9jcnRjcyA9IGRybV9vZl9maW5kX3Bvc3NpYmxlX2NydGNzKGRy bSwgZGV2LT5vZl9ub2RlKTsKKworCS8qCisJICogSWYgd2UgZmFpbGVkIHRvIGZpbmQgdGhlIENS VEMocykgd2hpY2ggdGhpcyBlbmNvZGVyIGlzCisJICogc3VwcG9zZWQgdG8gYmUgY29ubmVjdGVk IHRvLCBpdCdzIGJlY2F1c2UgdGhlIENSVEMgaGFzCisJICogbm90IGJlZW4gcmVnaXN0ZXJlZCB5 ZXQuICBEZWZlciBwcm9iaW5nLCBhbmQgaG9wZSB0aGF0CisJICogdGhlIHJlcXVpcmVkIENSVEMg aXMgYWRkZWQgbGF0ZXIuCisJICovCisJaWYgKGVuY29kZXItPnBvc3NpYmxlX2NydGNzID09IDAp CisJCXJldHVybiAtRVBST0JFX0RFRkVSOworCisJZHJtX2VuY29kZXJfaGVscGVyX2FkZChlbmNv ZGVyLCAmaW5ub19oZG1pX2VuY29kZXJfaGVscGVyX2Z1bmNzKTsKKwlkcm1fZW5jb2Rlcl9pbml0 KGRybSwgZW5jb2RlciwgJmlubm9faGRtaV9lbmNvZGVyX2Z1bmNzLAorCQkJIERSTV9NT0RFX0VO Q09ERVJfVE1EUywgTlVMTCk7CisKKwloZG1pLT5jb25uZWN0b3IucG9sbGVkID0gRFJNX0NPTk5F Q1RPUl9QT0xMX0hQRDsKKworCWRybV9jb25uZWN0b3JfaGVscGVyX2FkZCgmaGRtaS0+Y29ubmVj dG9yLAorCQkJCSAmaW5ub19oZG1pX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOworCWRybV9jb25u ZWN0b3JfaW5pdChkcm0sICZoZG1pLT5jb25uZWN0b3IsICZpbm5vX2hkbWlfY29ubmVjdG9yX2Z1 bmNzLAorCQkJICAgRFJNX01PREVfQ09OTkVDVE9SX0hETUlBKTsKKworCWRybV9tb2RlX2Nvbm5l Y3Rvcl9hdHRhY2hfZW5jb2RlcigmaGRtaS0+Y29ubmVjdG9yLCBlbmNvZGVyKTsKKworCXJldHVy biAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaW5ub19oZG1pX2kyY19pcnEoc3RydWN0IGlu bm9faGRtaSAqaGRtaSkKK3sKKwlzdHJ1Y3QgaW5ub19oZG1pX2kyYyAqaTJjID0gaGRtaS0+aTJj OworCXU4IHN0YXQ7CisKKwlzdGF0ID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX0lOVEVSUlVQVF9T VEFUVVMxKTsKKwlpZiAoIShzdGF0ICYgbV9JTlRfRURJRF9SRUFEWSkpCisJCXJldHVybiBJUlFf Tk9ORTsKKworCS8qIENsZWFyIEhETUkgRURJRCBpbnRlcnJ1cHQgZmxhZyAqLworCWhkbWlfd3Jp dGViKGhkbWksIEhETUlfSU5URVJSVVBUX1NUQVRVUzEsIG1fSU5UX0VESURfUkVBRFkpOworCisJ Y29tcGxldGUoJmkyYy0+Y21wKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGlj IGlycXJldHVybl90IGlubm9faGRtaV9oYXJkaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sK KwlzdHJ1Y3QgaW5ub19oZG1pICpoZG1pID0gZGV2X2lkOworCWlycXJldHVybl90IHJldCA9IElS UV9OT05FOworCXU4IGludGVycnVwdDsKKworCWlmIChoZG1pLT5pMmMpCisJCXJldCA9IGlubm9f aGRtaV9pMmNfaXJxKGhkbWkpOworCisJaW50ZXJydXB0ID0gaGRtaV9yZWFkYihoZG1pLCBIRE1J X1NUQVRVUyk7CisJaWYgKGludGVycnVwdCAmIG1fSU5UX0hPVFBMVUcpIHsKKwkJaGRtaV9tb2Ri KGhkbWksIEhETUlfU1RBVFVTLCBtX0lOVF9IT1RQTFVHLCBtX0lOVF9IT1RQTFVHKTsKKwkJcmV0 ID0gSVJRX1dBS0VfVEhSRUFEOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpcnFy ZXR1cm5fdCBpbm5vX2hkbWlfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3Qg aW5ub19oZG1pICpoZG1pID0gZGV2X2lkOworCisJZHJtX2hlbHBlcl9ocGRfaXJxX2V2ZW50KGhk bWktPmNvbm5lY3Rvci5kZXYpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMg aW50IGlubm9faGRtaV9pMmNfcmVhZChzdHJ1Y3QgaW5ub19oZG1pICpoZG1pLCBzdHJ1Y3QgaTJj X21zZyAqbXNncykKK3sKKwlpbnQgbGVuZ3RoID0gbXNncy0+bGVuOworCXU4ICpidWYgPSBtc2dz LT5idWY7CisJaW50IHJldDsKKworCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgm aGRtaS0+aTJjLT5jbXAsIEhaIC8gMTApOworCWlmICghcmV0KQorCQlyZXR1cm4gLUVBR0FJTjsK KworCXdoaWxlIChsZW5ndGgtLSkKKwkJKmJ1ZisrID0gaGRtaV9yZWFkYihoZG1pLCBIRE1JX0VE SURfRklGT19BRERSKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlubm9faGRtaV9p MmNfd3JpdGUoc3RydWN0IGlubm9faGRtaSAqaGRtaSwgc3RydWN0IGkyY19tc2cgKm1zZ3MpCit7 CisJLyoKKwkgKiBUaGUgRERDIG1vZHVsZSBvbmx5IHN1cHBvcnQgcmVhZCBFRElEIG1lc3NhZ2Us IHNvCisJICogd2UgYXNzdW1lIHRoYXQgZWFjaCB3b3JkIHdyaXRlIHRvIHRoaXMgaTJjIGFkYXB0 ZXIKKwkgKiBzaG91bGQgYmUgdGhlIG9mZnNldCBvZiBFRElEIHdvcmQgYWRkcmVzcy4KKwkgKi8K KwlpZiAoKG1zZ3MtPmxlbiAhPSAxKSB8fAorCSAgICAoKG1zZ3MtPmFkZHIgIT0gRERDX0FERFIp ICYmIChtc2dzLT5hZGRyICE9IEREQ19TRUdNRU5UX0FERFIpKSkKKwkJcmV0dXJuIC1FSU5WQUw7 CisKKwlyZWluaXRfY29tcGxldGlvbigmaGRtaS0+aTJjLT5jbXApOworCisJaWYgKG1zZ3MtPmFk ZHIgPT0gRERDX1NFR01FTlRfQUREUikKKwkJaGRtaS0+aTJjLT5zZWdtZW50X2FkZHIgPSBtc2dz LT5idWZbMF07CisJaWYgKG1zZ3MtPmFkZHIgPT0gRERDX0FERFIpCisJCWhkbWktPmkyYy0+ZGRj X2FkZHIgPSBtc2dzLT5idWZbMF07CisKKwkvKiBTZXQgZWRpZCBmaWZvIGZpcnN0IGFkZHIgKi8K KwloZG1pX3dyaXRlYihoZG1pLCBIRE1JX0VESURfRklGT19PRkZTRVQsIDB4MDApOworCisJLyog U2V0IGVkaWQgd29yZCBhZGRyZXNzIDB4MDAvMHg4MCAqLworCWhkbWlfd3JpdGViKGhkbWksIEhE TUlfRURJRF9XT1JEX0FERFIsIGhkbWktPmkyYy0+ZGRjX2FkZHIpOworCisJLyogU2V0IGVkaWQg c2VnbWVudCBwb2ludGVyICovCisJaGRtaV93cml0ZWIoaGRtaSwgSERNSV9FRElEX1NFR01FTlRf UE9JTlRFUiwgaGRtaS0+aTJjLT5zZWdtZW50X2FkZHIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0 YXRpYyBpbnQgaW5ub19oZG1pX2kyY194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwKKwkJ CSAgICAgIHN0cnVjdCBpMmNfbXNnICptc2dzLCBpbnQgbnVtKQoreworCXN0cnVjdCBpbm5vX2hk bWkgKmhkbWkgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOworCXN0cnVjdCBpbm5vX2hkbWlfaTJj ICppMmMgPSBoZG1pLT5pMmM7CisJaW50IGksIHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZpMmMt PmxvY2spOworCisJLyogQ2xlYXIgdGhlIEVESUQgaW50ZXJydXB0IGZsYWcgYW5kIHVubXV0ZSB0 aGUgaW50ZXJydXB0ICovCisJaGRtaV93cml0ZWIoaGRtaSwgSERNSV9JTlRFUlJVUFRfTUFTSzEs IG1fSU5UX0VESURfUkVBRFkpOworCWhkbWlfd3JpdGViKGhkbWksIEhETUlfSU5URVJSVVBUX1NU QVRVUzEsIG1fSU5UX0VESURfUkVBRFkpOworCisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7 CisJCWRldl9kYmcoaGRtaS0+ZGV2LCAieGZlcjogbnVtOiAlZC8lZCwgbGVuOiAlZCwgZmxhZ3M6 ICUjeFxuIiwKKwkJCWkgKyAxLCBudW0sIG1zZ3NbaV0ubGVuLCBtc2dzW2ldLmZsYWdzKTsKKwor CQlpZiAobXNnc1tpXS5mbGFncyAmIEkyQ19NX1JEKQorCQkJcmV0ID0gaW5ub19oZG1pX2kyY19y ZWFkKGhkbWksICZtc2dzW2ldKTsKKwkJZWxzZQorCQkJcmV0ID0gaW5ub19oZG1pX2kyY193cml0 ZShoZG1pLCAmbXNnc1tpXSk7CisKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKwl9CisKKwlp ZiAoIXJldCkKKwkJcmV0ID0gbnVtOworCisJLyogTXV0ZSBIRE1JIEVESUQgaW50ZXJydXB0ICov CisJaGRtaV93cml0ZWIoaGRtaSwgSERNSV9JTlRFUlJVUFRfTUFTSzEsIDApOworCisJbXV0ZXhf dW5sb2NrKCZpMmMtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHUzMiBpbm5v X2hkbWlfaTJjX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiBJ MkNfRlVOQ19JMkMgfCBJMkNfRlVOQ19TTUJVU19FTVVMOworfQorCitzdGF0aWMgY29uc3Qgc3Ry dWN0IGkyY19hbGdvcml0aG0gaW5ub19oZG1pX2FsZ29yaXRobSA9IHsKKwkubWFzdGVyX3hmZXIJ PSBpbm5vX2hkbWlfaTJjX3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkJPSBpbm5vX2hkbWlfaTJjX2Z1 bmMsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyICppbm5vX2hkbWlfaTJjX2FkYXB0 ZXIoc3RydWN0IGlubm9faGRtaSAqaGRtaSkKK3sKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXA7 CisJc3RydWN0IGlubm9faGRtaV9pMmMgKmkyYzsKKwlpbnQgcmV0OworCisJaTJjID0gZGV2bV9r emFsbG9jKGhkbWktPmRldiwgc2l6ZW9mKCppMmMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWkyYykK KwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwltdXRleF9pbml0KCZpMmMtPmxvY2spOwor CWluaXRfY29tcGxldGlvbigmaTJjLT5jbXApOworCisJYWRhcCA9ICZpMmMtPmFkYXA7CisJYWRh cC0+Y2xhc3MgPSBJMkNfQ0xBU1NfRERDOworCWFkYXAtPm93bmVyID0gVEhJU19NT0RVTEU7CisJ YWRhcC0+ZGV2LnBhcmVudCA9IGhkbWktPmRldjsKKwlhZGFwLT5kZXYub2Zfbm9kZSA9IGhkbWkt PmRldi0+b2Zfbm9kZTsKKwlhZGFwLT5hbGdvID0gJmlubm9faGRtaV9hbGdvcml0aG07CisJc3Ry bGNweShhZGFwLT5uYW1lLCAiSW5ubyBIRE1JIiwgc2l6ZW9mKGFkYXAtPm5hbWUpKTsKKwlpMmNf c2V0X2FkYXBkYXRhKGFkYXAsIGhkbWkpOworCisJcmV0ID0gaTJjX2FkZF9hZGFwdGVyKGFkYXAp OworCWlmIChyZXQpIHsKKwkJZGV2X3dhcm4oaGRtaS0+ZGV2LCAiY2Fubm90IGFkZCAlcyBJMkMg YWRhcHRlclxuIiwgYWRhcC0+bmFtZSk7CisJCWRldm1fa2ZyZWUoaGRtaS0+ZGV2LCBpMmMpOwor CQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKworCWhkbWktPmkyYyA9IGkyYzsKKworCWRldl9p bmZvKGhkbWktPmRldiwgInJlZ2lzdGVyZWQgJXMgSTJDIGJ1cyBkcml2ZXJcbiIsIGFkYXAtPm5h bWUpOworCisJcmV0dXJuIGFkYXA7Cit9CisKK3N0YXRpYyBpbnQgaW5ub19oZG1pX2JpbmQoc3Ry dWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsCisJCQkJIHZvaWQgKmRhdGEp Cit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShk ZXYpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkcm0gPSBkYXRhOworCXN0cnVjdCBpbm5vX2hkbWkg KmhkbWk7CisJc3RydWN0IHJlc291cmNlICppb3JlczsKKwlpbnQgaXJxOworCWludCByZXQ7CisK KwloZG1pID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpoZG1pKSwgR0ZQX0tFUk5FTCk7CisJ aWYgKCFoZG1pKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWhkbWktPmRldiA9IGRldjsKKwloZG1p LT5kcm1fZGV2ID0gZHJtOworCisJaW9yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwg SU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghaW9yZXMpCisJCXJldHVybiAtRU5YSU87CisKKwlo ZG1pLT5yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgaW9yZXMpOworCWlmIChJU19F UlIoaGRtaS0+cmVncykpCisJCXJldHVybiBQVFJfRVJSKGhkbWktPnJlZ3MpOworCisJaGRtaS0+ cGNsayA9IGRldm1fY2xrX2dldChoZG1pLT5kZXYsICJwY2xrIik7CisJaWYgKElTX0VSUihoZG1p LT5wY2xrKSkgeworCQlkZXZfZXJyKGhkbWktPmRldiwgIlVuYWJsZSB0byBnZXQgSERNSSBwY2xr IGNsa1xuIik7CisJCXJldHVybiBQVFJfRVJSKGhkbWktPnBjbGspOworCX0KKworCXJldCA9IGNs a19wcmVwYXJlX2VuYWJsZShoZG1pLT5wY2xrKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoaGRt aS0+ZGV2LCAiQ2Fubm90IGVuYWJsZSBIRE1JIHBjbGsgY2xvY2s6ICVkXG4iLCByZXQpOworCQly ZXR1cm4gcmV0OworCX0KKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYg KGlycSA8IDApCisJCXJldHVybiBpcnE7CisKKwlpbm5vX2hkbWlfcmVzZXQoaGRtaSk7CisKKwlo ZG1pLT5kZGMgPSBpbm5vX2hkbWlfaTJjX2FkYXB0ZXIoaGRtaSk7CisJaWYgKElTX0VSUihoZG1p LT5kZGMpKSB7CisJCWhkbWktPmRkYyA9IE5VTEw7CisJCXJldHVybiBQVFJfRVJSKGhkbWktPmRk Yyk7CisJfQorCisJLyoKKwkgKiBXaGVuIElQIGNvbnRyb2xsZXIgaGF2ZW4ndCBjb25maWd1cmVk IHRvIGFuIGFjY3VyYXRlIHZpZGVvCisJICogdGltaW5nLCB0aGVuIHRoZSBUTURTIGNsb2NrIHNv dXJjZSB3b3VsZCBiZSBzd2l0Y2hlZCB0bworCSAqIFBDTEtfSERNSSwgc28gd2UgbmVlZCB0byBp bml0IHRoZSBUTURTIHJhdGUgdG8gUENMSyByYXRlLAorCSAqIGFuZCByZWNvbmZpZ3VyZSB0aGUg RERDIGNsb2NrLgorCSAqLworCWhkbWktPnRtZHNfcmF0ZSA9IGNsa19nZXRfcmF0ZShoZG1pLT5w Y2xrKTsKKwlpbm5vX2hkbWlfaTJjX2luaXQoaGRtaSk7CisKKwlyZXQgPSBpbm5vX2hkbWlfcmVn aXN0ZXIoZHJtLCBoZG1pKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZGV2X3NldF9k cnZkYXRhKGRldiwgaGRtaSk7CisKKwkvKiBVbm11dGUgaG90cGx1ZyBpbnRlcnJ1cHQgKi8KKwlo ZG1pX21vZGIoaGRtaSwgSERNSV9TVEFUVVMsIG1fTUFTS19JTlRfSE9UUExVRywgdl9NQVNLX0lO VF9IT1RQTFVHKDEpKTsKKworCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoZGV2LCBp cnEsIGlubm9faGRtaV9oYXJkaXJxLAorCQkJCQlpbm5vX2hkbWlfaXJxLCBJUlFGX1NIQVJFRCwK KwkJCQkJZGV2X25hbWUoZGV2KSwgaGRtaSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMg dm9pZCBpbm5vX2hkbWlfdW5iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAq bWFzdGVyLAorCQkJICAgICB2b2lkICpkYXRhKQoreworCXN0cnVjdCBpbm5vX2hkbWkgKmhkbWkg PSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWhkbWktPmNvbm5lY3Rvci5mdW5jcy0+ZGVzdHJv eSgmaGRtaS0+Y29ubmVjdG9yKTsKKwloZG1pLT5lbmNvZGVyLmZ1bmNzLT5kZXN0cm95KCZoZG1p LT5lbmNvZGVyKTsKKworCWNsa19kaXNhYmxlX3VucHJlcGFyZShoZG1pLT5wY2xrKTsKKwlpMmNf cHV0X2FkYXB0ZXIoaGRtaS0+ZGRjKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjb21wb25l bnRfb3BzIGlubm9faGRtaV9vcHMgPSB7CisJLmJpbmQJPSBpbm5vX2hkbWlfYmluZCwKKwkudW5i aW5kCT0gaW5ub19oZG1pX3VuYmluZCwKK307CisKK3N0YXRpYyBpbnQgaW5ub19oZG1pX3Byb2Jl KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIGNvbXBvbmVudF9hZGQo JnBkZXYtPmRldiwgJmlubm9faGRtaV9vcHMpOworfQorCitzdGF0aWMgaW50IGlubm9faGRtaV9y ZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwljb21wb25lbnRfZGVsKCZw ZGV2LT5kZXYsICZpbm5vX2hkbWlfb3BzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29u c3Qgc3RydWN0IG9mX2RldmljZV9pZCBpbm5vX2hkbWlfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0 aWJsZSA9ICJyb2NrY2hpcCxyazMwMzYtaW5uby1oZG1pIiwKKwl9LAorCXt9LAorfTsKK01PRFVM RV9ERVZJQ0VfVEFCTEUob2YsIGlubm9faGRtaV9kdF9pZHMpOworCitzdGF0aWMgc3RydWN0IHBs YXRmb3JtX2RyaXZlciBpbm5vX2hkbWlfZHJpdmVyID0geworCS5wcm9iZSAgPSBpbm5vX2hkbWlf cHJvYmUsCisJLnJlbW92ZSA9IGlubm9faGRtaV9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5h bWUgPSAiaW5ub2hkbWktcm9ja2NoaXAiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBpbm5vX2hkbWlf ZHRfaWRzLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGlubm9faGRtaV9kcml2 ZXIpOworCitNT0RVTEVfQVVUSE9SKCJaaGVuZyBZYW5nIDx6aGVuZ3lhbmdAcm9jay1jaGlwcy5j b20+Iik7CitNT0RVTEVfQVVUSE9SKCJZYWtpciBZYW5nIDx5a2tAcm9jay1jaGlwcy5jb20+Iik7 CitNT0RVTEVfREVTQ1JJUFRJT04oIlJvY2tjaGlwIFNwZWNpZmljIElOTk8tSERNSSBEcml2ZXIi KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06aW5u b2hkbWktcm9ja2NoaXAiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9p bm5vX2hkbWkuaCBiL2RyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9pbm5vX2hkbWkuaApuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTdjNDE1Ci0tLSAvZGV2L251bGwKKysrIGIv ZHJpdmVycy9ncHUvZHJtL3JvY2tjaGlwL2lubm9faGRtaS5oCkBAIC0wLDAgKzEsMzYyIEBACisv KgorICogQ29weXJpZ2h0IChDKSBGdXpob3UgUm9ja2NoaXAgRWxlY3Ryb25pY3MgQ28uTHRkCisg KiAgICBaaGVuZyBZYW5nIDx6aGVuZ3lhbmdAcm9jay1jaGlwcy5jb20+CisgKiAgICBZYWtpciBZ YW5nIDx5a2tAcm9jay1jaGlwcy5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNl ZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2 ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBh bmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhv c2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9y IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fSU5O T19IRE1JX0hfXworI2RlZmluZSBfX0lOTk9fSERNSV9IX18KKworI2RlZmluZSBERENfU0VHTUVO VF9BRERSCQkweDMwCisKK2VudW0gUFdSX01PREUgeworCU5PUk1BTCwKKwlMT1dFUl9QV1IsCit9 OworCisjZGVmaW5lIEhETUlfU0NMX1JBVEUJCQkoMTAwKjEwMDApCisjZGVmaW5lIEREQ19CVVNf RlJFUV9MCQkJMHg0YgorI2RlZmluZSBERENfQlVTX0ZSRVFfSAkJCTB4NGMKKworI2RlZmluZSBI RE1JX1NZU19DVFJMCQkJMHgwMAorI2RlZmluZSBtX1JTVF9BTkFMT0cJCQkoMSA8PCA2KQorI2Rl ZmluZSB2X1JTVF9BTkFMT0cJCQkoMCA8PCA2KQorI2RlZmluZSB2X05PVF9SU1RfQU5BTE9HCQko MSA8PCA2KQorI2RlZmluZSBtX1JTVF9ESUdJVEFMCQkJKDEgPDwgNSkKKyNkZWZpbmUgdl9SU1Rf RElHSVRBTAkJCSgwIDw8IDUpCisjZGVmaW5lIHZfTk9UX1JTVF9ESUdJVEFMCQkoMSA8PCA1KQor I2RlZmluZSBtX1JFR19DTEtfSU5WCQkJKDEgPDwgNCkKKyNkZWZpbmUgdl9SRUdfQ0xLX05PVF9J TlYJCSgwIDw8IDQpCisjZGVmaW5lIHZfUkVHX0NMS19JTlYJCQkoMSA8PCA0KQorI2RlZmluZSBt X1ZDTEtfSU5WCQkJKDEgPDwgMykKKyNkZWZpbmUgdl9WQ0xLX05PVF9JTlYJCQkoMCA8PCAzKQor I2RlZmluZSB2X1ZDTEtfSU5WCQkJKDEgPDwgMykKKyNkZWZpbmUgbV9SRUdfQ0xLX1NPVVJDRQkJ KDEgPDwgMikKKyNkZWZpbmUgdl9SRUdfQ0xLX1NPVVJDRV9UTURTCQkoMCA8PCAyKQorI2RlZmlu ZSB2X1JFR19DTEtfU09VUkNFX1NZUwkJKDEgPDwgMikKKyNkZWZpbmUgbV9QT1dFUgkJCQkoMSA8 PCAxKQorI2RlZmluZSB2X1BXUl9PTgkJCSgwIDw8IDEpCisjZGVmaW5lIHZfUFdSX09GRgkJCSgx IDw8IDEpCisjZGVmaW5lIG1fSU5UX1BPTAkJCSgxIDw8IDApCisjZGVmaW5lIHZfSU5UX1BPTF9I SUdICQkJMQorI2RlZmluZSB2X0lOVF9QT0xfTE9XCQkJMAorCisjZGVmaW5lIEhETUlfVklERU9f Q09OVFJMMQkJMHgwMQorI2RlZmluZSBtX1ZJREVPX0lOUFVUX0ZPUk1BVAkJKDcgPDwgMSkKKyNk ZWZpbmUgbV9ERV9TT1VSQ0UJCQkoMSA8PCAwKQorI2RlZmluZSB2X1ZJREVPX0lOUFVUX0ZPUk1B VChuKQkJKG4gPDwgMSkKKyNkZWZpbmUgdl9ERV9FWFRFUk5BTAkJCTEKKyNkZWZpbmUgdl9ERV9J TlRFUk5BTAkJCTAKK2VudW0geworCVZJREVPX0lOUFVUX1NEUl9SR0I0NDQgPSAwLAorCVZJREVP X0lOUFVUX0REUl9SR0I0NDQgPSA1LAorCVZJREVPX0lOUFVUX0REUl9ZQ0JDUjQyMiA9IDYKK307 CisKKyNkZWZpbmUgSERNSV9WSURFT19DT05UUkwyCQkweDAyCisjZGVmaW5lIG1fVklERU9fT1VU UFVUX0NPTE9SCQkoMyA8PCA2KQorI2RlZmluZSBtX1ZJREVPX0lOUFVUX0JJVFMJCSgzIDw8IDQp CisjZGVmaW5lIG1fVklERU9fSU5QVVRfQ1NQCQkoMSA8PCAwKQorI2RlZmluZSB2X1ZJREVPX09V VFBVVF9DT0xPUihuKQkJKCgobikgJiAweDMpIDw8IDYpCisjZGVmaW5lIHZfVklERU9fSU5QVVRf QklUUyhuKQkJKG4gPDwgNCkKKyNkZWZpbmUgdl9WSURFT19JTlBVVF9DU1AobikJCShuIDw8IDAp CitlbnVtIHsKKwlWSURFT19JTlBVVF8xMkJJVFMgPSAwLAorCVZJREVPX0lOUFVUXzEwQklUUyA9 IDEsCisJVklERU9fSU5QVVRfUkVWRVJUID0gMiwKKwlWSURFT19JTlBVVF84QklUUyA9IDMsCit9 OworCisjZGVmaW5lIEhETUlfVklERU9fQ09OVFJMCQkweDAzCisjZGVmaW5lIG1fVklERU9fQVVU T19DU0MJCSgxIDw8IDcpCisjZGVmaW5lIHZfVklERU9fQVVUT19DU0MobikJCShuIDw8IDcpCisj ZGVmaW5lIG1fVklERU9fQzBfQzJfU1dBUAkJKDEgPDwgMCkKKyNkZWZpbmUgdl9WSURFT19DMF9D Ml9TV0FQKG4pCQkobiA8PCAwKQorZW51bSB7CisJQzBfQzJfQ0hBTkdFX0VOQUJMRSA9IDAsCisJ QzBfQzJfQ0hBTkdFX0RJU0FCTEUgPSAxLAorCUFVVE9fQ1NDX0RJU0FCTEUgPSAwLAorCUFVVE9f Q1NDX0VOQUJMRSA9IDEsCit9OworCisjZGVmaW5lIEhETUlfVklERU9fQ09OVFJMMwkJMHgwNAor I2RlZmluZSBtX0NPTE9SX0RFUFRIX05PVF9JTkRJQ0FURUQJKDEgPDwgNCkKKyNkZWZpbmUgbV9T T0YJCQkJKDEgPDwgMykKKyNkZWZpbmUgbV9DT0xPUl9SQU5HRQkJCSgxIDw8IDIpCisjZGVmaW5l IG1fQ1NDCQkJCSgxIDw8IDApCisjZGVmaW5lIHZfQ09MT1JfREVQVEhfTk9UX0lORElDQVRFRChu KQkoKG4pIDw8IDQpCisjZGVmaW5lIHZfU09GX0VOQUJMRQkJCSgwIDw8IDMpCisjZGVmaW5lIHZf U09GX0RJU0FCTEUJCQkoMSA8PCAzKQorI2RlZmluZSB2X0NPTE9SX1JBTkdFX0ZVTEwJCSgxIDw8 IDIpCisjZGVmaW5lIHZfQ09MT1JfUkFOR0VfTElNSVRFRAkJKDAgPDwgMikKKyNkZWZpbmUgdl9D U0NfRU5BQkxFCQkJMQorI2RlZmluZSB2X0NTQ19ESVNBQkxFCQkJMAorCisjZGVmaW5lIEhETUlf QVZfTVVURQkJCTB4MDUKKyNkZWZpbmUgbV9BVk1VVEVfQ0xFQVIJCQkoMSA8PCA3KQorI2RlZmlu ZSBtX0FWTVVURV9FTkFCTEUJCQkoMSA8PCA2KQorI2RlZmluZSBtX0FVRElPX01VVEUJCQkoMSA8 PCAxKQorI2RlZmluZSBtX1ZJREVPX0JMQUNLCQkJKDEgPDwgMCkKKyNkZWZpbmUgdl9BVk1VVEVf Q0xFQVIobikJCShuIDw8IDcpCisjZGVmaW5lIHZfQVZNVVRFX0VOQUJMRShuKQkJKG4gPDwgNikK KyNkZWZpbmUgdl9BVURJT19NVVRFKG4pCQkJKG4gPDwgMSkKKyNkZWZpbmUgdl9WSURFT19NVVRF KG4pCQkJKG4gPDwgMCkKKworI2RlZmluZSBIRE1JX1ZJREVPX1RJTUlOR19DVEwJCTB4MDgKKyNk ZWZpbmUgdl9IU1lOQ19QT0xBUklUWShuKQkJKG4gPDwgMykKKyNkZWZpbmUgdl9WU1lOQ19QT0xB UklUWShuKQkJKG4gPDwgMikKKyNkZWZpbmUgdl9JTkVUTEFDRShuKQkJCShuIDw8IDEpCisjZGVm aW5lIHZfRVhURVJBTkxfVklERU8obikJCShuIDw8IDApCisKKyNkZWZpbmUgSERNSV9WSURFT19F WFRfSFRPVEFMX0wJCTB4MDkKKyNkZWZpbmUgSERNSV9WSURFT19FWFRfSFRPVEFMX0gJCTB4MGEK KyNkZWZpbmUgSERNSV9WSURFT19FWFRfSEJMQU5LX0wJCTB4MGIKKyNkZWZpbmUgSERNSV9WSURF T19FWFRfSEJMQU5LX0gJCTB4MGMKKyNkZWZpbmUgSERNSV9WSURFT19FWFRfSERFTEFZX0wJCTB4 MGQKKyNkZWZpbmUgSERNSV9WSURFT19FWFRfSERFTEFZX0gJCTB4MGUKKyNkZWZpbmUgSERNSV9W SURFT19FWFRfSERVUkFUSU9OX0wJMHgwZgorI2RlZmluZSBIRE1JX1ZJREVPX0VYVF9IRFVSQVRJ T05fSAkweDEwCisjZGVmaW5lIEhETUlfVklERU9fRVhUX1ZUT1RBTF9MCQkweDExCisjZGVmaW5l IEhETUlfVklERU9fRVhUX1ZUT1RBTF9ICQkweDEyCisjZGVmaW5lIEhETUlfVklERU9fRVhUX1ZC TEFOSwkJMHgxMworI2RlZmluZSBIRE1JX1ZJREVPX0VYVF9WREVMQVkJCTB4MTQKKyNkZWZpbmUg SERNSV9WSURFT19FWFRfVkRVUkFUSU9OCTB4MTUKKworI2RlZmluZSBIRE1JX1ZJREVPX0NTQ19D T0VGCQkweDE4CisKKyNkZWZpbmUgSERNSV9BVURJT19DVFJMMQkJMHgzNQorZW51bSB7CisJQ1RT X1NPVVJDRV9JTlRFUk5BTCA9IDAsCisJQ1RTX1NPVVJDRV9FWFRFUk5BTCA9IDEsCit9OworI2Rl ZmluZSB2X0NUU19TT1VSQ0UobikJCQkobiA8PCA3KQorCitlbnVtIHsKKwlET1dOU0FNUExFX0RJ U0FCTEUgPSAwLAorCURPV05TQU1QTEVfMV8yID0gMSwKKwlET1dOU0FNUExFXzFfNCA9IDIsCit9 OworI2RlZmluZSB2X0RPV05fU0FNUExFKG4pCQkobiA8PCA1KQorCitlbnVtIHsKKwlBVURJT19T T1VSQ0VfSUlTID0gMCwKKwlBVURJT19TT1VSQ0VfU1BESUYgPSAxLAorfTsKKyNkZWZpbmUgdl9B VURJT19TT1VSQ0UobikJCShuIDw8IDMpCisKKyNkZWZpbmUgdl9NQ0xLX0VOQUJMRShuKQkJKG4g PDwgMikKK2VudW0geworCU1DTEtfMTI4RlMgPSAwLAorCU1DTEtfMjU2RlMgPSAxLAorCU1DTEtf Mzg0RlMgPSAyLAorCU1DTEtfNTEyRlMgPSAzLAorfTsKKyNkZWZpbmUgdl9NQ0xLX1JBVElPKG4p CQkJKG4pCisKKyNkZWZpbmUgQVVESU9fU0FNUExFX1JBVEUJCTB4MzcKK2VudW0geworCUFVRElP XzMySyA9IDB4MywKKwlBVURJT180NDFLID0gMHgwLAorCUFVRElPXzQ4SyA9IDB4MiwKKwlBVURJ T184ODJLID0gMHg4LAorCUFVRElPXzk2SyA9IDB4YSwKKwlBVURJT18xNzY0SyA9IDB4YywKKwlB VURJT18xOTJLID0gMHhlLAorfTsKKworI2RlZmluZSBBVURJT19JMlNfTU9ERQkJCTB4MzgKK2Vu dW0geworCUkyU19DSEFOTkVMXzFfMiA9IDEsCisJSTJTX0NIQU5ORUxfM180ID0gMywKKwlJMlNf Q0hBTk5FTF81XzYgPSA3LAorCUkyU19DSEFOTkVMXzdfOCA9IDB4ZgorfTsKKyNkZWZpbmUgdl9J MlNfQ0hBTk5FTChuKQkJKChuKSA8PCAyKQorZW51bSB7CisJSTJTX1NUQU5EQVJEID0gMCwKKwlJ MlNfTEVGVF9KVVNUSUZJRUQgPSAxLAorCUkyU19SSUdIVF9KVVNUSUZJRUQgPSAyLAorfTsKKyNk ZWZpbmUgdl9JMlNfTU9ERShuKQkJCShuKQorCisjZGVmaW5lIEFVRElPX0kyU19NQVAJCQkweDM5 CisjZGVmaW5lIEFVRElPX0kyU19TV0FQU19TUERJRgkJMHgzYQorI2RlZmluZSB2X1NQSURGX0ZS RVEobikJCQkobikKKworI2RlZmluZSBOXzMySwkJCQkweDEwMDAKKyNkZWZpbmUgTl80NDFLCQkJ CTB4MTg4MAorI2RlZmluZSBOXzg4MksJCQkJMHgzMTAwCisjZGVmaW5lIE5fMTc2NEsJCQkJMHg2 MjAwCisjZGVmaW5lIE5fNDhLCQkJCTB4MTgwMAorI2RlZmluZSBOXzk2SwkJCQkweDMwMDAKKyNk ZWZpbmUgTl8xOTJLCQkJCTB4NjAwMAorCisjZGVmaW5lIEhETUlfQVVESU9fQ0hBTk5FTF9TVEFU VVMJMHgzZQorI2RlZmluZSBtX0FVRElPX1NUQVRVU19OTFBDTQkJKDEgPDwgNykKKyNkZWZpbmUg bV9BVURJT19TVEFUVVNfVVNFCQkoMSA8PCA2KQorI2RlZmluZSBtX0FVRElPX1NUQVRVU19DT1BZ UklHSFQJKDEgPDwgNSkKKyNkZWZpbmUgbV9BVURJT19TVEFUVVNfQURESVRJT04JCSgzIDw8IDIp CisjZGVmaW5lIG1fQVVESU9fU1RBVFVTX0NMS19BQ0NVUkFDWQkoMiA8PCAwKQorI2RlZmluZSB2 X0FVRElPX1NUQVRVU19OTFBDTShuKQkJKChuICYgMSkgPDwgNykKKyNkZWZpbmUgQVVESU9fTl9I CQkJMHgzZgorI2RlZmluZSBBVURJT19OX00JCQkweDQwCisjZGVmaW5lIEFVRElPX05fTAkJCTB4 NDEKKworI2RlZmluZSBIRE1JX0FVRElPX0NUU19ICQkweDQ1CisjZGVmaW5lIEhETUlfQVVESU9f Q1RTX00JCTB4NDYKKyNkZWZpbmUgSERNSV9BVURJT19DVFNfTAkJMHg0NworCisjZGVmaW5lIEhE TUlfRERDX0NMS19MCQkJMHg0YgorI2RlZmluZSBIRE1JX0REQ19DTEtfSAkJCTB4NGMKKworI2Rl ZmluZSBIRE1JX0VESURfU0VHTUVOVF9QT0lOVEVSCTB4NGQKKyNkZWZpbmUgSERNSV9FRElEX1dP UkRfQUREUgkJMHg0ZQorI2RlZmluZSBIRE1JX0VESURfRklGT19PRkZTRVQJCTB4NGYKKyNkZWZp bmUgSERNSV9FRElEX0ZJRk9fQUREUgkJMHg1MAorCisjZGVmaW5lIEhETUlfUEFDS0VUX1NFTkRf TUFOVUFMCQkweDljCisjZGVmaW5lIEhETUlfUEFDS0VUX1NFTkRfQVVUTwkJMHg5ZAorI2RlZmlu ZSBtX1BBQ0tFVF9HQ1BfRU4JCQkoMSA8PCA3KQorI2RlZmluZSBtX1BBQ0tFVF9NU0lfRU4JCQko MSA8PCA2KQorI2RlZmluZSBtX1BBQ0tFVF9TRElfRU4JCQkoMSA8PCA1KQorI2RlZmluZSBtX1BB Q0tFVF9WU0lfRU4JCQkoMSA8PCA0KQorI2RlZmluZSB2X1BBQ0tFVF9HQ1BfRU4obikJCSgobiAm IDEpIDw8IDcpCisjZGVmaW5lIHZfUEFDS0VUX01TSV9FTihuKQkJKChuICYgMSkgPDwgNikKKyNk ZWZpbmUgdl9QQUNLRVRfU0RJX0VOKG4pCQkoKG4gJiAxKSA8PCA1KQorI2RlZmluZSB2X1BBQ0tF VF9WU0lfRU4obikJCSgobiAmIDEpIDw8IDQpCisKKyNkZWZpbmUgSERNSV9DT05UUk9MX1BBQ0tF VF9CVUZfSU5ERVgJMHg5ZgorZW51bSB7CisJSU5GT0ZSQU1FX1ZTSSA9IDB4MDUsCisJSU5GT0ZS QU1FX0FWSSA9IDB4MDYsCisJSU5GT0ZSQU1FX0FBSSA9IDB4MDgsCit9OworCisjZGVmaW5lIEhE TUlfQ09OVFJPTF9QQUNLRVRfQUREUgkweGEwCisjZGVmaW5lIEhETUlfTUFYSU1VTV9JTkZPX0ZS QU1FX1NJWkUJMHgxMQorZW51bSB7CisJQVZJX0NPTE9SX01PREVfUkdCID0gMCwKKwlBVklfQ09M T1JfTU9ERV9ZQ0JDUjQyMiA9IDEsCisJQVZJX0NPTE9SX01PREVfWUNCQ1I0NDQgPSAyLAorCUFW SV9DT0xPUklNRVRSWV9OT19EQVRBID0gMCwKKworCUFWSV9DT0xPUklNRVRSWV9TTVBURV8xNzBN ID0gMSwKKwlBVklfQ09MT1JJTUVUUllfSVRVNzA5ID0gMiwKKwlBVklfQ09MT1JJTUVUUllfRVhU RU5ERUQgPSAzLAorCisJQVZJX0NPREVEX0ZSQU1FX0FTUEVDVF9OT19EQVRBID0gMCwKKwlBVklf Q09ERURfRlJBTUVfQVNQRUNUXzRfMyA9IDEsCisJQVZJX0NPREVEX0ZSQU1FX0FTUEVDVF8xNl85 ID0gMiwKKworCUFDVElWRV9BU1BFQ1RfUkFURV9TQU1FX0FTX0NPREVEX0ZSQU1FID0gMHgwOCwK KwlBQ1RJVkVfQVNQRUNUX1JBVEVfNF8zID0gMHgwOSwKKwlBQ1RJVkVfQVNQRUNUX1JBVEVfMTZf OSA9IDB4MEEsCisJQUNUSVZFX0FTUEVDVF9SQVRFXzE0XzkgPSAweDBCLAorfTsKKworI2RlZmlu ZSBIRE1JX0hEQ1BfQ1RSTAkJCTB4NTIKKyNkZWZpbmUgbV9IRE1JX0RWSQkJCSgxIDw8IDEpCisj ZGVmaW5lIHZfSERNSV9EVkkobikJCQkobiA8PCAxKQorCisjZGVmaW5lIEhETUlfSU5URVJSVVBU X01BU0sxCQkweGMwCisjZGVmaW5lIEhETUlfSU5URVJSVVBUX1NUQVRVUzEJCTB4YzEKKyNkZWZp bmUJbV9JTlRfQUNUSVZFX1ZTWU5DCQkoMSA8PCA1KQorI2RlZmluZSBtX0lOVF9FRElEX1JFQURZ CQkoMSA8PCAyKQorCisjZGVmaW5lIEhETUlfSU5URVJSVVBUX01BU0syCQkweGMyCisjZGVmaW5l IEhETUlfSU5URVJSVVBUX1NUQVRVUzIJCTB4YzMKKyNkZWZpbmUgbV9JTlRfSERDUF9FUlIJCQko MSA8PCA3KQorI2RlZmluZSBtX0lOVF9CS1NWX0ZMQUcJCQkoMSA8PCA2KQorI2RlZmluZSBtX0lO VF9IRENQX09LCQkJKDEgPDwgNCkKKworI2RlZmluZSBIRE1JX1NUQVRVUwkJCTB4YzgKKyNkZWZp bmUgbV9IT1RQTFVHCQkJKDEgPDwgNykKKyNkZWZpbmUgbV9NQVNLX0lOVF9IT1RQTFVHCQkoMSA8 PCA1KQorI2RlZmluZSBtX0lOVF9IT1RQTFVHCQkJKDEgPDwgMSkKKyNkZWZpbmUgdl9NQVNLX0lO VF9IT1RQTFVHKG4pCQkoKG4gJiAweDEpIDw8IDUpCisKKyNkZWZpbmUgSERNSV9DT0xPUkJBUiAg ICAgICAgICAgICAgICAgICAweGM5CisKKyNkZWZpbmUgSERNSV9QSFlfU1lOQwkJCTB4Y2UKKyNk ZWZpbmUgSERNSV9QSFlfU1lTX0NUTAkJMHhlMAorI2RlZmluZSBtX1RNRFNfQ0xLX1NPVVJDRQkJ KDEgPDwgNSkKKyNkZWZpbmUgdl9UTURTX0ZST01fUExMCQkJKDAgPDwgNSkKKyNkZWZpbmUgdl9U TURTX0ZST01fR0VOCQkJKDEgPDwgNSkKKyNkZWZpbmUgbV9QSEFTRV9DTEsJCQkoMSA8PCA0KQor I2RlZmluZSB2X0RFRkFVTFRfUEhBU0UJCQkoMCA8PCA0KQorI2RlZmluZSB2X1NZTkNfUEhBU0UJ CQkoMSA8PCA0KQorI2RlZmluZSBtX1RNRFNfQ1VSUkVOVF9QV1IJCSgxIDw8IDMpCisjZGVmaW5l IHZfVFVSTl9PTl9DVVJSRU5UCQkoMCA8PCAzKQorI2RlZmluZSB2X0NBVF9PRkZfQ1VSUkVOVAkJ KDEgPDwgMykKKyNkZWZpbmUgbV9CQU5ER0FQX1BXUgkJCSgxIDw8IDIpCisjZGVmaW5lIHZfQkFO REdBUF9QV1JfVVAJCSgwIDw8IDIpCisjZGVmaW5lIHZfQkFOREdBUF9QV1JfRE9XTgkJKDEgPDwg MikKKyNkZWZpbmUgbV9QTExfUFdSCQkJKDEgPDwgMSkKKyNkZWZpbmUgdl9QTExfUFdSX1VQCQkJ KDAgPDwgMSkKKyNkZWZpbmUgdl9QTExfUFdSX0RPV04JCQkoMSA8PCAxKQorI2RlZmluZSBtX1RN RFNfQ0hHX1BXUgkJCSgxIDw8IDApCisjZGVmaW5lIHZfVE1EU19DSEdfUFdSX1VQCQkoMCA8PCAw KQorI2RlZmluZSB2X1RNRFNfQ0hHX1BXUl9ET1dOCQkoMSA8PCAwKQorCisjZGVmaW5lIEhETUlf UEhZX0NIR19QV1IJCTB4ZTEKKyNkZWZpbmUgdl9DTEtfQ0hHX1BXUihuKQkJKChuICYgMSkgPDwg MykKKyNkZWZpbmUgdl9EQVRBX0NIR19QV1IobikJCSgobiAmIDcpIDw8IDApCisKKyNkZWZpbmUg SERNSV9QSFlfRFJJVkVSCQkJMHhlMgorI2RlZmluZSB2X0NMS19NQUlOX0RSSVZFUihuKQkJKG4g PDwgNCkKKyNkZWZpbmUgdl9EQVRBX01BSU5fRFJJVkVSKG4pCQkobiA8PCAwKQorCisjZGVmaW5l IEhETUlfUEhZX1BSRV9FTVBIQVNJUwkJMHhlMworI2RlZmluZSB2X1BSRV9FTVBIQVNJUyhuKQkJ KChuICYgNykgPDwgNCkKKyNkZWZpbmUgdl9DTEtfUFJFX0RSSVZFUihuKQkJKChuICYgMykgPDwg MikKKyNkZWZpbmUgdl9EQVRBX1BSRV9EUklWRVIobikJCSgobiAmIDMpIDw8IDApCisKKyNkZWZp bmUgSERNSV9QSFlfRkVFREJBQ0tfRElWX1JBVElPX0xPVwkJMHhlNworI2RlZmluZSB2X0ZFRURC QUNLX0RJVl9MT1cobikJCQkobiAmIDB4ZmYpCisjZGVmaW5lIEhETUlfUEhZX0ZFRURCQUNLX0RJ Vl9SQVRJT19ISUdICTB4ZTgKKyNkZWZpbmUgdl9GRUVEQkFDS19ESVZfSElHSChuKQkJCShuICYg MSkKKworI2RlZmluZSBIRE1JX1BIWV9QUkVfRElWX1JBVElPCQkweGVkCisjZGVmaW5lIHZfUFJF X0RJVl9SQVRJTyhuKQkJKG4gJiAweDFmKQorCisjZGVmaW5lIEhETUlfQ0VDX0NUUkwJCQkweGQw CisjZGVmaW5lIG1fQURKVVNUX0ZPUl9ISVNFTlNFCQkoMSA8PCA2KQorI2RlZmluZSBtX1JFSkVD VF9SWF9CUk9BRENBU1QJCSgxIDw8IDUpCisjZGVmaW5lIG1fQlVTRlJFRVRJTUVfRU5BQkxFCQko MSA8PCAyKQorI2RlZmluZSBtX1JFSkVDVF9SWAkJCSgxIDw8IDEpCisjZGVmaW5lIG1fU1RBUlRf VFgJCQkoMSA8PCAwKQorCisjZGVmaW5lIEhETUlfQ0VDX0RBVEEJCQkweGQxCisjZGVmaW5lIEhE TUlfQ0VDX1RYX09GRlNFVAkJMHhkMgorI2RlZmluZSBIRE1JX0NFQ19SWF9PRkZTRVQJCTB4ZDMK KyNkZWZpbmUgSERNSV9DRUNfQ0xLX0gJCQkweGQ0CisjZGVmaW5lIEhETUlfQ0VDX0NMS19MCQkJ MHhkNQorI2RlZmluZSBIRE1JX0NFQ19UWF9MRU5HVEgJCTB4ZDYKKyNkZWZpbmUgSERNSV9DRUNf UlhfTEVOR1RICQkweGQ3CisjZGVmaW5lIEhETUlfQ0VDX1RYX0lOVF9NQVNLCQkweGQ4CisjZGVm aW5lIG1fVFhfRE9ORQkJCSgxIDw8IDMpCisjZGVmaW5lIG1fVFhfTk9BQ0sJCQkoMSA8PCAyKQor I2RlZmluZSBtX1RYX0JST0FEQ0FTVF9SRUoJCSgxIDw8IDEpCisjZGVmaW5lIG1fVFhfQlVTTk9U RlJFRQkJCSgxIDw8IDApCisKKyNkZWZpbmUgSERNSV9DRUNfUlhfSU5UX01BU0sJCTB4ZDkKKyNk ZWZpbmUgbV9SWF9MQV9FUlIJCQkoMSA8PCA0KQorI2RlZmluZSBtX1JYX0dMSVRDSAkJCSgxIDw8 IDMpCisjZGVmaW5lIG1fUlhfRE9ORQkJCSgxIDw8IDApCisKKyNkZWZpbmUgSERNSV9DRUNfVFhf SU5UCQkJMHhkYQorI2RlZmluZSBIRE1JX0NFQ19SWF9JTlQJCQkweGRiCisjZGVmaW5lIEhETUlf Q0VDX0JVU0ZSRUVUSU1FX0wJCTB4ZGMKKyNkZWZpbmUgSERNSV9DRUNfQlVTRlJFRVRJTUVfSAkJ MHhkZAorI2RlZmluZSBIRE1JX0NFQ19MT0dJQ0FERFIJCTB4ZGUKKworI2VuZGlmIC8qIF9fSU5O T19IRE1JX0hfXyAqLwotLSAKMS45LjEKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5m cmVlZGVza3RvcC5vcmcKaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2RyaS1kZXZlbAo=