From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ronald Rojas Subject: [PATCH RFC 45/59] libxl: Implement Destroy, Add/Remove operations Date: Wed, 28 Dec 2016 20:14:38 -0500 Message-ID: <1482974092-15891-45-git-send-email-ronladred@gmail.com> References: <1482974092-15891-1-git-send-email-ronladred@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1482974092-15891-1-git-send-email-ronladred@gmail.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: xen-devel , Ian Jackson , Wei Liu , George Dunlap , George Dunlap List-Id: xen-devel@lists.xenproject.org RnJvbTogR2VvcmdlIER1bmxhcCA8Z2VvcmdlLmR1bmxhcEBjaXRyaXguY29tPgoKQWxzbzoKCiog SW1wbGVtZW50IHVzZWZ1bCBCaXRtYXAgb3BlcmF0aW9uczogU2V0UmFuZ2UoKSwgQ2xlYXJSYW5n ZSgpLApJc0VtcHR5KCksIGFuZCBBbmQoKS4KCiogTm9ybWFsaXplIENwdXBvb2xJbmZvIGVsZW1l bnQgbmFtaW5nLgoKKiBJbXBsZW1lbnQgQ3B1cG9vbE1ha2VGcmVlLCB3aGljaCB3aWxsIHNjYW4g dGhyb3VnaCBjcHVwb29scyBmcmVlaW5nCiAgdGhlIGNwdXMgaW4gdGhlIG1hcC4KClNpZ25lZC1v ZmYtYnk6IEdlb3JnZSBEdW5sYXAgPGdlb3JnZS5kdW5sYXBAY2l0cml4LmNvbT4KLS0tCiBsaWJ4 bC5nbyB8IDE4NyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKy0tLS0tLS0tLS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCAxNTAgaW5zZXJ0aW9ucygrKSwgMzcg ZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvbGlieGwuZ28gYi9saWJ4bC5nbwppbmRleCA2ZTE3 YjUzLi45MjA2NGNhIDEwMDY0NAotLS0gYS9saWJ4bC5nbworKysgYi9saWJ4bC5nbwpAQCAtMjI2 LDYgKzIyNiwxMiBAQCBmdW5jIChibSAqQml0bWFwKSBTZXQoYml0IGludCkgewogCWJtLmJpdG1h cFtpYml0XSB8PSAxIDw8ICh1aW50KGJpdCkgJiA3KQogfQogCitmdW5jIChibSAqQml0bWFwKSBT ZXRSYW5nZShzdGFydCBpbnQsIGVuZCBpbnQpIHsKKwlmb3IgaSA6PSBzdGFydDsgaSA8PSBlbmQ7 IGkrKyB7CisJCWJtLlNldChpKQorCX0KK30KKwogZnVuYyAoYm0gKkJpdG1hcCkgQ2xlYXIoYml0 IGludCkgewogCXViaXQgOj0gdWludChiaXQpCiAJaWYgKGJpdCA+IGJtLk1heCgpKSB7CkBAIC0y MzUsMTAgKzI0MSw0MiBAQCBmdW5jIChibSAqQml0bWFwKSBDbGVhcihiaXQgaW50KSB7CiAJYm0u Yml0bWFwW2JpdCAvIDhdICY9IF4oMSA8PCAodWJpdCAmIDcpKQogfQogCitmdW5jIChibSAqQml0 bWFwKSBDbGVhclJhbmdlKHN0YXJ0IGludCwgZW5kIGludCkgeworCWZvciBpIDo9IHN0YXJ0OyBp IDw9IGVuZDsgaSsrIHsKKwkJYm0uQ2xlYXIoaSkKKwl9Cit9CisKIGZ1bmMgKGJtICpCaXRtYXAp IE1heCgpIChpbnQpIHsKIAlyZXR1cm4gbGVuKGJtLmJpdG1hcCkgKiA4CiB9CiAKK2Z1bmMgKGJt ICpCaXRtYXApIElzRW1wdHkoKSAoYm9vbCkgeworCWZvciBpOj0wOyBpPGxlbihibS5iaXRtYXAp OyBpKysgeworCQlpZiBibS5iaXRtYXBbaV0gIT0gMCB7CisJCQlyZXR1cm4gZmFsc2UKKwkJfQor CX0KKwlyZXR1cm4gdHJ1ZQorfQorCitmdW5jIChhIEJpdG1hcCkgQW5kKGIgQml0bWFwKSAoYyBC aXRtYXApIHsKKwl2YXIgbWF4LCBtaW4gaW50CisJaWYgbGVuKGEuYml0bWFwKSA+IGxlbihiLmJp dG1hcCkgeworCQltYXggPSBsZW4oYS5iaXRtYXApCisJCW1pbiA9IGxlbihiLmJpdG1hcCkKKwl9 IGVsc2UgeworCQltYXggPSBsZW4oYi5iaXRtYXApCisJCW1pbiA9IGxlbihhLmJpdG1hcCkKKwl9 CisJYy5iaXRtYXAgPSBtYWtlKFtdQy51aW50OF90LCBtYXgpCisKKwlmb3IgaSA6PSAwOyBpIDwg bWluOyBpKysgeworCQljLmJpdG1hcFtpXSA9IGEuYml0bWFwW2ldICYgYi5iaXRtYXBbaV0KKwl9 CisJcmV0dXJuCit9CisKIC8vICMgQ29uc2lzdGVudCB3aXRoIHZhbHVlcyBkZWZpbmVkIGluIGRv bWN0bC5oCiAvLyAjIEV4Y2VwdCB1bmtub3duIHdoaWNoIHdlIGhhdmUgbWFkZSB1cAogLy8gbGli eGxfc2NoZWR1bGVyID0gRW51bWVyYXRpb24oInNjaGVkdWxlciIsIFsKQEAgLTI5NCwxMSArMzMy LDExIEBAIGZ1bmMgU2NoZWR1bGVyRnJvbVN0cmluZyhuYW1lIHN0cmluZykgKHMgU2NoZWR1bGVy LCBlcnIgZXJyb3IpIHsKIC8vICAgICBdLCBkaXI9RElSX09VVCkKIAogdHlwZSBDcHVwb29sSW5m byBzdHJ1Y3QgewotCVBvb2xJZCB1aW50MzIKKwlQb29saWQgdWludDMyCiAJUG9vbE5hbWUgc3Ry aW5nCiAJU2NoZWR1bGVyIFNjaGVkdWxlcgogCURvbWFpbkNvdW50IGludAotCUNwdU1hcCBCaXRt YXAKKwlDcHVtYXAgQml0bWFwCiB9CiAKIC8vIGxpYnhsX2NwdXBvb2xpbmZvICogbGlieGxfbGlz dF9jcHVwb29sKGxpYnhsX2N0eCosIGludCAqbmJfcG9vbF9vdXQpOwpAQCAtMzIwLDExICszNTgs MTEgQEAgZnVuYyAoQ3R4ICpDb250ZXh0KSBMaXN0Q3B1cG9vbCgpIChsaXN0IFtdQ3B1cG9vbElu Zm8pIHsKIAlmb3IgaSA6PSByYW5nZSBjcHVwb29sTGlzdFNsaWNlIHsKIAkJdmFyIGluZm8gQ3B1 cG9vbEluZm8KIAkJCi0JCWluZm8uUG9vbElkID0gdWludDMyKGNwdXBvb2xMaXN0U2xpY2VbaV0u cG9vbGlkKQorCQlpbmZvLlBvb2xpZCA9IHVpbnQzMihjcHVwb29sTGlzdFNsaWNlW2ldLnBvb2xp ZCkKIAkJaW5mby5Qb29sTmFtZSA9IEMuR29TdHJpbmcoY3B1cG9vbExpc3RTbGljZVtpXS5wb29s X25hbWUpCiAJCWluZm8uU2NoZWR1bGVyID0gU2NoZWR1bGVyKGNwdXBvb2xMaXN0U2xpY2VbaV0u c2NoZWQpCiAJCWluZm8uRG9tYWluQ291bnQgPSBpbnQoY3B1cG9vbExpc3RTbGljZVtpXS5uX2Rv bSkKLQkJaW5mby5DcHVNYXAgPSBiaXRtYXBDVG9HbygmY3B1cG9vbExpc3RTbGljZVtpXS5jcHVt YXApCisJCWluZm8uQ3B1bWFwID0gYml0bWFwQ1RvR28oJmNwdXBvb2xMaXN0U2xpY2VbaV0uY3B1 bWFwKQogCiAJCWxpc3QgPSBhcHBlbmQobGlzdCwgaW5mbykKIAl9CkBAIC0zNjUsMTUgKzQwMyw3 OCBAQCBmdW5jIChDdHggKkNvbnRleHQpIENwdXBvb2xDcmVhdGUoTmFtZSBzdHJpbmcsIFNjaGVk dWxlciBTY2hlZHVsZXIsIENwdW1hcCBCaXRtYQogfQogCiAvLyBpbnQgbGlieGxfY3B1cG9vbF9k ZXN0cm95KGxpYnhsX2N0eCAqY3R4LCB1aW50MzJfdCBwb29saWQpOwotLy8gaW50IGxpYnhsX2Nw dXBvb2xfcmVuYW1lKGxpYnhsX2N0eCAqY3R4LCBjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCBw b29saWQpOworZnVuYyAoQ3R4ICpDb250ZXh0KSBDcHVwb29sRGVzdHJveShQb29saWQgdWludDMy KSAoZXJyIGVycm9yKSB7CisJcmV0IDo9IEMubGlieGxfY3B1cG9vbF9kZXN0cm95KEN0eC5jdHgs IEMudWludDMyX3QoUG9vbGlkKSkKKwkvLyBGSVhNRTogUHJvcGVyIGVycm9yCisJaWYgcmV0ICE9 IDAgeworCQllcnIgPSBmbXQuRXJyb3JmKCJsaWJ4bF9jcHVwb29sX2Rlc3Ryb3kgZmFpbGVkOiAl ZCIsIHJldCkKKwkJcmV0dXJuCisJfQorCisJcmV0dXJuCit9CisKIC8vIGludCBsaWJ4bF9jcHVw b29sX2NwdWFkZChsaWJ4bF9jdHggKmN0eCwgdWludDMyX3QgcG9vbGlkLCBpbnQgY3B1KTsKLS8v IGludCBsaWJ4bF9jcHVwb29sX2NwdWFkZF9ub2RlKGxpYnhsX2N0eCAqY3R4LCB1aW50MzJfdCBw b29saWQsIGludCBub2RlLCBpbnQgKmNwdXMpOworZnVuYyAoQ3R4ICpDb250ZXh0KSBDcHVwb29s Q3B1YWRkKFBvb2xpZCB1aW50MzIsIENwdSBpbnQpIChlcnIgZXJyb3IpIHsKKwlyZXQgOj0gQy5s aWJ4bF9jcHVwb29sX2NwdWFkZChDdHguY3R4LCBDLnVpbnQzMl90KFBvb2xpZCksIEMuaW50KENw dSkpCisJLy8gRklYTUU6IFByb3BlciBlcnJvcgorCWlmIHJldCAhPSAwIHsKKwkJZXJyID0gZm10 LkVycm9yZigibGlieGxfY3B1cG9vbF9jcHVhZGQgZmFpbGVkOiAlZCIsIHJldCkKKwkJcmV0dXJu CisJfQorCisJcmV0dXJuCit9CisKIC8vIGludCBsaWJ4bF9jcHVwb29sX2NwdWFkZF9jcHVtYXAo bGlieGxfY3R4ICpjdHgsIHVpbnQzMl90IHBvb2xpZCwKIC8vICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgY29uc3QgbGlieGxfYml0bWFwICpjcHVtYXApOworZnVuYyAoQ3R4ICpDb250 ZXh0KSBDcHVwb29sQ3B1YWRkQ3B1bWFwKFBvb2xpZCB1aW50MzIsIENwdW1hcCBCaXRtYXApIChl cnIgZXJyb3IpIHsKKwl2YXIgY2JtIEMubGlieGxfYml0bWFwCisJYml0bWFwR290b0MoQ3B1bWFw LCAmY2JtKQorCWRlZmVyIEMubGlieGxfYml0bWFwX2Rpc3Bvc2UoJmNibSkKKwkKKwlyZXQgOj0g Qy5saWJ4bF9jcHVwb29sX2NwdWFkZF9jcHVtYXAoQ3R4LmN0eCwgQy51aW50MzJfdChQb29saWQp LCAmY2JtKQorCS8vIEZJWE1FOiBQcm9wZXIgZXJyb3IKKwlpZiByZXQgIT0gMCB7CisJCWVyciA9 IGZtdC5FcnJvcmYoImxpYnhsX2NwdXBvb2xfY3B1YWRkX2NwdW1hcCBmYWlsZWQ6ICVkIiwgcmV0 KQorCQlyZXR1cm4KKwl9CisKKwlyZXR1cm4KK30KKwogLy8gaW50IGxpYnhsX2NwdXBvb2xfY3B1 cmVtb3ZlKGxpYnhsX2N0eCAqY3R4LCB1aW50MzJfdCBwb29saWQsIGludCBjcHUpOwotLy8gaW50 IGxpYnhsX2NwdXBvb2xfY3B1cmVtb3ZlX25vZGUobGlieGxfY3R4ICpjdHgsIHVpbnQzMl90IHBv b2xpZCwgaW50IG5vZGUsIGludCAqY3B1cyk7CitmdW5jIChDdHggKkNvbnRleHQpIENwdXBvb2xD cHVyZW1vdmUoUG9vbGlkIHVpbnQzMiwgQ3B1IGludCkgKGVyciBlcnJvcikgeworCXJldCA6PSBD LmxpYnhsX2NwdXBvb2xfY3B1cmVtb3ZlKEN0eC5jdHgsIEMudWludDMyX3QoUG9vbGlkKSwgQy5p bnQoQ3B1KSkKKwkvLyBGSVhNRTogUHJvcGVyIGVycm9yCisJaWYgcmV0ICE9IDAgeworCQllcnIg PSBmbXQuRXJyb3JmKCJsaWJ4bF9jcHVwb29sX2NwdXJlbW92ZSBmYWlsZWQ6ICVkIiwgcmV0KQor CQlyZXR1cm4KKwl9CisKKwlyZXR1cm4KK30KKwogLy8gaW50IGxpYnhsX2NwdXBvb2xfY3B1cmVt b3ZlX2NwdW1hcChsaWJ4bF9jdHggKmN0eCwgdWludDMyX3QgcG9vbGlkLAogLy8gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsaWJ4bF9iaXRtYXAgKmNwdW1hcCk7Citm dW5jIChDdHggKkNvbnRleHQpIENwdXBvb2xDcHVyZW1vdmVDcHVtYXAoUG9vbGlkIHVpbnQzMiwg Q3B1bWFwIEJpdG1hcCkgKGVyciBlcnJvcikgeworCXZhciBjYm0gQy5saWJ4bF9iaXRtYXAKKwli aXRtYXBHb3RvQyhDcHVtYXAsICZjYm0pCisJZGVmZXIgQy5saWJ4bF9iaXRtYXBfZGlzcG9zZSgm Y2JtKQorCQorCXJldCA6PSBDLmxpYnhsX2NwdXBvb2xfY3B1cmVtb3ZlX2NwdW1hcChDdHguY3R4 LCBDLnVpbnQzMl90KFBvb2xpZCksICZjYm0pCisJLy8gRklYTUU6IFByb3BlciBlcnJvcgorCWlm IHJldCAhPSAwIHsKKwkJZXJyID0gZm10LkVycm9yZigibGlieGxfY3B1cG9vbF9jcHVyZW1vdmVf Y3B1bWFwIGZhaWxlZDogJWQiLCByZXQpCisJCXJldHVybgorCX0KKworCXJldHVybgorfQorCisv LyBpbnQgbGlieGxfY3B1cG9vbF9yZW5hbWUobGlieGxfY3R4ICpjdHgsIGNvbnN0IGNoYXIgKm5h bWUsIHVpbnQzMl90IHBvb2xpZCk7CisvLyBpbnQgbGlieGxfY3B1cG9vbF9jcHVhZGRfbm9kZShs aWJ4bF9jdHggKmN0eCwgdWludDMyX3QgcG9vbGlkLCBpbnQgbm9kZSwgaW50ICpjcHVzKTsKKy8v IGludCBsaWJ4bF9jcHVwb29sX2NwdXJlbW92ZV9ub2RlKGxpYnhsX2N0eCAqY3R4LCB1aW50MzJf dCBwb29saWQsIGludCBub2RlLCBpbnQgKmNwdXMpOwogLy8gaW50IGxpYnhsX2NwdXBvb2xfbW92 ZWRvbWFpbihsaWJ4bF9jdHggKmN0eCwgdWludDMyX3QgcG9vbGlkLCB1aW50MzJfdCBkb21pZCk7 CiAvLyBpbnQgbGlieGxfY3B1cG9vbF9pbmZvKGxpYnhsX2N0eCAqY3R4LCBsaWJ4bF9jcHVwb29s aW5mbyAqaW5mbywgdWludDMyX3QgcG9vbGlkKTsKIApAQCAtMzkzLDYgKzQ5NCwyMiBAQCBmdW5j IChDdHggKkNvbnRleHQpIENwdXBvb2xGaW5kQnlOYW1lKG5hbWUgc3RyaW5nKSAoaW5mbyBDcHVw b29sSW5mbywgZm91bmQgYm9vbAogCXJldHVybgogfQogCitmdW5jIChDdHggKkNvbnRleHQpIENw dXBvb2xNYWtlRnJlZShDcHVtYXAgQml0bWFwKSAoZXJyIGVycm9yKSB7CisJcGxpc3QgOj0gQ3R4 Lkxpc3RDcHVwb29sKCkKKworCWZvciBpIDo9IHJhbmdlIHBsaXN0IHsKKwkJdmFyIEludGVyc2Vj dGlvbiBCaXRtYXAKKwkJSW50ZXJzZWN0aW9uID0gQ3B1bWFwLkFuZChwbGlzdFtpXS5DcHVtYXAp CisJCWlmICEgSW50ZXJzZWN0aW9uLklzRW1wdHkoKSB7CisJCQllcnIgPSBDdHguQ3B1cG9vbENw dXJlbW92ZUNwdW1hcChwbGlzdFtpXS5Qb29saWQsIEludGVyc2VjdGlvbikKKwkJCWlmIGVyciAh PSBuaWwgeworCQkJCXJldHVybgorCQkJfQorCQl9CisJfQorCXJldHVybgorfQorCiBmdW5jIFhs VGVzdChBcmdzIFtdc3RyaW5nKSB7CiAJdmFyIEN0eCBDb250ZXh0CiAKQEAgLTQwNSw0NSArNTIy LDQxIEBAIGZ1bmMgWGxUZXN0KEFyZ3MgW11zdHJpbmcpIHsKIAlwb29sLCBmb3VuZCA6PSBDdHgu Q3B1cG9vbEZpbmRCeU5hbWUoInNjaGVkYmVuY2giKQogCiAJaWYgZm91bmQgewotCQlmbXQuUHJp bnRmKCIldlxuIiwgcG9vbCkKKwkJZm10LlByaW50ZigiRm91bmQgc2NoZWRiZW5jaCwgZGVzdHJv eWluZ1xuIikKIAotCQlhIDo9IGludChwb29sLlNjaGVkdWxlcikKLQkJYiA6PSBwb29sLlNjaGVk dWxlci5TdHJpbmcoKQotCQljLCBlcnIgIDo9IFNjaGVkdWxlckZyb21TdHJpbmcoYikKKwkJZXJy ID0gQ3R4LkNwdXBvb2xEZXN0cm95KHBvb2wuUG9vbGlkKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJ CWZtdC5QcmludGYoIkNvdWxkbid0IGRlc3Ryb3kgcG9vbDogJXZcbiIsIGVycikKKwkJCXJldHVy bgorCQl9CiAKKwkJZm10LlByaW50ZigiUmV0dXJuaW5nIGNwdXMgdG8gcG9vbCAwIGZvciBmdW5c biIpCisJCWVyciA9IEN0eC5DcHVwb29sQ3B1YWRkQ3B1bWFwKDAsIHBvb2wuQ3B1bWFwKQogCQlp ZiBlcnIgIT0gbmlsIHsKLQkJCWZtdC5QcmludGYoIkVycm9yOiAldlxuIiwgZXJyKQorCQkJZm10 LlByaW50ZigiQ291bGRuJ3QgYWRkIGNwdXMgdG8gZG9tYWluIDA6ICV2XG4iLCBlcnIpCisJCQly ZXR1cm4KIAkJfQorCX0KIAotCQlmbXQuUHJpbnRmKCJhOiAlZCBiOiAlcyBjOiAlZFxuIiwgYSwg YiwgaW50KGMpKQorCXZhciBDcHVtYXAgQml0bWFwCiAKLQkJcG9vbC5DcHVNYXAuU2V0KDEpCi0J CXBvb2wuQ3B1TWFwLlNldCgyKQotCQlwb29sLkNwdU1hcC5DbGVhcigyKQotCQkKLQkJZm10LlBy aW50ZigiY3B1bWFwOiAiKQotCQlmb3IgaSA6PSAwOyBpIDwgcG9vbC5DcHVNYXAuTWF4KCkgOyBp KysgewotCQkJaWYgcG9vbC5DcHVNYXAuVGVzdChpKSB7Ci0JCQkJZm10LlByaW50ZigieCIpCi0J CQl9IGVsc2UgewotCQkJCWZtdC5QcmludGYoIi0iKQotCQkJfQotCQl9Ci0JCWZtdC5QcmludGYo IlxuIikKLQl9IGVsc2UgewotCQlmbXQuUHJpbnRmKCJzY2hlZGJlbmNoIG5vdCBmb3VuZCwgY3Jl YXRpbmdcbiIpCisJQ3B1bWFwLlNldFJhbmdlKDEyLCAxNSkKKworCWZtdC5QcmludGYoIkZyZWVp bmcgY3B1c1xuIikKKwllcnIgPSBDdHguQ3B1cG9vbE1ha2VGcmVlKENwdW1hcCkKKwlpZiBlcnIg IT0gbmlsIHsKKwkJZm10LlByaW50ZigiQ291bGRuJ3QgZnJlZSBjcHVzOiAldlxuIiwgZXJyKQor CQlyZXR1cm4KKwl9CiAKLQkJdmFyIENwdW1hcCBCaXRtYXAKLQkJdmFyIFBvb2xpZCB1aW50MzIK IAotCQlDcHVtYXAuU2V0KDE1KQorCWZtdC5QcmludGYoIkNyZWF0aW5nIG5ldyBwb29sXG4iKQog Ci0JCWVyciwgUG9vbGlkID0gQ3R4LkNwdXBvb2xDcmVhdGUoInNjaGVkYmVuY2giLCBTY2hlZHVs ZXJDcmVkaXQsIENwdW1hcCkKLQkJaWYgZXJyICE9IG5pbCB7Ci0JCQlmbXQuUHJpbnRmKCJFcnJv ciBjcmVhdGluZyBjcHVwb29sOiAldlxuIiwgZXJyKQotCQl9IGVsc2UgewotCQkJZm10LlByaW50 ZigiUG9vbCBpZDogJWRcbiIsIFBvb2xpZCkKLQkJfQorCWVyciwgUG9vbGlkIDo9IEN0eC5DcHVw b29sQ3JlYXRlKCJzY2hlZGJlbmNoIiwgU2NoZWR1bGVyQ3JlZGl0LCBDcHVtYXApCisJaWYgZXJy ICE9IG5pbCB7CisJCWZtdC5QcmludGYoIkVycm9yIGNyZWF0aW5nIGNwdXBvb2w6ICV2XG4iLCBl cnIpCisJfSBlbHNlIHsKKwkJZm10LlByaW50ZigiUG9vbCBpZDogJWRcbiIsIFBvb2xpZCkKIAl9 CiAKIAlDdHguQ2xvc2UoKQotLSAKMi43LjQKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0 cy54ZW4ub3JnCmh0dHBzOi8vbGlzdHMueGVuLm9yZy94ZW4tZGV2ZWwK