From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chunming Zhou Subject: [PATCH 08/13] drm/amdgpu: use RB tree instead of link list Date: Wed, 9 May 2018 14:45:38 +0800 Message-ID: <20180509064543.15937-9-david1.zhou@amd.com> References: <20180509064543.15937-1-david1.zhou@amd.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20180509064543.15937-1-david1.zhou-5C7GfCeVMHo@public.gmane.org> List-Id: Discussion list for AMD gfx List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: amd-gfx-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "amd-gfx" To: dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Cc: Jerry.Zhang-5C7GfCeVMHo@public.gmane.org, ckoenig.leichtzumerken-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org, Kai.Guo-5C7GfCeVMHo@public.gmane.org, Chunming Zhou Q2hhbmdlLUlkOiBJYWNhNWNkYWNjYmM1YmVlYjdhMzdjMGY3MDNjZGZjOTdkZjRlY2U0ZgpTaWdu ZWQtb2ZmLWJ5OiBDaHVubWluZyBaaG91IDxkYXZpZDEuemhvdUBhbWQuY29tPgotLS0KIGRyaXZl cnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9vYmplY3QuaCB8ICAyICsKIGRyaXZlcnMvZ3B1 L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV90dG0uYyAgICB8ICAxICsKIGRyaXZlcnMvZ3B1L2RybS9h bWQvYW1kZ3B1L2FtZGdwdV92bS5jICAgICB8IDg1ICsrKysrKysrKysrKysrKysrKysrKysrKysr Ky0tLQogZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3ZtLmggICAgIHwgIDMgKy0K IDQgZmlsZXMgY2hhbmdlZCwgODIgaW5zZXJ0aW9ucygrKSwgOSBkZWxldGlvbnMoLSkKCmRpZmYg LS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfb2JqZWN0LmggYi9kcml2 ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfb2JqZWN0LmgKaW5kZXggZjA0ZmM0MDEzMjdi Li5iNjM5NjIzMGQzMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2Ft ZGdwdV9vYmplY3QuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfb2Jq ZWN0LmgKQEAgLTgyLDYgKzgyLDggQEAgc3RydWN0IGFtZGdwdV9ibyB7CiAJc3RydWN0IHR0bV9w bGFjZW1lbnQJCXBsYWNlbWVudDsKIAlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QJdGJvOwogCXN0 cnVjdCB0dG1fYm9fa21hcF9vYmoJCWttYXA7CisJc3RydWN0IHJiX25vZGUJCQlub2RlOworCXU2 NAkJCQlpbmRleDsKIAl1NjQJCQkJZmxhZ3M7CiAJdW5zaWduZWQJCQlwaW5fY291bnQ7CiAJdTY0 CQkJCXRpbGluZ19mbGFnczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1 L2FtZGdwdV90dG0uYyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV90dG0uYwpp bmRleCAyMDdmODhmMzhiMjMuLmE1ZDhmNTExYjAxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUv ZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3R0bS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1k Z3B1L2FtZGdwdV90dG0uYwpAQCAtMTI3OSw2ICsxMjc5LDcgQEAgc3RhdGljIHN0cnVjdCB0dG1f Ym9fZHJpdmVyIGFtZGdwdV9ib19kcml2ZXIgPSB7CiAJLmludmFsaWRhdGVfY2FjaGVzID0gJmFt ZGdwdV9pbnZhbGlkYXRlX2NhY2hlcywKIAkuaW5pdF9tZW1fdHlwZSA9ICZhbWRncHVfaW5pdF9t ZW1fdHlwZSwKIAkuZXZpY3Rpb25fdmFsdWFibGUgPSBhbWRncHVfdHRtX2JvX2V2aWN0aW9uX3Zh bHVhYmxlLAorCS5scnVfZW1wdHkgPSAmYW1kZ3B1X3ZtX2xydV9lbXB0eSwKIAkuZ2V0X2V2aWN0 YWJsZV9ibyA9ICZhbWRncHVfdm1fZ2V0X2V2aWN0YWJsZV9ibywKIAkuYWRkX3RvX2xydSA9ICZh bWRncHVfdm1fYWRkX3RvX2xydSwKIAkuZGVsX2Zyb21fbHJ1ID0gJmFtZGdwdV92bV9kZWxfZnJv bV9scnUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdm0u YyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV92bS5jCmluZGV4IDI3YjNmZGI2 ZGQ0Ni4uMWEwOWMwN2JiZjIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdw dS9hbWRncHVfdm0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdm0u YwpAQCAtMTMzLDcgKzEzMyw3IEBAIGludCBhbWRncHVfdm1fbHJ1X2luaXQoc3RydWN0IGFtZGdw dV92bV9scnUgKnZtX2xydSwgc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCiAJSU5JVF9MSVNU X0hFQUQoJnZtX2xydS0+dm1fbHJ1X2xpc3QpOwogCWZvciAoaSA9IDA7IGkgPCBUVE1fTlVNX01F TV9UWVBFUzsgaSsrKSB7CiAJCWZvciAoaiA9IDA7IGogPCBUVE1fTUFYX0JPX1BSSU9SSVRZOyBq KyspIHsKLQkJCUlOSVRfTElTVF9IRUFEKCZ2bV9scnUtPmZpeGVkX2xydVtpXVtqXSk7CisJCQl2 bV9scnUtPmZpeGVkX2xydVtpXVtqXSA9IFJCX1JPT1Q7CiAJCQlJTklUX0xJU1RfSEVBRCgmdm1f bHJ1LT5keW5hbWljX2xydVtpXVtqXSk7CiAJCX0KIAl9CkBAIC0xNTcsNiArMTU3LDI0IEBAIGlu dCBhbWRncHVfdm1fbHJ1X2Zpbmkoc3RydWN0IGFtZGdwdV92bV9scnUgKnZtX2xydSwgc3RydWN0 IGFtZGdwdV9kZXZpY2UgKmFkZXYpCiAJcmV0dXJuIDA7CiB9CiAKK2Jvb2wgYW1kZ3B1X3ZtX2xy dV9lbXB0eShzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwgdW5zaWduZWQgbWVtX3R5cGUpCit7 CisJc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYgPSBhbWRncHVfdHRtX2FkZXYoYmRldik7CisJ c3RydWN0IGFtZGdwdV92bV9scnUgKnZtX2xydTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkg PCBUVE1fTUFYX0JPX1BSSU9SSVRZOyArK2kpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2bV9s cnUsICZhZGV2LT52bV9scnVfbGlzdCwgdm1fbHJ1X2xpc3QpIHsKKwkJCWlmICghbGlzdF9lbXB0 eSgmdm1fbHJ1LT5keW5hbWljX2xydVttZW1fdHlwZV1baV0pKQorCQkJCXJldHVybiBmYWxzZTsK KwkJCWlmICghUkJfRU1QVFlfUk9PVCgmdm1fbHJ1LT5maXhlZF9scnVbbWVtX3R5cGVdW2ldKSkK KwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwogc3RydWN0 IHR0bV9idWZmZXJfb2JqZWN0ICphbWRncHVfdm1fZ2V0X2V2aWN0YWJsZV9ibyhzdHJ1Y3QgdHRt X2JvX2RldmljZSAqYmRldiwKIAkJCQkJCSAgICAgdWludDMyX3QgbWVtX3R5cGUsCiAJCQkJCQkg ICAgIGNvbnN0IHN0cnVjdCB0dG1fcGxhY2UgKnBsYWNlLApAQCAtMTY1LDExICsxODMsMTMgQEAg c3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICphbWRncHVfdm1fZ2V0X2V2aWN0YWJsZV9ibyhzdHJ1 Y3QgdHRtX2JvX2RldmljZSAqYmRldiwKIHsKIAlzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiA9 IGFtZGdwdV90dG1fYWRldihiZGV2KTsKIAlzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvID0g TlVMTDsKKwlzdHJ1Y3QgYW1kZ3B1X2JvICphYm8gPSBOVUxMOwogCXN0cnVjdCBhbWRncHVfdm1f bHJ1ICp2bV9scnU7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgVFRNX01BWF9CT19QUklP UklUWTsgKytpKSB7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkodm1fbHJ1LCAmYWRldi0+dm1fbHJ1 X2xpc3QsIHZtX2xydV9saXN0KSB7CisJCQlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKIAkJCWxpc3Rf Zm9yX2VhY2hfZW50cnkoYm8sICZ2bV9scnUtPmR5bmFtaWNfbHJ1W21lbV90eXBlXVtpXSwgbHJ1 KSB7CiAJCQkJaWYgKCF0dG1fYm9fZXZpY3Rfc3dhcG91dF9hbGxvd2FibGUoYm8sIGN0eCwgbG9j a2VkKSkKIAkJCQkJY29udGludWU7CkBAIC0xODQsMjAgKzIwNCwyMiBAQCBzdHJ1Y3QgdHRtX2J1 ZmZlcl9vYmplY3QgKmFtZGdwdV92bV9nZXRfZXZpY3RhYmxlX2JvKHN0cnVjdCB0dG1fYm9fZGV2 aWNlICpiZGV2LAogCQkJaWYgKCZiby0+bHJ1ICE9ICZ2bV9scnUtPmR5bmFtaWNfbHJ1W21lbV90 eXBlXVtpXSkKIAkJCQlicmVhazsKIAkJCWJvID0gTlVMTDsKLQkJCWxpc3RfZm9yX2VhY2hfZW50 cnkoYm8sICZ2bV9scnUtPmZpeGVkX2xydVttZW1fdHlwZV1baV0sIGxydSkgewotCQkJCWlmICgh dHRtX2JvX2V2aWN0X3N3YXBvdXRfYWxsb3dhYmxlKGJvLCBjdHgsIGxvY2tlZCkpCisJCQlmb3Ig KG5vZGUgPSByYl9maXJzdCgmdm1fbHJ1LT5maXhlZF9scnVbbWVtX3R5cGVdW2ldKTsKKwkJCSAg ICAgbm9kZTsgbm9kZSA9IHJiX25leHQobm9kZSkpIHsKKwkJCQlhYm8gPSByYl9lbnRyeShub2Rl LCBzdHJ1Y3QgYW1kZ3B1X2JvLCBub2RlKTsKKwkJCQlibyA9ICZhYm8tPnRibzsKKwkJCQlpZiAo IXR0bV9ib19ldmljdF9zd2Fwb3V0X2FsbG93YWJsZShibywgY3R4LCBsb2NrZWQpKSB7CisJCQkJ CWJvID0gTlVMTDsKIAkJCQkJY29udGludWU7CisJCQkJfQogCQkJCWlmIChwbGFjZSAmJiAhYmRl di0+ZHJpdmVyLT5ldmljdGlvbl92YWx1YWJsZShibywgcGxhY2UpKSB7CiAJCQkJCWlmIChsb2Nr ZWQpCiAJCQkJCQlyZXNlcnZhdGlvbl9vYmplY3RfdW5sb2NrKGJvLT5yZXN2KTsKKwkJCQkJYm8g PSBOVUxMOwogCQkJCQljb250aW51ZTsKIAkJCQl9CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQkvKiBJ ZiB0aGUgaW5uZXIgbG9vcCB0ZXJtaW5hdGVkIGVhcmx5LCB3ZSBoYXZlIG91ciBjYW5kaWRhdGUg Ki8KLQkJCWlmICgmYm8tPmxydSAhPSAmdm1fbHJ1LT5maXhlZF9scnVbbWVtX3R5cGVdW2ldKQot CQkJCWJyZWFrOwotCQkJYm8gPSBOVUxMOwogCQl9CiAJCWlmIChibykKIAkJCWJyZWFrOwpAQCAt MjA3LDYgKzIyOSwyNiBAQCBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmFtZGdwdV92bV9nZXRf ZXZpY3RhYmxlX2JvKHN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2LAogCiB9CiAKK3N0YXRpYyB2 b2lkIGFtZGdwdV92bV9ib19hZGRfdG9fcmIoc3RydWN0IGFtZGdwdV9ibyAqYm8sCisJCQkJICAg c3RydWN0IHJiX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IHJiX25vZGUgKipuZXcgPSAmKHJvb3Qt PnJiX25vZGUpLCAqcGFyZW50ID0gTlVMTDsKKworCXdoaWxlICgqbmV3KSB7CisJCXN0cnVjdCBh bWRncHVfYm8gKnRoaXMgPQorCQkJY29udGFpbmVyX29mKCpuZXcsIHN0cnVjdCBhbWRncHVfYm8s IG5vZGUpOworCisJCXBhcmVudCA9ICpuZXc7CisJCWlmIChiby0+aW5kZXggPCB0aGlzLT5pbmRl eCkKKwkJCW5ldyA9ICYoKCpuZXcpLT5yYl9sZWZ0KTsKKwkJZWxzZQorCQkJbmV3ID0gJigoKm5l dyktPnJiX3JpZ2h0KTsKKwl9CisKKwlyYl9saW5rX25vZGUoJmJvLT5ub2RlLCBwYXJlbnQsIG5l dyk7CisJcmJfaW5zZXJ0X2NvbG9yKCZiby0+bm9kZSwgcm9vdCk7Cit9CisKIHZvaWQgYW1kZ3B1 X3ZtX2FkZF90b19scnUoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibykKIHsKIAlzdHJ1Y3Qg dHRtX2JvX2RldmljZSAqYmRldiA9IGJvLT5iZGV2OwpAQCAtMjE1LDcgKzI1Nyw3IEBAIHZvaWQg YW1kZ3B1X3ZtX2FkZF90b19scnUoc3RydWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibykKIAogCWlm ICghKGJvLT5tZW0ucGxhY2VtZW50ICYgVFRNX1BMX0ZMQUdfTk9fRVZJQ1QpKSB7CiAJCWlmIChi by0+cmVzdiA9PSB2bV9scnUtPnJlc3YpCi0JCQlsaXN0X2FkZF90YWlsKCZiby0+bHJ1LCAmdm1f bHJ1LT5maXhlZF9scnVbYm8tPm1lbS5tZW1fdHlwZV1bYm8tPnByaW9yaXR5XSk7CisJCQlhbWRn cHVfdm1fYm9fYWRkX3RvX3JiKGFibywgJnZtX2xydS0+Zml4ZWRfbHJ1W2JvLT5tZW0ubWVtX3R5 cGVdW2JvLT5wcmlvcml0eV0pOwogCQllbHNlCiAJCQlsaXN0X2FkZF90YWlsKCZiby0+bHJ1LCAm dm1fbHJ1LT5keW5hbWljX2xydVtiby0+bWVtLm1lbV90eXBlXVtiby0+cHJpb3JpdHldKTsKIAkJ a3JlZl9nZXQoJmJvLT5saXN0X2tyZWYpOwpAQCAtMjMwLDkgKzI3MiwzNiBAQCB2b2lkIGFtZGdw dV92bV9hZGRfdG9fbHJ1KHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pCiAKIH0KIAorc3Rh dGljIHN0cnVjdCBhbWRncHVfYm8gKmFtZGdwdV92bV9ib19yYl9maW5kKHN0cnVjdCByYl9yb290 ICpyb290LCB1NjQgaW5kZXgpCit7CisJc3RydWN0IHJiX25vZGUgKm5vZGUgPSByb290LT5yYl9u b2RlOworCisJd2hpbGUgKG5vZGUpIHsKKwkJc3RydWN0IGFtZGdwdV9ibyAqYm8gPQorCQkJY29u dGFpbmVyX29mKG5vZGUsIHN0cnVjdCBhbWRncHVfYm8sIG5vZGUpOworCisJaWYgKGluZGV4IDwg Ym8tPmluZGV4KQorCQlub2RlID0gbm9kZS0+cmJfbGVmdDsKKwllbHNlIGlmIChpbmRleCA+IGJv LT5pbmRleCkKKwkJbm9kZSA9IG5vZGUtPnJiX3JpZ2h0OworCWVsc2UKKwkJcmV0dXJuIGJvOwor CX0KKworCXJldHVybiBOVUxMOworfQorCiB2b2lkIGFtZGdwdV92bV9kZWxfZnJvbV9scnUoc3Ry dWN0IHR0bV9idWZmZXJfb2JqZWN0ICpibykKIHsKKwlzdHJ1Y3QgYW1kZ3B1X2JvICphYm8gPSB0 dG1fdG9fYW1kZ3B1X2JvKGJvKTsKKwlzdHJ1Y3QgYW1kZ3B1X3ZtX2xydSAqdm1fbHJ1ID0gYWJv LT52bV9scnU7CiAKKwlpZiAoYW1kZ3B1X3ZtX2JvX3JiX2ZpbmQoJnZtX2xydS0+Zml4ZWRfbHJ1 W2JvLT5tZW0ubWVtX3R5cGVdW2JvLT5wcmlvcml0eV0sCisJCQkJIGFiby0+aW5kZXgpKSB7CisJ CXJiX2VyYXNlKCZhYm8tPm5vZGUsCisJCQkgJnZtX2xydS0+Zml4ZWRfbHJ1W2Fiby0+dGJvLm1l bS5tZW1fdHlwZV1bYWJvLT50Ym8ucHJpb3JpdHldKTsKKwkJa3JlZl9wdXQoJmFiby0+dGJvLmxp c3Rfa3JlZiwgdHRtX2JvX3JlZl9idWcpOworCX0KIH0KIAogdm9pZCBhbWRncHVfdm1fbW92ZV90 b19scnVfdGFpbChzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmJvKQpkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3ZtLmggYi9kcml2ZXJzL2dwdS9kcm0vYW1k L2FtZGdwdS9hbWRncHVfdm0uaAppbmRleCA2NmVlOTAyNjE0YTIuLjg0NDAwNjczZDcxMCAxMDA2 NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3ZtLmgKKysrIGIvZHJp dmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3ZtLmgKQEAgLTEzOCw3ICsxMzgsNyBAQCBl bnVtIGFtZGdwdV92bV9sZXZlbCB7CiAKIHN0cnVjdCBhbWRncHVfdm1fbHJ1IHsKIAlzdHJ1Y3Qg bGlzdF9oZWFkIHZtX2xydV9saXN0OwotCXN0cnVjdCBsaXN0X2hlYWQgZml4ZWRfbHJ1W1RUTV9O VU1fTUVNX1RZUEVTXVtUVE1fTUFYX0JPX1BSSU9SSVRZXTsKKwlzdHJ1Y3QgcmJfcm9vdCBmaXhl ZF9scnVbVFRNX05VTV9NRU1fVFlQRVNdW1RUTV9NQVhfQk9fUFJJT1JJVFldOwogCXN0cnVjdCBs aXN0X2hlYWQgZHluYW1pY19scnVbVFRNX05VTV9NRU1fVFlQRVNdW1RUTV9NQVhfQk9fUFJJT1JJ VFldOwogCXN0cnVjdCByZXNlcnZhdGlvbl9vYmplY3QgKnJlc3Y7CiB9OwpAQCAtMjY5LDYgKzI2 OSw3IEBAIGludCBhbWRncHVfdm1fbHJ1X2luaXQoc3RydWN0IGFtZGdwdV92bV9scnUgKnZtX2xy dSwgc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCiAJCSAgICAgICBzdHJ1Y3QgcmVzZXJ2YXRp b25fb2JqZWN0ICpyZXN2KTsKIGludCBhbWRncHVfdm1fbHJ1X2Zpbmkoc3RydWN0IGFtZGdwdV92 bV9scnUgKnZtX2xydSwKIAkJICAgICAgIHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KTsKK2Jv b2wgYW1kZ3B1X3ZtX2xydV9lbXB0eShzdHJ1Y3QgdHRtX2JvX2RldmljZSAqYmRldiwgdW5zaWdu ZWQgbWVtX3R5cGUpOwogCiBzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3QgKmFtZGdwdV92bV9nZXRf ZXZpY3RhYmxlX2JvKHN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2LAogCQkJCQkJICAgICB1aW50 MzJfdCBtZW1fdHlwZSwKLS0gCjIuMTQuMQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KYW1kLWdmeCBtYWlsaW5nIGxpc3QKYW1kLWdmeEBsaXN0cy5mcmVl ZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5m by9hbWQtZ2Z4Cg==