From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chris Wilson Subject: [PATCH 6/7] drm/i915/userptr: Avoid struct_mutex recursion for mmu_invalidate_range_start Date: Tue, 4 Dec 2018 14:15:21 +0000 Message-ID: <20181204141522.13640-6-chris@chris-wilson.co.uk> References: <20181204141522.13640-1-chris@chris-wilson.co.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from fireflyinternet.com (mail.fireflyinternet.com [109.228.58.192]) by gabe.freedesktop.org (Postfix) with ESMTPS id 04A126E263 for ; Tue, 4 Dec 2018 14:15:40 +0000 (UTC) In-Reply-To: <20181204141522.13640-1-chris@chris-wilson.co.uk> 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 U2luY2UgY29tbWl0IDkzMDY1YWM3NTNlNCAoIm1tLCBvb206IGRpc3Rpbmd1aXNoIGJsb2NrYWJs ZSBtb2RlIGZvciBtbXUKbm90aWZpZXJzIikgd2UgaGF2ZSBiZWVuIGFibGUgdG8gcmVwb3J0IGZh aWx1cmUgZnJvbQptbXVfaW52YWxpZGF0ZV9yYW5nZV9zdGFydCB3aGljaCBhbGxvd3MgdXMgdG8g dXNlIGEgdHJ5bG9jayBvbiB0aGUKc3RydWN0X211dGV4IHRvIGF2b2lkIHBvdGVudGlhbCByZWN1 cnNpb24gYW5kIHJlcG9ydCAtRUJVU1kgaW5zdGVhZC4KRnVydGhlcm1vcmUsIHRoaXMgYWxsb3dz IHVzIHRvIHB1bGwgdGhlIHdvcmsgaW50byB0aGUgbWFpbiBjYWxsYmFjayBhbmQKYXZvaWQgdGhl IHNsZWlnaHQtb2YtaGFuZCBpbiB1c2luZyBhIHdvcmtxdWV1ZSB0byBhdm9pZCBsb2NrZGVwLgoK SG93ZXZlciwgbm90IGFsbCBwYXRocyB0byBtbXVfaW52YWxpZGF0ZV9yYW5nZV9zdGFydCBhcmUg cHJlcGFyZWQgdG8KaGFuZGxlIGZhaWx1cmUsIHNvIGluc3RlYWQgb2YgcmVwb3J0aW5nIHRoZSBy ZWN1cnNpb24sIGRlYWwgd2l0aCBpdCBieQpwcm9wYWdhdGluZyB0aGUgZmFpbHVyZSB1cHdhcmRz LCB3aG8gY2FuIGRlY2lkZSB0aGVtc2VsdmVzIHRvIGhhbmRsZSBpdApvciByZXBvcnQgaXQuCgp2 MjogTWFyayB1cCB0aGUgcmVjdXJzaXZlIGxvY2sgYmVoYXZpb3VyIGFuZCBjb21tZW50IG9uIHRo ZSB2YXJpb3VzIHdlYWsKcG9pbnRzLgoKQnVnemlsbGE6IGh0dHBzOi8vYnVncy5mcmVlZGVza3Rv cC5vcmcvc2hvd19idWcuY2dpP2lkPTEwODM3NQpSZWZlcmVuY2VzOiA5MzA2NWFjNzUzZTQgKCJt bSwgb29tOiBkaXN0aW5ndWlzaCBibG9ja2FibGUgbW9kZSBmb3IgbW11IG5vdGlmaWVycyIpClNp Z25lZC1vZmYtYnk6IENocmlzIFdpbHNvbiA8Y2hyaXNAY2hyaXMtd2lsc29uLmNvLnVrPgpDYzog VHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNvbT4KLS0tCiBkcml2ZXJzL2dw dS9kcm0vaTkxNS9pOTE1X2Rydi5oICAgICAgICAgfCAgIDQgKy0KIGRyaXZlcnMvZ3B1L2RybS9p OTE1L2k5MTVfZ2VtLmMgICAgICAgICB8ICAzMCArKystCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9p OTE1X2dlbV9vYmplY3QuaCAgfCAgIDcgKwogZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1f dXNlcnB0ci5jIHwgMjIxICsrKysrKysrKysrLS0tLS0tLS0tLS0tLQogNCBmaWxlcyBjaGFuZ2Vk LCAxMzYgaW5zZXJ0aW9ucygrKSwgMTI2IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Ry di5oCmluZGV4IDFjYWQyMThiNzFkMy4uMTQ0Yjc3MzdjMGEyIDEwMDY0NAotLS0gYS9kcml2ZXJz L2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVf ZHJ2LmgKQEAgLTI5MjEsOCArMjkyMSw4IEBAIGVudW0gaTkxNV9tbV9zdWJjbGFzcyB7IC8qIGxv Y2tkZXAgc3ViY2xhc3MgZm9yIG9iai0+bW0ubG9jay9zdHJ1Y3RfbXV0ZXggKi8KIAlJOTE1X01N X1NIUklOS0VSIC8qIGNhbGxlZCAicmVjdXJzaXZlbHkiIGZyb20gZGlyZWN0LXJlY2xhaW0tZXNx dWUgKi8KIH07CiAKLXZvaWQgX19pOTE1X2dlbV9vYmplY3RfcHV0X3BhZ2VzKHN0cnVjdCBkcm1f aTkxNV9nZW1fb2JqZWN0ICpvYmosCi0JCQkJIGVudW0gaTkxNV9tbV9zdWJjbGFzcyBzdWJjbGFz cyk7CitpbnQgX19pOTE1X2dlbV9vYmplY3RfcHV0X3BhZ2VzKHN0cnVjdCBkcm1faTkxNV9nZW1f b2JqZWN0ICpvYmosCisJCQkJZW51bSBpOTE1X21tX3N1YmNsYXNzIHN1YmNsYXNzKTsKIHZvaWQg X19pOTE1X2dlbV9vYmplY3RfaW52YWxpZGF0ZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAq b2JqKTsKIAogZW51bSBpOTE1X21hcF90eXBlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2k5MTVfZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCmluZGV4 IGQzNmE5NzU1YWQ5MS4uMmFkOGY5NGY1MDU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0v aTkxNS9pOTE1X2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKQEAg LTI0NDcsOCArMjQ0Nyw4IEBAIF9faTkxNV9nZW1fb2JqZWN0X3Vuc2V0X3BhZ2VzKHN0cnVjdCBk cm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiAJc3RydWN0IHNnX3RhYmxlICpwYWdlczsKIAogCXBh Z2VzID0gZmV0Y2hfYW5kX3plcm8oJm9iai0+bW0ucGFnZXMpOwotCWlmICghcGFnZXMpCi0JCXJl dHVybiBOVUxMOworCWlmIChJU19FUlJfT1JfTlVMTChwYWdlcykpCisJCXJldHVybiBwYWdlczsK IAogCXNwaW5fbG9jaygmaTkxNS0+bW0ub2JqX2xvY2spOwogCWxpc3RfZGVsKCZvYmotPm1tLmxp bmspOwpAQCAtMjQ3MiwyMiArMjQ3MiwyMyBAQCBfX2k5MTVfZ2VtX29iamVjdF91bnNldF9wYWdl cyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogCXJldHVybiBwYWdlczsKIH0KIAot dm9pZCBfX2k5MTVfZ2VtX29iamVjdF9wdXRfcGFnZXMoc3RydWN0IGRybV9pOTE1X2dlbV9vYmpl Y3QgKm9iaiwKLQkJCQkgZW51bSBpOTE1X21tX3N1YmNsYXNzIHN1YmNsYXNzKQoraW50IF9faTkx NV9nZW1fb2JqZWN0X3B1dF9wYWdlcyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAor CQkJCWVudW0gaTkxNV9tbV9zdWJjbGFzcyBzdWJjbGFzcykKIHsKIAlzdHJ1Y3Qgc2dfdGFibGUg KnBhZ2VzOworCWludCByZXQ7CiAKIAlpZiAoaTkxNV9nZW1fb2JqZWN0X2hhc19waW5uZWRfcGFn ZXMob2JqKSkKLQkJcmV0dXJuOworCQlyZXR1cm4gLUVCVVNZOwogCiAJR0VNX0JVR19PTihvYmot PmJpbmRfY291bnQpOwotCWlmICghaTkxNV9nZW1fb2JqZWN0X2hhc19wYWdlcyhvYmopKQotCQly ZXR1cm47CiAKIAkvKiBNYXkgYmUgY2FsbGVkIGJ5IHNocmlua2VyIGZyb20gd2l0aGluIGdldF9w YWdlcygpIChvbiBhbm90aGVyIGJvKSAqLwogCW11dGV4X2xvY2tfbmVzdGVkKCZvYmotPm1tLmxv Y2ssIHN1YmNsYXNzKTsKLQlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJm9iai0+bW0ucGFnZXNf cGluX2NvdW50KSkpCisJaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCZvYmotPm1tLnBhZ2VzX3Bp bl9jb3VudCkpKSB7CisJCXJldCA9IC1FQlVTWTsKIAkJZ290byB1bmxvY2s7CisJfQogCiAJLyoK IAkgKiAtPnB1dF9wYWdlcyBtaWdodCBuZWVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGJp dDE3IHN3aXp6bGUKQEAgLTI0OTUsMTEgKzI0OTYsMjQgQEAgdm9pZCBfX2k5MTVfZ2VtX29iamVj dF9wdXRfcGFnZXMoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKIAkgKiBsaXN0cyBl YXJseS4KIAkgKi8KIAlwYWdlcyA9IF9faTkxNV9nZW1fb2JqZWN0X3Vuc2V0X3BhZ2VzKG9iaik7 CisKKwkvKgorCSAqIFhYWCBUZW1wb3JhcnkgaGlqaW54IHRvIGF2b2lkIHVwZGF0aW5nIGFsbCBi YWNrZW5kcyB0byBoYW5kbGUKKwkgKiBOVUxMIHBhZ2VzLiBJbiB0aGUgZnV0dXJlLCB3aGVuIHdl IGhhdmUgbW9yZSBhc3luY2hyb25vdXMKKwkgKiBnZXRfcGFnZXMgYmFja2VuZHMgd2Ugc2hvdWxk IGJlIGJldHRlciBhYmxlIHRvIGhhbmRsZSB0aGUKKwkgKiBjYW5jZWxsYXRpb24gb2YgdGhlIGFz eW5jIHRhc2sgaW4gYSBtb3JlIHVuaWZvcm0gbWFubmVyLgorCSAqLworCWlmICghcGFnZXMgJiYg IWk5MTVfZ2VtX29iamVjdF9uZWVkc19hc3luY19jYW5jZWwob2JqKSkKKwkJcGFnZXMgPSBFUlJf UFRSKC1FSU5WQUwpOworCiAJaWYgKCFJU19FUlIocGFnZXMpKQogCQlvYmotPm9wcy0+cHV0X3Bh Z2VzKG9iaiwgcGFnZXMpOwogCisJcmV0ID0gMDsKIHVubG9jazoKIAltdXRleF91bmxvY2soJm9i ai0+bW0ubG9jayk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBib29sIGk5MTVfc2dfdHJpbShzdHJ1 Y3Qgc2dfdGFibGUgKm9yaWdfc3QpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9p OTE1X2dlbV9vYmplY3QuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX29iamVjdC5o CmluZGV4IGE2ZGQ3YzQ2ZGUwZC4uNDljZTc5NzE3M2I1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dw dS9kcm0vaTkxNS9pOTE1X2dlbV9vYmplY3QuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9p OTE1X2dlbV9vYmplY3QuaApAQCAtNTYsNiArNTYsNyBAQCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29i amVjdF9vcHMgewogI2RlZmluZSBJOTE1X0dFTV9PQkpFQ1RfSEFTX1NUUlVDVF9QQUdFCUJJVCgw KQogI2RlZmluZSBJOTE1X0dFTV9PQkpFQ1RfSVNfU0hSSU5LQUJMRQlCSVQoMSkKICNkZWZpbmUg STkxNV9HRU1fT0JKRUNUX0lTX1BST1hZCUJJVCgyKQorI2RlZmluZSBJOTE1X0dFTV9PQkpFQ1Rf QVNZTkNfQ0FOQ0VMCUJJVCgzKQogCiAJLyogSW50ZXJmYWNlIGJldHdlZW4gdGhlIEdFTSBvYmpl Y3QgYW5kIGl0cyBiYWNraW5nIHN0b3JhZ2UuCiAJICogZ2V0X3BhZ2VzKCkgaXMgY2FsbGVkIG9u Y2UgcHJpb3IgdG8gdGhlIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBzZXQKQEAgLTM4Niw2ICszODcs MTIgQEAgaTkxNV9nZW1fb2JqZWN0X2lzX3Byb3h5KGNvbnN0IHN0cnVjdCBkcm1faTkxNV9nZW1f b2JqZWN0ICpvYmopCiAJcmV0dXJuIG9iai0+b3BzLT5mbGFncyAmIEk5MTVfR0VNX09CSkVDVF9J U19QUk9YWTsKIH0KIAorc3RhdGljIGlubGluZSBib29sCitpOTE1X2dlbV9vYmplY3RfbmVlZHNf YXN5bmNfY2FuY2VsKGNvbnN0IHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJ cmV0dXJuIG9iai0+b3BzLT5mbGFncyAmIEk5MTVfR0VNX09CSkVDVF9BU1lOQ19DQU5DRUw7Cit9 CisKIHN0YXRpYyBpbmxpbmUgYm9vbAogaTkxNV9nZW1fb2JqZWN0X2lzX2FjdGl2ZShjb25zdCBz dHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL2k5MTUvaTkxNV9nZW1fdXNlcnB0ci5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkx NV9nZW1fdXNlcnB0ci5jCmluZGV4IDJjOWIyODQwMzZkMS4uOGIwN2ZkNDQ3MzFmIDEwMDY0NAot LS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV91c2VycHRyLmMKKysrIGIvZHJpdmVy cy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fdXNlcnB0ci5jCkBAIC01MCw3OSArNTAsODQgQEAgc3Ry dWN0IGk5MTVfbW11X25vdGlmaWVyIHsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlOwogCXN0cnVj dCBtbXVfbm90aWZpZXIgbW47CiAJc3RydWN0IHJiX3Jvb3RfY2FjaGVkIG9iamVjdHM7Ci0Jc3Ry dWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOworCXN0cnVjdCBpOTE1X21tX3N0cnVjdCAqbW07CiB9 OwogCiBzdHJ1Y3QgaTkxNV9tbXVfb2JqZWN0IHsKIAlzdHJ1Y3QgaTkxNV9tbXVfbm90aWZpZXIg Km1uOwogCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CiAJc3RydWN0IGludGVydmFs X3RyZWVfbm9kZSBpdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7Ci0Jc3RydWN0IHdvcmtfc3Ry dWN0IHdvcms7Ci0JYm9vbCBhdHRhY2hlZDsKIH07CiAKLXN0YXRpYyB2b2lkIGNhbmNlbF91c2Vy cHRyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgaTkxNV9tbXVfb2JqZWN0 ICptbyA9IGNvbnRhaW5lcl9vZih3b3JrLCB0eXBlb2YoKm1vKSwgd29yayk7Ci0Jc3RydWN0IGRy bV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IG1vLT5vYmo7Ci0Jc3RydWN0IHdvcmtfc3RydWN0ICph Y3RpdmU7Ci0KLQkvKiBDYW5jZWwgYW55IGFjdGl2ZSB3b3JrZXIgYW5kIGZvcmNlIHVzIHRvIHJl LWV2YWx1YXRlIGd1cCAqLwotCW11dGV4X2xvY2soJm9iai0+bW0ubG9jayk7Ci0JYWN0aXZlID0g ZmV0Y2hfYW5kX3plcm8oJm9iai0+dXNlcnB0ci53b3JrKTsKLQltdXRleF91bmxvY2soJm9iai0+ bW0ubG9jayk7Ci0JaWYgKGFjdGl2ZSkKLQkJZ290byBvdXQ7Ci0KLQlpOTE1X2dlbV9vYmplY3Rf d2FpdChvYmosIEk5MTVfV0FJVF9BTEwsIE1BWF9TQ0hFRFVMRV9USU1FT1VULCBOVUxMKTsKLQot CW11dGV4X2xvY2soJm9iai0+YmFzZS5kZXYtPnN0cnVjdF9tdXRleCk7Ci0KLQkvKiBXZSBhcmUg aW5zaWRlIGEga3RocmVhZCBjb250ZXh0IGFuZCBjYW4ndCBiZSBpbnRlcnJ1cHRlZCAqLwotCWlm IChpOTE1X2dlbV9vYmplY3RfdW5iaW5kKG9iaikgPT0gMCkKLQkJX19pOTE1X2dlbV9vYmplY3Rf cHV0X3BhZ2VzKG9iaiwgSTkxNV9NTV9OT1JNQUwpOwotCVdBUk5fT05DRShpOTE1X2dlbV9vYmpl Y3RfaGFzX3BhZ2VzKG9iaiksCi0JCSAgIkZhaWxlZCB0byByZWxlYXNlIHBhZ2VzOiBiaW5kX2Nv dW50PSVkLCBwYWdlc19waW5fY291bnQ9JWQsIHBpbl9nbG9iYWw9JWRcbiIsCi0JCSAgb2JqLT5i aW5kX2NvdW50LAotCQkgIGF0b21pY19yZWFkKCZvYmotPm1tLnBhZ2VzX3Bpbl9jb3VudCksCi0J CSAgb2JqLT5waW5fZ2xvYmFsKTsKLQotCW11dGV4X3VubG9jaygmb2JqLT5iYXNlLmRldi0+c3Ry dWN0X211dGV4KTsKLQotb3V0OgotCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKLX0KLQogc3Rh dGljIHZvaWQgYWRkX29iamVjdChzdHJ1Y3QgaTkxNV9tbXVfb2JqZWN0ICptbykKIHsKLQlpZiAo bW8tPmF0dGFjaGVkKQorCWlmICghUkJfRU1QVFlfTk9ERSgmbW8tPml0LnJiKSkKIAkJcmV0dXJu OwogCiAJaW50ZXJ2YWxfdHJlZV9pbnNlcnQoJm1vLT5pdCwgJm1vLT5tbi0+b2JqZWN0cyk7Ci0J bW8tPmF0dGFjaGVkID0gdHJ1ZTsKIH0KIAogc3RhdGljIHZvaWQgZGVsX29iamVjdChzdHJ1Y3Qg aTkxNV9tbXVfb2JqZWN0ICptbykKIHsKLQlpZiAoIW1vLT5hdHRhY2hlZCkKKwlpZiAoUkJfRU1Q VFlfTk9ERSgmbW8tPml0LnJiKSkKIAkJcmV0dXJuOwogCiAJaW50ZXJ2YWxfdHJlZV9yZW1vdmUo Jm1vLT5pdCwgJm1vLT5tbi0+b2JqZWN0cyk7Ci0JbW8tPmF0dGFjaGVkID0gZmFsc2U7CisJUkJf Q0xFQVJfTk9ERSgmbW8tPml0LnJiKTsKK30KKworc3RhdGljIHZvaWQKK19faTkxNV9nZW1fdXNl cnB0cl9zZXRfYWN0aXZlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosIGJvb2wgdmFs dWUpCit7CisJc3RydWN0IGk5MTVfbW11X29iamVjdCAqbW8gPSBvYmotPnVzZXJwdHIubW11X29i amVjdDsKKworCS8qCisJICogRHVyaW5nIG1tX2ludmFsaWRhdGVfcmFuZ2Ugd2UgbmVlZCB0byBj YW5jZWwgYW55IHVzZXJwdHIgdGhhdAorCSAqIG92ZXJsYXBzIHRoZSByYW5nZSBiZWluZyBpbnZh bGlkYXRlZC4gRG9pbmcgc28gcmVxdWlyZXMgdGhlCisJICogc3RydWN0X211dGV4LCBhbmQgdGhh dCByaXNrcyByZWN1cnNpb24uIEluIG9yZGVyIHRvIGNhdXNlCisJICogcmVjdXJzaW9uLCB0aGUg dXNlciBtdXN0IGFsaWFzIHRoZSB1c2VycHRyIGFkZHJlc3Mgc3BhY2Ugd2l0aAorCSAqIGEgR1RU IG1tYXBwaW5nIChwb3NzaWJsZSB3aXRoIGEgTUFQX0ZJWEVEKSAtIHRoZW4gd2hlbiB3ZSBoYXZl CisJICogdG8gaW52YWxpZGF0ZSB0aGF0IG1tYXBpbmcsIG1tX2ludmFsaWRhdGVfcmFuZ2UgaXMg Y2FsbGVkIHdpdGgKKwkgKiB0aGUgdXNlcnB0ciBhZGRyZXNzICphbmQqIHRoZSBzdHJ1Y3RfbXV0 ZXggaGVsZC4gIFRvIHByZXZlbnQgdGhhdAorCSAqIHdlIHNldCBhIGZsYWcgdW5kZXIgdGhlIGk5 MTVfbW11X25vdGlmaWVyIHNwaW5sb2NrIHRvIGluZGljYXRlCisJICogd2hldGhlciB0aGlzIG9i amVjdCBpcyB2YWxpZC4KKwkgKi8KKwlpZiAoIW1vKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2so Jm1vLT5tbi0+bG9jayk7CisJaWYgKHZhbHVlKQorCQlhZGRfb2JqZWN0KG1vKTsKKwllbHNlCisJ CWRlbF9vYmplY3QobW8pOworCXNwaW5fdW5sb2NrKCZtby0+bW4tPmxvY2spOworfQorCitzdGF0 aWMgc3RydWN0IG11dGV4ICpfX2k5MTVfbXV0ZXhfbG9ja19yZWN1cnNpdmUoc3RydWN0IG11dGV4 ICptKQoreworCXN3aXRjaCAobXV0ZXhfdHJ5bG9ja19yZWN1cnNpdmUobSkpIHsKKwlkZWZhdWx0 OgorCWNhc2UgTVVURVhfVFJZTE9DS19GQUlMRUQ6CisJCW11dGV4X2xvY2tfbmVzdGVkKG0sIEk5 MTVfTU1fU0hSSU5LRVIpOworCWNhc2UgTVVURVhfVFJZTE9DS19TVUNDRVNTOgorCQlyZXR1cm4g bTsKKworCWNhc2UgTVVURVhfVFJZTE9DS19SRUNVUlNJVkU6CisJCXJldHVybiBFUlJfUFRSKC1F RVhJU1QpOworCX0KIH0KIAogc3RhdGljIGludCBpOTE1X2dlbV91c2VycHRyX21uX2ludmFsaWRh dGVfcmFuZ2Vfc3RhcnQoc3RydWN0IG1tdV9ub3RpZmllciAqX21uLAotCQkJCQkJICAgICAgIHN0 cnVjdCBtbV9zdHJ1Y3QgKm1tLAotCQkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsCi0J CQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBlbmQsCi0JCQkJCQkgICAgICAgYm9vbCBibG9ja2Fi bGUpCisJCQkJCQkgICAgICBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkJCSAgICAgIHVuc2ln bmVkIGxvbmcgc3RhcnQsCisJCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGVuZCwKKwkJCQkJCSAg ICAgIGJvb2wgYmxvY2thYmxlKQogewogCXN0cnVjdCBpOTE1X21tdV9ub3RpZmllciAqbW4gPQog CQljb250YWluZXJfb2YoX21uLCBzdHJ1Y3QgaTkxNV9tbXVfbm90aWZpZXIsIG1uKTsKLQlzdHJ1 Y3QgaTkxNV9tbXVfb2JqZWN0ICptbzsKIAlzdHJ1Y3QgaW50ZXJ2YWxfdHJlZV9ub2RlICppdDsK LQlMSVNUX0hFQUQoY2FuY2VsbGVkKTsKKwlzdHJ1Y3QgbXV0ZXggKnVubG9jayA9IE5VTEw7CisJ aW50IHJldCA9IDA7CiAKIAlpZiAoUkJfRU1QVFlfUk9PVCgmbW4tPm9iamVjdHMucmJfcm9vdCkp CiAJCXJldHVybiAwOwpAQCAtMTMzLDExICsxMzgsMTUgQEAgc3RhdGljIGludCBpOTE1X2dlbV91 c2VycHRyX21uX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQoc3RydWN0IG1tdV9ub3RpZmllciAqX21u LAogCXNwaW5fbG9jaygmbW4tPmxvY2spOwogCWl0ID0gaW50ZXJ2YWxfdHJlZV9pdGVyX2ZpcnN0 KCZtbi0+b2JqZWN0cywgc3RhcnQsIGVuZCk7CiAJd2hpbGUgKGl0KSB7CisJCXN0cnVjdCBkcm1f aTkxNV9nZW1fb2JqZWN0ICpvYmo7CisKIAkJaWYgKCFibG9ja2FibGUpIHsKLQkJCXNwaW5fdW5s b2NrKCZtbi0+bG9jayk7Ci0JCQlyZXR1cm4gLUVBR0FJTjsKKwkJCXJldCA9IC1FQUdBSU47CisJ CQlicmVhazsKIAkJfQotCQkvKiBUaGUgbW11X29iamVjdCBpcyByZWxlYXNlZCBsYXRlIHdoZW4g ZGVzdHJveWluZyB0aGUKKworCQkvKgorCQkgKiBUaGUgbW11X29iamVjdCBpcyByZWxlYXNlZCBs YXRlIHdoZW4gZGVzdHJveWluZyB0aGUKIAkJICogR0VNIG9iamVjdCBzbyBpdCBpcyBlbnRpcmVs eSBwb3NzaWJsZSB0byBnYWluIGEKIAkJICogcmVmZXJlbmNlIG9uIGFuIG9iamVjdCBpbiB0aGUg cHJvY2VzcyBvZiBiZWluZyBmcmVlZAogCQkgKiBzaW5jZSBvdXIgc2VyaWFsaXNhdGlvbiBpcyB2 aWEgdGhlIHNwaW5sb2NrIGFuZCBub3QKQEAgLTE0NiwyMSArMTU1LDM5IEBAIHN0YXRpYyBpbnQg aTkxNV9nZW1fdXNlcnB0cl9tbl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0KHN0cnVjdCBtbXVfbm90 aWZpZXIgKl9tbiwKIAkJICogdXNlLWFmdGVyLWZyZWUgd2Ugb25seSBhY3F1aXJlIGEgcmVmZXJl bmNlIG9uIHRoZQogCQkgKiBvYmplY3QgaWYgaXQgaXMgbm90IGluIHRoZSBwcm9jZXNzIG9mIGJl aW5nIGRlc3Ryb3llZC4KIAkJICovCi0JCW1vID0gY29udGFpbmVyX29mKGl0LCBzdHJ1Y3QgaTkx NV9tbXVfb2JqZWN0LCBpdCk7Ci0JCWlmIChrcmVmX2dldF91bmxlc3NfemVybygmbW8tPm9iai0+ YmFzZS5yZWZjb3VudCkpCi0JCQlxdWV1ZV93b3JrKG1uLT53cSwgJm1vLT53b3JrKTsKKwkJb2Jq ID0gY29udGFpbmVyX29mKGl0LCBzdHJ1Y3QgaTkxNV9tbXVfb2JqZWN0LCBpdCktPm9iajsKKwkJ aWYgKCFrcmVmX2dldF91bmxlc3NfemVybygmb2JqLT5iYXNlLnJlZmNvdW50KSkgeworCQkJaXQg PSBpbnRlcnZhbF90cmVlX2l0ZXJfbmV4dChpdCwgc3RhcnQsIGVuZCk7CisJCQljb250aW51ZTsK KwkJfQorCQlzcGluX3VubG9jaygmbW4tPmxvY2spOwogCi0JCWxpc3RfYWRkKCZtby0+bGluaywg JmNhbmNlbGxlZCk7Ci0JCWl0ID0gaW50ZXJ2YWxfdHJlZV9pdGVyX25leHQoaXQsIHN0YXJ0LCBl bmQpOworCQlpZiAoIXVubG9jaykKKwkJCXVubG9jayA9IF9faTkxNV9tdXRleF9sb2NrX3JlY3Vy c2l2ZSgmbW4tPm1tLT5pOTE1LT5kcm0uc3RydWN0X211dGV4KTsKKwkJcmV0ID0gaTkxNV9nZW1f b2JqZWN0X3VuYmluZChvYmopOworCQlpZiAocmV0ID09IDApCisJCQlyZXQgPSBfX2k5MTVfZ2Vt X29iamVjdF9wdXRfcGFnZXMob2JqLCBJOTE1X01NX1NIUklOS0VSKTsKKwkJaTkxNV9nZW1fb2Jq ZWN0X3B1dChvYmopOworCQlpZiAocmV0KQorCQkJZ290byB1bmxvY2s7CisKKwkJc3Bpbl9sb2Nr KCZtbi0+bG9jayk7CisKKwkJLyoKKwkJICogQXMgd2UgZG8gbm90ICh5ZXQpIHByb3RlY3QgdGhl IG1tdSBmcm9tIGNvbmN1cnJlbnQgaW5zZXJ0aW9uCisJCSAqIG92ZXIgdGhpcyByYW5nZSwgdGhl cmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhpcyBzZWFyY2ggd2lsbAorCQkgKiB0ZXJtaW5hdGUg Z2l2ZW4gYSBwYXRob2xvZ2ljIHdvcmtsb2FkLgorCQkgKi8KKwkJaXQgPSBpbnRlcnZhbF90cmVl X2l0ZXJfZmlyc3QoJm1uLT5vYmplY3RzLCBzdGFydCwgZW5kKTsKIAl9Ci0JbGlzdF9mb3JfZWFj aF9lbnRyeShtbywgJmNhbmNlbGxlZCwgbGluaykKLQkJZGVsX29iamVjdChtbyk7CiAJc3Bpbl91 bmxvY2soJm1uLT5sb2NrKTsKIAotCWlmICghbGlzdF9lbXB0eSgmY2FuY2VsbGVkKSkKLQkJZmx1 c2hfd29ya3F1ZXVlKG1uLT53cSk7Cit1bmxvY2s6CisJaWYgKCFJU19FUlJfT1JfTlVMTCh1bmxv Y2spKQorCQltdXRleF91bmxvY2sodW5sb2NrKTsKKworCXJldHVybiByZXQ7CiAKLQlyZXR1cm4g MDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBtbXVfbm90aWZpZXJfb3BzIGk5MTVfZ2VtX3Vz ZXJwdHJfbm90aWZpZXIgPSB7CkBAIC0xNjgsNyArMTk1LDcgQEAgc3RhdGljIGNvbnN0IHN0cnVj dCBtbXVfbm90aWZpZXJfb3BzIGk5MTVfZ2VtX3VzZXJwdHJfbm90aWZpZXIgPSB7CiB9OwogCiBz dGF0aWMgc3RydWN0IGk5MTVfbW11X25vdGlmaWVyICoKLWk5MTVfbW11X25vdGlmaWVyX2NyZWF0 ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK2k5MTVfbW11X25vdGlmaWVyX2NyZWF0ZShzdHJ1Y3Qg aTkxNV9tbV9zdHJ1Y3QgKm1tKQogewogCXN0cnVjdCBpOTE1X21tdV9ub3RpZmllciAqbW47CiAK QEAgLTE3OSwxMyArMjA2LDcgQEAgaTkxNV9tbXVfbm90aWZpZXJfY3JlYXRlKHN0cnVjdCBtbV9z dHJ1Y3QgKm1tKQogCXNwaW5fbG9ja19pbml0KCZtbi0+bG9jayk7CiAJbW4tPm1uLm9wcyA9ICZp OTE1X2dlbV91c2VycHRyX25vdGlmaWVyOwogCW1uLT5vYmplY3RzID0gUkJfUk9PVF9DQUNIRUQ7 Ci0JbW4tPndxID0gYWxsb2Nfd29ya3F1ZXVlKCJpOTE1LXVzZXJwdHItcmVsZWFzZSIsCi0JCQkJ IFdRX1VOQk9VTkQgfCBXUV9NRU1fUkVDTEFJTSwKLQkJCQkgMCk7Ci0JaWYgKG1uLT53cSA9PSBO VUxMKSB7Ci0JCWtmcmVlKG1uKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JfQorCW1u LT5tbSA9IG1tOwogCiAJcmV0dXJuIG1uOwogfQpAQCAtMTk1LDE2ICsyMTYsMTQgQEAgaTkxNV9n ZW1fdXNlcnB0cl9yZWxlYXNlX19tbXVfbm90aWZpZXIoc3RydWN0IGRybV9pOTE1X2dlbV9vYmpl Y3QgKm9iaikKIHsKIAlzdHJ1Y3QgaTkxNV9tbXVfb2JqZWN0ICptbzsKIAotCW1vID0gb2JqLT51 c2VycHRyLm1tdV9vYmplY3Q7Ci0JaWYgKG1vID09IE5VTEwpCisJbW8gPSBmZXRjaF9hbmRfemVy bygmb2JqLT51c2VycHRyLm1tdV9vYmplY3QpOworCWlmICghbW8pCiAJCXJldHVybjsKIAogCXNw aW5fbG9jaygmbW8tPm1uLT5sb2NrKTsKIAlkZWxfb2JqZWN0KG1vKTsKIAlzcGluX3VubG9jaygm bW8tPm1uLT5sb2NrKTsKIAlrZnJlZShtbyk7Ci0KLQlvYmotPnVzZXJwdHIubW11X29iamVjdCA9 IE5VTEw7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaTkxNV9tbXVfbm90aWZpZXIgKgpAQCAtMjE3LDcg KzIzNiw3IEBAIGk5MTVfbW11X25vdGlmaWVyX2ZpbmQoc3RydWN0IGk5MTVfbW1fc3RydWN0ICpt bSkKIAlpZiAobW4pCiAJCXJldHVybiBtbjsKIAotCW1uID0gaTkxNV9tbXVfbm90aWZpZXJfY3Jl YXRlKG1tLT5tbSk7CisJbW4gPSBpOTE1X21tdV9ub3RpZmllcl9jcmVhdGUobW0pOwogCWlmIChJ U19FUlIobW4pKQogCQllcnIgPSBQVFJfRVJSKG1uKTsKIApAQCAtMjQwLDEwICsyNTksOCBAQCBp OTE1X21tdV9ub3RpZmllcl9maW5kKHN0cnVjdCBpOTE1X21tX3N0cnVjdCAqbW0pCiAJbXV0ZXhf dW5sb2NrKCZtbS0+aTkxNS0+bW1fbG9jayk7CiAJdXBfd3JpdGUoJm1tLT5tbS0+bW1hcF9zZW0p OwogCi0JaWYgKG1uICYmICFJU19FUlIobW4pKSB7Ci0JCWRlc3Ryb3lfd29ya3F1ZXVlKG1uLT53 cSk7CisJaWYgKG1uICYmICFJU19FUlIobW4pKQogCQlrZnJlZShtbik7Ci0JfQogCiAJcmV0dXJu IGVyciA/IEVSUl9QVFIoZXJyKSA6IG1tLT5tbjsKIH0KQEAgLTI2NiwxNCArMjgzLDE0IEBAIGk5 MTVfZ2VtX3VzZXJwdHJfaW5pdF9fbW11X25vdGlmaWVyKHN0cnVjdCBkcm1faTkxNV9nZW1fb2Jq ZWN0ICpvYmosCiAJCXJldHVybiBQVFJfRVJSKG1uKTsKIAogCW1vID0ga3phbGxvYyhzaXplb2Yo Km1vKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKG1vID09IE5VTEwpCisJaWYgKCFtbykKIAkJcmV0dXJu IC1FTk9NRU07CiAKIAltby0+bW4gPSBtbjsKIAltby0+b2JqID0gb2JqOwogCW1vLT5pdC5zdGFy dCA9IG9iai0+dXNlcnB0ci5wdHI7CiAJbW8tPml0Lmxhc3QgPSBvYmotPnVzZXJwdHIucHRyICsg b2JqLT5iYXNlLnNpemUgLSAxOwotCUlOSVRfV09SSygmbW8tPndvcmssIGNhbmNlbF91c2VycHRy KTsKKwlSQl9DTEVBUl9OT0RFKCZtby0+aXQucmIpOwogCiAJb2JqLT51c2VycHRyLm1tdV9vYmpl Y3QgPSBtbzsKIAlyZXR1cm4gMDsKQEAgLTI4NywxMiArMzA0LDE2IEBAIGk5MTVfbW11X25vdGlm aWVyX2ZyZWUoc3RydWN0IGk5MTVfbW11X25vdGlmaWVyICptbiwKIAkJcmV0dXJuOwogCiAJbW11 X25vdGlmaWVyX3VucmVnaXN0ZXIoJm1uLT5tbiwgbW0pOwotCWRlc3Ryb3lfd29ya3F1ZXVlKG1u LT53cSk7CiAJa2ZyZWUobW4pOwogfQogCiAjZWxzZQogCitzdGF0aWMgdm9pZAorX19pOTE1X2dl bV91c2VycHRyX3NldF9hY3RpdmUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwgYm9v bCB2YWx1ZSkKK3sKK30KKwogc3RhdGljIHZvaWQKIGk5MTVfZ2VtX3VzZXJwdHJfcmVsZWFzZV9f bW11X25vdGlmaWVyKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCiB7CkBAIC00NjEs NDIgKzQ4Miw2IEBAIF9faTkxNV9nZW1fdXNlcnB0cl9hbGxvY19wYWdlcyhzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX29iamVjdCAqb2JqLAogCXJldHVybiBzdDsKIH0KIAotc3RhdGljIGludAotX19pOTE1 X2dlbV91c2VycHRyX3NldF9hY3RpdmUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwK LQkJCSAgICAgIGJvb2wgdmFsdWUpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQkvKiBEdXJpbmcgbW1f aW52YWxpZGF0ZV9yYW5nZSB3ZSBuZWVkIHRvIGNhbmNlbCBhbnkgdXNlcnB0ciB0aGF0Ci0JICog b3ZlcmxhcHMgdGhlIHJhbmdlIGJlaW5nIGludmFsaWRhdGVkLiBEb2luZyBzbyByZXF1aXJlcyB0 aGUKLQkgKiBzdHJ1Y3RfbXV0ZXgsIGFuZCB0aGF0IHJpc2tzIHJlY3Vyc2lvbi4gSW4gb3JkZXIg dG8gY2F1c2UKLQkgKiByZWN1cnNpb24sIHRoZSB1c2VyIG11c3QgYWxpYXMgdGhlIHVzZXJwdHIg YWRkcmVzcyBzcGFjZSB3aXRoCi0JICogYSBHVFQgbW1hcHBpbmcgKHBvc3NpYmxlIHdpdGggYSBN QVBfRklYRUQpIC0gdGhlbiB3aGVuIHdlIGhhdmUKLQkgKiB0byBpbnZhbGlkYXRlIHRoYXQgbW1h cGluZywgbW1faW52YWxpZGF0ZV9yYW5nZSBpcyBjYWxsZWQgd2l0aAotCSAqIHRoZSB1c2VycHRy IGFkZHJlc3MgKmFuZCogdGhlIHN0cnVjdF9tdXRleCBoZWxkLiAgVG8gcHJldmVudCB0aGF0Ci0J ICogd2Ugc2V0IGEgZmxhZyB1bmRlciB0aGUgaTkxNV9tbXVfbm90aWZpZXIgc3BpbmxvY2sgdG8g aW5kaWNhdGUKLQkgKiB3aGV0aGVyIHRoaXMgb2JqZWN0IGlzIHZhbGlkLgotCSAqLwotI2lmIGRl ZmluZWQoQ09ORklHX01NVV9OT1RJRklFUikKLQlpZiAob2JqLT51c2VycHRyLm1tdV9vYmplY3Qg PT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0KLQlzcGluX2xvY2soJm9iai0+dXNlcnB0ci5tbXVfb2Jq ZWN0LT5tbi0+bG9jayk7Ci0JLyogSW4gb3JkZXIgdG8gc2VyaWFsaXNlIGdldF9wYWdlcyB3aXRo IGFuIG91dHN0YW5kaW5nCi0JICogY2FuY2VsX3VzZXJwdHIsIHdlIG11c3QgZHJvcCB0aGUgc3Ry dWN0X211dGV4IGFuZCB0cnkgYWdhaW4uCi0JICovCi0JaWYgKCF2YWx1ZSkKLQkJZGVsX29iamVj dChvYmotPnVzZXJwdHIubW11X29iamVjdCk7Ci0JZWxzZSBpZiAoIXdvcmtfcGVuZGluZygmb2Jq LT51c2VycHRyLm1tdV9vYmplY3QtPndvcmspKQotCQlhZGRfb2JqZWN0KG9iai0+dXNlcnB0ci5t bXVfb2JqZWN0KTsKLQllbHNlCi0JCXJldCA9IC1FQUdBSU47Ci0Jc3Bpbl91bmxvY2soJm9iai0+ dXNlcnB0ci5tbXVfb2JqZWN0LT5tbi0+bG9jayk7Ci0jZW5kaWYKLQotCXJldHVybiByZXQ7Ci19 Ci0KIHN0YXRpYyB2b2lkCiBfX2k5MTVfZ2VtX3VzZXJwdHJfZ2V0X3BhZ2VzX3dvcmtlcihzdHJ1 Y3Qgd29ya19zdHJ1Y3QgKl93b3JrKQogewpAQCAtNjgyLDggKzY2NywxMSBAQCBpOTE1X2dlbV91 c2VycHRyX3B1dF9wYWdlcyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAogCXN0cnVj dCBzZ3RfaXRlciBzZ3RfaXRlcjsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAotCUJVR19PTihvYmot PnVzZXJwdHIud29yayAhPSBOVUxMKTsKKwkvKiBDYW5jZWwgYW55IGluZmxpZ2h0IHdvcmsgYW5k IGZvcmNlIHRoZW0gdG8gcmVzdGFydCB0aGVpciBndXAgKi8KKwlvYmotPnVzZXJwdHIud29yayA9 IE5VTEw7CiAJX19pOTE1X2dlbV91c2VycHRyX3NldF9hY3RpdmUob2JqLCBmYWxzZSk7CisJaWYg KCFwYWdlcykKKwkJcmV0dXJuOwogCiAJaWYgKG9iai0+bW0ubWFkdiAhPSBJOTE1X01BRFZfV0lM TE5FRUQpCiAJCW9iai0+bW0uZGlydHkgPSBmYWxzZTsKQEAgLTcyMSw3ICs3MDksOCBAQCBpOTE1 X2dlbV91c2VycHRyX2RtYWJ1Zl9leHBvcnQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9i aikKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0X29wcyBpOTE1X2dl bV91c2VycHRyX29wcyA9IHsKIAkuZmxhZ3MgPSBJOTE1X0dFTV9PQkpFQ1RfSEFTX1NUUlVDVF9Q QUdFIHwKLQkJIEk5MTVfR0VNX09CSkVDVF9JU19TSFJJTktBQkxFLAorCQkgSTkxNV9HRU1fT0JK RUNUX0lTX1NIUklOS0FCTEUgfAorCQkgSTkxNV9HRU1fT0JKRUNUX0FTWU5DX0NBTkNFTCwKIAku Z2V0X3BhZ2VzID0gaTkxNV9nZW1fdXNlcnB0cl9nZXRfcGFnZXMsCiAJLnB1dF9wYWdlcyA9IGk5 MTVfZ2VtX3VzZXJwdHJfcHV0X3BhZ2VzLAogCS5kbWFidWZfZXhwb3J0ID0gaTkxNV9nZW1fdXNl cnB0cl9kbWFidWZfZXhwb3J0LAotLSAKMi4yMC4wLnJjMgoKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1n ZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21h aWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==