From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andy Zhou Subject: [RFC: add openvswitch actions using BPF 2/2] openvswitch: implements the BPF_PROG action in datapath Date: Wed, 4 Feb 2015 14:48:42 -0800 Message-ID: <1423090122-19807-3-git-send-email-azhou@nicira.com> References: <1423090122-19807-1-git-send-email-azhou@nicira.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Cc: netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org To: dev-yBygre7rU0SM8Zsap4Y0gw@public.gmane.org Return-path: In-Reply-To: <1423090122-19807-1-git-send-email-azhou-l0M0P4e3n4LQT0dZR+AlfA@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces-yBygre7rU0TnMu66kgdUjQ@public.gmane.org Sender: "dev" List-Id: netdev.vger.kernel.org QlBGX1BST0cgYWN0aW9uIGFsbG93cyBhbiBhY3Rpb24gdG8gYmUgaW1wbGVtZW50ZWQgaW4gZUJQ RiBsYW5ndWFnZSBhbmQKZG93bmxvYWRlZCBieSB0aGUgdXNlcnNwYWNlIGF0IHJ1bnRpbWUuCgpT aWduZWQtb2ZmLWJ5OiBBbmR5IFpob3UgPGF6aG91QG5pY2lyYS5jb20+Ci0tLQogbmV0L29wZW52 c3dpdGNoL2FjdGlvbnMuYyAgICAgIHwgMzAgKysrKysrKysrKysrKysKIG5ldC9vcGVudnN3aXRj aC9kYXRhcGF0aC5jICAgICB8ICA2ICsrLQogbmV0L29wZW52c3dpdGNoL2Zsb3dfbmV0bGluay5j IHwgOTIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystCiBuZXQvb3Bl bnZzd2l0Y2gvZmxvd19uZXRsaW5rLmggfCAgOCArKysrCiA0IGZpbGVzIGNoYW5nZWQsIDEzMiBp bnNlcnRpb25zKCspLCA0IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRj aC9hY3Rpb25zLmMgYi9uZXQvb3BlbnZzd2l0Y2gvYWN0aW9ucy5jCmluZGV4IGI0Y2ZmZTYuLjI5 ZTkxNzEgMTAwNjQ0Ci0tLSBhL25ldC9vcGVudnN3aXRjaC9hY3Rpb25zLmMKKysrIGIvbmV0L29w ZW52c3dpdGNoL2FjdGlvbnMuYwpAQCAtMzgsOCArMzgsMTIgQEAKIAogI2luY2x1ZGUgImRhdGFw YXRoLmgiCiAjaW5jbHVkZSAiZmxvdy5oIgorI2luY2x1ZGUgImZsb3dfbmV0bGluay5oIgogI2lu Y2x1ZGUgInZwb3J0LmgiCiAKK3R5cGVkZWYgaW50ICgqb3ZzX2JwZl9mdW5jX3QpKGNvbnN0IHN0 cnVjdCBvdnNfYnBmX2FjdGlvbl9jdHh0ICosCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgYnBmX2lu c24gKik7CisKIHN0YXRpYyBpbnQgZG9fZXhlY3V0ZV9hY3Rpb25zKHN0cnVjdCBkYXRhcGF0aCAq ZHAsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgICBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtl eSwKIAkJCSAgICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKmF0dHIsIGludCBsZW4pOwpAQCAtNzQ3 LDYgKzc1MSwyOCBAQCBzdGF0aWMgaW50IGV4ZWN1dGVfcmVjaXJjKHN0cnVjdCBkYXRhcGF0aCAq ZHAsIHN0cnVjdCBza19idWZmICpza2IsCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZXhl Y3V0ZV9icGYoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksCisJ CSAgICAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICphKQoreworCXN0cnVjdCBvdnNfYWN0aW9uX2Jw Zl9ydW50aW1lICpydDsKKwlzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7CisJc3RydWN0IG92c19icGZf YWN0aW9uX2N0eHQgY3R4dDsKKwlvdnNfYnBmX2Z1bmNfdCBvdnNfYnBmX2Z1bmM7CisJaW50IGVy cjsKKworCXJ0ID0gbmxhX2RhdGEoYSk7CisJcHJvZyA9IHJ0LT5wcm9nOworCisJLyogQnVpbGQg dGhlIEJQRiBwcm9ncmFtIHJ1bnRpbWUgY29udGV4dC4gKi8KKwljdHh0LnNrYiA9ICh2b2lkICop c2tiOworCWN0eHQuYXJnMCA9IHJ0LT5hcmcwOworCWN0eHQuYXJnMSA9IHJ0LT5hcmcxOworCisJ b3ZzX2JwZl9mdW5jID0gKG92c19icGZfZnVuY190KShwcm9nLT5icGZfZnVuYyk7CisJZXJyID0g b3ZzX2JwZl9mdW5jKCZjdHh0LCBwcm9nLT5pbnNuc2kpOworCXJldHVybiBlcnI7Cit9CisKIC8q IEV4ZWN1dGUgYSBsaXN0IG9mIGFjdGlvbnMgYWdhaW5zdCAnc2tiJy4gKi8KIHN0YXRpYyBpbnQg ZG9fZXhlY3V0ZV9hY3Rpb25zKHN0cnVjdCBkYXRhcGF0aCAqZHAsIHN0cnVjdCBza19idWZmICpz a2IsCiAJCQkgICAgICBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSwKQEAgLTgxNCw2ICs4NDAsMTAg QEAgc3RhdGljIGludCBkb19leGVjdXRlX2FjdGlvbnMoc3RydWN0IGRhdGFwYXRoICpkcCwgc3Ry dWN0IHNrX2J1ZmYgKnNrYiwKIAkJCX0KIAkJCWJyZWFrOwogCisJCWNhc2UgT1ZTX0FDVElPTl9B VFRSX0JQRl9QUk9HOgorCQkJZXJyID0gZXhlY3V0ZV9icGYoc2tiLCBrZXksIGEpOworCQkJYnJl YWs7CisKIAkJY2FzZSBPVlNfQUNUSU9OX0FUVFJfU0VUOgogCQkJZXJyID0gZXhlY3V0ZV9zZXRf YWN0aW9uKHNrYiwga2V5LCBubGFfZGF0YShhKSk7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL25l dC9vcGVudnN3aXRjaC9kYXRhcGF0aC5jIGIvbmV0L29wZW52c3dpdGNoL2RhdGFwYXRoLmMKaW5k ZXggYWU1ZTc3Yy4uODEwYTBiZiAxMDA2NDQKLS0tIGEvbmV0L29wZW52c3dpdGNoL2RhdGFwYXRo LmMKKysrIGIvbmV0L29wZW52c3dpdGNoL2RhdGFwYXRoLmMKQEAgLTY5OSw2ICs2OTksOCBAQCBz dGF0aWMgc2l6ZV90IG92c19mbG93X2NtZF9tc2dfc2l6ZShjb25zdCBzdHJ1Y3Qgc3dfZmxvd19h Y3Rpb25zICphY3RzLAogCQlsZW4gKz0gbmxhX3RvdGFsX3NpemUob3ZzX2tleV9hdHRyX3NpemUo KSk7CiAKIAkvKiBPVlNfRkxPV19BVFRSX0FDVElPTlMgKi8KKwkvKiBYWFggdGhpcyBsb2dpYyBu ZWVkcyB0byBiZSBmaXhlZCB0byBhY2NvbW1vZGF0ZSBCUEZfUFJPRyBhY3Rpb24KKwkgKiB3aWxs IGV4cGFuZCB0aGUgcnVuIHRpbWUgYWN0aW9uIHNpemUuICAgKi8KIAlpZiAoc2hvdWxkX2ZpbGxf YWN0aW9ucyh1ZmlkX2ZsYWdzKSkKIAkJbGVuICs9IG5sYV90b3RhbF9zaXplKGFjdHMtPmFjdGlv bnNfbGVuKTsKIApAQCAtMTAxNyw3ICsxMDE5LDcgQEAgZXJyX3VubG9ja19vdnM6CiAJb3ZzX3Vu bG9jaygpOwogCWtmcmVlX3NrYihyZXBseSk7CiBlcnJfa2ZyZWVfYWN0czoKLQlrZnJlZShhY3Rz KTsKKwlmcmVlX2Zsb3dfYWN0aW9ucyhhY3RzKTsKIGVycl9rZnJlZV9mbG93OgogCW92c19mbG93 X2ZyZWUobmV3X2Zsb3csIGZhbHNlKTsKIGVycm9yOgpAQCAtMTE1Miw3ICsxMTU0LDcgQEAgZXJy X3VubG9ja19vdnM6CiAJb3ZzX3VubG9jaygpOwogCWtmcmVlX3NrYihyZXBseSk7CiBlcnJfa2Zy ZWVfYWN0czoKLQlrZnJlZShhY3RzKTsKKwlmcmVlX2Zsb3dfYWN0aW9ucyhhY3RzKTsKIGVycm9y OgogCXJldHVybiBlcnJvcjsKIH0KZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9mbG93X25l dGxpbmsuYyBiL25ldC9vcGVudnN3aXRjaC9mbG93X25ldGxpbmsuYwppbmRleCA4YjlhNjEyLi40 NjZlODVmIDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvZmxvd19uZXRsaW5rLmMKKysrIGIv bmV0L29wZW52c3dpdGNoL2Zsb3dfbmV0bGluay5jCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVk ZSA8bGludXgvaWNtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2ljbXB2Ni5oPgogI2luY2x1ZGUgPGxp bnV4L3JjdWxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9icGYuaD4KICNpbmNsdWRlIDxuZXQvZ2Vu ZXZlLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KQEAgLTE1 NDYsMTEgKzE1NDcsMzggQEAgc3RhdGljIHN0cnVjdCBzd19mbG93X2FjdGlvbnMgKm5sYV9hbGxv Y19mbG93X2FjdGlvbnMoaW50IHNpemUsIGJvb2wgbG9nKQogCXJldHVybiBzZmE7CiB9CiAKK3Zv aWQgZnJlZV9mbG93X2FjdGlvbnMoc3RydWN0IHN3X2Zsb3dfYWN0aW9ucyAqc2ZfYWN0cykKK3sK Kwljb25zdCBzdHJ1Y3QgbmxhdHRyICphOworCWludCByZW07CisJc3RydWN0IG92c19hY3Rpb25f YnBmX3J1bnRpbWUgKnJ0OworCisJbmxhX2Zvcl9lYWNoX2F0dHIoYSwgc2ZfYWN0cy0+YWN0aW9u cywgc2ZfYWN0cy0+YWN0aW9uc19sZW4sIHJlbSkgeworCQlpbnQgdHlwZSA9IG5sYV90eXBlKGEp OworCisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIE9WU19BQ1RJT05fQVRUUl9CUEZfUFJPRzoK KwkJCXJ0ID0gbmxhX2RhdGEoYSk7CisJCQlicGZfcHJvZ19wdXQocnQtPnByb2cpOworCQkJYnJl YWs7CisJCX0KKwl9CisKKwlrZnJlZShzZl9hY3RzKTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9m bG93X2FjdGlvbnNfcmN1KHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3Qgc3dfZmxv d19hY3Rpb25zICphY3RzID0gY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBzd19mbG93X2FjdGlv bnMsIHJjdSk7CisKKwlmcmVlX2Zsb3dfYWN0aW9ucyhhY3RzKTsKK30KKwogLyogU2NoZWR1bGVz ICdzZl9hY3RzJyB0byBiZSBmcmVlZCBhZnRlciB0aGUgbmV4dCBSQ1UgZ3JhY2UgcGVyaW9kLgog ICogVGhlIGNhbGxlciBtdXN0IGhvbGQgcmN1X3JlYWRfbG9jayBmb3IgdGhpcyB0byBiZSBzZW5z aWJsZS4gKi8KIHZvaWQgb3ZzX25sYV9mcmVlX2Zsb3dfYWN0aW9ucyhzdHJ1Y3Qgc3dfZmxvd19h Y3Rpb25zICpzZl9hY3RzKQogewotCWtmcmVlX3JjdShzZl9hY3RzLCByY3UpOworCWNhbGxfcmN1 KCZzZl9hY3RzLT5yY3UsIGZyZWVfZmxvd19hY3Rpb25zX3JjdSk7CiB9CiAKIHN0YXRpYyBzdHJ1 Y3QgbmxhdHRyICpyZXNlcnZlX3NmYV9zaXplKHN0cnVjdCBzd19mbG93X2FjdGlvbnMgKipzZmEs CkBAIC0xNjk1LDYgKzE3MjMsMzcgQEAgc3RhdGljIGludCB2YWxpZGF0ZV9hbmRfY29weV9zYW1w bGUoY29uc3Qgc3RydWN0IG5sYXR0ciAqYXR0ciwKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlu dCB2YWxpZGF0ZV9hbmRfY29weV9icGYoY29uc3Qgc3RydWN0IG5sYXR0ciAqYXR0ciwKKwkJCQkg c3RydWN0IHN3X2Zsb3dfYWN0aW9ucyAqKnNmYSwKKwkJCQkgYm9vbCBsb2cpCit7CisJY29uc3Qg c3RydWN0IG92c19hY3Rpb25fYnBmX3Byb2cgKmFjdF9icGYgPSBubGFfZGF0YShhdHRyKTsKKwlz dHJ1Y3Qgb3ZzX2FjdGlvbl9icGZfcnVudGltZSBydDsKKwl1MzIgZmQ7CisJaW50IGVycjsKKwor CWZkID0gbnRvaGwoYWN0X2JwZi0+cHJvZ19mZCk7CisJcnQucHJvZyA9IGJwZl9wcm9nX2dldChm ZCk7CisJaWYgKCFydC5wcm9nKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChydC5wcm9nLT5h dXgtPnByb2dfdHlwZSAhPSBCUEZfUFJPR19UWVBFX09QRU5WU1dJVENIKSB7CisJCWJwZl9wcm9n X3B1dChydC5wcm9nKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcnQuZmQgPSBmZDsKKwly dC5hcmcwID0gbnRvaGwoYWN0X2JwZi0+YXJnMCk7CisJcnQuYXJnMSA9IG50b2hsKGFjdF9icGYt PmFyZzEpOworCisJLyogVmFsaWRhdGlvbiBkb25lLiAgUmV3cml0ZSB0aGUgYWN0aW9uIHdpdGgg cnVudGltZSBkYXRhc3RydWN0dXJlLiAqLworCWVyciA9IGFkZF9hY3Rpb24oc2ZhLCBPVlNfQUNU SU9OX0FUVFJfQlBGX1BST0csICZydCwgc2l6ZW9mKHJ0KSwgbG9nKTsKKwlpZiAoZXJyKQorCQly ZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgdmFsaWRhdGVfdHBfcG9y dChjb25zdCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmZsb3dfa2V5LAogCQkJICAgIF9fYmUxNiBldGhf dHlwZSkKIHsKQEAgLTE5NjYsNyArMjAyNSw5IEBAIHN0YXRpYyBpbnQgX19vdnNfbmxhX2NvcHlf YWN0aW9ucyhjb25zdCBzdHJ1Y3QgbmxhdHRyICphdHRyLAogCQkJW09WU19BQ1RJT05fQVRUUl9Q T1BfVkxBTl0gPSAwLAogCQkJW09WU19BQ1RJT05fQVRUUl9TRVRdID0gKHUzMiktMSwKIAkJCVtP VlNfQUNUSU9OX0FUVFJfU0FNUExFXSA9ICh1MzIpLTEsCi0JCQlbT1ZTX0FDVElPTl9BVFRSX0hB U0hdID0gc2l6ZW9mKHN0cnVjdCBvdnNfYWN0aW9uX2hhc2gpCisJCQlbT1ZTX0FDVElPTl9BVFRS X0hBU0hdID0gc2l6ZW9mKHN0cnVjdCBvdnNfYWN0aW9uX2hhc2gpLAorCQkJW09WU19BQ1RJT05f QVRUUl9CUEZfUFJPR10gPQorCQkJCXNpemVvZihzdHJ1Y3Qgb3ZzX2FjdGlvbl9icGZfcHJvZyks CiAJCX07CiAJCWNvbnN0IHN0cnVjdCBvdnNfYWN0aW9uX3B1c2hfdmxhbiAqdmxhbjsKIAkJaW50 IHR5cGUgPSBubGFfdHlwZShhKTsKQEAgLTIwNzMsNiArMjEzNCwxMyBAQCBzdGF0aWMgaW50IF9f b3ZzX25sYV9jb3B5X2FjdGlvbnMoY29uc3Qgc3RydWN0IG5sYXR0ciAqYXR0ciwKIAkJCXNraXBf Y29weSA9IHRydWU7CiAJCQlicmVhazsKIAorCQljYXNlIE9WU19BQ1RJT05fQVRUUl9CUEZfUFJP RzoKKwkJCWVyciA9IHZhbGlkYXRlX2FuZF9jb3B5X2JwZihhLCBzZmEsIGxvZyk7CisJCQlpZiAo ZXJyKQorCQkJCXJldHVybiBlcnI7CisJCQlza2lwX2NvcHkgPSB0cnVlOworCQkJYnJlYWs7CisK IAkJZGVmYXVsdDoKIAkJCU9WU19OTEVSUihsb2csICJVbmtub3duIEFjdGlvbiB0eXBlICVkIiwg dHlwZSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIxNzcsNiArMjI0NSwyMSBAQCBzdGF0aWMg aW50IHNldF9hY3Rpb25fdG9fYXR0cihjb25zdCBzdHJ1Y3QgbmxhdHRyICphLCBzdHJ1Y3Qgc2tf YnVmZiAqc2tiKQogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGJwZl9hY3Rpb25fdG9fYXR0 cihjb25zdCBzdHJ1Y3QgbmxhdHRyICphLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWNvbnN0 IHN0cnVjdCBvdnNfYWN0aW9uX2JwZl9ydW50aW1lICpydCA9IG5sYV9kYXRhKGEpOworCXN0cnVj dCBvdnNfYWN0aW9uX2JwZl9wcm9nIHByb2c7CisKKwlwcm9nLnByb2dfZmQgPSBodG9ubChydC0+ ZmQpOworCXByb2cuYXJnMCA9IGh0b25sKHJ0LT5hcmcwKTsKKwlwcm9nLmFyZzEgPSBodG9ubChy dC0+YXJnMSk7CisKKwlpZiAobmxhX3B1dChza2IsIE9WU19BQ1RJT05fQVRUUl9CUEZfUFJPRywg c2l6ZW9mKHByb2cpLCAmcHJvZykpOworCQlyZXR1cm4gLUVNU0dTSVpFOworCisJcmV0dXJuIDA7 Cit9CisKIGludCBvdnNfbmxhX3B1dF9hY3Rpb25zKGNvbnN0IHN0cnVjdCBubGF0dHIgKmF0dHIs IGludCBsZW4sIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJY29uc3Qgc3RydWN0IG5sYXR0ciAq YTsKQEAgLTIxOTcsNiArMjI4MCwxMSBAQCBpbnQgb3ZzX25sYV9wdXRfYWN0aW9ucyhjb25zdCBz dHJ1Y3QgbmxhdHRyICphdHRyLCBpbnQgbGVuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogCQkJaWYg KGVycikKIAkJCQlyZXR1cm4gZXJyOwogCQkJYnJlYWs7CisKKwkJY2FzZSBPVlNfQUNUSU9OX0FU VFJfQlBGX1BST0c6CisJCQllcnIgPSBicGZfYWN0aW9uX3RvX2F0dHIoYSwgc2tiKTsKKwkJCWJy ZWFrOworCiAJCWRlZmF1bHQ6CiAJCQlpZiAobmxhX3B1dChza2IsIHR5cGUsIG5sYV9sZW4oYSks IG5sYV9kYXRhKGEpKSkKIAkJCQlyZXR1cm4gLUVNU0dTSVpFOwpkaWZmIC0tZ2l0IGEvbmV0L29w ZW52c3dpdGNoL2Zsb3dfbmV0bGluay5oIGIvbmV0L29wZW52c3dpdGNoL2Zsb3dfbmV0bGluay5o CmluZGV4IDVjM2Q3NWIuLmU5ODZkZGIgMTAwNjQ0Ci0tLSBhL25ldC9vcGVudnN3aXRjaC9mbG93 X25ldGxpbmsuaAorKysgYi9uZXQvb3BlbnZzd2l0Y2gvZmxvd19uZXRsaW5rLmgKQEAgLTY4LDYg KzY4LDE0IEBAIGludCBvdnNfbmxhX2NvcHlfYWN0aW9ucyhjb25zdCBzdHJ1Y3QgbmxhdHRyICph dHRyLAogaW50IG92c19ubGFfcHV0X2FjdGlvbnMoY29uc3Qgc3RydWN0IG5sYXR0ciAqYXR0ciwK IAkJCWludCBsZW4sIHN0cnVjdCBza19idWZmICpza2IpOwogCit2b2lkIGZyZWVfZmxvd19hY3Rp b25zKHN0cnVjdCBzd19mbG93X2FjdGlvbnMgKik7CiB2b2lkIG92c19ubGFfZnJlZV9mbG93X2Fj dGlvbnMoc3RydWN0IHN3X2Zsb3dfYWN0aW9ucyAqKTsKIAorc3RydWN0IG92c19hY3Rpb25fYnBm X3J1bnRpbWUgeworCXVpbnQzMl90IGZkOworCXVpbnQzMl90IGFyZzA7CisJdWludDMyX3QgYXJn MTsKKwlzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7Cit9OworCiAjZW5kaWYgLyogZmxvd19uZXRsaW5r LmggKi8KLS0gCjEuOS4xCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fXwpkZXYgbWFpbGluZyBsaXN0CmRldkBvcGVudnN3aXRjaC5vcmcKaHR0cDovL29wZW52 c3dpdGNoLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2Rldgo=