From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dave Gordon Subject: [PATCH 09/13 v4] drm/i915: Implementation of GuC client Date: Thu, 9 Jul 2015 19:29:10 +0100 Message-ID: <1436466554-24806-10-git-send-email-david.s.gordon@intel.com> References: <1436466554-24806-1-git-send-email-david.s.gordon@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by gabe.freedesktop.org (Postfix) with ESMTP id A335C6ED13 for ; Thu, 9 Jul 2015 11:29:54 -0700 (PDT) In-Reply-To: <1436466554-24806-1-git-send-email-david.s.gordon@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org QSBHdUMgY2xpZW50IGhhcyBpdHMgb3duIGRvb3JiZWxsIGFuZCB3b3JrcXVldWUuIEl0IG1haW50 YWlucyB0aGUKZG9vcmJlbGwgY2FjaGUgbGluZSwgcHJvY2VzcyBkZXNjcmlwdGlvbiBvYmplY3Qg YW5kIHdvcmsgcXVldWUgaXRlbS4KCkEgZGVmYXVsdCBndWNfY2xpZW50IGlzIGNyZWF0ZWQgZm9y IHRoZSBpOTE1IGRyaXZlciB0byB1c2UgZm9yCm5vcm1hbC1wcmlvcml0eSBpbi1vcmRlciBzdWJt aXNzaW9uLgoKTm90ZSB0aGF0IHRoZSBjcmVhdGVkIGNsaWVudCBpcyBub3QgeWV0IHJlYWR5IGZv ciB1c2U7IGRvb3JiZWxsCmFsbG9jYXRpb24gd2lsbCBmYWlsIGFzIHdlIGhhdmVuJ3QgeWV0IGxp bmtlZCB0aGUgR3VDJ3MgY29udGV4dApkZXNjcmlwdG9yIHRvIHRoZSBkZWZhdWx0IGNvbnRleHRz IGZvciBlYWNoIHJpbmcgKHNlZSBsYXRlciBwYXRjaCkuCgp2MjoKICAgIERlZmVyIGFkZGluZyBz dHJ1Y3R1cmUgbWVtYmVycyB1bnRpbCBuZWVkZWQgW0NocmlzIFdpbHNvbl0KICAgIFJhdGlvbmFs aXNlIHR5cGUgZGVjbGFyYXRpb25zIFtDaHJpcyBXaWxzb25dCgp2NDoKICAgIFJlYmFzZWQKCklz c3VlOiBWSVotNDg4NApTaWduZWQtb2ZmLWJ5OiBBbGV4IERhaSA8eXUuZGFpQGludGVsLmNvbT4K U2lnbmVkLW9mZi1ieTogRGF2ZSBHb3Jkb24gPGRhdmlkLnMuZ29yZG9uQGludGVsLmNvbT4KLS0t CiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2d1Y19zdWJtaXNzaW9uLmMgfCA2NDkgKysrKysr KysrKysrKysrKysrKysrKysrKysrKysKIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2d1Yy5o ICAgICAgICAgICB8ICA0MiArKwogZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZ3VjX2xvYWRl ci5jICAgIHwgIDEyICsKIDMgZmlsZXMgY2hhbmdlZCwgNzAzIGluc2VydGlvbnMoKykKCmRpZmYg LS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2d1Y19zdWJtaXNzaW9uLmMgYi9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2d1Y19zdWJtaXNzaW9uLmMKaW5kZXggZTlkNDZkNi4uMjVk ODgwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9ndWNfc3VibWlzc2lv bi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ3VjX3N1Ym1pc3Npb24uYwpAQCAt MjcsNiArMjcsNTEyIEBACiAjaW5jbHVkZSAiaW50ZWxfZ3VjLmgiCiAKIC8qKgorICogRE9DOiBH dUMgQ2xpZW50CisgKgorICogaTkxNV9ndWNfY2xpZW50OgorICogV2UgdXNlIHRoZSB0ZXJtIGNs aWVudCB0byBhdm9pZCBjb25mdXNpb24gd2l0aCBjb250ZXh0cy4gQSBpOTE1X2d1Y19jbGllbnQg aXMKKyAqIGVxdWl2YWxlbnQgdG8gR3VDIG9iamVjdCBndWNfY29udGV4dF9kZXNjLiBUaGlzIGNv bnRleHQgZGVzY3JpcHRvciBpcworICogYWxsb2NhdGVkIGZyb20gYSBwb29sIG9mIDEwMjQgZW50 cmllcy4gS2VybmVsIGRyaXZlciB3aWxsIGFsbG9jYXRlIGRvb3JiZWxsCisgKiBhbmQgd29ya3F1 ZXVlIGZvciBpdC4gQWxzbyB0aGUgcHJvY2VzcyBkZXNjcmlwdG9yIChndWNfcHJvY2Vzc19kZXNj KSwgd2hpY2gKKyAqIGlzIG1hcHBlZCB0byBjbGllbnQgc3BhY2UuIFNvIHRoZSBjbGllbnQgY2Fu IHdyaXRlIFdvcmsgSXRlbSB0aGVuIHJpbmcgdGhlCisgKiBkb29yYmVsbC4KKyAqCisgKiBUbyBz aW1wbGlmeSB0aGUgaW1wbGVtZW50YXRpb24sIHdlIGFsbG9jYXRlIG9uZSBnZW0gb2JqZWN0IHRo YXQgY29udGFpbnMgYWxsCisgKiBwYWdlcyBmb3IgZG9vcmJlbGwsIHByb2Nlc3MgZGVzY3JpcHRv ciBhbmQgd29ya3F1ZXVlLgorICoKKyAqIFRoZSBTY3JhdGNoIHJlZ2lzdGVyczoKKyAqIFRoZXJl IGFyZSAxNiBNTUlPLWJhc2VkIHJlZ2lzdGVycyBzdGFydCBmcm9tIDB4QzE4MC4gVGhlIGtlcm5l bCBkcml2ZXIgd3JpdGVzCisgKiBhIHZhbHVlIHRvIHRoZSBhY3Rpb24gcmVnaXN0ZXIgKFNPRlRf U0NSQVRDSF8wKSBhbG9uZyB3aXRoIGFueSBkYXRhLiBJdCB0aGVuCisgKiB0cmlnZ2VycyBhbiBp bnRlcnJ1cHQgb24gdGhlIEd1QyB2aWEgYW5vdGhlciByZWdpc3RlciB3cml0ZSAoMHhDNEM4KS4K KyAqIEZpcm13YXJlIHdyaXRlcyBhIHN1Y2Nlc3MvZmFpbCBjb2RlIGJhY2sgdG8gdGhlIGFjdGlv biByZWdpc3RlciBhZnRlcgorICogcHJvY2Vzc2VzIHRoZSByZXF1ZXN0LiBUaGUga2VybmVsIGRy aXZlciBwb2xscyB3YWl0aW5nIGZvciB0aGlzIHVwZGF0ZSBhbmQKKyAqIHRoZW4gcHJvY2VlZHMu CisgKiBTZWUgaG9zdDJndWNfYWN0aW9uKCkKKyAqCisgKiBEb29yYmVsbHM6CisgKiBEb29yYmVs bHMgYXJlIGludGVycnVwdHMgdG8gdUtlcm5lbC4gQSBkb29yYmVsbCBpcyBhIHNpbmdsZSBjYWNo ZSBsaW5lIChRVykKKyAqIG1hcHBlZCBpbnRvIHByb2Nlc3Mgc3BhY2UuCisgKgorICogV29yayBJ dGVtczoKKyAqIFRoZXJlIGFyZSBzZXZlcmFsIHR5cGVzIG9mIHdvcmsgaXRlbXMgdGhhdCB0aGUg aG9zdCBtYXkgcGxhY2UgaW50byBhCisgKiB3b3JrcXVldWUsIGVhY2ggd2l0aCBpdHMgb3duIHJl cXVpcmVtZW50cyBhbmQgbGltaXRhdGlvbnMuIEN1cnJlbnRseSBvbmx5CisgKiBXUV9UWVBFX0lO T1JERVIgaXMgbmVlZGVkIHRvIHN1cHBvcnQgbGVnYWN5IHN1Ym1pc3Npb24gdmlhIEd1Qywgd2hp Y2gKKyAqIHJlcHJlc2VudHMgaW4tb3JkZXIgcXVldWUuIFRoZSBrZXJuZWwgZHJpdmVyIHBhY2tz IHJpbmcgdGFpbCBwb2ludGVyIGFuZCBhbgorICogRUxTUCBjb250ZXh0IGRlc2NyaXB0b3IgZHdv cmQgaW50byBXb3JrIEl0ZW0uCisgKiBTZWUgZ3VjX2FkZF93b3JrcXVldWVfaXRlbSgpCisgKgor ICovCisKKy8qCisgKiBSZWFkIEd1QyBjb21tYW5kL3N0YXR1cyByZWdpc3RlciAoU09GVF9TQ1JB VENIXzApCisgKiBSZXR1cm4gdHJ1ZSBpZiBpdCBjb250YWlucyBhIHJlc3BvbnNlIHJhdGhlciB0 aGFuIGEgY29tbWFuZAorICovCitzdGF0aWMgaW5saW5lIGJvb2wgaG9zdDJndWNfYWN0aW9uX3Jl c3BvbnNlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKKwkJCQkJICAgIHUzMiAq c3RhdHVzKQoreworCXUzMiB2YWwgPSBJOTE1X1JFQUQoU09GVF9TQ1JBVENIKDApKTsKKwkqc3Rh dHVzID0gdmFsOworCXJldHVybiBHVUMySE9TVF9JU19SRVNQT05TRSh2YWwpOworfQorCitzdGF0 aWMgaW50IGhvc3QyZ3VjX2FjdGlvbihzdHJ1Y3QgaW50ZWxfZ3VjICpndWMsIHUzMiAqZGF0YSwg dTMyIGxlbikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBndWNfdG9f aTkxNShndWMpOworCXUzMiBzdGF0dXM7CisJaW50IGk7CisJaW50IHJldDsKKworCWlmIChXQVJO X09OKGxlbiA8IDEgfHwgbGVuID4gMTUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9j aygmZGV2X3ByaXYtPmd1Yy5ob3N0Mmd1Y19sb2NrKTsKKworCWRldl9wcml2LT5ndWMuYWN0aW9u X2NvdW50ICs9IDE7CisJZGV2X3ByaXYtPmd1Yy5hY3Rpb25fY21kID0gZGF0YVswXTsKKworCWZv ciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJSTkxNV9XUklURShTT0ZUX1NDUkFUQ0goaSksIGRh dGFbaV0pOworCisJUE9TVElOR19SRUFEKFNPRlRfU0NSQVRDSChpIC0gMSkpOworCisJSTkxNV9X UklURShIT1NUMkdVQ19JTlRFUlJVUFQsIEhPU1QyR1VDX1RSSUdHRVIpOworCisJcmV0ID0gd2Fp dF9mb3JfYXRvbWljKGhvc3QyZ3VjX2FjdGlvbl9yZXNwb25zZShkZXZfcHJpdiwgJnN0YXR1cyks IDEwKTsKKwlpZiAoc3RhdHVzICE9IEdVQzJIT1NUX1NUQVRVU19TVUNDRVNTKSB7CisJCS8qIGVp dGhlciBHdUMgZG9lc24ndCByZXNwb25kLCB3aGljaCBpcyBhIFRJTUVPVVQsCisJCSAqIG9yIGEg ZmFpbHVyZSBjb2RlIGlzIHJldHVybmVkLiAqLworCQlpZiAocmV0ICE9IC1FVElNRURPVVQpCisJ CQlyZXQgPSAtRUlPOworCisJCURSTV9FUlJPUigiR1VDOiBob3N0Mmd1YyBhY3Rpb24gMHglWCBm YWlsZWQuIHJldD0lZCAiCisJCQkJInN0YXR1cz0weCUwOFggcmVzcG9uc2U9MHglMDhYXG4iLAor CQkJCWRhdGFbMF0sIHJldCwgc3RhdHVzLAorCQkJCUk5MTVfUkVBRChTT0ZUX1NDUkFUQ0goMTUp KSk7CisKKwkJZGV2X3ByaXYtPmd1Yy5hY3Rpb25fZmFpbCArPSAxOworCQlkZXZfcHJpdi0+Z3Vj LmFjdGlvbl9lcnIgPSByZXQ7CisJfQorCWRldl9wcml2LT5ndWMuYWN0aW9uX3N0YXR1cyA9IHN0 YXR1czsKKworCXNwaW5fdW5sb2NrKCZkZXZfcHJpdi0+Z3VjLmhvc3QyZ3VjX2xvY2spOworCisJ cmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRlbGwgdGhlIEd1QyB0byBhbGxvY2F0ZSBvciBkZWFs bG9jYXRlIGEgc3BlY2lmaWMgZG9vcmJlbGwKKyAqLworCitzdGF0aWMgaW50IGhvc3QyZ3VjX2Fs bG9jYXRlX2Rvb3JiZWxsKHN0cnVjdCBpbnRlbF9ndWMgKmd1YywKKwkJCQkgICAgICBzdHJ1Y3Qg aTkxNV9ndWNfY2xpZW50ICpjbGllbnQpCit7CisJdTMyIGRhdGFbMl07CisKKwlkYXRhWzBdID0g SE9TVDJHVUNfQUNUSU9OX0FMTE9DQVRFX0RPT1JCRUxMOworCWRhdGFbMV0gPSBjbGllbnQtPmN0 eF9pbmRleDsKKworCXJldHVybiBob3N0Mmd1Y19hY3Rpb24oZ3VjLCBkYXRhLCAyKTsKK30KKwor c3RhdGljIGludCBob3N0Mmd1Y19yZWxlYXNlX2Rvb3JiZWxsKHN0cnVjdCBpbnRlbF9ndWMgKmd1 YywKKwkJCQkgICAgIHN0cnVjdCBpOTE1X2d1Y19jbGllbnQgKmNsaWVudCkKK3sKKwl1MzIgZGF0 YVsyXTsKKworCWRhdGFbMF0gPSBIT1NUMkdVQ19BQ1RJT05fREVBTExPQ0FURV9ET09SQkVMTDsK KwlkYXRhWzFdID0gY2xpZW50LT5jdHhfaW5kZXg7CisKKwlyZXR1cm4gaG9zdDJndWNfYWN0aW9u KGd1YywgZGF0YSwgMik7Cit9CisKKy8qCisgKiBJbml0aWFsaXNlLCB1cGRhdGUsIG9yIGNsZWFy IGRvb3JiZWxsIGRhdGEgc2hhcmVkIHdpdGggdGhlIEd1QworICoKKyAqIFRoZXNlIGZ1bmN0aW9u cyBtb2RpZnkgc2hhcmVkIGRhdGEgYW5kIHNvIG5lZWQgYWNjZXNzIHRvIHRoZSBtYXBwZWQKKyAq IGNsaWVudCBvYmplY3Qgd2hpY2ggY29udGFpbnMgdGhlIHBhZ2UgYmVpbmcgdXNlZCBmb3IgdGhl IGRvb3JiZWxsCisgKi8KKworc3RhdGljIHZvaWQgZ3VjX2luaXRfZG9vcmJlbGwoc3RydWN0IGlu dGVsX2d1YyAqZ3VjLAorCQkJICAgICAgc3RydWN0IGk5MTVfZ3VjX2NsaWVudCAqY2xpZW50KQor eworCXN0cnVjdCBndWNfZG9vcmJlbGxfaW5mbyAqZG9vcmJlbGw7CisJdm9pZCAqYmFzZTsKKwor CWJhc2UgPSBrbWFwX2F0b21pYyhpOTE1X2dlbV9vYmplY3RfZ2V0X3BhZ2UoY2xpZW50LT5jbGll bnRfb2JqLCAwKSk7CisJZG9vcmJlbGwgPSBiYXNlICsgY2xpZW50LT5kb29yYmVsbF9vZmZzZXQ7 CisKKwlkb29yYmVsbC0+ZGJfc3RhdHVzID0gMTsKKwlkb29yYmVsbC0+Y29va2llID0gMDsKKwor CWt1bm1hcF9hdG9taWMoYmFzZSk7Cit9CisKK3N0YXRpYyBpbnQgZ3VjX3JpbmdfZG9vcmJlbGwo c3RydWN0IGk5MTVfZ3VjX2NsaWVudCAqZ2MpCit7CisJc3RydWN0IGd1Y19wcm9jZXNzX2Rlc2Mg KmRlc2M7CisJdW5pb24gZ3VjX2Rvb3JiZWxsX3F3IGRiX2NtcCwgZGJfZXhjLCBkYl9yZXQ7CisJ dW5pb24gZ3VjX2Rvb3JiZWxsX3F3ICpkYjsKKwl2b2lkICpiYXNlOworCWludCBhdHRlbXB0ID0g MiwgcmV0ID0gLUVBR0FJTjsKKworCWJhc2UgPSBrbWFwX2F0b21pYyhpOTE1X2dlbV9vYmplY3Rf Z2V0X3BhZ2UoZ2MtPmNsaWVudF9vYmosIDApKTsKKwlkZXNjID0gYmFzZSArIGdjLT5wcm9jX2Rl c2Nfb2Zmc2V0OworCisJLyogVXBkYXRlIHRoZSB0YWlsIHNvIGl0IGlzIHZpc2libGUgdG8gR3VD ICovCisJZGVzYy0+dGFpbCA9IGdjLT53cV90YWlsOworCisJLyogY3VycmVudCBjb29raWUgKi8K KwlkYl9jbXAuZGJfc3RhdHVzID0gR1VDX0RPT1JCRUxMX0VOQUJMRUQ7CisJZGJfY21wLmNvb2tp ZSA9IGdjLT5jb29raWU7CisKKwkvKiBjb29raWUgdG8gYmUgdXBkYXRlZCAqLworCWRiX2V4Yy5k Yl9zdGF0dXMgPSBHVUNfRE9PUkJFTExfRU5BQkxFRDsKKwlkYl9leGMuY29va2llID0gZ2MtPmNv b2tpZSArIDE7CisJaWYgKGRiX2V4Yy5jb29raWUgPT0gMCkKKwkJZGJfZXhjLmNvb2tpZSA9IDE7 CisKKwkvKiBwb2ludGVyIG9mIGN1cnJlbnQgZG9vcmJlbGwgY2FjaGVsaW5lICovCisJZGIgPSBi YXNlICsgZ2MtPmRvb3JiZWxsX29mZnNldDsKKworCXdoaWxlIChhdHRlbXB0LS0pIHsKKwkJLyog bGV0cyByaW5nIHRoZSBkb29yYmVsbCAqLworCQlkYl9yZXQudmFsdWVfcXcgPSBhdG9taWM2NF9j bXB4Y2hnKChhdG9taWM2NF90ICopZGIsCisJCQlkYl9jbXAudmFsdWVfcXcsIGRiX2V4Yy52YWx1 ZV9xdyk7CisKKwkJLyogaWYgdGhlIGV4Y2hhbmdlIHdhcyBzdWNjZXNzZnVsbHkgZXhlY3V0ZWQg Ki8KKwkJaWYgKGRiX3JldC52YWx1ZV9xdyA9PSBkYl9jbXAudmFsdWVfcXcpIHsKKwkJCS8qIGRi IHdhcyBzdWNjZXNzZnVsbHkgcnVuZyAqLworCQkJZ2MtPmNvb2tpZSA9IGRiX2V4Yy5jb29raWU7 CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBYWFg6IGRvb3JiZWxsIHdhcyBs b3N0IGFuZCBuZWVkIHRvIGFjcXVpcmUgaXQgYWdhaW4gKi8KKwkJaWYgKGRiX3JldC5kYl9zdGF0 dXMgPT0gR1VDX0RPT1JCRUxMX0RJU0FCTEVEKQorCQkJYnJlYWs7CisKKwkJRFJNX0VSUk9SKCJD b29raWUgbWlzbWF0Y2guIEV4cGVjdGVkICVkLCByZXR1cm5lZCAlZFxuIiwKKwkJCSAgZGJfY21w LmNvb2tpZSwgZGJfcmV0LmNvb2tpZSk7CisKKwkJLyogdXBkYXRlIHRoZSBjb29raWUgdG8gbmV3 bHkgcmVhZCBjb29raWUgZnJvbSBHdUMgKi8KKwkJZGJfY21wLmNvb2tpZSA9IGRiX3JldC5jb29r aWU7CisJCWRiX2V4Yy5jb29raWUgPSBkYl9yZXQuY29va2llICsgMTsKKwkJaWYgKGRiX2V4Yy5j b29raWUgPT0gMCkKKwkJCWRiX2V4Yy5jb29raWUgPSAxOworCX0KKworCWt1bm1hcF9hdG9taWMo YmFzZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZ3VjX2Rpc2FibGVfZG9vcmJl bGwoc3RydWN0IGludGVsX2d1YyAqZ3VjLAorCQkJCSBzdHJ1Y3QgaTkxNV9ndWNfY2xpZW50ICpj bGllbnQpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZ3VjX3RvX2k5 MTUoZ3VjKTsKKwlzdHJ1Y3QgZ3VjX2Rvb3JiZWxsX2luZm8gKmRvb3JiZWxsOworCXZvaWQgKmJh c2U7CisJaW50IGRyYnJlZyA9IEdFTjhfRFJCUkVHTChjbGllbnQtPmRvb3JiZWxsX2lkKTsKKwlp bnQgdmFsdWU7CisKKwliYXNlID0ga21hcF9hdG9taWMoaTkxNV9nZW1fb2JqZWN0X2dldF9wYWdl KGNsaWVudC0+Y2xpZW50X29iaiwgMCkpOworCWRvb3JiZWxsID0gYmFzZSArIGNsaWVudC0+ZG9v cmJlbGxfb2Zmc2V0OworCisJZG9vcmJlbGwtPmRiX3N0YXR1cyA9IDA7CisKKwlrdW5tYXBfYXRv bWljKGJhc2UpOworCisJSTkxNV9XUklURShkcmJyZWcsIEk5MTVfUkVBRChkcmJyZWcpICYgfkdF TjhfRFJCX1ZBTElEKTsKKworCXZhbHVlID0gSTkxNV9SRUFEKGRyYnJlZyk7CisJV0FSTl9PTigo dmFsdWUgJiBHRU44X0RSQl9WQUxJRCkgIT0gMCk7CisKKwlJOTE1X1dSSVRFKEdFTjhfRFJCUkVH VShjbGllbnQtPmRvb3JiZWxsX2lkKSwgMCk7CisJSTkxNV9XUklURShkcmJyZWcsIDApOworCisJ LyogWFhYOiB3YWl0IGZvciBhbnkgaW50ZXJydXB0cyAqLworCS8qIFhYWDogd2FpdCBmb3Igd29y a3F1ZXVlIHRvIGRyYWluICovCit9CisKKy8qCisgKiBTZWxlY3QsIGFzc2lnbiBhbmQgcmVsYXNl IGRvb3JiZWxsIGNhY2hlbGluZXMKKyAqCisgKiBUaGVzZSBmdW5jdGlvbnMgdHJhY2sgd2hpY2gg ZG9vcmJlbGwgY2FjaGVsaW5lcyBhcmUgaW4gdXNlLgorICogVGhlIGRhdGEgdGhleSBtYW5pcHVs YXRlIGlzIHByb3RlY3RlZCBieSB0aGUgaG9zdDJndWMgbG9jay4KKyAqLworCitzdGF0aWMgdWlu dDMyX3Qgc2VsZWN0X2Rvb3JiZWxsX2NhY2hlbGluZShzdHJ1Y3QgaW50ZWxfZ3VjICpndWMpCit7 CisJY29uc3QgdWludDMyX3QgY2FjaGVsaW5lX3NpemUgPSBib290X2NwdV9kYXRhLng4Nl9jbGZs dXNoX3NpemU7CisJdWludDMyX3Qgb2Zmc2V0OworCisJc3Bpbl9sb2NrKCZndWMtPmhvc3QyZ3Vj X2xvY2spOworCisJLyogRG9vcmJlbGwgdXNlcyBhIHNpbmdsZSBjYWNoZSBsaW5lIHdpdGhpbiBh IHBhZ2UgKi8KKwlvZmZzZXQgPSBndWMtPmRiX2NhY2hlbGluZSAmIFBBR0VfTUFTSzsKKworCS8q IE1vdmluZyB0byBuZXh0IGNhY2hlIGxpbmUgdG8gcmVkdWNlIGNvbnRlbnRpb24gKi8KKwlndWMt PmRiX2NhY2hlbGluZSArPSBjYWNoZWxpbmVfc2l6ZTsKKworCXNwaW5fdW5sb2NrKCZndWMtPmhv c3QyZ3VjX2xvY2spOworCisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIHVpbnQxNl90IGFz c2lnbl9kb29yYmVsbChzdHJ1Y3QgaW50ZWxfZ3VjICpndWMsIHVpbnQzMl90IHByaW9yaXR5KQor eworCS8qIFRoZSBiaXRtYXAgaXMgc3BsaXQgaW50byB0d28gaGFsdmVzIC0gaGlnaCBhbmQgbm9y bWFsIHByaW9yaXR5LiAqLworCWNvbnN0IHVpbnQxNl90IGhhbGYgPSBHVUNfTUFYX0RPT1JCRUxM UyAvIDI7CisJY29uc3QgdWludDE2X3Qgc3RhcnQgPSAocHJpb3JpdHkgPD0gR1VDX0NUWF9QUklP UklUWV9ISUdIKSA/IGhhbGYgOiAwOworCWNvbnN0IHVpbnQxNl90IGVuZCA9IHN0YXJ0ICsgaGFs ZjsKKwl1aW50MTZfdCBpZDsKKworCXNwaW5fbG9jaygmZ3VjLT5ob3N0Mmd1Y19sb2NrKTsKKwlp ZCA9IGZpbmRfbmV4dF96ZXJvX2JpdChndWMtPmRvb3JiZWxsX2JpdG1hcCwgZW5kLCBzdGFydCk7 CisJaWYgKGlkID09IGVuZCkKKwkJaWQgPSBHVUNfSU5WQUxJRF9ET09SQkVMTF9JRDsKKwllbHNl CisJCWJpdG1hcF9zZXQoZ3VjLT5kb29yYmVsbF9iaXRtYXAsIGlkLCAxKTsKKwlzcGluX3VubG9j aygmZ3VjLT5ob3N0Mmd1Y19sb2NrKTsKKworCXJldHVybiBpZDsKK30KKworc3RhdGljIHZvaWQg cmVsZWFzZV9kb29yYmVsbChzdHJ1Y3QgaW50ZWxfZ3VjICpndWMsIHVpbnQxNl90IGlkKQorewor CXNwaW5fbG9jaygmZ3VjLT5ob3N0Mmd1Y19sb2NrKTsKKwliaXRtYXBfY2xlYXIoZ3VjLT5kb29y YmVsbF9iaXRtYXAsIGlkLCAxKTsKKwlzcGluX3VubG9jaygmZ3VjLT5ob3N0Mmd1Y19sb2NrKTsK K30KKworLyoKKyAqIEluaXRpYWxpc2UgdGhlIHByb2Nlc3MgZGVzY3JpcHRvciBzaGFyZWQgd2l0 aCB0aGUgR3VDIGZpcm13YXJlLgorICovCitzdGF0aWMgdm9pZCBndWNfaW5pdF9wcm9jX2Rlc2Mo c3RydWN0IGludGVsX2d1YyAqZ3VjLAorCQkJICAgICAgIHN0cnVjdCBpOTE1X2d1Y19jbGllbnQg KmNsaWVudCkKK3sKKwlzdHJ1Y3QgZ3VjX3Byb2Nlc3NfZGVzYyAqZGVzYzsKKwl2b2lkICpiYXNl OworCisJYmFzZSA9IGttYXBfYXRvbWljKGk5MTVfZ2VtX29iamVjdF9nZXRfcGFnZShjbGllbnQt PmNsaWVudF9vYmosIDApKTsKKwlkZXNjID0gYmFzZSArIGNsaWVudC0+cHJvY19kZXNjX29mZnNl dDsKKworCW1lbXNldChkZXNjLCAwLCBzaXplb2YoKmRlc2MpKTsKKworCS8qCisJICogWFhYOiBw RG9vcmJlbGwgYW5kIFdRVkJhc2VBZGRyZXNzIGFyZSBwb2ludGVycyBpbiBwcm9jZXNzIGFkZHJl c3MKKwkgKiBzcGFjZSBmb3IgcmluZzMgY2xpZW50cyAoc2V0IHRoZW0gYXMgaW4gbW1hcF9pb2N0 bCkgb3Iga2VybmVsCisJICogc3BhY2UgZm9yIGtlcm5lbCBjbGllbnRzIChtYXAgb24gZGVtYW5k IGluc3RlYWQ/IE1heSBtYWtlIGRlYnVnCisJICogZWFzaWVyIHRvIGhhdmUgaXQgbWFwcGVkKS4K KwkgKi8KKwlkZXNjLT53cV9iYXNlX2FkZHIgPSAwOworCWRlc2MtPmRiX2Jhc2VfYWRkciA9IDA7 CisKKwlkZXNjLT5jb250ZXh0X2lkID0gY2xpZW50LT5jdHhfaW5kZXg7CisJZGVzYy0+d3Ffc2l6 ZV9ieXRlcyA9IGNsaWVudC0+d3Ffc2l6ZTsKKwlkZXNjLT53cV9zdGF0dXMgPSBXUV9TVEFUVVNf QUNUSVZFOworCWRlc2MtPnByaW9yaXR5ID0gY2xpZW50LT5wcmlvcml0eTsKKworCWt1bm1hcF9h dG9taWMoYmFzZSk7Cit9CisKKy8qCisgKiBJbml0aWFsaXNlL2NsZWFyIHRoZSBjb250ZXh0IGRl c2NyaXB0b3Igc2hhcmVkIHdpdGggdGhlIEd1QyBmaXJtd2FyZS4KKyAqCisgKiBUaGlzIGRlc2Ny aXB0b3IgdGVsbHMgdGhlIEd1QyB3aGVyZSAoaW4gR0dUVCBzcGFjZSkgdG8gZmluZCB0aGUgaW1w b3J0YW50CisgKiBkYXRhIHN0cnVjdHVyZXMgcmVsYXRpbmcgdG8gdGhpcyBjbGllbnQgKGRvb3Ji ZWxsLCBwcm9jZXNzIGRlc2NyaXB0b3IsCisgKiB3cml0ZSBxdWV1ZSwgZXRjKS4KKyAqLworCitz dGF0aWMgdm9pZCBndWNfaW5pdF9jdHhfZGVzYyhzdHJ1Y3QgaW50ZWxfZ3VjICpndWMsCisJCQkg ICAgICBzdHJ1Y3QgaTkxNV9ndWNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGd1Y19jb250 ZXh0X2Rlc2MgZGVzYzsKKwlzdHJ1Y3Qgc2dfdGFibGUgKnNnOworCisJbWVtc2V0KCZkZXNjLCAw LCBzaXplb2YoZGVzYykpOworCisJZGVzYy5hdHRyaWJ1dGUgPSBHVUNfQ1RYX0RFU0NfQVRUUl9B Q1RJVkUgfCBHVUNfQ1RYX0RFU0NfQVRUUl9LRVJORUw7CisJZGVzYy5jb250ZXh0X2lkID0gY2xp ZW50LT5jdHhfaW5kZXg7CisJZGVzYy5wcmlvcml0eSA9IGNsaWVudC0+cHJpb3JpdHk7CisJZGVz Yy5lbmdpbmVzX3VzZWQgPSAoMSA8PCBSQ1MpIHwgKDEgPDwgVkNTKSB8ICgxIDw8IEJDUykgfAor CQkJICAgICgxIDw8IFZFQ1MpIHwgKDEgPDwgVkNTMik7IC8qIGFsbCBlbmdpbmVzICovCisJZGVz Yy5kYl9pZCA9IGNsaWVudC0+ZG9vcmJlbGxfaWQ7CisKKwkvKgorCSAqIFRoZSBDUFUgYWRkcmVz cyBpcyBvbmx5IG5lZWRlZCBhdCBjZXJ0YWluIHBvaW50cywgc28ga21hcF9hdG9taWMgb24KKwkg KiBkZW1hbmQgaW5zdGVhZCBvZiBzdG9yaW5nIGl0IGluIHRoZSBjdHggZGVzY3JpcHRvci4KKwkg KiBYWFg6IE1heSBtYWtlIGRlYnVnIGVhc2llciB0byBoYXZlIGl0IG1hcHBlZAorCSAqLworCWRl c2MuZGJfdHJpZ2dlcl9jcHUgPSAwOworCWRlc2MuZGJfdHJpZ2dlcl91ayA9IGNsaWVudC0+ZG9v cmJlbGxfb2Zmc2V0ICsKKwkJaTkxNV9nZW1fb2JqX2dndHRfb2Zmc2V0KGNsaWVudC0+Y2xpZW50 X29iaik7CisJZGVzYy5kYl90cmlnZ2VyX3BoeSA9IGNsaWVudC0+ZG9vcmJlbGxfb2Zmc2V0ICsK KwkJc2dfZG1hX2FkZHJlc3MoY2xpZW50LT5jbGllbnRfb2JqLT5wYWdlcy0+c2dsKTsKKworCWRl c2MucHJvY2Vzc19kZXNjID0gY2xpZW50LT5wcm9jX2Rlc2Nfb2Zmc2V0ICsKKwkJaTkxNV9nZW1f b2JqX2dndHRfb2Zmc2V0KGNsaWVudC0+Y2xpZW50X29iaik7CisKKwlkZXNjLndxX2FkZHIgPSBj bGllbnQtPndxX29mZnNldCArCisJCWk5MTVfZ2VtX29ial9nZ3R0X29mZnNldChjbGllbnQtPmNs aWVudF9vYmopOworCisJZGVzYy53cV9zaXplID0gY2xpZW50LT53cV9zaXplOworCisJLyoKKwkg KiBYWFg6IFRha2UgTFJDcyBmcm9tIGFuIGV4aXN0aW5nIGludGVsX2NvbnRleHQgaWYgdGhpcyBp cyBub3QgYW4KKwkgKiBJc0tNRENyZWF0ZWRDb250ZXh0IGNsaWVudAorCSAqLworCWRlc2MuZGVz Y19wcml2YXRlID0gKHVpbnRwdHJfdCljbGllbnQ7CisKKwkvKiBQb29sIGNvbnRleHQgaXMgcGlu bmVkIGFscmVhZHkgKi8KKwlzZyA9IGd1Yy0+Y3R4X3Bvb2xfb2JqLT5wYWdlczsKKwlzZ19wY29w eV9mcm9tX2J1ZmZlcihzZy0+c2dsLCBzZy0+bmVudHMsICZkZXNjLCBzaXplb2YoZGVzYyksCisJ CQkgICAgIHNpemVvZihkZXNjKSAqIGNsaWVudC0+Y3R4X2luZGV4KTsKK30KKworc3RhdGljIHZv aWQgZ3VjX2ZpbmlfY3R4X2Rlc2Moc3RydWN0IGludGVsX2d1YyAqZ3VjLAorCQkJICAgICAgc3Ry dWN0IGk5MTVfZ3VjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBndWNfY29udGV4dF9kZXNj IGRlc2M7CisJc3RydWN0IHNnX3RhYmxlICpzZzsKKworCW1lbXNldCgmZGVzYywgMCwgc2l6ZW9m KGRlc2MpKTsKKworCXNnID0gZ3VjLT5jdHhfcG9vbF9vYmotPnBhZ2VzOworCXNnX3Bjb3B5X2Zy b21fYnVmZmVyKHNnLT5zZ2wsIHNnLT5uZW50cywgJmRlc2MsIHNpemVvZihkZXNjKSwKKwkJCSAg ICAgc2l6ZW9mKGRlc2MpICogY2xpZW50LT5jdHhfaW5kZXgpOworfQorCisvKiBHZXQgdmFsaWQg d29ya3F1ZXVlIGl0ZW0gYW5kIHJldHVybiBpdCBiYWNrIHRvIG9mZnNldCAqLworc3RhdGljIGlu dCBndWNfZ2V0X3dvcmtxdWV1ZV9zcGFjZShzdHJ1Y3QgaTkxNV9ndWNfY2xpZW50ICpnYywgdTMy ICpvZmZzZXQpCit7CisJc3RydWN0IGd1Y19wcm9jZXNzX2Rlc2MgKmRlc2M7CisJdm9pZCAqYmFz ZTsKKwl1MzIgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZ3VjX3dxX2l0ZW0pOworCWludCByZXQgPSAw LCB0aW1lb3V0X2NvdW50ZXIgPSAyMDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWJhc2Ug PSBrbWFwX2F0b21pYyhpOTE1X2dlbV9vYmplY3RfZ2V0X3BhZ2UoZ2MtPmNsaWVudF9vYmosIDAp KTsKKwlkZXNjID0gYmFzZSArIGdjLT5wcm9jX2Rlc2Nfb2Zmc2V0OworCisJd2hpbGUgKHRpbWVv dXRfY291bnRlci0tID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ2MtPndxX2xvY2ssIGZs YWdzKTsKKworCQlyZXQgPSB3YWl0X2Zvcl9hdG9taWMoQ0lSQ19TUEFDRShnYy0+d3FfdGFpbCwg ZGVzYy0+aGVhZCwKKwkJCQlnYy0+d3Ffc2l6ZSkgPj0gc2l6ZSwgMSk7CisKKwkJaWYgKCFyZXQp IHsKKwkJCSpvZmZzZXQgPSBnYy0+d3FfdGFpbDsKKworCQkJLyogYWR2YW5jZSB0aGUgdGFpbCBm b3IgbmV4dCB3b3JrcXVldWUgaXRlbSAqLworCQkJZ2MtPndxX3RhaWwgKz0gc2l6ZTsKKwkJCWdj LT53cV90YWlsICY9IGdjLT53cV9zaXplIC0gMTsKKworCQkJLyogdGhpcyB3aWxsIGJyZWFrIHRo ZSBsb29wICovCisJCQl0aW1lb3V0X2NvdW50ZXIgPSAwOworCQl9CisKKwkJc3Bpbl91bmxvY2tf aXJxcmVzdG9yZSgmZ2MtPndxX2xvY2ssIGZsYWdzKTsKKwl9OworCisJa3VubWFwX2F0b21pYyhi YXNlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ3VjX2FkZF93b3JrcXVldWVf aXRlbShzdHJ1Y3QgaTkxNV9ndWNfY2xpZW50ICpnYywKKwkJCQkgIHN0cnVjdCBkcm1faTkxNV9n ZW1fcmVxdWVzdCAqcnEpCit7CisJZW51bSBpbnRlbF9yaW5nX2lkIHJpbmdfaWQgPSBycS0+cmlu Zy0+aWQ7CisJc3RydWN0IGd1Y193cV9pdGVtICp3cWk7CisJdm9pZCAqYmFzZTsKKwl1MzIgdGFp bCwgd3FfbGVuLCB3cV9vZmYgPSAwOworCWludCByZXQ7CisKKwlyZXQgPSBndWNfZ2V0X3dvcmtx dWV1ZV9zcGFjZShnYywgJndxX29mZik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8q IEZvciBub3cgd29ya3F1ZXVlIGl0ZW0gaXMgNCBEV3M7IHdvcmtxdWV1ZSBidWZmZXIgaXMgMiBw YWdlcy4gU28gd2UKKwkgKiBzaG91bGQgbm90IGhhdmUgdGhlIGNhc2Ugd2hlcmUgc3RydWN0dXJl IHdxaSBpcyBhY3Jvc3MgcGFnZSwgbmVpdGhlcgorCSAqIHdyYXBwZWQgdG8gdGhlIGJlZ2lubmlu Zy4gVGhpcyBzaW1wbGlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiBiZWxvdy4KKwkgKgorCSAqIFhY WDogaWYgbm90IHRoZSBjYXNlLCB3ZSBuZWVkIHNhdmUgZGF0YSB0byBhIHRlbXAgd3FpIGFuZCBj b3B5IGl0IHRvCisJICogd29ya3F1ZXVlIGJ1ZmZlciBkdyBieSBkdy4KKwkgKi8KKwlXQVJOX09O KHNpemVvZihzdHJ1Y3QgZ3VjX3dxX2l0ZW0pICE9IDE2KTsKKwlXQVJOX09OKHdxX29mZiAmIDMp OworCisJLyogd3Egc3RhcnRzIGZyb20gdGhlIHBhZ2UgYWZ0ZXIgZG9vcmJlbGwgLyBwcm9jZXNz X2Rlc2MgKi8KKwliYXNlID0ga21hcF9hdG9taWMoaTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlKGdj LT5jbGllbnRfb2JqLAorCQkJKHdxX29mZiArIEdVQ19EQl9TSVpFKSA+PiBQQUdFX1NISUZUKSk7 CisJd3Ffb2ZmICY9IFBBR0VfU0laRSAtIDE7CisJd3FpID0gKHN0cnVjdCBndWNfd3FfaXRlbSAq KSgoY2hhciAqKWJhc2UgKyB3cV9vZmYpOworCisJLyogbGVuIGRvZXMgbm90IGluY2x1ZGUgdGhl IGhlYWRlciAqLworCXdxX2xlbiA9IHNpemVvZihzdHJ1Y3QgZ3VjX3dxX2l0ZW0pIC8gc2l6ZW9m KHUzMikgLSAxOworCXdxaS0+aGVhZGVyID0gV1FfVFlQRV9JTk9SREVSIHwKKwkJCSh3cV9sZW4g PDwgV1FfTEVOX1NISUZUKSB8CisJCQkocmluZ19pZCA8PCBXUV9UQVJHRVRfU0hJRlQpIHwKKwkJ CVdRX05PX1dDRkxVU0hfV0FJVDsKKworCS8qIFRoZSBHdUMgd2FudHMgb25seSB0aGUgbG93LW9y ZGVyIHdvcmQgb2YgdGhlIGNvbnRleHQgZGVzY3JpcHRvciAqLworCXdxaS0+Y29udGV4dF9kZXNj ID0gKHUzMilpbnRlbF9scl9jb250ZXh0X2Rlc2NyaXB0b3IocnEtPmN0eCwgcnEtPnJpbmcpOwor CisJLyogVGhlIEd1QyBmaXJtd2FyZSB3YW50cyB0aGUgdGFpbCBpbmRleCBpbiBRV29yZHMsIG5v dCBieXRlcyAqLworCXRhaWwgPSBycS0+cmluZ2J1Zi0+dGFpbCA+PiAzOworCXdxaS0+cmluZ190 YWlsID0gdGFpbCA8PCBXUV9SSU5HX1RBSUxfU0hJRlQ7CisJd3FpLT5mZW5jZV9pZCA9IDA7IC8q WFhYOiB3aGF0IGZlbmNlIHRvIGJlIGhlcmUgKi8KKworCWt1bm1hcF9hdG9taWMoYmFzZSk7CisK KwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpOTE1X2d1Y19zdWJtaXQoKSAtIFN1Ym1pdCBjb21t YW5kcyB0aHJvdWdoIEd1QworICogQGNsaWVudDoJdGhlIGd1YyBjbGllbnQgd2hlcmUgY29tbWFu ZHMgd2lsbCBnbyB0aHJvdWdoCisgKiBAY3R4OglMUkMgd2hlcmUgY29tbWFuZHMgY29tZSBmcm9t CisgKiBAcmluZzoJSFcgZW5naW5lIHRoYXQgd2lsbCBleGN1dGUgdGhlIGNvbW1hbmRzCisgKgor ICogUmV0dXJuOgkwIGlmIHN1Y2NlZWQKKyAqLworaW50IGk5MTVfZ3VjX3N1Ym1pdChzdHJ1Y3Qg aTkxNV9ndWNfY2xpZW50ICpjbGllbnQsCisJCSAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVl c3QgKnJxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHFfcmV0LCBiX3JldDsKKwor CS8qIE5lZWQgdGhpcyBiZWNhdXNlIG9mIHRoZSBkZWZlcnJlZCBwaW4gY3R4IGFuZCByaW5nICov CisJLyogU2hhbGwgd2UgbW92ZSB0aGlzIHJpZ2h0IGFmdGVyIHJpbmcgaXMgcGlubmVkPyAqLwor CWludGVsX2xyX2NvbnRleHRfdXBkYXRlKHJxKTsKKworCXFfcmV0ID0gZ3VjX2FkZF93b3JrcXVl dWVfaXRlbShjbGllbnQsIHJxKTsKKwlpZiAocV9yZXQgPT0gMCkKKwkJYl9yZXQgPSBndWNfcmlu Z19kb29yYmVsbChjbGllbnQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNsaWVudC0+d3FfbG9j aywgZmxhZ3MpOworCWNsaWVudC0+c3VibWlzc2lvbnMgKz0gMTsKKwlpZiAocV9yZXQpIHsKKwkJ Y2xpZW50LT5xX2ZhaWwgKz0gMTsKKwkJY2xpZW50LT5yZXRjb2RlID0gcV9yZXQ7CisJfSBlbHNl IGlmIChiX3JldCkgeworCQljbGllbnQtPmJfZmFpbCArPSAxOworCQljbGllbnQtPnJldGNvZGUg PSBxX3JldCA9IGJfcmV0OworCX0gZWxzZSB7CisJCWNsaWVudC0+cmV0Y29kZSA9IDA7CisJfQor CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsaWVudC0+d3FfbG9jaywgZmxhZ3MpOworCisJcmV0 dXJuIHFfcmV0OworfQorCisvKgorICogRXZlcnl0aGluZyBiZWxvdyBoZXJlIGlzIGNvbmNlcm5l ZCB3aXRoIHNldHVwICYgdGVhcmRvd24sIGFuZCBpcworICogdGhlcmVmb3JlIG5vdCBwYXJ0IG9m IHRoZSBzb21ld2hhdCB0aW1lLWNyaXRpY2FsIGJhdGNoLXN1Ym1pc3Npb24KKyAqIHBhdGggb2Yg aTkxNV9ndWNfc3VibWl0KCkgYWJvdmUuCisgKi8KKworLyoqCiAgKiBnZW1fYWxsb2NhdGVfZ3Vj X29iaigpIC0gQWxsb2NhdGUgZ2VtIG9iamVjdCBmb3IgR3VDIHVzYWdlCiAgKiBAZGV2Oglkcm0g ZGV2aWNlCiAgKiBAc2l6ZToJc2l6ZSBvZiBvYmplY3QKQEAgLTc1LDYgKzU4MSwxMjEgQEAgc3Rh dGljIHZvaWQgZ2VtX3JlbGVhc2VfZ3VjX29iaihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAq b2JqKQogCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOwogfQogCitzdGF0 aWMgdm9pZCBndWNfY2xpZW50X2ZyZWUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgICBz dHJ1Y3QgaTkxNV9ndWNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZh dGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfZ3VjICpndWMg PSAmZGV2X3ByaXYtPmd1YzsKKworCWlmICghY2xpZW50KQorCQlyZXR1cm47CisKKwlpZiAoY2xp ZW50LT5kb29yYmVsbF9pZCAhPSBHVUNfSU5WQUxJRF9ET09SQkVMTF9JRCkgeworCQkvKgorCQkg KiBGaXJzdCBkaXNhYmxlIHRoZSBkb29yYmVsbCwgdGhlbiB0ZWxsIHRoZSBHdUMgd2UndmUKKwkJ ICogZmluaXNoZWQgd2l0aCBpdCwgZmluYWxseSBkZWFsbG9jYXRlIGl0IGluIG91ciBiaXRtYXAK KwkJICovCisJCWd1Y19kaXNhYmxlX2Rvb3JiZWxsKGd1YywgY2xpZW50KTsKKwkJaG9zdDJndWNf cmVsZWFzZV9kb29yYmVsbChndWMsIGNsaWVudCk7CisJCXJlbGVhc2VfZG9vcmJlbGwoZ3VjLCBj bGllbnQtPmRvb3JiZWxsX2lkKTsKKwl9CisKKwkvKgorCSAqIFhYWDogd2FpdCBmb3IgYW55IG91 dHN0YW5kaW5nIHN1Ym1pc3Npb25zIGJlZm9yZSBmcmVlaW5nIG1lbW9yeS4KKwkgKiBCZSBzdXJl IHRvIGRyb3AgYW55IGxvY2tzCisJICovCisKKwlnZW1fcmVsZWFzZV9ndWNfb2JqKGNsaWVudC0+ Y2xpZW50X29iaik7CisKKwlpZiAoY2xpZW50LT5jdHhfaW5kZXggIT0gR1VDX0lOVkFMSURfQ1RY X0lEKSB7CisJCWd1Y19maW5pX2N0eF9kZXNjKGd1YywgY2xpZW50KTsKKwkJaWRhX3NpbXBsZV9y ZW1vdmUoJmd1Yy0+Y3R4X2lkcywgY2xpZW50LT5jdHhfaW5kZXgpOworCX0KKworCWtmcmVlKGNs aWVudCk7Cit9CisKKy8qKgorICogZ3VjX2NsaWVudF9hbGxvYygpIC0gQWxsb2NhdGUgYW4gaTkx NV9ndWNfY2xpZW50CisgKiBAZGV2Oglkcm0gZGV2aWNlCisgKiBAcHJpb3JpdHk6CWZvdXIgbGV2 ZWxzIHByaW9yaXR5IF9DUklUSUNBTCwgX0hJR0gsIF9OT1JNQUwgYW5kIF9MT1cKKyAqIAkJVGhl IGtlcm5lbCBjbGllbnQgdG8gcmVwbGFjZSBFeGVjTGlzdCBzdWJtaXNzaW9uIGlzIGNyZWF0ZWQg d2l0aAorICogCQlOT1JNQUwgcHJpb3JpdHkuIFByaW9yaXR5IG9mIGEgY2xpZW50IGZvciBzY2hl ZHVsZXIgY2FuIGJlIEhJR0gsCisgKiAJCXdoaWxlIGEgcHJlZW1wdGlvbiBjb250ZXh0IGNhbiB1 c2UgQ1JJVElDQUwuCisgKgorICogUmV0dXJuOglBbiBpOTE1X2d1Y19jbGllbnQgb2JqZWN0IGlm IHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaTkxNV9ndWNfY2xpZW50ICpndWNfY2xpZW50 X2FsbG9jKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCQl1aW50MzJfdCBwcmlvcml0eSkK K3sKKwlzdHJ1Y3QgaTkxNV9ndWNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGRybV9pOTE1X3By aXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfZ3VjICpn dWMgPSAmZGV2X3ByaXYtPmd1YzsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwor CisJY2xpZW50ID0ga3phbGxvYyhzaXplb2YoKmNsaWVudCksIEdGUF9LRVJORUwpOworCWlmICgh Y2xpZW50KQorCQlyZXR1cm4gTlVMTDsKKworCWNsaWVudC0+ZG9vcmJlbGxfaWQgPSBHVUNfSU5W QUxJRF9ET09SQkVMTF9JRDsKKwljbGllbnQtPnByaW9yaXR5ID0gcHJpb3JpdHk7CisKKwljbGll bnQtPmN0eF9pbmRleCA9ICh1aW50MzJfdClpZGFfc2ltcGxlX2dldCgmZ3VjLT5jdHhfaWRzLCAw LAorCQkJR1VDX01BWF9HUFVfQ09OVEVYVFMsIEdGUF9LRVJORUwpOworCWlmIChjbGllbnQtPmN0 eF9pbmRleCA+PSBHVUNfTUFYX0dQVV9DT05URVhUUykgeworCQljbGllbnQtPmN0eF9pbmRleCA9 IEdVQ19JTlZBTElEX0NUWF9JRDsKKwkJZ290byBlcnI7CisJfQorCisJLyogVGhlIGZpcnN0IHBh Z2UgaXMgZG9vcmJlbGwvcHJvY19kZXNjLiBUd28gZm9sbG93ZWQgcGFnZXMgYXJlIHdxLiAqLwor CW9iaiA9IGdlbV9hbGxvY2F0ZV9ndWNfb2JqKGRldiwgR1VDX0RCX1NJWkUgKyBHVUNfV1FfU0la RSk7CisJaWYgKCFvYmopCisJCWdvdG8gZXJyOworCisJY2xpZW50LT5jbGllbnRfb2JqID0gb2Jq OworCWNsaWVudC0+d3Ffb2Zmc2V0ID0gR1VDX0RCX1NJWkU7CisJY2xpZW50LT53cV9zaXplID0g R1VDX1dRX1NJWkU7CisJc3Bpbl9sb2NrX2luaXQoJmNsaWVudC0+d3FfbG9jayk7CisKKwljbGll bnQtPmRvb3JiZWxsX29mZnNldCA9IHNlbGVjdF9kb29yYmVsbF9jYWNoZWxpbmUoZ3VjKTsKKwor CS8qCisJICogU2luY2UgdGhlIGRvb3JiZWxsIG9ubHkgcmVxdWlyZXMgYSBzaW5nbGUgY2FjaGVs aW5lLCB3ZSBjYW4gc2F2ZQorCSAqIHNwYWNlIGJ5IHB1dHRpbmcgdGhlIGFwcGxpY2F0aW9uIHBy b2Nlc3MgZGVzY3JpcHRvciBpbiB0aGUgc2FtZQorCSAqIHBhZ2UuIFVzZSB0aGUgaGFsZiBvZiB0 aGUgcGFnZSB0aGF0IGRvZXNuJ3QgaW5jbHVkZSB0aGUgZG9vcmJlbGwuCisJICovCisJaWYgKGNs aWVudC0+ZG9vcmJlbGxfb2Zmc2V0ID49IChHVUNfREJfU0laRSAvIDIpKQorCQljbGllbnQtPnBy b2NfZGVzY19vZmZzZXQgPSAwOworCWVsc2UKKwkJY2xpZW50LT5wcm9jX2Rlc2Nfb2Zmc2V0ID0g KEdVQ19EQl9TSVpFIC8gMik7CisKKwljbGllbnQtPmRvb3JiZWxsX2lkID0gYXNzaWduX2Rvb3Ji ZWxsKGd1YywgY2xpZW50LT5wcmlvcml0eSk7CisJaWYgKGNsaWVudC0+ZG9vcmJlbGxfaWQgPT0g R1VDX0lOVkFMSURfRE9PUkJFTExfSUQpCisJCS8qIFhYWDogZXZpY3QgYSBkb29yYmVsbCBpbnN0 ZWFkICovCisJCWdvdG8gZXJyOworCisJZ3VjX2luaXRfcHJvY19kZXNjKGd1YywgY2xpZW50KTsK KwlndWNfaW5pdF9jdHhfZGVzYyhndWMsIGNsaWVudCk7CisJZ3VjX2luaXRfZG9vcmJlbGwoZ3Vj LCBjbGllbnQpOworCisJLyogSW52YWxpZGF0ZSBHdUMgVExCIHRvIGxldCBHdUMgdGFrZSB0aGUg bGF0ZXN0IHVwZGF0ZXMgdG8gR1RULiAqLworCUk5MTVfV1JJVEUoR0VOOF9HVENSLCBHRU44X0dU Q1JfSU5WQUxJREFURSk7CisKKwkvKiBYWFg6IEFueSBjYWNoZSBmbHVzaGVzIG5lZWRlZD8gR2Vu ZXJhbCBkb21haW4gbWdtdCBjYWxscz8gKi8KKworCWlmIChob3N0Mmd1Y19hbGxvY2F0ZV9kb29y YmVsbChndWMsIGNsaWVudCkpCisJCWdvdG8gZXJyOworCisJRFJNX0RFQlVHX0RSSVZFUigibmV3 IHByaW9yaXR5ICV1IGNsaWVudCAlcDogY3R4X2luZGV4ICV1IGRiX2lkICV1XG4iLAorCQlwcmlv cml0eSwgY2xpZW50LCBjbGllbnQtPmN0eF9pbmRleCwgY2xpZW50LT5kb29yYmVsbF9pZCk7CisK KwlyZXR1cm4gY2xpZW50OworCitlcnI6CisJZ3VjX2NsaWVudF9mcmVlKGRldiwgY2xpZW50KTsK KwlyZXR1cm4gTlVMTDsKK30KKwogc3RhdGljIHZvaWQgZ3VjX2NyZWF0ZV9sb2coc3RydWN0IGlu dGVsX2d1YyAqZ3VjKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGd1 Y190b19pOTE1KGd1Yyk7CkBAIC0xMzgsNiArNzU5LDggQEAgaW50IGk5MTVfZ3VjX3N1Ym1pc3Np b25faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogCWlmICghZ3VjLT5jdHhfcG9vbF9vYmop CiAJCXJldHVybiAtRU5PTUVNOwogCisJc3Bpbl9sb2NrX2luaXQoJmRldl9wcml2LT5ndWMuaG9z dDJndWNfbG9jayk7CisKIAlpZGFfaW5pdCgmZ3VjLT5jdHhfaWRzKTsKIAogCWd1Y19jcmVhdGVf bG9nKGd1Yyk7CkBAIC0xNDUsNiArNzY4LDMyIEBAIGludCBpOTE1X2d1Y19zdWJtaXNzaW9uX2lu aXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIAlyZXR1cm4gMDsKIH0KIAoraW50IGk5MTVfZ3Vj X3N1Ym1pc3Npb25fZW5hYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50 ZWxfZ3VjICpndWMgPSAmZGV2X3ByaXYtPmd1YzsKKwlzdHJ1Y3QgaTkxNV9ndWNfY2xpZW50ICpj bGllbnQ7CisKKwkvKiBjbGllbnQgZm9yIGV4ZWNidWYgc3VibWlzc2lvbiAqLworCWNsaWVudCA9 IGd1Y19jbGllbnRfYWxsb2MoZGV2LCBHVUNfQ1RYX1BSSU9SSVRZX05PUk1BTCk7CisJaWYgKCFj bGllbnQpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIGV4ZWNidWYgZ3VjX2NsaWVu dFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWd1Yy0+ZXhlY2J1Zl9jbGllbnQgPSBj bGllbnQ7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaTkxNV9ndWNfc3VibWlzc2lvbl9kaXNhYmxl KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRl dl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgaW50ZWxfZ3VjICpndWMgPSAmZGV2 X3ByaXYtPmd1YzsKKworCWd1Y19jbGllbnRfZnJlZShkZXYsIGd1Yy0+ZXhlY2J1Zl9jbGllbnQp OworCWd1Yy0+ZXhlY2J1Zl9jbGllbnQgPSBOVUxMOworfQorCiB2b2lkIGk5MTVfZ3VjX3N1Ym1p c3Npb25fZmluaShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1faTkxNV9w cml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CmRpZmYgLS1naXQgYS9kcml2ZXJz L2dwdS9kcm0vaTkxNS9pbnRlbF9ndWMuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2d1 Yy5oCmluZGV4IDViNTFiMDUuLmQyNDkzMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2ludGVsX2d1Yy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2d1Yy5oCkBA IC0yNyw2ICsyNywzMCBAQAogI2luY2x1ZGUgImludGVsX2d1Y19md2lmLmgiCiAjaW5jbHVkZSAi aTkxNV9ndWNfcmVnLmgiCiAKK3N0cnVjdCBpOTE1X2d1Y19jbGllbnQgeworCXN0cnVjdCBkcm1f aTkxNV9nZW1fb2JqZWN0ICpjbGllbnRfb2JqOworCXVpbnQzMl90IHByaW9yaXR5OworCXVpbnQz Ml90IGN0eF9pbmRleDsKKworCXVpbnQzMl90IHByb2NfZGVzY19vZmZzZXQ7CisJdWludDMyX3Qg ZG9vcmJlbGxfb2Zmc2V0OworCXVpbnQzMl90IGNvb2tpZTsKKwl1aW50MTZfdCBkb29yYmVsbF9p ZDsKKwl1aW50MTZfdCBwYWRkaW5nOwkJLyogTWFpbnRhaW4gYWxpZ25tZW50CQkqLworCisJdWlu dDMyX3Qgd3Ffb2Zmc2V0OworCXVpbnQzMl90IHdxX3NpemU7CisKKwlzcGlubG9ja190IHdxX2xv Y2s7CQkvKiBQcm90ZWN0cyBhbGwgZGF0YSBiZWxvdwkqLworCXVpbnQzMl90IHdxX3RhaWw7CisK KwkvKiBHdUMgc3VibWlzc2lvbiBzdGF0aXN0aWNzICYgc3RhdHVzICovCisJdWludDY0X3Qgc3Vi bWlzc2lvbnM7CisJdWludDMyX3QgcV9mYWlsOworCXVpbnQzMl90IGJfZmFpbDsKKwlpbnQgcmV0 Y29kZTsKK307CisKIGVudW0gaW50ZWxfZ3VjX2Z3X3N0YXR1cyB7CiAJR1VDX0ZJUk1XQVJFX0ZB SUwgPSAtMSwKIAlHVUNfRklSTVdBUkVfTk9ORSA9IDAsCkBAIC02MCw2ICs4NCwyMCBAQCBzdHJ1 Y3QgaW50ZWxfZ3VjIHsKIAogCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpjdHhfcG9vbF9v Ymo7CiAJc3RydWN0IGlkYSBjdHhfaWRzOworCisJc3RydWN0IGk5MTVfZ3VjX2NsaWVudCAqZXhl Y2J1Zl9jbGllbnQ7CisKKwlzcGlubG9ja190IGhvc3QyZ3VjX2xvY2s7CS8qIFByb3RlY3RzIGFs bCBkYXRhIGJlbG93CSovCisKKwlERUNMQVJFX0JJVE1BUChkb29yYmVsbF9iaXRtYXAsIEdVQ19N QVhfRE9PUkJFTExTKTsKKwlpbnQgZGJfY2FjaGVsaW5lOworCisJLyogQWN0aW9uIHN0YXR1cyAm IHN0YXRpc3RpY3MgKi8KKwl1aW50NjRfdCBhY3Rpb25fY291bnQ7CQkvKiBUb3RhbCBjb21tYW5k cyBpc3N1ZWQJKi8KKwl1aW50MzJfdCBhY3Rpb25fY21kOwkJLyogTGFzdCBjb21tYW5kIHdvcmQJ CSovCisJdWludDMyX3QgYWN0aW9uX3N0YXR1czsJCS8qIExhc3QgcmV0dXJuIHN0YXR1cwkJKi8K Kwl1aW50MzJfdCBhY3Rpb25fZmFpbDsJCS8qIFRvdGFsIG51bWJlciBvZiBmYWlsdXJlcwkqLwor CWludDMyX3QgYWN0aW9uX2VycjsJCS8qIExhc3QgZXJyb3IgY29kZQkJKi8KIH07CiAKIC8qIGlu dGVsX2d1Y19sb2FkZXIuYyAqLwpAQCAtNzAsNiArMTA4LDEwIEBAIGV4dGVybiBjb25zdCBjaGFy ICppbnRlbF9ndWNfZndfc3RhdHVzX3JlcHIoZW51bSBpbnRlbF9ndWNfZndfc3RhdHVzIHN0YXR1 cyk7CiAKIC8qIGk5MTVfZ3VjX3N1Ym1pc3Npb24uYyAqLwogaW50IGk5MTVfZ3VjX3N1Ym1pc3Np b25faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2ludCBpOTE1X2d1Y19zdWJtaXNzaW9u X2VuYWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2ludCBpOTE1X2d1Y19zdWJtaXQoc3Ry dWN0IGk5MTVfZ3VjX2NsaWVudCAqY2xpZW50LAorCQkgICAgc3RydWN0IGRybV9pOTE1X2dlbV9y ZXF1ZXN0ICpycSk7Cit2b2lkIGk5MTVfZ3VjX3N1Ym1pc3Npb25fZGlzYWJsZShzdHJ1Y3QgZHJt X2RldmljZSAqZGV2KTsKIHZvaWQgaTkxNV9ndWNfc3VibWlzc2lvbl9maW5pKHN0cnVjdCBkcm1f ZGV2aWNlICpkZXYpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1 L2ludGVsX2d1Y19sb2FkZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2d1Y19sb2Fk ZXIuYwppbmRleCBlNWQ3MTM2Li4yNWJhMjlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0v aTkxNS9pbnRlbF9ndWNfbG9hZGVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxf Z3VjX2xvYWRlci5jCkBAIC00MjcsNiArNDI3LDggQEAgaW50IGludGVsX2d1Y191Y29kZV9sb2Fk KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiAJCWludGVsX2d1Y19md19zdGF0dXNfcmVwcihndWNf ZnctPmd1Y19md19mZXRjaF9zdGF0dXMpLAogCQlpbnRlbF9ndWNfZndfc3RhdHVzX3JlcHIoZ3Vj X2Z3LT5ndWNfZndfbG9hZF9zdGF0dXMpKTsKIAorCWk5MTVfZ3VjX3N1Ym1pc3Npb25fZGlzYWJs ZShkZXYpOworCiAJaWYgKGd1Y19mdy0+Z3VjX2Z3X2ZldGNoX3N0YXR1cyA9PSBHVUNfRklSTVdB UkVfTk9ORSkKIAkJcmV0dXJuIDA7CiAKQEAgLTQ3OSwxMiArNDgxLDIwIEBAIGludCBpbnRlbF9n dWNfdWNvZGVfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogCQlpbnRlbF9ndWNfZndfc3Rh dHVzX3JlcHIoZ3VjX2Z3LT5ndWNfZndfZmV0Y2hfc3RhdHVzKSwKIAkJaW50ZWxfZ3VjX2Z3X3N0 YXR1c19yZXByKGd1Y19mdy0+Z3VjX2Z3X2xvYWRfc3RhdHVzKSk7CiAKKwlpZiAoaTkxNS5lbmFi bGVfZ3VjX3N1Ym1pc3Npb24pIHsKKwkJZXJyID0gaTkxNV9ndWNfc3VibWlzc2lvbl9lbmFibGUo ZGV2KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZmFpbDsKKwl9CisKIAlyZXR1cm4gMDsKIAogZmFp bDoKIAlpZiAoZ3VjX2Z3LT5ndWNfZndfbG9hZF9zdGF0dXMgPT0gR1VDX0ZJUk1XQVJFX1BFTkRJ TkcpCiAJCWd1Y19mdy0+Z3VjX2Z3X2xvYWRfc3RhdHVzID0gR1VDX0ZJUk1XQVJFX0ZBSUw7CiAK KwlpOTE1X2d1Y19zdWJtaXNzaW9uX2Rpc2FibGUoZGV2KTsKKwogCURSTV9FUlJPUigiRmFpbGVk IHRvIGluaXRpYWxpemUgR3VDLCBlcnJvciAlZFxuIiwgZXJyKTsKIAogCXJldHVybiBlcnI7CkBA IC01NDcsNiArNTU3LDggQEAgdm9pZCBpbnRlbF9ndWNfdWNvZGVfZmluaShzdHJ1Y3QgZHJtX2Rl dmljZSAqZGV2KQogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2 X3ByaXZhdGU7CiAJc3RydWN0IGludGVsX2d1Y19mdyAqZ3VjX2Z3ID0gJmRldl9wcml2LT5ndWMu Z3VjX2Z3OwogCisJaTkxNV9ndWNfc3VibWlzc2lvbl9maW5pKGRldik7CisKIAlpZiAoZ3VjX2Z3 LT5ndWNfZndfb2JqKQogCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmZ3VjX2Z3LT5ndWNf Zndfb2JqLT5iYXNlKTsKIAlndWNfZnctPmd1Y19md19vYmogPSBOVUxMOwotLSAKMS45LjEKCl9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBt YWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwOi8vbGlzdHMu ZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==