From mboxrd@z Thu Jan 1 00:00:00 1970 From: Vivek Gautam Subject: [PATCH v13 2/4] iommu/arm-smmu: Invoke pm_runtime during probe, add/remove device Date: Thu, 19 Jul 2018 15:45:37 +0530 Message-ID: <20180719101539.6104-3-vivek.gautam@codeaurora.org> References: <20180719101539.6104-1-vivek.gautam@codeaurora.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20180719101539.6104-1-vivek.gautam-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: freedreno-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "Freedreno" To: joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org, robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org, rjw-LthD3rsA81gm4RdzfppkhA@public.gmane.org, robin.murphy-5wv7dgnIgG8@public.gmane.org, will.deacon-5wv7dgnIgG8@public.gmane.org, iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org, devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org Cc: mark.rutland-5wv7dgnIgG8@public.gmane.org, architt-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org, jcrouse-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org, linux-pm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, sboyd-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org, sricharan-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org, robdclark-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org, tfiga-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org, alex.williamson-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org, lukas-JFq808J9C/izQB+pC5nmwQ@public.gmane.org, Vivek Gautam , linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org List-Id: devicetree@vger.kernel.org RnJvbTogU3JpY2hhcmFuIFIgPHNyaWNoYXJhbkBjb2RlYXVyb3JhLm9yZz4KClRoZSBzbW11IGRl dmljZSBwcm9iZS9yZW1vdmUgYW5kIGFkZC9yZW1vdmUgbWFzdGVyIGRldmljZSBjYWxsYmFja3MK Z2V0cyBjYWxsZWQgd2hlbiB0aGUgc21tdSBpcyBub3QgbGlua2VkIHRvIGl0cyBtYXN0ZXIsIHRo YXQgaXMgd2l0aG91dAp0aGUgY29udGV4dCBvZiB0aGUgbWFzdGVyIGRldmljZS4gU28gY2FsbGlu ZyBydW50aW1lIGFwaXMgaW4gdGhvc2UgcGxhY2VzCnNlcGFyYXRlbHkuCgpTaWduZWQtb2ZmLWJ5 OiBTcmljaGFyYW4gUiA8c3JpY2hhcmFuQGNvZGVhdXJvcmEub3JnPgpbdml2ZWs6IENsZWFudXAg cG0gcnVudGltZSBjYWxsc10KU2lnbmVkLW9mZi1ieTogVml2ZWsgR2F1dGFtIDx2aXZlay5nYXV0 YW1AY29kZWF1cm9yYS5vcmc+ClJldmlld2VkLWJ5OiBUb21hc3ogRmlnYSA8dGZpZ2FAY2hyb21p dW0ub3JnPgotLS0KCkNoYW5nZXMgc2luY2UgdjEyOgogLSBFeHBsaWNpdGx5IGVuYWJsaW5nIGFu ZCBkaXNhYmxpbmcgY2xvY2tzIGluIHByb2JlIGFuZCByZW1vdmUgcm91dGluZXMKICAgaWYgcnVu dGltZSBQTSBpcyBkaXNhYmxlZCwKCiBkcml2ZXJzL2lvbW11L2FybS1zbW11LmMgfCAxMDEgKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0KIDEgZmlsZSBjaGFu Z2VkLCA5MyBpbnNlcnRpb25zKCspLCA4IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZl cnMvaW9tbXUvYXJtLXNtbXUuYyBiL2RyaXZlcnMvaW9tbXUvYXJtLXNtbXUuYwppbmRleCA5MTM4 YTZmZmZlMDQuLjE1YjIwOTQxNDQxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9hcm0tc21t dS5jCisrKyBiL2RyaXZlcnMvaW9tbXUvYXJtLXNtbXUuYwpAQCAtMjY4LDYgKzI2OCwyMCBAQCBz dGF0aWMgc3RydWN0IGFybV9zbW11X29wdGlvbl9wcm9wIGFybV9zbW11X29wdGlvbnNbXSA9IHsK IAl7IDAsIE5VTEx9LAogfTsKIAorc3RhdGljIGlubGluZSBpbnQgYXJtX3NtbXVfcnBtX2dldChz dHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11KQoreworCWlmIChwbV9ydW50aW1lX2VuYWJsZWQo c21tdS0+ZGV2KSkKKwkJcmV0dXJuIHBtX3J1bnRpbWVfZ2V0X3N5bmMoc21tdS0+ZGV2KTsKKwor CXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXJtX3NtbXVfcnBtX3B1dChzdHJ1 Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11KQoreworCWlmIChwbV9ydW50aW1lX2VuYWJsZWQoc21t dS0+ZGV2KSkKKwkJcG1fcnVudGltZV9wdXQoc21tdS0+ZGV2KTsKK30KKwogc3RhdGljIHN0cnVj dCBhcm1fc21tdV9kb21haW4gKnRvX3NtbXVfZG9tYWluKHN0cnVjdCBpb21tdV9kb21haW4gKmRv bSkKIHsKIAlyZXR1cm4gY29udGFpbmVyX29mKGRvbSwgc3RydWN0IGFybV9zbW11X2RvbWFpbiwg ZG9tYWluKTsKQEAgLTkxMywxMSArOTI3LDE1IEBAIHN0YXRpYyB2b2lkIGFybV9zbW11X2Rlc3Ry b3lfZG9tYWluX2NvbnRleHQoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluKQogCXN0cnVjdCBh cm1fc21tdV9kb21haW4gKnNtbXVfZG9tYWluID0gdG9fc21tdV9kb21haW4oZG9tYWluKTsKIAlz dHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11ID0gc21tdV9kb21haW4tPnNtbXU7CiAJc3RydWN0 IGFybV9zbW11X2NmZyAqY2ZnID0gJnNtbXVfZG9tYWluLT5jZmc7Ci0JaW50IGlycTsKKwlpbnQg cmV0LCBpcnE7CiAKIAlpZiAoIXNtbXUgfHwgZG9tYWluLT50eXBlID09IElPTU1VX0RPTUFJTl9J REVOVElUWSkKIAkJcmV0dXJuOwogCisJcmV0ID0gYXJtX3NtbXVfcnBtX2dldChzbW11KTsKKwlp ZiAocmV0IDwgMCkKKwkJcmV0dXJuOworCiAJLyoKIAkgKiBEaXNhYmxlIHRoZSBjb250ZXh0IGJh bmsgYW5kIGZyZWUgdGhlIHBhZ2UgdGFibGVzIGJlZm9yZSBmcmVlaW5nCiAJICogaXQuCkBAIC05 MzIsNiArOTUwLDggQEAgc3RhdGljIHZvaWQgYXJtX3NtbXVfZGVzdHJveV9kb21haW5fY29udGV4 dChzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4pCiAKIAlmcmVlX2lvX3BndGFibGVfb3BzKHNt bXVfZG9tYWluLT5wZ3RibF9vcHMpOwogCV9fYXJtX3NtbXVfZnJlZV9iaXRtYXAoc21tdS0+Y29u dGV4dF9tYXAsIGNmZy0+Y2JuZHgpOworCisJYXJtX3NtbXVfcnBtX3B1dChzbW11KTsKIH0KIAog c3RhdGljIHN0cnVjdCBpb21tdV9kb21haW4gKmFybV9zbW11X2RvbWFpbl9hbGxvYyh1bnNpZ25l ZCB0eXBlKQpAQCAtMTIxMywxMCArMTIzMywxNSBAQCBzdGF0aWMgaW50IGFybV9zbW11X2F0dGFj aF9kZXYoc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCiAJ CXJldHVybiAtRU5PREVWOwogCiAJc21tdSA9IGZ3c3BlY19zbW11KGZ3c3BlYyk7CisKKwlyZXQg PSBhcm1fc21tdV9ycG1fZ2V0KHNtbXUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0Owor CiAJLyogRW5zdXJlIHRoYXQgdGhlIGRvbWFpbiBpcyBmaW5hbGlzZWQgKi8KIAlyZXQgPSBhcm1f c21tdV9pbml0X2RvbWFpbl9jb250ZXh0KGRvbWFpbiwgc21tdSk7CiAJaWYgKHJldCA8IDApCi0J CXJldHVybiByZXQ7CisJCWdvdG8gcnBtX3B1dDsKIAogCS8qCiAJICogU2FuaXR5IGNoZWNrIHRo ZSBkb21haW4uIFdlIGRvbid0IHN1cHBvcnQgZG9tYWlucyBhY3Jvc3MKQEAgLTEyMjYsMzMgKzEy NTEsNTAgQEAgc3RhdGljIGludCBhcm1fc21tdV9hdHRhY2hfZGV2KHN0cnVjdCBpb21tdV9kb21h aW4gKmRvbWFpbiwgc3RydWN0IGRldmljZSAqZGV2KQogCQlkZXZfZXJyKGRldiwKIAkJCSJjYW5u b3QgYXR0YWNoIHRvIFNNTVUgJXMgd2hpbHN0IGFscmVhZHkgYXR0YWNoZWQgdG8gZG9tYWluIG9u IFNNTVUgJXNcbiIsCiAJCQlkZXZfbmFtZShzbW11X2RvbWFpbi0+c21tdS0+ZGV2KSwgZGV2X25h bWUoc21tdS0+ZGV2KSk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXQgPSAtRUlOVkFMOworCQln b3RvIHJwbV9wdXQ7CiAJfQogCiAJLyogTG9va3Mgb2ssIHNvIGFkZCB0aGUgZGV2aWNlIHRvIHRo ZSBkb21haW4gKi8KLQlyZXR1cm4gYXJtX3NtbXVfZG9tYWluX2FkZF9tYXN0ZXIoc21tdV9kb21h aW4sIGZ3c3BlYyk7CisJcmV0ID0gYXJtX3NtbXVfZG9tYWluX2FkZF9tYXN0ZXIoc21tdV9kb21h aW4sIGZ3c3BlYyk7CisKK3JwbV9wdXQ6CisJYXJtX3NtbXVfcnBtX3B1dChzbW11KTsKKwlyZXR1 cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGFybV9zbW11X21hcChzdHJ1Y3QgaW9tbXVfZG9tYWlu ICpkb21haW4sIHVuc2lnbmVkIGxvbmcgaW92YSwKIAkJCXBoeXNfYWRkcl90IHBhZGRyLCBzaXpl X3Qgc2l6ZSwgaW50IHByb3QpCiB7CiAJc3RydWN0IGlvX3BndGFibGVfb3BzICpvcHMgPSB0b19z bW11X2RvbWFpbihkb21haW4pLT5wZ3RibF9vcHM7CisJc3RydWN0IGFybV9zbW11X2RldmljZSAq c21tdSA9IHRvX3NtbXVfZG9tYWluKGRvbWFpbiktPnNtbXU7CisJaW50IHJldDsKIAogCWlmICgh b3BzKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJldHVybiBvcHMtPm1hcChvcHMsIGlvdmEsIHBh ZGRyLCBzaXplLCBwcm90KTsKKwlhcm1fc21tdV9ycG1fZ2V0KHNtbXUpOworCXJldCA9IG9wcy0+ bWFwKG9wcywgaW92YSwgcGFkZHIsIHNpemUsIHByb3QpOworCWFybV9zbW11X3JwbV9wdXQoc21t dSk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgc2l6ZV90IGFybV9zbW11X3VubWFwKHN0 cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwgdW5zaWduZWQgbG9uZyBpb3ZhLAogCQkJICAgICBz aXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3QgaW9fcGd0YWJsZV9vcHMgKm9wcyA9IHRvX3NtbXVfZG9t YWluKGRvbWFpbiktPnBndGJsX29wczsKKwlzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11ID0g dG9fc21tdV9kb21haW4oZG9tYWluKS0+c21tdTsKKwlzaXplX3QgcmV0OwogCiAJaWYgKCFvcHMp CiAJCXJldHVybiAwOwogCi0JcmV0dXJuIG9wcy0+dW5tYXAob3BzLCBpb3ZhLCBzaXplKTsKKwlh cm1fc21tdV9ycG1fZ2V0KHNtbXUpOworCXJldCA9IG9wcy0+dW5tYXAob3BzLCBpb3ZhLCBzaXpl KTsKKwlhcm1fc21tdV9ycG1fcHV0KHNtbXUpOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGlj IHZvaWQgYXJtX3NtbXVfaW90bGJfc3luYyhzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4pCkBA IC0xNDA3LDcgKzE0NDksMTMgQEAgc3RhdGljIGludCBhcm1fc21tdV9hZGRfZGV2aWNlKHN0cnVj dCBkZXZpY2UgKmRldikKIAl3aGlsZSAoaS0tKQogCQljZmctPnNtZW5keFtpXSA9IElOVkFMSURf U01FTkRYOwogCisJcmV0ID0gYXJtX3NtbXVfcnBtX2dldChzbW11KTsKKwlpZiAocmV0IDwgMCkK KwkJZ290byBvdXRfY2ZnX2ZyZWU7CisKIAlyZXQgPSBhcm1fc21tdV9tYXN0ZXJfYWxsb2Nfc21l cyhkZXYpOworCWFybV9zbW11X3JwbV9wdXQoc21tdSk7CisKIAlpZiAocmV0KQogCQlnb3RvIG91 dF9jZmdfZnJlZTsKIApAQCAtMTQyNyw3ICsxNDc1LDcgQEAgc3RhdGljIHZvaWQgYXJtX3NtbXVf cmVtb3ZlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiAJc3RydWN0IGlvbW11X2Z3c3BlYyAq ZndzcGVjID0gZGV2LT5pb21tdV9md3NwZWM7CiAJc3RydWN0IGFybV9zbW11X21hc3Rlcl9jZmcg KmNmZzsKIAlzdHJ1Y3QgYXJtX3NtbXVfZGV2aWNlICpzbW11OwotCisJaW50IHJldDsKIAogCWlm ICghZndzcGVjIHx8IGZ3c3BlYy0+b3BzICE9ICZhcm1fc21tdV9vcHMpCiAJCXJldHVybjsKQEAg LTE0MzUsOCArMTQ4MywxNSBAQCBzdGF0aWMgdm9pZCBhcm1fc21tdV9yZW1vdmVfZGV2aWNlKHN0 cnVjdCBkZXZpY2UgKmRldikKIAljZmcgID0gZndzcGVjLT5pb21tdV9wcml2OwogCXNtbXUgPSBj ZmctPnNtbXU7CiAKKwlyZXQgPSBhcm1fc21tdV9ycG1fZ2V0KHNtbXUpOworCWlmIChyZXQgPCAw KQorCQlyZXR1cm47CisKIAlpb21tdV9kZXZpY2VfdW5saW5rKCZzbW11LT5pb21tdSwgZGV2KTsK IAlhcm1fc21tdV9tYXN0ZXJfZnJlZV9zbWVzKGZ3c3BlYyk7CisKKwlhcm1fc21tdV9ycG1fcHV0 KHNtbXUpOworCiAJaW9tbXVfZ3JvdXBfcmVtb3ZlX2RldmljZShkZXYpOwogCWtmcmVlKGZ3c3Bl Yy0+aW9tbXVfcHJpdik7CiAJaW9tbXVfZndzcGVjX2ZyZWUoZGV2KTsKQEAgLTIxMjQsNiArMjE3 OSw4IEBAIHN0YXRpYyBpbnQgYXJtX3NtbXVfZGV2aWNlX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9k ZXZpY2UgKnBkZXYpCiAJCXNtbXUtPmlycXNbaV0gPSBpcnE7CiAJfQogCisJcGxhdGZvcm1fc2V0 X2RydmRhdGEocGRldiwgc21tdSk7CisKIAllcnIgPSBkZXZtX2Nsa19idWxrX2dldChzbW11LT5k ZXYsIHNtbXUtPm51bV9jbGtzLCBzbW11LT5jbGtzKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJy OwpAQCAtMjEzMiw2ICsyMTg5LDI2IEBAIHN0YXRpYyBpbnQgYXJtX3NtbXVfZGV2aWNlX3Byb2Jl KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsK IAorCS8qCisJICogV2Ugd2FudCB0byBhdm9pZCB0b3VjaGluZyBkZXYtPnBvd2VyLmxvY2sgaW4g ZmFzdHBhdGhzIHVubGVzcworCSAqIGl0J3MgcmVhbGx5IGdvaW5nIHRvIGRvIHNvbWV0aGluZyB1 c2VmdWwgLSBwbV9ydW50aW1lX2VuYWJsZWQoKQorCSAqIGNhbiBzZXJ2ZSBhcyBhbiBpZGVhbCBw cm94eSBmb3IgdGhhdCBkZWNpc2lvbi4gU28sIGNvbmRpdGlvbmFsbHkKKwkgKiBlbmFibGUgcG1f cnVudGltZS4KKwkgKi8KKwlpZiAoZGV2LT5wbV9kb21haW4pCisJCXBtX3J1bnRpbWVfZW5hYmxl KGRldik7CisKKwllcnIgPSBhcm1fc21tdV9ycG1fZ2V0KHNtbXUpOworCWlmIChlcnIgPCAwKQor CQlyZXR1cm4gZXJyOworCisJLyogRW5hYmxlIGNsb2NrcyBleHBsaWNpdGx5IGlmIHJ1bnRpbWUg UE0gaXMgZGlzYWJsZWQgKi8KKwlpZiAoIXBtX3J1bnRpbWVfZW5hYmxlZChkZXYpKSB7CisJCWVy ciA9IGNsa19idWxrX2VuYWJsZShzbW11LT5udW1fY2xrcywgc21tdS0+Y2xrcyk7CisJCWlmIChl cnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwogCWVyciA9IGFybV9zbW11X2RldmljZV9jZmdfcHJv YmUoc21tdSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKQEAgLTIxNzMsMTAgKzIyNTAsMTEg QEAgc3RhdGljIGludCBhcm1fc21tdV9kZXZpY2VfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2Rldmlj ZSAqcGRldikKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2 LCBzbW11KTsKIAlhcm1fc21tdV9kZXZpY2VfcmVzZXQoc21tdSk7CiAJYXJtX3NtbXVfdGVzdF9z bXJfbWFza3Moc21tdSk7CiAKKwlhcm1fc21tdV9ycG1fcHV0KHNtbXUpOworCiAJLyoKIAkgKiBG b3IgQUNQSSBhbmQgZ2VuZXJpYyBEVCBiaW5kaW5ncywgYW4gU01NVSB3aWxsIGJlIHByb2JlZCBi ZWZvcmUKIAkgKiBhbnkgZGV2aWNlIHdoaWNoIG1pZ2h0IG5lZWQgaXQsIHNvIHdlIHdhbnQgdGhl IGJ1cyBvcHMgaW4gcGxhY2UKQEAgLTIyMTIsOCArMjI5MCwxNSBAQCBzdGF0aWMgaW50IGFybV9z bW11X2RldmljZV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIAlpZiAoIWJp dG1hcF9lbXB0eShzbW11LT5jb250ZXh0X21hcCwgQVJNX1NNTVVfTUFYX0NCUykpCiAJCWRldl9l cnIoJnBkZXYtPmRldiwgInJlbW92aW5nIGRldmljZSB3aXRoIGFjdGl2ZSBkb21haW5zIVxuIik7 CiAKKwlhcm1fc21tdV9ycG1fZ2V0KHNtbXUpOwogCS8qIFR1cm4gdGhlIHRoaW5nIG9mZiAqLwog CXdyaXRlbChzQ1IwX0NMSUVOVFBELCBBUk1fU01NVV9HUjBfTlMoc21tdSkgKyBBUk1fU01NVV9H UjBfc0NSMCk7CisJYXJtX3NtbXVfcnBtX3B1dChzbW11KTsKKworCWlmIChwbV9ydW50aW1lX2Vu YWJsZWQoc21tdS0+ZGV2KSkKKwkJcG1fcnVudGltZV9mb3JjZV9zdXNwZW5kKHNtbXUtPmRldik7 CisJZWxzZQorCQljbGtfYnVsa19kaXNhYmxlKHNtbXUtPm51bV9jbGtzLCBzbW11LT5jbGtzKTsK IAogCWNsa19idWxrX3VucHJlcGFyZShzbW11LT5udW1fY2xrcywgc21tdS0+Y2xrcyk7CiAKLS0g ClFVQUxDT01NIElORElBLCBvbiBiZWhhbGYgb2YgUXVhbGNvbW0gSW5ub3ZhdGlvbiBDZW50ZXIs IEluYy4gaXMgYSBtZW1iZXIKb2YgQ29kZSBBdXJvcmEgRm9ydW0sIGhvc3RlZCBieSBUaGUgTGlu dXggRm91bmRhdGlvbgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KRnJlZWRyZW5vIG1haWxpbmcgbGlzdApGcmVlZHJlbm9AbGlzdHMuZnJlZWRlc2t0b3Au b3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZnJlZWRy ZW5vCg==