From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chris Wilson Subject: [PATCH 21/41] drm/i915: Implement pwrite without struct-mutex Date: Fri, 14 Oct 2016 13:18:13 +0100 Message-ID: <20161014121833.439-22-chris@chris-wilson.co.uk> References: <20161014121833.439-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 mail-lf0-x244.google.com (mail-lf0-x244.google.com [IPv6:2a00:1450:4010:c07::244]) by gabe.freedesktop.org (Postfix) with ESMTPS id 9C7D66EC27 for ; Fri, 14 Oct 2016 12:19:03 +0000 (UTC) Received: by mail-lf0-x244.google.com with SMTP id l131so15055892lfl.0 for ; Fri, 14 Oct 2016 05:19:03 -0700 (PDT) In-Reply-To: <20161014121833.439-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 V2Ugb25seSBuZWVkIHN0cnVjdF9tdXRleCB3aXRoaW4gcHdyaXRlIGZvciBhIGJyaWVmIHdpbmRv dyB3aGVyZSB3ZSBuZWVkCnRvIHNlcmlhbGlzZSB3aXRoIHJlbmRlcmluZyBhbmQgY29udHJvbCBv dXIgY2FjaGUgZG9tYWlucy4gRWxzZXdoZXJlIHdlCmNhbiByZWx5IG9uIHRoZSBiYWNraW5nIHN0 b3JhZ2UgYmVpbmcgcGlubmVkLCBhbmQgZm9yZ2l2ZSB1c2Vyc3BhY2UgYW55CnJhY2VzIGFnYWlu c3QgdXMuCgpTaWduZWQtb2ZmLWJ5OiBDaHJpcyBXaWxzb24gPGNocmlzQGNocmlzLXdpbHNvbi5j by51az4KUmV2aWV3ZWQtYnk6IEpvb25hcyBMYWh0aW5lbiA8am9vbmFzLmxhaHRpbmVuQGxpbnV4 LmludGVsLmNvbT4KLS0tCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jIHwgMzQ2ICsr KysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCAx MjEgaW5zZXJ0aW9ucygrKSwgMjI1IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5j CmluZGV4IDRhMTcxMzM0MzZjNi4uNWQ4MDUyZmJjZTE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dw dS9kcm0vaTkxNS9pOTE1X2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2Vt LmMKQEAgLTExMjAsMTAgKzExMjAsMTAgQEAgb3V0OgogICovCiAKIHN0YXRpYyBpbmxpbmUgaW50 Ci1mYXN0X3VzZXJfd3JpdGUoc3RydWN0IGlvX21hcHBpbmcgKm1hcHBpbmcsCi0JCWxvZmZfdCBw YWdlX2Jhc2UsIGludCBwYWdlX29mZnNldCwKLQkJY2hhciBfX3VzZXIgKnVzZXJfZGF0YSwKLQkJ aW50IGxlbmd0aCkKK2dndHRfd3JpdGUoc3RydWN0IGlvX21hcHBpbmcgKm1hcHBpbmcsCisJICAg bG9mZl90IHBhZ2VfYmFzZSwgaW50IHBhZ2Vfb2Zmc2V0LAorCSAgIGNoYXIgX191c2VyICp1c2Vy X2RhdGEsCisJICAgaW50IGxlbmd0aCkKIHsKIAl2b2lkIF9faW9tZW0gKnZhZGRyX2F0b21pYzsK IAl2b2lkICp2YWRkcjsKQEAgLTExMzEsNjAgKzExMzEsNDMgQEAgZmFzdF91c2VyX3dyaXRlKHN0 cnVjdCBpb19tYXBwaW5nICptYXBwaW5nLAogCiAJdmFkZHJfYXRvbWljID0gaW9fbWFwcGluZ19t YXBfYXRvbWljX3djKG1hcHBpbmcsIHBhZ2VfYmFzZSk7CiAJLyogV2UgY2FuIHVzZSB0aGUgY3B1 IG1lbSBjb3B5IGZ1bmN0aW9uIGJlY2F1c2UgdGhpcyBpcyBYODYuICovCi0JdmFkZHIgPSAodm9p ZCBfX2ZvcmNlKil2YWRkcl9hdG9taWMgKyBwYWdlX29mZnNldDsKKwl2YWRkciA9ICh2b2lkIF9f Zm9yY2UgKil2YWRkcl9hdG9taWMgKyBwYWdlX29mZnNldDsKIAl1bndyaXR0ZW4gPSBfX2NvcHlf ZnJvbV91c2VyX2luYXRvbWljX25vY2FjaGUodmFkZHIsCiAJCQkJCQkgICAgICB1c2VyX2RhdGEs IGxlbmd0aCk7CiAJaW9fbWFwcGluZ191bm1hcF9hdG9taWModmFkZHJfYXRvbWljKTsKLQlyZXR1 cm4gdW53cml0dGVuOwotfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLXNsb3dfdXNl cl9hY2Nlc3Moc3RydWN0IGlvX21hcHBpbmcgKm1hcHBpbmcsCi0JCSB1bnNpZ25lZCBsb25nIHBh Z2VfYmFzZSwgaW50IHBhZ2Vfb2Zmc2V0LAotCQkgY2hhciBfX3VzZXIgKnVzZXJfZGF0YSwKLQkJ IHVuc2lnbmVkIGxvbmcgbGVuZ3RoLCBib29sIHB3cml0ZSkKLXsKLQl2b2lkIF9faW9tZW0gKmlv YWRkcjsKLQl2b2lkICp2YWRkcjsKLQl1bnNpZ25lZCBsb25nIHVud3JpdHRlbjsKLQotCWlvYWRk ciA9IGlvX21hcHBpbmdfbWFwX3djKG1hcHBpbmcsIHBhZ2VfYmFzZSwgUEFHRV9TSVpFKTsKLQkv KiBXZSBjYW4gdXNlIHRoZSBjcHUgbWVtIGNvcHkgZnVuY3Rpb24gYmVjYXVzZSB0aGlzIGlzIFg4 Ni4gKi8KLQl2YWRkciA9ICh2b2lkIF9fZm9yY2UgKilpb2FkZHIgKyBwYWdlX29mZnNldDsKLQlp ZiAocHdyaXRlKQotCQl1bndyaXR0ZW4gPSBfX2NvcHlfZnJvbV91c2VyKHZhZGRyLCB1c2VyX2Rh dGEsIGxlbmd0aCk7Ci0JZWxzZQotCQl1bndyaXR0ZW4gPSBfX2NvcHlfdG9fdXNlcih1c2VyX2Rh dGEsIHZhZGRyLCBsZW5ndGgpOworCWlmICh1bndyaXR0ZW4pIHsKKwkJdmFkZHJfYXRvbWljID0g aW9fbWFwcGluZ19tYXBfd2MobWFwcGluZywgcGFnZV9iYXNlLCBQQUdFX1NJWkUpOworCQkvKiBX ZSBjYW4gdXNlIHRoZSBjcHUgbWVtIGNvcHkgZnVuY3Rpb24gYmVjYXVzZSB0aGlzIGlzIFg4Ni4g Ki8KKwkJdmFkZHIgPSAodm9pZCBfX2ZvcmNlICopdmFkZHJfYXRvbWljICsgcGFnZV9vZmZzZXQ7 CisJCXVud3JpdHRlbiA9IGNvcHlfZnJvbV91c2VyKHZhZGRyLCB1c2VyX2RhdGEsIGxlbmd0aCk7 CisJCWlvX21hcHBpbmdfdW5tYXAodmFkZHJfYXRvbWljKTsKKwl9CiAKLQlpb19tYXBwaW5nX3Vu bWFwKGlvYWRkcik7CiAJcmV0dXJuIHVud3JpdHRlbjsKIH0KIAogLyoqCiAgKiBUaGlzIGlzIHRo ZSBmYXN0IHB3cml0ZSBwYXRoLCB3aGVyZSB3ZSBjb3B5IHRoZSBkYXRhIGRpcmVjdGx5IGZyb20g dGhlCiAgKiB1c2VyIGludG8gdGhlIEdUVCwgdW5jYWNoZWQuCi0gKiBAaTkxNTogaTkxNSBkZXZp Y2UgcHJpdmF0ZSBkYXRhCi0gKiBAb2JqOiBpOTE1IGdlbSBvYmplY3QKKyAqIEBvYmo6IGk5MTUg R0VNIG9iamVjdAogICogQGFyZ3M6IHB3cml0ZSBhcmd1bWVudHMgc3RydWN0dXJlCi0gKiBAZmls ZTogZHJtIGZpbGUgcG9pbnRlcgogICovCiBzdGF0aWMgaW50Ci1pOTE1X2dlbV9ndHRfcHdyaXRl X2Zhc3Qoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsCi0JCQkgc3RydWN0IGRybV9pOTE1 X2dlbV9vYmplY3QgKm9iaiwKLQkJCSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3B3cml0ZSAqYXJncywK LQkJCSBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCitpOTE1X2dlbV9ndHRfcHdyaXRlX2Zhc3Qoc3Ry dWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCSBjb25zdCBzdHJ1Y3QgZHJtX2k5MTVf Z2VtX3B3cml0ZSAqYXJncykKIHsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IHRv X2k5MTUob2JqLT5iYXNlLmRldik7CiAJc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCA9ICZpOTE1LT5n Z3R0OwotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OwotCXN0cnVjdCBp OTE1X3ZtYSAqdm1hOwogCXN0cnVjdCBkcm1fbW1fbm9kZSBub2RlOwotCXVpbnQ2NF90IHJlbWFp biwgb2Zmc2V0OwotCWNoYXIgX191c2VyICp1c2VyX2RhdGE7CisJc3RydWN0IGk5MTVfdm1hICp2 bWE7CisJdTY0IHJlbWFpbiwgb2Zmc2V0OworCXZvaWQgX191c2VyICp1c2VyX2RhdGE7CiAJaW50 IHJldDsKLQlib29sIGhpdF9zbG93X3BhdGggPSBmYWxzZTsKIAotCWlmIChpOTE1X2dlbV9vYmpl Y3RfaXNfdGlsZWQob2JqKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0ID0gbXV0ZXhfbG9ja19p bnRlcnJ1cHRpYmxlKCZpOTE1LT5kcm0uc3RydWN0X211dGV4KTsKKwlpZiAocmV0KQorCQlyZXR1 cm4gcmV0OwogCiAJaW50ZWxfcnVudGltZV9wbV9nZXQoaTkxNSk7CiAJdm1hID0gaTkxNV9nZW1f b2JqZWN0X2dndHRfcGluKG9iaiwgTlVMTCwgMCwgMCwKQEAgLTEyMDEsMjEgKzExODQsMTcgQEAg aTkxNV9nZW1fZ3R0X3B3cml0ZV9mYXN0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1LAog CWlmIChJU19FUlIodm1hKSkgewogCQlyZXQgPSBpbnNlcnRfbWFwcGFibGVfbm9kZShnZ3R0LCAm bm9kZSwgUEFHRV9TSVpFKTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gb3V0OwotCi0JCXJldCA9IGk5 MTVfZ2VtX29iamVjdF9waW5fcGFnZXMob2JqKTsKLQkJaWYgKHJldCkgewotCQkJcmVtb3ZlX21h cHBhYmxlX25vZGUoJm5vZGUpOwotCQkJZ290byBvdXQ7Ci0JCX0KKwkJCWdvdG8gb3V0X3VubG9j azsKKwkJR0VNX0JVR19PTighbm9kZS5hbGxvY2F0ZWQpOwogCX0KIAogCXJldCA9IGk5MTVfZ2Vt X29iamVjdF9zZXRfdG9fZ3R0X2RvbWFpbihvYmosIHRydWUpOwogCWlmIChyZXQpCiAJCWdvdG8g b3V0X3VucGluOwogCisJbXV0ZXhfdW5sb2NrKCZpOTE1LT5kcm0uc3RydWN0X211dGV4KTsKKwog CWludGVsX2ZiX29ial9pbnZhbGlkYXRlKG9iaiwgT1JJR0lOX0NQVSk7Ci0Jb2JqLT5tbS5kaXJ0 eSA9IHRydWU7CiAKIAl1c2VyX2RhdGEgPSB1NjRfdG9fdXNlcl9wdHIoYXJncy0+ZGF0YV9wdHIp OwogCW9mZnNldCA9IGFyZ3MtPm9mZnNldDsKQEAgLTEyNDYsOTIgKzEyMjUsMzYgQEAgaTkxNV9n ZW1fZ3R0X3B3cml0ZV9mYXN0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1LAogCQkgKiBJ ZiB0aGUgb2JqZWN0IGlzIG5vbi1zaG1lbSBiYWNrZWQsIHdlIHJldHJ5IGFnYWluIHdpdGggdGhl CiAJCSAqIHBhdGggdGhhdCBoYW5kbGVzIHBhZ2UgZmF1bHQuCiAJCSAqLwotCQlpZiAoZmFzdF91 c2VyX3dyaXRlKCZnZ3R0LT5tYXBwYWJsZSwgcGFnZV9iYXNlLAotCQkJCSAgICBwYWdlX29mZnNl dCwgdXNlcl9kYXRhLCBwYWdlX2xlbmd0aCkpIHsKLQkJCWhpdF9zbG93X3BhdGggPSB0cnVlOwot CQkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JCQlpZiAoc2xvd191c2VyX2Fj Y2VzcygmZ2d0dC0+bWFwcGFibGUsCi0JCQkJCSAgICAgcGFnZV9iYXNlLAotCQkJCQkgICAgIHBh Z2Vfb2Zmc2V0LCB1c2VyX2RhdGEsCi0JCQkJCSAgICAgcGFnZV9sZW5ndGgsIHRydWUpKSB7Ci0J CQkJcmV0ID0gLUVGQVVMVDsKLQkJCQltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0J CQkJZ290byBvdXRfZmx1c2g7Ci0JCQl9Ci0KLQkJCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211 dGV4KTsKKwkJaWYgKGdndHRfd3JpdGUoJmdndHQtPm1hcHBhYmxlLCBwYWdlX2Jhc2UsIHBhZ2Vf b2Zmc2V0LAorCQkJICAgICAgIHVzZXJfZGF0YSwgcGFnZV9sZW5ndGgpKSB7CisJCQlyZXQgPSAt RUZBVUxUOworCQkJYnJlYWs7CiAJCX0KIAogCQlyZW1haW4gLT0gcGFnZV9sZW5ndGg7CiAJCXVz ZXJfZGF0YSArPSBwYWdlX2xlbmd0aDsKIAkJb2Zmc2V0ICs9IHBhZ2VfbGVuZ3RoOwogCX0KLQot b3V0X2ZsdXNoOgotCWlmIChoaXRfc2xvd19wYXRoKSB7Ci0JCWlmIChyZXQgPT0gMCAmJgotCQkg ICAgKG9iai0+YmFzZS5yZWFkX2RvbWFpbnMgJiBJOTE1X0dFTV9ET01BSU5fR1RUKSA9PSAwKSB7 Ci0JCQkvKiBUaGUgdXNlciBoYXMgbW9kaWZpZWQgdGhlIG9iamVjdCB3aGlsc3Qgd2UgdHJpZWQK LQkJCSAqIHJlYWRpbmcgZnJvbSBpdCwgYW5kIHdlIG5vdyBoYXZlIG5vIGlkZWEgd2hhdCBkb21h aW4KLQkJCSAqIHRoZSBwYWdlcyBzaG91bGQgYmUgaW4uIEFzIHdlIGhhdmUganVzdCBiZWVuIHRv dWNoaW5nCi0JCQkgKiB0aGVtIGRpcmVjdGx5LCBmbHVzaCBldmVyeXRoaW5nIGJhY2sgdG8gdGhl IEdUVAotCQkJICogZG9tYWluLgotCQkJICovCi0JCQlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0 X3RvX2d0dF9kb21haW4ob2JqLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KIAlpbnRlbF9mYl9vYmpfZmx1 c2gob2JqLCBmYWxzZSwgT1JJR0lOX0NQVSk7CisKKwltdXRleF9sb2NrKCZpOTE1LT5kcm0uc3Ry dWN0X211dGV4KTsKIG91dF91bnBpbjoKIAlpZiAobm9kZS5hbGxvY2F0ZWQpIHsKIAkJd21iKCk7 CiAJCWdndHQtPmJhc2UuY2xlYXJfcmFuZ2UoJmdndHQtPmJhc2UsCiAJCQkJICAgICAgIG5vZGUu c3RhcnQsIG5vZGUuc2l6ZSk7Ci0JCWk5MTVfZ2VtX29iamVjdF91bnBpbl9wYWdlcyhvYmopOwog CQlyZW1vdmVfbWFwcGFibGVfbm9kZSgmbm9kZSk7CiAJfSBlbHNlIHsKIAkJaTkxNV92bWFfdW5w aW4odm1hKTsKIAl9Ci1vdXQ6CitvdXRfdW5sb2NrOgogCWludGVsX3J1bnRpbWVfcG1fcHV0KGk5 MTUpOworCW11dGV4X3VubG9jaygmaTkxNS0+ZHJtLnN0cnVjdF9tdXRleCk7CiAJcmV0dXJuIHJl dDsKIH0KIAotLyogUGVyLXBhZ2UgY29weSBmdW5jdGlvbiBmb3IgdGhlIHNobWVtIHB3cml0ZSBm YXN0cGF0aC4KLSAqIEZsdXNoZXMgaW52YWxpZCBjYWNoZWxpbmVzIGJlZm9yZSB3cml0aW5nIHRv IHRoZSB0YXJnZXQgaWYKLSAqIG5lZWRzX2NsZmx1c2hfYmVmb3JlIGlzIHNldCBhbmQgZmx1c2hl cyBvdXQgYW55IHdyaXR0ZW4gY2FjaGVsaW5lcyBhZnRlcgotICogd3JpdGluZyBpZiBuZWVkc19j bGZsdXNoIGlzIHNldC4gKi8KIHN0YXRpYyBpbnQKLXNobWVtX3B3cml0ZV9mYXN0KHN0cnVjdCBw YWdlICpwYWdlLCBpbnQgc2htZW1fcGFnZV9vZmZzZXQsIGludCBwYWdlX2xlbmd0aCwKLQkJICBj aGFyIF9fdXNlciAqdXNlcl9kYXRhLAotCQkgIGJvb2wgcGFnZV9kb19iaXQxN19zd2l6emxpbmcs Ci0JCSAgYm9vbCBuZWVkc19jbGZsdXNoX2JlZm9yZSwKLQkJICBib29sIG5lZWRzX2NsZmx1c2hf YWZ0ZXIpCi17Ci0JY2hhciAqdmFkZHI7Ci0JaW50IHJldDsKLQotCWlmICh1bmxpa2VseShwYWdl X2RvX2JpdDE3X3N3aXp6bGluZykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdmFkZHIgPSBrbWFw X2F0b21pYyhwYWdlKTsKLQlpZiAobmVlZHNfY2xmbHVzaF9iZWZvcmUpCi0JCWRybV9jbGZsdXNo X3ZpcnRfcmFuZ2UodmFkZHIgKyBzaG1lbV9wYWdlX29mZnNldCwKLQkJCQkgICAgICAgcGFnZV9s ZW5ndGgpOwotCXJldCA9IF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWModmFkZHIgKyBzaG1lbV9w YWdlX29mZnNldCwKLQkJCQkJdXNlcl9kYXRhLCBwYWdlX2xlbmd0aCk7Ci0JaWYgKG5lZWRzX2Ns Zmx1c2hfYWZ0ZXIpCi0JCWRybV9jbGZsdXNoX3ZpcnRfcmFuZ2UodmFkZHIgKyBzaG1lbV9wYWdl X29mZnNldCwKLQkJCQkgICAgICAgcGFnZV9sZW5ndGgpOwotCWt1bm1hcF9hdG9taWModmFkZHIp OwotCi0JcmV0dXJuIHJldCA/IC1FRkFVTFQgOiAwOwotfQotCi0vKiBPbmx5IGRpZmZlcmVuY2Ug dG8gdGhlIGZhc3QtcGF0aCBmdW5jdGlvbiBpcyB0aGF0IHRoaXMgY2FuIGhhbmRsZSBiaXQxNwot ICogYW5kIHVzZXMgbm9uLWF0b21pYyBjb3B5IGFuZCBrbWFwIGZ1bmN0aW9ucy4gKi8KLXN0YXRp YyBpbnQKLXNobWVtX3B3cml0ZV9zbG93KHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgc2htZW1fcGFn ZV9vZmZzZXQsIGludCBwYWdlX2xlbmd0aCwKK3NobWVtX3B3cml0ZV9zbG93KHN0cnVjdCBwYWdl ICpwYWdlLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAogCQkgIGNoYXIgX191c2VyICp1c2VyX2Rh dGEsCiAJCSAgYm9vbCBwYWdlX2RvX2JpdDE3X3N3aXp6bGluZywKIAkJICBib29sIG5lZWRzX2Ns Zmx1c2hfYmVmb3JlLApAQCAtMTM0MiwxMjQgKzEyNjUsMTE0IEBAIHNobWVtX3B3cml0ZV9zbG93 KHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgc2htZW1fcGFnZV9vZmZzZXQsIGludCBwYWdlX2xlbmd0 aCwKIAogCXZhZGRyID0ga21hcChwYWdlKTsKIAlpZiAodW5saWtlbHkobmVlZHNfY2xmbHVzaF9i ZWZvcmUgfHwgcGFnZV9kb19iaXQxN19zd2l6emxpbmcpKQotCQlzaG1lbV9jbGZsdXNoX3N3aXp6 bGVkX3JhbmdlKHZhZGRyICsgc2htZW1fcGFnZV9vZmZzZXQsCi0JCQkJCSAgICAgcGFnZV9sZW5n dGgsCisJCXNobWVtX2NsZmx1c2hfc3dpenpsZWRfcmFuZ2UodmFkZHIgKyBvZmZzZXQsIGxlbmd0 aCwKIAkJCQkJICAgICBwYWdlX2RvX2JpdDE3X3N3aXp6bGluZyk7CiAJaWYgKHBhZ2VfZG9fYml0 MTdfc3dpenpsaW5nKQotCQlyZXQgPSBfX2NvcHlfZnJvbV91c2VyX3N3aXp6bGVkKHZhZGRyLCBz aG1lbV9wYWdlX29mZnNldCwKLQkJCQkJCXVzZXJfZGF0YSwKLQkJCQkJCXBhZ2VfbGVuZ3RoKTsK KwkJcmV0ID0gX19jb3B5X2Zyb21fdXNlcl9zd2l6emxlZCh2YWRkciwgb2Zmc2V0LCB1c2VyX2Rh dGEsCisJCQkJCQlsZW5ndGgpOwogCWVsc2UKLQkJcmV0ID0gX19jb3B5X2Zyb21fdXNlcih2YWRk ciArIHNobWVtX3BhZ2Vfb2Zmc2V0LAotCQkJCSAgICAgICB1c2VyX2RhdGEsCi0JCQkJICAgICAg IHBhZ2VfbGVuZ3RoKTsKKwkJcmV0ID0gX19jb3B5X2Zyb21fdXNlcih2YWRkciArIG9mZnNldCwg dXNlcl9kYXRhLCBsZW5ndGgpOwogCWlmIChuZWVkc19jbGZsdXNoX2FmdGVyKQotCQlzaG1lbV9j bGZsdXNoX3N3aXp6bGVkX3JhbmdlKHZhZGRyICsgc2htZW1fcGFnZV9vZmZzZXQsCi0JCQkJCSAg ICAgcGFnZV9sZW5ndGgsCisJCXNobWVtX2NsZmx1c2hfc3dpenpsZWRfcmFuZ2UodmFkZHIgKyBv ZmZzZXQsIGxlbmd0aCwKIAkJCQkJICAgICBwYWdlX2RvX2JpdDE3X3N3aXp6bGluZyk7CiAJa3Vu bWFwKHBhZ2UpOwogCiAJcmV0dXJuIHJldCA/IC1FRkFVTFQgOiAwOwogfQogCisvKiBQZXItcGFn ZSBjb3B5IGZ1bmN0aW9uIGZvciB0aGUgc2htZW0gcHdyaXRlIGZhc3RwYXRoLgorICogRmx1c2hl cyBpbnZhbGlkIGNhY2hlbGluZXMgYmVmb3JlIHdyaXRpbmcgdG8gdGhlIHRhcmdldCBpZgorICog bmVlZHNfY2xmbHVzaF9iZWZvcmUgaXMgc2V0IGFuZCBmbHVzaGVzIG91dCBhbnkgd3JpdHRlbiBj YWNoZWxpbmVzIGFmdGVyCisgKiB3cml0aW5nIGlmIG5lZWRzX2NsZmx1c2ggaXMgc2V0LgorICov CiBzdGF0aWMgaW50Ci1pOTE1X2dlbV9zaG1lbV9wd3JpdGUoc3RydWN0IGRybV9kZXZpY2UgKmRl diwKLQkJICAgICAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKLQkJICAgICAgc3Ry dWN0IGRybV9pOTE1X2dlbV9wd3JpdGUgKmFyZ3MsCi0JCSAgICAgIHN0cnVjdCBkcm1fZmlsZSAq ZmlsZSkKK3NobWVtX3B3cml0ZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG9mZnNldCwgaW50IGxl biwgY2hhciBfX3VzZXIgKnVzZXJfZGF0YSwKKwkgICAgIGJvb2wgcGFnZV9kb19iaXQxN19zd2l6 emxpbmcsCisJICAgICBib29sIG5lZWRzX2NsZmx1c2hfYmVmb3JlLAorCSAgICAgYm9vbCBuZWVk c19jbGZsdXNoX2FmdGVyKQogewotCXNzaXplX3QgcmVtYWluOwotCWxvZmZfdCBvZmZzZXQ7Ci0J Y2hhciBfX3VzZXIgKnVzZXJfZGF0YTsKLQlpbnQgc2htZW1fcGFnZV9vZmZzZXQsIHBhZ2VfbGVu Z3RoLCByZXQgPSAwOwotCWludCBvYmpfZG9fYml0MTdfc3dpenpsaW5nLCBwYWdlX2RvX2JpdDE3 X3N3aXp6bGluZzsKLQlpbnQgaGl0X3Nsb3dwYXRoID0gMDsKKwlpbnQgcmV0OworCisJcmV0ID0g LUVOT0RFVjsKKwlpZiAoIXBhZ2VfZG9fYml0MTdfc3dpenpsaW5nKSB7CisJCWNoYXIgKnZhZGRy ID0ga21hcF9hdG9taWMocGFnZSk7CisKKwkJaWYgKG5lZWRzX2NsZmx1c2hfYmVmb3JlKQorCQkJ ZHJtX2NsZmx1c2hfdmlydF9yYW5nZSh2YWRkciArIG9mZnNldCwgbGVuKTsKKwkJcmV0ID0gX19j b3B5X2Zyb21fdXNlcl9pbmF0b21pYyh2YWRkciArIG9mZnNldCwgdXNlcl9kYXRhLCBsZW4pOwor CQlpZiAobmVlZHNfY2xmbHVzaF9hZnRlcikKKwkJCWRybV9jbGZsdXNoX3ZpcnRfcmFuZ2UodmFk ZHIgKyBvZmZzZXQsIGxlbik7CisKKwkJa3VubWFwX2F0b21pYyh2YWRkcik7CisJfQorCWlmIChy ZXQgPT0gMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzaG1lbV9wd3JpdGVfc2xvdyhwYWdl LCBvZmZzZXQsIGxlbiwgdXNlcl9kYXRhLAorCQkJCSBwYWdlX2RvX2JpdDE3X3N3aXp6bGluZywK KwkJCQkgbmVlZHNfY2xmbHVzaF9iZWZvcmUsCisJCQkJIG5lZWRzX2NsZmx1c2hfYWZ0ZXIpOwor fQorCitzdGF0aWMgaW50CitpOTE1X2dlbV9zaG1lbV9wd3JpdGUoc3RydWN0IGRybV9pOTE1X2dl bV9vYmplY3QgKm9iaiwKKwkJICAgICAgY29uc3Qgc3RydWN0IGRybV9pOTE1X2dlbV9wd3JpdGUg KmFyZ3MpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSB0b19pOTE1KG9iai0+ YmFzZS5kZXYpOworCXZvaWQgX191c2VyICp1c2VyX2RhdGE7CisJdTY0IHJlbWFpbjsKKwl1bnNp Z25lZCBpbnQgb2JqX2RvX2JpdDE3X3N3aXp6bGluZzsKKwl1bnNpZ25lZCBpbnQgcGFydGlhbF9j YWNoZWxpbmVfd3JpdGU7CiAJdW5zaWduZWQgaW50IG5lZWRzX2NsZmx1c2g7Ci0Jc3RydWN0IHNn X3BhZ2VfaXRlciBzZ19pdGVyOworCXVuc2lnbmVkIGludCBvZmZzZXQsIGlkeDsKKwlpbnQgcmV0 OwogCi0JcmV0ID0gaTkxNV9nZW1fb2JqX3ByZXBhcmVfc2htZW1fd3JpdGUob2JqLCAmbmVlZHNf Y2xmbHVzaCk7CisJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZpOTE1LT5kcm0uc3Ry dWN0X211dGV4KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0Jb2JqX2RvX2JpdDE3X3N3 aXp6bGluZyA9IGk5MTVfZ2VtX29iamVjdF9uZWVkc19iaXQxN19zd2l6emxlKG9iaik7Ci0JdXNl cl9kYXRhID0gdTY0X3RvX3VzZXJfcHRyKGFyZ3MtPmRhdGFfcHRyKTsKLQlvZmZzZXQgPSBhcmdz LT5vZmZzZXQ7Ci0JcmVtYWluID0gYXJncy0+c2l6ZTsKKwlyZXQgPSBpOTE1X2dlbV9vYmpfcHJl cGFyZV9zaG1lbV93cml0ZShvYmosICZuZWVkc19jbGZsdXNoKTsKKwltdXRleF91bmxvY2soJmk5 MTUtPmRybS5zdHJ1Y3RfbXV0ZXgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKLQlmb3Jf ZWFjaF9zZ19wYWdlKG9iai0+bW0ucGFnZXMtPnNnbCwgJnNnX2l0ZXIsIG9iai0+bW0ucGFnZXMt Pm5lbnRzLAotCQkJIG9mZnNldCA+PiBQQUdFX1NISUZUKSB7Ci0JCXN0cnVjdCBwYWdlICpwYWdl ID0gc2dfcGFnZV9pdGVyX3BhZ2UoJnNnX2l0ZXIpOwotCQlpbnQgcGFydGlhbF9jYWNoZWxpbmVf d3JpdGU7CisJb2JqX2RvX2JpdDE3X3N3aXp6bGluZyA9IDA7CisJaWYgKGk5MTVfZ2VtX29iamVj dF9uZWVkc19iaXQxN19zd2l6emxlKG9iaikpCisJCW9ial9kb19iaXQxN19zd2l6emxpbmcgPSBC SVQoMTcpOwogCi0JCWlmIChyZW1haW4gPD0gMCkKLQkJCWJyZWFrOworCS8qIElmIHdlIGRvbid0 IG92ZXJ3cml0ZSBhIGNhY2hlbGluZSBjb21wbGV0ZWx5IHdlIG5lZWQgdG8gYmUKKwkgKiBjYXJl ZnVsIHRvIGhhdmUgdXAtdG8tZGF0ZSBkYXRhIGJ5IGZpcnN0IGNsZmx1c2hpbmcuIERvbid0CisJ ICogb3ZlcmNvbXBsaWNhdGUgdGhpbmdzIGFuZCBmbHVzaCB0aGUgZW50aXJlIHBhdGNoLgorCSAq LworCXBhcnRpYWxfY2FjaGVsaW5lX3dyaXRlID0gMDsKKwlpZiAobmVlZHNfY2xmbHVzaCAmIENM RkxVU0hfQkVGT1JFKQorCQlwYXJ0aWFsX2NhY2hlbGluZV93cml0ZSA9IGJvb3RfY3B1X2RhdGEu eDg2X2NsZmx1c2hfc2l6ZSAtIDE7CiAKLQkJLyogT3BlcmF0aW9uIGluIHRoaXMgcGFnZQotCQkg KgotCQkgKiBzaG1lbV9wYWdlX29mZnNldCA9IG9mZnNldCB3aXRoaW4gcGFnZSBpbiBzaG1lbSBm aWxlCi0JCSAqIHBhZ2VfbGVuZ3RoID0gYnl0ZXMgdG8gY29weSBmb3IgdGhpcyBwYWdlCi0JCSAq LwotCQlzaG1lbV9wYWdlX29mZnNldCA9IG9mZnNldF9pbl9wYWdlKG9mZnNldCk7Ci0KLQkJcGFn ZV9sZW5ndGggPSByZW1haW47Ci0JCWlmICgoc2htZW1fcGFnZV9vZmZzZXQgKyBwYWdlX2xlbmd0 aCkgPiBQQUdFX1NJWkUpCi0JCQlwYWdlX2xlbmd0aCA9IFBBR0VfU0laRSAtIHNobWVtX3BhZ2Vf b2Zmc2V0OwotCi0JCS8qIElmIHdlIGRvbid0IG92ZXJ3cml0ZSBhIGNhY2hlbGluZSBjb21wbGV0 ZWx5IHdlIG5lZWQgdG8gYmUKLQkJICogY2FyZWZ1bCB0byBoYXZlIHVwLXRvLWRhdGUgZGF0YSBi eSBmaXJzdCBjbGZsdXNoaW5nLiBEb24ndAotCQkgKiBvdmVyY29tcGxpY2F0ZSB0aGluZ3MgYW5k IGZsdXNoIHRoZSBlbnRpcmUgcGF0Y2guICovCi0JCXBhcnRpYWxfY2FjaGVsaW5lX3dyaXRlID0g bmVlZHNfY2xmbHVzaCAmIENMRkxVU0hfQkVGT1JFICYmCi0JCQkoKHNobWVtX3BhZ2Vfb2Zmc2V0 IHwgcGFnZV9sZW5ndGgpCi0JCQkJJiAoYm9vdF9jcHVfZGF0YS54ODZfY2xmbHVzaF9zaXplIC0g MSkpOwotCi0JCXBhZ2VfZG9fYml0MTdfc3dpenpsaW5nID0gb2JqX2RvX2JpdDE3X3N3aXp6bGlu ZyAmJgotCQkJKHBhZ2VfdG9fcGh5cyhwYWdlKSAmICgxIDw8IDE3KSkgIT0gMDsKLQotCQlyZXQg PSBzaG1lbV9wd3JpdGVfZmFzdChwYWdlLCBzaG1lbV9wYWdlX29mZnNldCwgcGFnZV9sZW5ndGgs Ci0JCQkJCXVzZXJfZGF0YSwgcGFnZV9kb19iaXQxN19zd2l6emxpbmcsCi0JCQkJCXBhcnRpYWxf Y2FjaGVsaW5lX3dyaXRlLAotCQkJCQluZWVkc19jbGZsdXNoICYgQ0xGTFVTSF9BRlRFUik7Ci0J CWlmIChyZXQgPT0gMCkKLQkJCWdvdG8gbmV4dF9wYWdlOwotCi0JCWhpdF9zbG93cGF0aCA9IDE7 Ci0JCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQlyZXQgPSBzaG1lbV9wd3Jp dGVfc2xvdyhwYWdlLCBzaG1lbV9wYWdlX29mZnNldCwgcGFnZV9sZW5ndGgsCi0JCQkJCXVzZXJf ZGF0YSwgcGFnZV9kb19iaXQxN19zd2l6emxpbmcsCi0JCQkJCXBhcnRpYWxfY2FjaGVsaW5lX3dy aXRlLAotCQkJCQluZWVkc19jbGZsdXNoICYgQ0xGTFVTSF9BRlRFUik7CisJdXNlcl9kYXRhID0g dTY0X3RvX3VzZXJfcHRyKGFyZ3MtPmRhdGFfcHRyKTsKKwlyZW1haW4gPSBhcmdzLT5zaXplOwor CW9mZnNldCA9IG9mZnNldF9pbl9wYWdlKGFyZ3MtPm9mZnNldCk7CisJZm9yIChpZHggPSBhcmdz LT5vZmZzZXQgPj4gUEFHRV9TSElGVDsgcmVtYWluOyBpZHgrKykgeworCQlzdHJ1Y3QgcGFnZSAq cGFnZSA9IGk5MTVfZ2VtX29iamVjdF9nZXRfcGFnZShvYmosIGlkeCk7CisJCWludCBsZW5ndGg7 CiAKLQkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQlsZW5ndGggPSByZW1haW47 CisJCWlmIChvZmZzZXQgKyBsZW5ndGggPiBQQUdFX1NJWkUpCisJCQlsZW5ndGggPSBQQUdFX1NJ WkUgLSBvZmZzZXQ7CiAKKwkJcmV0ID0gc2htZW1fcHdyaXRlKHBhZ2UsIG9mZnNldCwgbGVuZ3Ro LCB1c2VyX2RhdGEsCisJCQkJICAgcGFnZV90b19waHlzKHBhZ2UpICYgb2JqX2RvX2JpdDE3X3N3 aXp6bGluZywKKwkJCQkgICAob2Zmc2V0IHwgbGVuZ3RoKSAmIHBhcnRpYWxfY2FjaGVsaW5lX3dy aXRlLAorCQkJCSAgIG5lZWRzX2NsZmx1c2ggJiBDTEZMVVNIX0FGVEVSKTsKIAkJaWYgKHJldCkK LQkJCWdvdG8gb3V0OwotCi1uZXh0X3BhZ2U6Ci0JCXJlbWFpbiAtPSBwYWdlX2xlbmd0aDsKLQkJ dXNlcl9kYXRhICs9IHBhZ2VfbGVuZ3RoOwotCQlvZmZzZXQgKz0gcGFnZV9sZW5ndGg7Ci0JfQot Ci1vdXQ6Ci0JaTkxNV9nZW1fb2JqX2ZpbmlzaF9zaG1lbV9hY2Nlc3Mob2JqKTsKKwkJCWJyZWFr OwogCi0JaWYgKGhpdF9zbG93cGF0aCkgewotCQkvKgotCQkgKiBGaXh1cDogRmx1c2ggY3B1IGNh Y2hlcyBpbiBjYXNlIHdlIGRpZG4ndCBmbHVzaCB0aGUgZGlydHkKLQkJICogY2FjaGVsaW5lcyBp bi1saW5lIHdoaWxlIHdyaXRpbmcgYW5kIHRoZSBvYmplY3QgbW92ZWQKLQkJICogb3V0IG9mIHRo ZSBjcHUgd3JpdGUgZG9tYWluIHdoaWxlIHdlJ3ZlIGRyb3BwZWQgdGhlIGxvY2suCi0JCSAqLwot CQlpZiAoIShuZWVkc19jbGZsdXNoICYgQ0xGTFVTSF9BRlRFUikgJiYKLQkJICAgIG9iai0+YmFz ZS53cml0ZV9kb21haW4gIT0gSTkxNV9HRU1fRE9NQUlOX0NQVSkgewotCQkJaWYgKGk5MTVfZ2Vt X2NsZmx1c2hfb2JqZWN0KG9iaiwgb2JqLT5waW5fZGlzcGxheSkpCi0JCQkJbmVlZHNfY2xmbHVz aCB8PSBDTEZMVVNIX0FGVEVSOwotCQl9CisJCXJlbWFpbiAtPSBsZW5ndGg7CisJCXVzZXJfZGF0 YSArPSBsZW5ndGg7CisJCW9mZnNldCA9IDA7CiAJfQogCi0JaWYgKG5lZWRzX2NsZmx1c2ggJiBD TEZMVVNIX0FGVEVSKQotCQlpOTE1X2dlbV9jaGlwc2V0X2ZsdXNoKHRvX2k5MTUoZGV2KSk7Ci0K IAlpbnRlbF9mYl9vYmpfZmx1c2gob2JqLCBmYWxzZSwgT1JJR0lOX0NQVSk7CisJaTkxNV9nZW1f b2JqX2ZpbmlzaF9zaG1lbV9hY2Nlc3Mob2JqKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNDc1 LDcgKzEzODgsNiBAQCBpbnQKIGk5MTVfZ2VtX3B3cml0ZV9pb2N0bChzdHJ1Y3QgZHJtX2Rldmlj ZSAqZGV2LCB2b2lkICpkYXRhLAogCQkgICAgICBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCiB7Ci0J c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkxNShkZXYpOwogCXN0cnVj dCBkcm1faTkxNV9nZW1fcHdyaXRlICphcmdzID0gZGF0YTsKIAlzdHJ1Y3QgZHJtX2k5MTVfZ2Vt X29iamVjdCAqb2JqOwogCWludCByZXQ7CkBAIC0xNDg4LDEzICsxNDAwLDYgQEAgaTkxNV9nZW1f cHdyaXRlX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCSAgICAg ICBhcmdzLT5zaXplKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlpZiAobGlrZWx5KCFpOTE1LnBy ZWZhdWx0X2Rpc2FibGUpKSB7Ci0JCXJldCA9IGZhdWx0X2luX211bHRpcGFnZXNfcmVhZGFibGUo dTY0X3RvX3VzZXJfcHRyKGFyZ3MtPmRhdGFfcHRyKSwKLQkJCQkJCSAgIGFyZ3MtPnNpemUpOwot CQlpZiAocmV0KQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCiAJb2JqID0gaTkxNV9nZW1fb2Jq ZWN0X2xvb2t1cChmaWxlLCBhcmdzLT5oYW5kbGUpOwogCWlmICghb2JqKQogCQlyZXR1cm4gLUVO T0VOVDsKQEAgLTE1MTYsMTEgKzE0MjEsOSBAQCBpOTE1X2dlbV9wd3JpdGVfaW9jdGwoc3RydWN0 IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKIAlpZiAocmV0KQogCQlnb3RvIGVycjsKIAot CWludGVsX3J1bnRpbWVfcG1fZ2V0KGRldl9wcml2KTsKLQotCXJldCA9IGk5MTVfbXV0ZXhfbG9j a19pbnRlcnJ1cHRpYmxlKGRldik7CisJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3Bpbl9wYWdlcyhv YmopOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyX3JwbTsKKwkJZ290byBlcnI7CiAKIAlyZXQgPSAt RUZBVUxUOwogCS8qIFdlIGNhbiBvbmx5IGRvIHRoZSBHVFQgcHdyaXRlIG9uIHVudGlsZWQgYnVm ZmVycywgYXMgb3RoZXJ3aXNlCkBAIC0xNTM1LDIzICsxNDM4LDE2IEBAIGk5MTVfZ2VtX3B3cml0 ZV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCQkgKiBwb2ludGVy cyAoZS5nLiBndHQgbWFwcGluZ3Mgd2hlbiBtb3ZpbmcgZGF0YSBiZXR3ZWVuCiAJCSAqIHRleHR1 cmVzKS4gRmFsbGJhY2sgdG8gdGhlIHNobWVtIHBhdGggaW4gdGhhdCBjYXNlLgogCQkgKi8KLQkJ cmV0ID0gaTkxNV9nZW1fZ3R0X3B3cml0ZV9mYXN0KGRldl9wcml2LCBvYmosIGFyZ3MsIGZpbGUp OworCQlyZXQgPSBpOTE1X2dlbV9ndHRfcHdyaXRlX2Zhc3Qob2JqLCBhcmdzKTsKIAogCWlmIChy ZXQgPT0gLUVGQVVMVCB8fCByZXQgPT0gLUVOT1NQQykgewogCQlpZiAob2JqLT5waHlzX2hhbmRs ZSkKIAkJCXJldCA9IGk5MTVfZ2VtX3BoeXNfcHdyaXRlKG9iaiwgYXJncywgZmlsZSk7CiAJCWVs c2UKLQkJCXJldCA9IGk5MTVfZ2VtX3NobWVtX3B3cml0ZShkZXYsIG9iaiwgYXJncywgZmlsZSk7 CisJCQlyZXQgPSBpOTE1X2dlbV9zaG1lbV9wd3JpdGUob2JqLCBhcmdzKTsKIAl9CiAKLQlpOTE1 X2dlbV9vYmplY3RfcHV0KG9iaik7Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7 Ci0JaW50ZWxfcnVudGltZV9wbV9wdXQoZGV2X3ByaXYpOwotCi0JcmV0dXJuIHJldDsKLQotZXJy X3JwbToKLQlpbnRlbF9ydW50aW1lX3BtX3B1dChkZXZfcHJpdik7CisJaTkxNV9nZW1fb2JqZWN0 X3VucGluX3BhZ2VzKG9iaik7CiBlcnI6CiAJaTkxNV9nZW1fb2JqZWN0X3B1dF91bmxvY2tlZChv YmopOwogCXJldHVybiByZXQ7Ci0tIAoyLjkuMwoKX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlz dHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4v bGlzdGluZm8vaW50ZWwtZ2Z4Cg==