From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ville Syrjala Subject: [PATCH v3 4/8] drm/i915: Overcome display engine stride limits via GTT remapping Date: Fri, 18 Jan 2019 17:27:16 +0200 Message-ID: <20190118152720.24643-5-ville.syrjala@linux.intel.com> References: <20190118152720.24643-1-ville.syrjala@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by gabe.freedesktop.org (Postfix) with ESMTPS id 452A56F831 for ; Fri, 18 Jan 2019 15:27:37 +0000 (UTC) In-Reply-To: <20190118152720.24643-1-ville.syrjala@linux.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 RnJvbTogVmlsbGUgU3lyasOkbMOkIDx2aWxsZS5zeXJqYWxhQGxpbnV4LmludGVsLmNvbT4KClRo ZSBkaXNwbGF5IGVuZ2luZSBzdHJpZGUgbGltaXRzIGFyZSBnZXR0aW5nIGluIG91ciB3YXkuIE9u IFNLTCsKd2UgYXJlIGxpbWl0ZWQgdG8gOGsgcGl4ZWxzLCB3aGljaCBpcyBlYXNpbHkgZXhjZWVk ZWQgd2l0aCB0aHJlZQo0ayBkaXNwbGF5cy4gVG8gb3ZlcmNvbWUgdGhpcyBsaW1pdGF0aW9uIHdl IGNhbiByZW1hcCB0aGUgcGFnZXMKaW4gdGhlIEdUVCB0byBwcm92aWRlIHRoZSBkaXNwbGF5IGVu Z2luZSB3aXRoIGEgdmlldyBvZiBtZW1vcnkKd2l0aCBhIHNtYWxsZXIgc3RyaWRlLgoKVGhlIGNv ZGUgaXMgbW9zdGx5IGFscmVhZHkgdGhlcmUgYXMgV2UgYWxyZWFkeSBwbGF5IHRyaWNrcyB3aXRo CnRoZSBwbGFuZSBzdXJmYWNlIGFkZHJlc3MgYW5kIHgveSBvZmZzZXRzLgoKQSBmZXcgY2F2ZWF0 cyBhcHBseToKKiBsaW5lYXIgYnVmZmVycyBuZWVkIHRoZSBmYiBzdHJpZGUgdG8gYmUgcGFnZSBh bGlnbmVkLCBhcwogIG90aGVyd2lzZSB0aGUgcmVtYXBwZWQgbGluZXMgd291bGRuJ3Qgc3RhcnQg YXQgdGhlIHNhbWUKICBzcG90CiogY29tcHJlc3NlZCBidWZmZXJzIGNhbid0IGJlIHJlbWFwcGVk IGR1ZSB0byB0aGUgbmV3CiAgY2NzIGhhc2ggbW9kZSBjYXVzaW5nIHRoZSB2aXJ0dWFsIGFkZHJl c3Mgb2YgdGhlIHBhZ2VzCiAgdG8gYWZmZWN0IHRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgY29t cHJlc3NlZCBkYXRhLiBJSVJDCiAgdGhlIG9sZCBoYXNoIHdhcyBsaW1pdGVkIHRvIHRoZSBsb3cg MTIgYml0cyBzbyBpZiB3ZSB3ZXJlCiAgdXNpbmcgdGhhdCBtb2RlIHdlIGNvdWxkIHJlbWFwLiBB cyBpdCBzdGFuZHMgd2UganVzdCByZWZ1c2UKICB0byByZW1hcHAgd2l0aCBjb21wcmVzc2VkIGZi cy4KKiBubyByZW1hcHBpbmcgZ2VuMi8zIGFzIHdlJ2QgbmVlZCBhIGZlbmNlIGZvciB0aGUgcmVt YXBwZWQKICB2bWEsIHdoaWNoIHdlIGN1cnJlbnRseSBkb24ndCBoYXZlLiBOZWVkIHRvIGRlYWwg d2l0aCB0aGUKICBmZW5jZSBQT1QgcmVxdWlyZW1lbnRzLCBhbmQgZG8gc29tZXRoaW5nIGFib3V0 IHRoZSBnZW4yCiAgZ3R0IHBhZ2Ugc2l6ZSB2cyB0aWxlIHNpemUgZGlmZmVyZW5jZQoKdjI6IFJl YmFzZSBkdWUgdG8gaXNfY2NzX21vZGlmaWVyKCkKICAgIEZpeCB1cCB0aGUgc2tsKyBzdHJpZGVf bXVsdCBtZXNzCiAgICBtZW1zZXQoKSB0aGUgZ3R0X3ZpZXcgYmVjYXVzZSBvdGhlcndpc2Ugd2Ug Y291bGQgbGVhdmUKICAgIGp1bmsgaW4gcGxhbmVbMV0gd2hlbiBnb2luZyBmcm9tIDIgcGxhbmUg dG8gMSBwbGFuZSBmb3JtYXQKdjM6IGludGVsX2NoZWNrX3BsYW5lX3N0cmlkZSgpIHdhcyBzcGxp dCBvdXQKdjQ6IERyb3AgdGhlIGFsaWduZWQgdmlld3BvcnQgc3R1ZmYsIGl0IHdhcyBtZWFudCBm b3IgY2NzIHdoaWNoCiAgICBjYW4ndCBiZSByZW1hcHBlZCBhbnl3YXkKClNpZ25lZC1vZmYtYnk6 IFZpbGxlIFN5cmrDpGzDpCA8dmlsbGUuc3lyamFsYUBsaW51eC5pbnRlbC5jb20+Ci0tLQogZHJp dmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jIHwgMzMyICsrKysrKysrKysrKysrKysr KysrLS0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDI1NSBpbnNlcnRpb25zKCspLCA3NyBkZWxldGlv bnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMg Yi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMKaW5kZXggMGQ1NTI2ZWMzNGI0 Li44Njg0N2NlZTgzM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rp c3BsYXkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMKQEAgLTE4 NjUsNyArMTg2NSw3IEBAIGludGVsX3RpbGVfd2lkdGhfYnl0ZXMoY29uc3Qgc3RydWN0IGRybV9m cmFtZWJ1ZmZlciAqZmIsIGludCBjb2xvcl9wbGFuZSkKIAogCXN3aXRjaCAoZmItPm1vZGlmaWVy KSB7CiAJY2FzZSBEUk1fRk9STUFUX01PRF9MSU5FQVI6Ci0JCXJldHVybiBjcHA7CisJCXJldHVy biBpbnRlbF90aWxlX3NpemUoZGV2X3ByaXYpOwogCWNhc2UgSTkxNV9GT1JNQVRfTU9EX1hfVElM RUQ6CiAJCWlmIChJU19HRU4oZGV2X3ByaXYsIDIpKQogCQkJcmV0dXJuIDEyODsKQEAgLTE5MDgs MTEgKzE5MDgsOCBAQCBpbnRlbF90aWxlX3dpZHRoX2J5dGVzKGNvbnN0IHN0cnVjdCBkcm1fZnJh bWVidWZmZXIgKmZiLCBpbnQgY29sb3JfcGxhbmUpCiBzdGF0aWMgdW5zaWduZWQgaW50CiBpbnRl bF90aWxlX2hlaWdodChjb25zdCBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwgaW50IGNvbG9y X3BsYW5lKQogewotCWlmIChmYi0+bW9kaWZpZXIgPT0gRFJNX0ZPUk1BVF9NT0RfTElORUFSKQot CQlyZXR1cm4gMTsKLQllbHNlCi0JCXJldHVybiBpbnRlbF90aWxlX3NpemUodG9faTkxNShmYi0+ ZGV2KSkgLwotCQkJaW50ZWxfdGlsZV93aWR0aF9ieXRlcyhmYiwgY29sb3JfcGxhbmUpOworCXJl dHVybiBpbnRlbF90aWxlX3NpemUodG9faTkxNShmYi0+ZGV2KSkgLworCQlpbnRlbF90aWxlX3dp ZHRoX2J5dGVzKGZiLCBjb2xvcl9wbGFuZSk7CiB9CiAKIC8qIFJldHVybiB0aGUgdGlsZSBkaW1l bnNpb25zIGluIHBpeGVsIHVuaXRzICovCkBAIC0yMTcwLDE2ICsyMTY3LDggQEAgdm9pZCBpbnRl bF9hZGRfZmJfb2Zmc2V0cyhpbnQgKngsIGludCAqeSwKIAkJCSAgaW50IGNvbG9yX3BsYW5lKQog CiB7Ci0JY29uc3Qgc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYiA9IHRvX2ludGVs X2ZyYW1lYnVmZmVyKHN0YXRlLT5iYXNlLmZiKTsKLQl1bnNpZ25lZCBpbnQgcm90YXRpb24gPSBz dGF0ZS0+YmFzZS5yb3RhdGlvbjsKLQotCWlmIChkcm1fcm90YXRpb25fOTBfb3JfMjcwKHJvdGF0 aW9uKSkgewotCQkqeCArPSBpbnRlbF9mYi0+cm90YXRlZFtjb2xvcl9wbGFuZV0ueDsKLQkJKnkg Kz0gaW50ZWxfZmItPnJvdGF0ZWRbY29sb3JfcGxhbmVdLnk7Ci0JfSBlbHNlIHsKLQkJKnggKz0g aW50ZWxfZmItPm5vcm1hbFtjb2xvcl9wbGFuZV0ueDsKLQkJKnkgKz0gaW50ZWxfZmItPm5vcm1h bFtjb2xvcl9wbGFuZV0ueTsKLQl9CisJKnggKz0gc3RhdGUtPmNvbG9yX3BsYW5lW2NvbG9yX3Bs YW5lXS54OworCSp5ICs9IHN0YXRlLT5jb2xvcl9wbGFuZVtjb2xvcl9wbGFuZV0ueTsKIH0KIAog c3RhdGljIHUzMiBpbnRlbF9hZGp1c3RfdGlsZV9vZmZzZXQoaW50ICp4LCBpbnQgKnksCkBAIC0y NDU5LDYgKzI0NDgsODIgQEAgYm9vbCBpc19jY3NfbW9kaWZpZXIodTY0IG1vZGlmaWVyKQogCSAg ICAgICBtb2RpZmllciA9PSBJOTE1X0ZPUk1BVF9NT0RfWWZfVElMRURfQ0NTOwogfQogCitzdGF0 aWMKK3UzMiBpbnRlbF9wbGFuZV9mYl9tYXhfc3RyaWRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICpkZXZfcHJpdiwKKwkJCSAgICAgIHUzMiBwaXhlbF9mb3JtYXQsIHU2NCBtb2RpZmllcikKK3sK KwlzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0YzsKKwlzdHJ1Y3QgaW50ZWxfcGxhbmUgKnBsYW5lOwor CisJLyoKKwkgKiBXZSBhc3N1bWUgdGhlIHByaW1hcnkgcGxhbmUgZm9yIHBpcGUgQSBoYXMKKwkg KiB0aGUgaGlnaGVzdCBzdHJpZGUgbGltaXRzIG9mIHRoZW0gYWxsLgorCSAqLworCWNydGMgPSBp bnRlbF9nZXRfY3J0Y19mb3JfcGlwZShkZXZfcHJpdiwgUElQRV9BKTsKKwlwbGFuZSA9IHRvX2lu dGVsX3BsYW5lKGNydGMtPmJhc2UucHJpbWFyeSk7CisKKwlyZXR1cm4gcGxhbmUtPm1heF9zdHJp ZGUocGxhbmUsIHBpeGVsX2Zvcm1hdCwgbW9kaWZpZXIsCisJCQkJIERSTV9NT0RFX1JPVEFURV8w KTsKK30KKworc3RhdGljCit1MzIgaW50ZWxfZmJfbWF4X3N0cmlkZShzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqZGV2X3ByaXYsCisJCQl1MzIgcGl4ZWxfZm9ybWF0LCB1NjQgbW9kaWZpZXIpCit7 CisJcmV0dXJuIGludGVsX3BsYW5lX2ZiX21heF9zdHJpZGUoZGV2X3ByaXYsIHBpeGVsX2Zvcm1h dCwgbW9kaWZpZXIpOworfQorCitzdGF0aWMgdTMyCitpbnRlbF9mYl9zdHJpZGVfYWxpZ25tZW50 KGNvbnN0IHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLCBpbnQgY29sb3JfcGxhbmUpCit7CisJ c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkxNShmYi0+ZGV2KTsKKwor CWlmIChmYi0+bW9kaWZpZXIgPT0gRFJNX0ZPUk1BVF9NT0RfTElORUFSKSB7CisJCXUzMiBtYXhf c3RyaWRlID0gaW50ZWxfcGxhbmVfZmJfbWF4X3N0cmlkZShkZXZfcHJpdiwKKwkJCQkJCQkgICBm Yi0+Zm9ybWF0LT5mb3JtYXQsCisJCQkJCQkJICAgZmItPm1vZGlmaWVyKTsKKworCQkvKgorCQkg KiBUbyBtYWtlIHJlbWFwcGluZyB3aXRoIGxpbmVhciBnZW5lcmFsbHkgZmVhc2libGUKKwkJICog d2UgbmVlZCB0aGUgc3RyaWRlIHRvIGJlIHBhZ2UgYWxpZ25lZC4KKwkJICovCisJCWlmIChmYi0+ cGl0Y2hlc1tjb2xvcl9wbGFuZV0gPiBtYXhfc3RyaWRlKQorCQkJcmV0dXJuIGludGVsX3RpbGVf c2l6ZShkZXZfcHJpdik7CisJCWVsc2UKKwkJCXJldHVybiA2NDsKKwl9IGVsc2UgeworCQlyZXR1 cm4gaW50ZWxfdGlsZV93aWR0aF9ieXRlcyhmYiwgY29sb3JfcGxhbmUpOworCX0KK30KKworc3Rh dGljIGJvb2wgaW50ZWxfcGxhbmVfbmVlZHNfcmVtYXAoY29uc3Qgc3RydWN0IGludGVsX3BsYW5l X3N0YXRlICpwbGFuZV9zdGF0ZSkKK3sKKwlzdHJ1Y3QgaW50ZWxfcGxhbmUgKnBsYW5lID0gdG9f aW50ZWxfcGxhbmUocGxhbmVfc3RhdGUtPmJhc2UucGxhbmUpOworCXN0cnVjdCBkcm1faTkxNV9w cml2YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUocGxhbmUtPmJhc2UuZGV2KTsKKwljb25zdCBzdHJ1 Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiA9IHBsYW5lX3N0YXRlLT5iYXNlLmZiOworCXVuc2lnbmVk IGludCByb3RhdGlvbiA9IHBsYW5lX3N0YXRlLT5iYXNlLnJvdGF0aW9uOworCXUzMiBzdHJpZGUs IG1heF9zdHJpZGU7CisKKwkvKiBXZSBkb24ndCB3YW50IHRvIGRlYWwgd2l0aCByZW1hcHBpbmcg d2l0aCBjdXJzb3JzICovCisJaWYgKHBsYW5lLT5pZCA9PSBQTEFORV9DVVJTT1IpCisJCXJldHVy biBmYWxzZTsKKworCS8qIE5vIGZlbmNlIGZvciB0aGUgcmVtYXBwZWQgdm1hICovCisJaWYgKElO VEVMX0dFTihkZXZfcHJpdikgPCA0KQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBOZXcgQ0NTIGhh c2ggbW9kZSBtYWtlcyByZW1hcHBpbmcgaW1wb3NzaWJsZSAqLworCWlmIChpc19jY3NfbW9kaWZp ZXIoZmItPm1vZGlmaWVyKSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogRklYTUUgb3RoZXIgY29s b3IgcGxhbmVzPyAqLworCXN0cmlkZSA9IGludGVsX2ZiX3BpdGNoKGZiLCAwLCByb3RhdGlvbik7 CisJbWF4X3N0cmlkZSA9IHBsYW5lLT5tYXhfc3RyaWRlKHBsYW5lLCBmYi0+Zm9ybWF0LT5mb3Jt YXQsCisJCQkJICAgICAgIGZiLT5tb2RpZmllciwgcm90YXRpb24pOworCisJcmV0dXJuIHN0cmlk ZSA+IG1heF9zdHJpZGU7Cit9CisKIHN0YXRpYyBpbnQKIGludGVsX2ZpbGxfZmJfaW5mbyhzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCiAJCSAgIHN0cnVjdCBkcm1fZnJhbWVidWZm ZXIgKmZiKQpAQCAtMjYyNCw2ICsyNjg5LDE2NyBAQCBpbnRlbF9maWxsX2ZiX2luZm8oc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9p ZAoraW50ZWxfcGxhbmVfcmVtYXBfZ3R0KHN0cnVjdCBpbnRlbF9wbGFuZV9zdGF0ZSAqcGxhbmVf c3RhdGUpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0KKwkJdG9faTkx NShwbGFuZV9zdGF0ZS0+YmFzZS5wbGFuZS0+ZGV2KTsKKwlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVy ICpmYiA9IHBsYW5lX3N0YXRlLT5iYXNlLmZiOworCXN0cnVjdCBpbnRlbF9mcmFtZWJ1ZmZlciAq aW50ZWxfZmIgPSB0b19pbnRlbF9mcmFtZWJ1ZmZlcihmYik7CisJc3RydWN0IGludGVsX3JvdGF0 aW9uX2luZm8gKmluZm8gPSAmcGxhbmVfc3RhdGUtPnZpZXcucm90YXRlZDsKKwl1bnNpZ25lZCBp bnQgcm90YXRpb24gPSBwbGFuZV9zdGF0ZS0+YmFzZS5yb3RhdGlvbjsKKwlpbnQgaSwgbnVtX3Bs YW5lcyA9IGZiLT5mb3JtYXQtPm51bV9wbGFuZXM7CisJdW5zaWduZWQgaW50IHRpbGVfc2l6ZSA9 IGludGVsX3RpbGVfc2l6ZShkZXZfcHJpdik7CisJdW5zaWduZWQgaW50IHNyY194LCBzcmNfeTsK Kwl1bnNpZ25lZCBpbnQgc3JjX3csIHNyY19oOworCXUzMiBndHRfb2Zmc2V0ID0gMDsKKworCW1l bXNldCgmcGxhbmVfc3RhdGUtPnZpZXcsIDAsIHNpemVvZihwbGFuZV9zdGF0ZS0+dmlldykpOwor CXBsYW5lX3N0YXRlLT52aWV3LnR5cGUgPSBkcm1fcm90YXRpb25fOTBfb3JfMjcwKHJvdGF0aW9u KSA/CisJCUk5MTVfR0dUVF9WSUVXX1JPVEFURUQgOiBJOTE1X0dHVFRfVklFV19SRU1BUFBFRDsK KworCXNyY194ID0gcGxhbmVfc3RhdGUtPmJhc2Uuc3JjLngxID4+IDE2OworCXNyY195ID0gcGxh bmVfc3RhdGUtPmJhc2Uuc3JjLnkxID4+IDE2OworCXNyY193ID0gZHJtX3JlY3Rfd2lkdGgoJnBs YW5lX3N0YXRlLT5iYXNlLnNyYykgPj4gMTY7CisJc3JjX2ggPSBkcm1fcmVjdF9oZWlnaHQoJnBs YW5lX3N0YXRlLT5iYXNlLnNyYykgPj4gMTY7CisKKwlXQVJOX09OKGlzX2Njc19tb2RpZmllcihm Yi0+bW9kaWZpZXIpKTsKKworCS8qIE1ha2Ugc3JjIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRo ZSB2aWV3cG9ydCAqLworCWRybV9yZWN0X3RyYW5zbGF0ZSgmcGxhbmVfc3RhdGUtPmJhc2Uuc3Jj LAorCQkJICAgLShzcmNfeCA8PCAxNiksIC0oc3JjX3kgPDwgMTYpKTsKKworCS8qIFJvdGF0ZSBz cmMgY29vcmRpbmF0ZXMgdG8gbWF0Y2ggcm90YXRlZCBHVFQgdmlldyAqLworCWlmIChkcm1fcm90 YXRpb25fOTBfb3JfMjcwKHJvdGF0aW9uKSkKKwkJZHJtX3JlY3Rfcm90YXRlKCZwbGFuZV9zdGF0 ZS0+YmFzZS5zcmMsCisJCQkJc3JjX3cgPDwgMTYsIHNyY19oIDw8IDE2LAorCQkJCURSTV9NT0RF X1JPVEFURV8yNzApOworCisJZm9yIChpID0gMDsgaSA8IG51bV9wbGFuZXM7IGkrKykgeworCQl1 bnNpZ25lZCBpbnQgaHN1YiA9IGkgPyBmYi0+Zm9ybWF0LT5oc3ViIDogMTsKKwkJdW5zaWduZWQg aW50IHZzdWIgPSBpID8gZmItPmZvcm1hdC0+dnN1YiA6IDE7CisJCXVuc2lnbmVkIGludCBjcHAg PSBmYi0+Zm9ybWF0LT5jcHBbaV07CisJCXVuc2lnbmVkIGludCB0aWxlX3dpZHRoLCB0aWxlX2hl aWdodDsKKwkJdW5zaWduZWQgaW50IHdpZHRoLCBoZWlnaHQ7CisJCXVuc2lnbmVkIGludCBwaXRj aF90aWxlczsKKwkJdW5zaWduZWQgaW50IHgsIHk7CisJCXUzMiBvZmZzZXQ7CisKKwkJaW50ZWxf dGlsZV9kaW1zKGZiLCBpLCAmdGlsZV93aWR0aCwgJnRpbGVfaGVpZ2h0KTsKKworCQl4ID0gc3Jj X3ggLyBoc3ViOworCQl5ID0gc3JjX3kgLyB2c3ViOworCQl3aWR0aCA9IHNyY193IC8gaHN1YjsK KwkJaGVpZ2h0ID0gc3JjX2ggLyB2c3ViOworCisJCS8qCisJCSAqIEZpcnN0IHBpeGVsIG9mIHRo ZSBzcmMgdmlld3BvcnQgZnJvbSB0aGUKKwkJICogc3RhcnQgb2YgdGhlIG5vcm1hbCBndHQgbWFw cGluZy4KKwkJICovCisJCXggKz0gaW50ZWxfZmItPm5vcm1hbFtpXS54OworCQl5ICs9IGludGVs X2ZiLT5ub3JtYWxbaV0ueTsKKworCQlvZmZzZXQgPSBpbnRlbF9jb21wdXRlX2FsaWduZWRfb2Zm c2V0KGRldl9wcml2LCAmeCwgJnksCisJCQkJCQkgICAgICBmYiwgaSwgZmItPnBpdGNoZXNbaV0s CisJCQkJCQkgICAgICBEUk1fTU9ERV9ST1RBVEVfMCwgdGlsZV9zaXplKTsKKwkJb2Zmc2V0IC89 IHRpbGVfc2l6ZTsKKworCQlpbmZvLT5wbGFuZVtpXS5vZmZzZXQgPSBvZmZzZXQ7CisJCWluZm8t PnBsYW5lW2ldLnN0cmlkZSA9IERJVl9ST1VORF9VUChmYi0+cGl0Y2hlc1tpXSwKKwkJCQkJCSAg ICAgdGlsZV93aWR0aCAqIGNwcCk7CisJCWluZm8tPnBsYW5lW2ldLndpZHRoID0gRElWX1JPVU5E X1VQKHggKyB3aWR0aCwgdGlsZV93aWR0aCk7CisJCWluZm8tPnBsYW5lW2ldLmhlaWdodCA9IERJ Vl9ST1VORF9VUCh5ICsgaGVpZ2h0LCB0aWxlX2hlaWdodCk7CisKKwkJaWYgKGRybV9yb3RhdGlv bl85MF9vcl8yNzAocm90YXRpb24pKSB7CisJCQlzdHJ1Y3QgZHJtX3JlY3QgcjsKKworCQkJLyog cm90YXRlIHRoZSB4L3kgb2Zmc2V0cyB0byBtYXRjaCB0aGUgR1RUIHZpZXcgKi8KKwkJCXIueDEg PSB4OworCQkJci55MSA9IHk7CisJCQlyLngyID0geCArIHdpZHRoOworCQkJci55MiA9IHkgKyBo ZWlnaHQ7CisJCQlkcm1fcmVjdF9yb3RhdGUoJnIsCisJCQkJCWluZm8tPnBsYW5lW2ldLndpZHRo ICogdGlsZV93aWR0aCwKKwkJCQkJaW5mby0+cGxhbmVbaV0uaGVpZ2h0ICogdGlsZV9oZWlnaHQs CisJCQkJCURSTV9NT0RFX1JPVEFURV8yNzApOworCQkJeCA9IHIueDE7CisJCQl5ID0gci55MTsK KworCQkJcGl0Y2hfdGlsZXMgPSBpbmZvLT5wbGFuZVtpXS5oZWlnaHQ7CisJCQlwbGFuZV9zdGF0 ZS0+Y29sb3JfcGxhbmVbaV0uc3RyaWRlID0gcGl0Y2hfdGlsZXMgKiB0aWxlX2hlaWdodDsKKwor CQkJLyogcm90YXRlIHRoZSB0aWxlIGRpbWVuc2lvbnMgdG8gbWF0Y2ggdGhlIEdUVCB2aWV3ICov CisJCQlzd2FwKHRpbGVfd2lkdGgsIHRpbGVfaGVpZ2h0KTsKKwkJfSBlbHNlIHsKKwkJCXBpdGNo X3RpbGVzID0gaW5mby0+cGxhbmVbaV0ud2lkdGg7CisJCQlwbGFuZV9zdGF0ZS0+Y29sb3JfcGxh bmVbaV0uc3RyaWRlID0gcGl0Y2hfdGlsZXMgKiB0aWxlX3dpZHRoICogY3BwOworCQl9CisKKwkJ LyoKKwkJICogV2Ugb25seSBrZWVwIHRoZSB4L3kgb2Zmc2V0cywgc28gcHVzaCBhbGwgb2YgdGhl CisJCSAqIGd0dCBvZmZzZXQgaW50byB0aGUgeC95IG9mZnNldHMuCisJCSAqLworCQlpbnRlbF9h ZGp1c3RfdGlsZV9vZmZzZXQoJngsICZ5LAorCQkJCQkgdGlsZV93aWR0aCwgdGlsZV9oZWlnaHQs CisJCQkJCSB0aWxlX3NpemUsIHBpdGNoX3RpbGVzLAorCQkJCQkgZ3R0X29mZnNldCAqIHRpbGVf c2l6ZSwgMCk7CisKKwkJZ3R0X29mZnNldCArPSBpbmZvLT5wbGFuZVtpXS53aWR0aCAqIGluZm8t PnBsYW5lW2ldLmhlaWdodDsKKworCQlwbGFuZV9zdGF0ZS0+Y29sb3JfcGxhbmVbaV0ub2Zmc2V0 ID0gMDsKKwkJcGxhbmVfc3RhdGUtPmNvbG9yX3BsYW5lW2ldLnggPSB4OworCQlwbGFuZV9zdGF0 ZS0+Y29sb3JfcGxhbmVbaV0ueSA9IHk7CisJfQorfQorCitzdGF0aWMgaW50CitpbnRlbF9wbGFu ZV9jb21wdXRlX2d0dChzdHJ1Y3QgaW50ZWxfcGxhbmVfc3RhdGUgKnBsYW5lX3N0YXRlKQorewor CWNvbnN0IHN0cnVjdCBpbnRlbF9mcmFtZWJ1ZmZlciAqZmIgPQorCQl0b19pbnRlbF9mcmFtZWJ1 ZmZlcihwbGFuZV9zdGF0ZS0+YmFzZS5mYik7CisJdW5zaWduZWQgaW50IHJvdGF0aW9uID0gcGxh bmVfc3RhdGUtPmJhc2Uucm90YXRpb247CisJaW50IGksIG51bV9wbGFuZXMgPSBmYi0+YmFzZS5m b3JtYXQtPm51bV9wbGFuZXM7CisJaW50IHJldDsKKworCWlmIChpbnRlbF9wbGFuZV9uZWVkc19y ZW1hcChwbGFuZV9zdGF0ZSkpIHsKKwkJaW50ZWxfcGxhbmVfcmVtYXBfZ3R0KHBsYW5lX3N0YXRl KTsKKworCQkvKiBSZW1hcHBpbmcgc2hvdWxkIHRha2UgY2FyZSBvZiB0aGlzIGFsd2F5cyAqLwor CQlyZXQgPSBpbnRlbF9wbGFuZV9jaGVja19zdHJpZGUocGxhbmVfc3RhdGUpOworCQlpZiAoV0FS Tl9PTihyZXQpKQorCQkJcmV0dXJuIHJldDsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlpbnRlbF9m aWxsX2ZiX2dndHRfdmlldygmcGxhbmVfc3RhdGUtPnZpZXcsICZmYi0+YmFzZSwgcm90YXRpb24p OworCisJZm9yIChpID0gMDsgaSA8IG51bV9wbGFuZXM7IGkrKykgeworCQlwbGFuZV9zdGF0ZS0+ Y29sb3JfcGxhbmVbaV0uc3RyaWRlID0gaW50ZWxfZmJfcGl0Y2goJmZiLT5iYXNlLCBpLCByb3Rh dGlvbik7CisJCXBsYW5lX3N0YXRlLT5jb2xvcl9wbGFuZVtpXS5vZmZzZXQgPSAwOworCisJCWlm IChkcm1fcm90YXRpb25fOTBfb3JfMjcwKHJvdGF0aW9uKSkgeworCQkJcGxhbmVfc3RhdGUtPmNv bG9yX3BsYW5lW2ldLnggPSBmYi0+cm90YXRlZFtpXS54OworCQkJcGxhbmVfc3RhdGUtPmNvbG9y X3BsYW5lW2ldLnkgPSBmYi0+cm90YXRlZFtpXS55OworCQl9IGVsc2UgeworCQkJcGxhbmVfc3Rh dGUtPmNvbG9yX3BsYW5lW2ldLnggPSBmYi0+bm9ybWFsW2ldLng7CisJCQlwbGFuZV9zdGF0ZS0+ Y29sb3JfcGxhbmVbaV0ueSA9IGZiLT5ub3JtYWxbaV0ueTsKKwkJfQorCX0KKworCS8qIFJvdGF0 ZSBzcmMgY29vcmRpbmF0ZXMgdG8gbWF0Y2ggcm90YXRlZCBHVFQgdmlldyAqLworCWlmIChkcm1f cm90YXRpb25fOTBfb3JfMjcwKHJvdGF0aW9uKSkKKwkJZHJtX3JlY3Rfcm90YXRlKCZwbGFuZV9z dGF0ZS0+YmFzZS5zcmMsCisJCQkJZmItPmJhc2Uud2lkdGggPDwgMTYsIGZiLT5iYXNlLmhlaWdo dCA8PCAxNiwKKwkJCQlEUk1fTU9ERV9ST1RBVEVfMjcwKTsKKworCXJldCA9IGludGVsX3BsYW5l X2NoZWNrX3N0cmlkZShwbGFuZV9zdGF0ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwor CXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGk5eHhfZm9ybWF0X3RvX2ZvdXJjYyhpbnQgZm9y bWF0KQogewogCXN3aXRjaCAoZm9ybWF0KSB7CkBAIC0zMTI3LDI2ICszMzUzLDEyIEBAIHN0YXRp YyBpbnQgc2tsX2NoZWNrX2Njc19hdXhfc3VyZmFjZShzdHJ1Y3QgaW50ZWxfcGxhbmVfc3RhdGUg KnBsYW5lX3N0YXRlKQogaW50IHNrbF9jaGVja19wbGFuZV9zdXJmYWNlKHN0cnVjdCBpbnRlbF9w bGFuZV9zdGF0ZSAqcGxhbmVfc3RhdGUpCiB7CiAJY29uc3Qgc3RydWN0IGRybV9mcmFtZWJ1ZmZl ciAqZmIgPSBwbGFuZV9zdGF0ZS0+YmFzZS5mYjsKLQl1bnNpZ25lZCBpbnQgcm90YXRpb24gPSBw bGFuZV9zdGF0ZS0+YmFzZS5yb3RhdGlvbjsKIAlpbnQgcmV0OwogCi0JaW50ZWxfZmlsbF9mYl9n Z3R0X3ZpZXcoJnBsYW5lX3N0YXRlLT52aWV3LCBmYiwgcm90YXRpb24pOwotCXBsYW5lX3N0YXRl LT5jb2xvcl9wbGFuZVswXS5zdHJpZGUgPSBpbnRlbF9mYl9waXRjaChmYiwgMCwgcm90YXRpb24p OwotCXBsYW5lX3N0YXRlLT5jb2xvcl9wbGFuZVsxXS5zdHJpZGUgPSBpbnRlbF9mYl9waXRjaChm YiwgMSwgcm90YXRpb24pOwotCi0JcmV0ID0gaW50ZWxfcGxhbmVfY2hlY2tfc3RyaWRlKHBsYW5l X3N0YXRlKTsKKwlyZXQgPSBpbnRlbF9wbGFuZV9jb21wdXRlX2d0dChwbGFuZV9zdGF0ZSk7CiAJ aWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlmICghcGxhbmVfc3RhdGUtPmJhc2UudmlzaWJs ZSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBSb3RhdGUgc3JjIGNvb3JkaW5hdGVzIHRvIG1hdGNoIHJv dGF0ZWQgR1RUIHZpZXcgKi8KLQlpZiAoZHJtX3JvdGF0aW9uXzkwX29yXzI3MChyb3RhdGlvbikp Ci0JCWRybV9yZWN0X3JvdGF0ZSgmcGxhbmVfc3RhdGUtPmJhc2Uuc3JjLAotCQkJCWZiLT53aWR0 aCA8PCAxNiwgZmItPmhlaWdodCA8PCAxNiwKLQkJCQlEUk1fTU9ERV9ST1RBVEVfMjcwKTsKLQog CS8qCiAJICogSGFuZGxlIHRoZSBBVVggc3VyZmFjZSBmaXJzdCBzaW5jZQogCSAqIHRoZSBtYWlu IHN1cmZhY2Ugc2V0dXAgZGVwZW5kcyBvbiBpdC4KQEAgLTMyNjUsMjAgKzM0NzcsMTcgQEAgaW50 IGk5eHhfY2hlY2tfcGxhbmVfc3VyZmFjZShzdHJ1Y3QgaW50ZWxfcGxhbmVfc3RhdGUgKnBsYW5l X3N0YXRlKQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9CiAJCXRvX2k5 MTUocGxhbmVfc3RhdGUtPmJhc2UucGxhbmUtPmRldik7Ci0JY29uc3Qgc3RydWN0IGRybV9mcmFt ZWJ1ZmZlciAqZmIgPSBwbGFuZV9zdGF0ZS0+YmFzZS5mYjsKLQl1bnNpZ25lZCBpbnQgcm90YXRp b24gPSBwbGFuZV9zdGF0ZS0+YmFzZS5yb3RhdGlvbjsKLQlpbnQgc3JjX3ggPSBwbGFuZV9zdGF0 ZS0+YmFzZS5zcmMueDEgPj4gMTY7Ci0JaW50IHNyY195ID0gcGxhbmVfc3RhdGUtPmJhc2Uuc3Jj LnkxID4+IDE2OworCWludCBzcmNfeCwgc3JjX3k7CiAJdTMyIG9mZnNldDsKIAlpbnQgcmV0Owog Ci0JaW50ZWxfZmlsbF9mYl9nZ3R0X3ZpZXcoJnBsYW5lX3N0YXRlLT52aWV3LCBmYiwgcm90YXRp b24pOwotCXBsYW5lX3N0YXRlLT5jb2xvcl9wbGFuZVswXS5zdHJpZGUgPSBpbnRlbF9mYl9waXRj aChmYiwgMCwgcm90YXRpb24pOwotCi0JcmV0ID0gaW50ZWxfcGxhbmVfY2hlY2tfc3RyaWRlKHBs YW5lX3N0YXRlKTsKKwlyZXQgPSBpbnRlbF9wbGFuZV9jb21wdXRlX2d0dChwbGFuZV9zdGF0ZSk7 CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCXNyY194ID0gcGxhbmVfc3RhdGUtPmJhc2Uu c3JjLngxID4+IDE2OworCXNyY195ID0gcGxhbmVfc3RhdGUtPmJhc2Uuc3JjLnkxID4+IDE2Owor CiAJaW50ZWxfYWRkX2ZiX29mZnNldHMoJnNyY194LCAmc3JjX3ksIHBsYW5lX3N0YXRlLCAwKTsK IAogCWlmIChJTlRFTF9HRU4oZGV2X3ByaXYpID49IDQpCkBAIC0zMjg5LDYgKzM0OTgsNyBAQCBp bnQgaTl4eF9jaGVja19wbGFuZV9zdXJmYWNlKHN0cnVjdCBpbnRlbF9wbGFuZV9zdGF0ZSAqcGxh bmVfc3RhdGUpCiAKIAkvKiBIU1cvQkRXIGRvIHRoaXMgYXV0b21hZ2ljYWxseSBpbiBoYXJkd2Fy ZSAqLwogCWlmICghSVNfSEFTV0VMTChkZXZfcHJpdikgJiYgIUlTX0JST0FEV0VMTChkZXZfcHJp dikpIHsKKwkJdW5zaWduZWQgaW50IHJvdGF0aW9uID0gcGxhbmVfc3RhdGUtPmJhc2Uucm90YXRp b247CiAJCWludCBzcmNfdyA9IGRybV9yZWN0X3dpZHRoKCZwbGFuZV9zdGF0ZS0+YmFzZS5zcmMp ID4+IDE2OwogCQlpbnQgc3JjX2ggPSBkcm1fcmVjdF9oZWlnaHQoJnBsYW5lX3N0YXRlLT5iYXNl LnNyYykgPj4gMTY7CiAKQEAgLTM0NTksMTUgKzM2NjksNiBAQCBzdGF0aWMgYm9vbCBpOXh4X3Bs YW5lX2dldF9od19zdGF0ZShzdHJ1Y3QgaW50ZWxfcGxhbmUgKnBsYW5lLAogCXJldHVybiByZXQ7 CiB9CiAKLXN0YXRpYyB1MzIKLWludGVsX2ZiX3N0cmlkZV9hbGlnbm1lbnQoY29uc3Qgc3RydWN0 IGRybV9mcmFtZWJ1ZmZlciAqZmIsIGludCBjb2xvcl9wbGFuZSkKLXsKLQlpZiAoZmItPm1vZGlm aWVyID09IERSTV9GT1JNQVRfTU9EX0xJTkVBUikKLQkJcmV0dXJuIDY0OwotCWVsc2UKLQkJcmV0 dXJuIGludGVsX3RpbGVfd2lkdGhfYnl0ZXMoZmIsIGNvbG9yX3BsYW5lKTsKLX0KLQogc3RhdGlj IHZvaWQgc2tsX2RldGFjaF9zY2FsZXIoc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMsIGlu dCBpZCkKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gaW50ZWxfY3J0Yy0+YmFzZS5kZXY7 CkBAIC05ODI5LDE2ICsxMDAzMCwxMSBAQCBzdGF0aWMgYm9vbCBpbnRlbF9jdXJzb3Jfc2l6ZV9v ayhjb25zdCBzdHJ1Y3QgaW50ZWxfcGxhbmVfc3RhdGUgKnBsYW5lX3N0YXRlKQogCiBzdGF0aWMg aW50IGludGVsX2N1cnNvcl9jaGVja19zdXJmYWNlKHN0cnVjdCBpbnRlbF9wbGFuZV9zdGF0ZSAq cGxhbmVfc3RhdGUpCiB7Ci0JY29uc3Qgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIgPSBwbGFu ZV9zdGF0ZS0+YmFzZS5mYjsKLQl1bnNpZ25lZCBpbnQgcm90YXRpb24gPSBwbGFuZV9zdGF0ZS0+ YmFzZS5yb3RhdGlvbjsKIAlpbnQgc3JjX3gsIHNyY195OwogCXUzMiBvZmZzZXQ7CiAJaW50IHJl dDsKIAotCWludGVsX2ZpbGxfZmJfZ2d0dF92aWV3KCZwbGFuZV9zdGF0ZS0+dmlldywgZmIsIHJv dGF0aW9uKTsKLQlwbGFuZV9zdGF0ZS0+Y29sb3JfcGxhbmVbMF0uc3RyaWRlID0gaW50ZWxfZmJf cGl0Y2goZmIsIDAsIHJvdGF0aW9uKTsKLQotCXJldCA9IGludGVsX3BsYW5lX2NoZWNrX3N0cmlk ZShwbGFuZV9zdGF0ZSk7CisJcmV0ID0gaW50ZWxfcGxhbmVfY29tcHV0ZV9ndHQocGxhbmVfc3Rh dGUpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTE0NTcxLDMxICsxNDc2NywxMyBA QCBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9mcmFtZWJ1ZmZlcl9mdW5jcyBpbnRlbF9mYl9mdW5j cyA9IHsKIAkuZGlydHkgPSBpbnRlbF91c2VyX2ZyYW1lYnVmZmVyX2RpcnR5LAogfTsKIAotc3Rh dGljCi11MzIgaW50ZWxfZmJfcGl0Y2hfbGltaXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRl dl9wcml2LAotCQkJIHUzMiBwaXhlbF9mb3JtYXQsIHU2NCBmYl9tb2RpZmllcikKLXsKLQlzdHJ1 Y3QgaW50ZWxfY3J0YyAqY3J0YzsKLQlzdHJ1Y3QgaW50ZWxfcGxhbmUgKnBsYW5lOwotCi0JLyoK LQkgKiBXZSBhc3N1bWUgdGhlIHByaW1hcnkgcGxhbmUgZm9yIHBpcGUgQSBoYXMKLQkgKiB0aGUg aGlnaGVzdCBzdHJpZGUgbGltaXRzIG9mIHRoZW0gYWxsLgotCSAqLwotCWNydGMgPSBpbnRlbF9n ZXRfY3J0Y19mb3JfcGlwZShkZXZfcHJpdiwgUElQRV9BKTsKLQlwbGFuZSA9IHRvX2ludGVsX3Bs YW5lKGNydGMtPmJhc2UucHJpbWFyeSk7Ci0KLQlyZXR1cm4gcGxhbmUtPm1heF9zdHJpZGUocGxh bmUsIHBpeGVsX2Zvcm1hdCwgZmJfbW9kaWZpZXIsCi0JCQkJIERSTV9NT0RFX1JPVEFURV8wKTsK LX0KLQogc3RhdGljIGludCBpbnRlbF9mcmFtZWJ1ZmZlcl9pbml0KHN0cnVjdCBpbnRlbF9mcmFt ZWJ1ZmZlciAqaW50ZWxfZmIsCiAJCQkJICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2Jq LAogCQkJCSAgc3RydWN0IGRybV9tb2RlX2ZiX2NtZDIgKm1vZGVfY21kKQogewogCXN0cnVjdCBk cm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUob2JqLT5iYXNlLmRldik7CiAJc3Ry dWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIgPSAmaW50ZWxfZmItPmJhc2U7Ci0JdTMyIHBpdGNoX2xp bWl0OworCXUzMiBtYXhfc3RyaWRlOwogCXVuc2lnbmVkIGludCB0aWxpbmcsIHN0cmlkZTsKIAlp bnQgcmV0ID0gLUVJTlZBTDsKIAlpbnQgaTsKQEAgLTE0NjQ3LDEzICsxNDgyNSwxMyBAQCBzdGF0 aWMgaW50IGludGVsX2ZyYW1lYnVmZmVyX2luaXQoc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICpp bnRlbF9mYiwKIAkJZ290byBlcnI7CiAJfQogCi0JcGl0Y2hfbGltaXQgPSBpbnRlbF9mYl9waXRj aF9saW1pdChkZXZfcHJpdiwgbW9kZV9jbWQtPnBpeGVsX2Zvcm1hdCwKLQkJCQkJICAgbW9kZV9j bWQtPm1vZGlmaWVyWzBdKTsKLQlpZiAobW9kZV9jbWQtPnBpdGNoZXNbMF0gPiBwaXRjaF9saW1p dCkgeworCW1heF9zdHJpZGUgPSBpbnRlbF9mYl9tYXhfc3RyaWRlKGRldl9wcml2LCBtb2RlX2Nt ZC0+cGl4ZWxfZm9ybWF0LAorCQkJCQkgbW9kZV9jbWQtPm1vZGlmaWVyWzBdKTsKKwlpZiAobW9k ZV9jbWQtPnBpdGNoZXNbMF0gPiBtYXhfc3RyaWRlKSB7CiAJCURSTV9ERUJVR19LTVMoIiVzIHBp dGNoICgldSkgbXVzdCBiZSBhdCBtb3N0ICVkXG4iLAogCQkJICAgICAgbW9kZV9jbWQtPm1vZGlm aWVyWzBdICE9IERSTV9GT1JNQVRfTU9EX0xJTkVBUiA/CiAJCQkgICAgICAidGlsZWQiIDogImxp bmVhciIsCi0JCQkgICAgICBtb2RlX2NtZC0+cGl0Y2hlc1swXSwgcGl0Y2hfbGltaXQpOworCQkJ ICAgICAgbW9kZV9jbWQtPnBpdGNoZXNbMF0sIG1heF9zdHJpZGUpOwogCQlnb3RvIGVycjsKIAl9 CiAKLS0gCjIuMTkuMgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Au b3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwt Z2Z4Cg==