From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from metis.ext.pengutronix.de ([2001:67c:670:201:290:27ff:fe1d:cc33]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1dwxO2-0007AV-R6 for barebox@lists.infradead.org; Tue, 26 Sep 2017 21:27:34 +0000 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Date: Tue, 26 Sep 2017 23:26:45 +0200 Message-Id: <20170926212646.2968-3-u.kleine-koenig@pengutronix.de> In-Reply-To: <20170926212646.2968-1-u.kleine-koenig@pengutronix.de> References: <20170926212646.2968-1-u.kleine-koenig@pengutronix.de> MIME-Version: 1.0 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "barebox" Errors-To: barebox-bounces+u.kleine-koenig=pengutronix.de@lists.infradead.org Subject: [PATCH 2/3] gpiolib: introduce helper functions working on gpio_info structs To: barebox@lists.infradead.org Z3Bpb2luZm9fKigpIGFzc3VtZSB0aGVpciBncGlvX2luZm8gcG9pbnRlciBwYXJhbWV0ZXIgdG8g YmUgdmFsaWQgYW5kCmRvbid0IGVuc3VyZSB0aGUgZ3BpbyB0byBiZSByZXF1ZXN0ZWQuCgpUaGlz IGRyb3BzIHNldmVyYWwgY2hlY2tzIGZvciBiZWluZyByZXF1ZXN0ZWQgYW5kIGFsbG93cyBmdXJ0 aGVyCmV4dGVuc2lvbnMgdG8gd29yayB3aXRoIHVucmVxdWVzdGVkIGdwaW9zLgoKU2lnbmVkLW9m Zi1ieTogVXdlIEtsZWluZS1Lw7ZuaWcgPHUua2xlaW5lLWtvZW5pZ0BwZW5ndXRyb25peC5kZT4K LS0tCiBkcml2ZXJzL2dwaW8vZ3Bpb2xpYi5jIHwgMTM1ICsrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCA5NiBpbnNlcnRpb25z KCspLCAzOSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5j IGIvZHJpdmVycy9ncGlvL2dwaW9saWIuYwppbmRleCBiODY4OTg2ZGQ0NDkuLmRlNTQzZmJiMTMy MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW9saWIuYworKysgYi9kcml2ZXJzL2dwaW8v Z3Bpb2xpYi5jCkBAIC00Nyw2ICs0NywxMSBAQCBzdGF0aWMgc3RydWN0IGdwaW9faW5mbyAqZ3Bp b190b19kZXNjKHVuc2lnbmVkIGdwaW8pCiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyB1bnNp Z25lZCBncGlvaW5mb19jaGlwX29mZnNldChzdHJ1Y3QgZ3Bpb19pbmZvICpnaSkKK3sKKwlyZXR1 cm4gKGdpIC0gZ3Bpb19kZXNjKSAtIGdpLT5jaGlwLT5iYXNlOworfQorCiBzdGF0aWMgaW50IGdw aW9fYWRqdXN0X3ZhbHVlKHN0cnVjdCBncGlvX2luZm8gKmdpLAogCQkJICAgICBpbnQgdmFsdWUp CiB7CkBAIC01NiwxNiArNjEsMTAgQEAgc3RhdGljIGludCBncGlvX2FkanVzdF92YWx1ZShzdHJ1 Y3QgZ3Bpb19pbmZvICpnaSwKIAlyZXR1cm4gISF2YWx1ZSBeIGdpLT5hY3RpdmVfbG93OwogfQog Ci1pbnQgZ3Bpb19yZXF1ZXN0KHVuc2lnbmVkIGdwaW8sIGNvbnN0IGNoYXIgKmxhYmVsKQorc3Rh dGljIGludCBncGlvaW5mb19yZXF1ZXN0KHN0cnVjdCBncGlvX2luZm8gKmdpLCBjb25zdCBjaGFy ICpsYWJlbCkKIHsKLQlzdHJ1Y3QgZ3Bpb19pbmZvICpnaSA9IGdwaW9fdG9fZGVzYyhncGlvKTsK IAlpbnQgcmV0OwogCi0JaWYgKCFnaSkgewotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGRvbmU7 Ci0JfQotCiAJaWYgKGdpLT5yZXF1ZXN0ZWQpIHsKIAkJcmV0ID0gLUVCVVNZOwogCQlnb3RvIGRv bmU7CkBAIC03NCw3ICs3Myw4IEBAIGludCBncGlvX3JlcXVlc3QodW5zaWduZWQgZ3BpbywgY29u c3QgY2hhciAqbGFiZWwpCiAJcmV0ID0gMDsKIAogCWlmIChnaS0+Y2hpcC0+b3BzLT5yZXF1ZXN0 KSB7Ci0JCXJldCA9IGdpLT5jaGlwLT5vcHMtPnJlcXVlc3QoZ2ktPmNoaXAsIGdwaW8gLSBnaS0+ Y2hpcC0+YmFzZSk7CisJCXJldCA9IGdpLT5jaGlwLT5vcHMtPnJlcXVlc3QoZ2ktPmNoaXAsCisJ CQkJCSAgICAgZ3Bpb2luZm9fY2hpcF9vZmZzZXQoZ2kpKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8g ZG9uZTsKIAl9CkBAIC04NiwyMyArODYsMzEgQEAgaW50IGdwaW9fcmVxdWVzdCh1bnNpZ25lZCBn cGlvLCBjb25zdCBjaGFyICpsYWJlbCkKIGRvbmU6CiAJaWYgKHJldCkKIAkJcHJfZXJyKCJfZ3Bp b19yZXF1ZXN0OiBncGlvLSVkICglcykgc3RhdHVzICVkXG4iLAotCQkJIGdwaW8sIGxhYmVsID8g OiAiPyIsIHJldCk7CisJCSAgICAgICBnaSAtIGdwaW9fZGVzYywgbGFiZWwgPyA6ICI/IiwgcmV0 KTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgZ3Bpb19mcmVlKHVuc2lnbmVkIGdwaW8pCitp bnQgZ3Bpb19yZXF1ZXN0KHVuc2lnbmVkIGdwaW8sIGNvbnN0IGNoYXIgKmxhYmVsKQogewogCXN0 cnVjdCBncGlvX2luZm8gKmdpID0gZ3Bpb190b19kZXNjKGdwaW8pOwogCi0JaWYgKCFnaSkKLQkJ cmV0dXJuOworCWlmICghZ2kpIHsKKwkJcHJfZXJyKCJfZ3Bpb19yZXF1ZXN0OiBncGlvLSVkICgl cykgc3RhdHVzICVkXG4iLAorCQkJIGdwaW8sIGxhYmVsID8gOiAiPyIsIC1FTk9ERVYpOworCQly ZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gZ3Bpb2luZm9fcmVxdWVzdChnaSwgbGFiZWwp OworfQogCitzdGF0aWMgdm9pZCBncGlvaW5mb19mcmVlKHN0cnVjdCBncGlvX2luZm8gKmdpKQor ewogCWlmICghZ2ktPnJlcXVlc3RlZCkKIAkJcmV0dXJuOwogCiAJaWYgKGdpLT5jaGlwLT5vcHMt PmZyZWUpCi0JCWdpLT5jaGlwLT5vcHMtPmZyZWUoZ2ktPmNoaXAsIGdwaW8gLSBnaS0+Y2hpcC0+ YmFzZSk7CisJCWdpLT5jaGlwLT5vcHMtPmZyZWUoZ2ktPmNoaXAsIGdwaW9pbmZvX2NoaXBfb2Zm c2V0KGdpKSk7CiAKIAlnaS0+cmVxdWVzdGVkID0gZmFsc2U7CiAJZ2ktPmFjdGl2ZV9sb3cgPSBm YWxzZTsKQEAgLTExMCw2ICsxMTgsMjIgQEAgdm9pZCBncGlvX2ZyZWUodW5zaWduZWQgZ3BpbykK IAlnaS0+bGFiZWwgPSBOVUxMOwogfQogCit2b2lkIGdwaW9fZnJlZSh1bnNpZ25lZCBncGlvKQor eworCXN0cnVjdCBncGlvX2luZm8gKmdpID0gZ3Bpb190b19kZXNjKGdwaW8pOworCisJaWYgKCFn aSkKKwkJcmV0dXJuOworCisJZ3Bpb2luZm9fZnJlZShnaSk7Cit9CisKK3N0YXRpYyB2b2lkIGdw aW9pbmZvX3NldF92YWx1ZShzdHJ1Y3QgZ3Bpb19pbmZvICpnaSwgaW50IHZhbHVlKQoreworCWlm IChnaS0+Y2hpcC0+b3BzLT5zZXQpCisJCWdpLT5jaGlwLT5vcHMtPnNldChnaS0+Y2hpcCwgZ3Bp b2luZm9fY2hpcF9vZmZzZXQoZ2kpLCB2YWx1ZSk7Cit9CisKIHZvaWQgZ3Bpb19zZXRfdmFsdWUo dW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQogewogCXN0cnVjdCBncGlvX2luZm8gKmdpID0gZ3Bp b190b19kZXNjKGdwaW8pOwpAQCAtMTIwLDggKzE0NCw3IEBAIHZvaWQgZ3Bpb19zZXRfdmFsdWUo dW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQogCWlmIChncGlvX2Vuc3VyZV9yZXF1ZXN0ZWQoZ2ks IGdwaW8pKQogCQlyZXR1cm47CiAKLQlpZiAoZ2ktPmNoaXAtPm9wcy0+c2V0KQotCQlnaS0+Y2hp cC0+b3BzLT5zZXQoZ2ktPmNoaXAsIGdwaW8gLSBnaS0+Y2hpcC0+YmFzZSwgdmFsdWUpOworCWdw aW9pbmZvX3NldF92YWx1ZShnaSwgdmFsdWUpOwogfQogRVhQT1JUX1NZTUJPTChncGlvX3NldF92 YWx1ZSk7CiAKQEAgLTEzNiw2ICsxNTksMTQgQEAgdm9pZCBncGlvX3NldF9hY3RpdmUodW5zaWdu ZWQgZ3BpbywgYm9vbCB2YWx1ZSkKIH0KIEVYUE9SVF9TWU1CT0woZ3Bpb19zZXRfYWN0aXZlKTsK IAorc3RhdGljIGludCBncGlvaW5mb19nZXRfdmFsdWUoc3RydWN0IGdwaW9faW5mbyAqZ2kpCit7 CisJaWYgKCFnaS0+Y2hpcC0+b3BzLT5nZXQpCisJCXJldHVybiAtRU5PU1lTOworCisJcmV0dXJu IGdpLT5jaGlwLT5vcHMtPmdldChnaS0+Y2hpcCwgZ3Bpb2luZm9fY2hpcF9vZmZzZXQoZ2kpKTsK K30KKwogaW50IGdwaW9fZ2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8pCiB7CiAJc3RydWN0IGdwaW9f aW5mbyAqZ2kgPSBncGlvX3RvX2Rlc2MoZ3Bpbyk7CkBAIC0xNDgsOSArMTc5LDcgQEAgaW50IGdw aW9fZ2V0X3ZhbHVlKHVuc2lnbmVkIGdwaW8pCiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAot CWlmICghZ2ktPmNoaXAtPm9wcy0+Z2V0KQotCQlyZXR1cm4gLUVOT1NZUzsKLQlyZXR1cm4gZ2kt PmNoaXAtPm9wcy0+Z2V0KGdpLT5jaGlwLCBncGlvIC0gZ2ktPmNoaXAtPmJhc2UpOworCXJldHVy biBncGlvaW5mb19nZXRfdmFsdWUoZ2kpOwogfQogRVhQT1JUX1NZTUJPTChncGlvX2dldF92YWx1 ZSk7CiAKQEAgLTE2NSw2ICsxOTQsMTUgQEAgaW50IGdwaW9faXNfYWN0aXZlKHVuc2lnbmVkIGdw aW8pCiB9CiBFWFBPUlRfU1lNQk9MKGdwaW9faXNfYWN0aXZlKTsKIAorc3RhdGljIGludCBncGlv aW5mb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2luZm8gKmdpLCBpbnQgdmFsdWUpCit7 CisJaWYgKCFnaS0+Y2hpcC0+b3BzLT5kaXJlY3Rpb25fb3V0cHV0KQorCQlyZXR1cm4gLUVOT1NZ UzsKKworCXJldHVybiBnaS0+Y2hpcC0+b3BzLT5kaXJlY3Rpb25fb3V0cHV0KGdpLT5jaGlwLAor CQkJCQkgICAgICAgZ3Bpb2luZm9fY2hpcF9vZmZzZXQoZ2kpLCB2YWx1ZSk7Cit9CisKIGludCBn cGlvX2RpcmVjdGlvbl9vdXRwdXQodW5zaWduZWQgZ3BpbywgaW50IHZhbHVlKQogewogCXN0cnVj dCBncGlvX2luZm8gKmdpID0gZ3Bpb190b19kZXNjKGdwaW8pOwpAQCAtMTc3LDEzICsyMTUsMTUg QEAgaW50IGdwaW9fZGlyZWN0aW9uX291dHB1dCh1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpCiAJ aWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlmICghZ2ktPmNoaXAtPm9wcy0+ZGlyZWN0aW9u X291dHB1dCkKLQkJcmV0dXJuIC1FTk9TWVM7Ci0JcmV0dXJuIGdpLT5jaGlwLT5vcHMtPmRpcmVj dGlvbl9vdXRwdXQoZ2ktPmNoaXAsIGdwaW8gLSBnaS0+Y2hpcC0+YmFzZSwKLQkJCQkJICAgICAg IHZhbHVlKTsKKwlyZXR1cm4gZ3Bpb2luZm9fZGlyZWN0aW9uX291dHB1dChnaSwgdmFsdWUpOwog fQogRVhQT1JUX1NZTUJPTChncGlvX2RpcmVjdGlvbl9vdXRwdXQpOwogCitzdGF0aWMgaW50IGdw aW9pbmZvX2RpcmVjdGlvbl9hY3RpdmUoc3RydWN0IGdwaW9faW5mbyAqZ2ksIGJvb2wgdmFsdWUp Cit7CisJcmV0dXJuIGdwaW9pbmZvX2RpcmVjdGlvbl9vdXRwdXQoZ2ksIGdwaW9fYWRqdXN0X3Zh bHVlKGdpLCB2YWx1ZSkpOworfQorCiBpbnQgZ3Bpb19kaXJlY3Rpb25fYWN0aXZlKHVuc2lnbmVk IGdwaW8sIGJvb2wgdmFsdWUpCiB7CiAJc3RydWN0IGdwaW9faW5mbyAqZ2kgPSBncGlvX3RvX2Rl c2MoZ3Bpbyk7CkBAIC0xOTEsMTAgKzIzMSwxOSBAQCBpbnQgZ3Bpb19kaXJlY3Rpb25fYWN0aXZl KHVuc2lnbmVkIGdwaW8sIGJvb2wgdmFsdWUpCiAJaWYgKCFnaSkKIAkJcmV0dXJuIC1FTk9ERVY7 CiAKLQlyZXR1cm4gZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGdwaW8sIGdwaW9fYWRqdXN0X3ZhbHVl KGdpLCB2YWx1ZSkpOworCXJldHVybiBncGlvaW5mb19kaXJlY3Rpb25fYWN0aXZlKGdpLCB2YWx1 ZSk7CiB9CiBFWFBPUlRfU1lNQk9MKGdwaW9fZGlyZWN0aW9uX2FjdGl2ZSk7CiAKK3N0YXRpYyBp bnQgZ3Bpb2luZm9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2luZm8gKmdpKQoreworCWlm ICghZ2ktPmNoaXAtPm9wcy0+ZGlyZWN0aW9uX2lucHV0KQorCQlyZXR1cm4gLUVOT1NZUzsKKwor CXJldHVybiBnaS0+Y2hpcC0+b3BzLT5kaXJlY3Rpb25faW5wdXQoZ2ktPmNoaXAsCisJCQkJCSAg ICAgIGdwaW9pbmZvX2NoaXBfb2Zmc2V0KGdpKSk7Cit9CisKIGludCBncGlvX2RpcmVjdGlvbl9p bnB1dCh1bnNpZ25lZCBncGlvKQogewogCXN0cnVjdCBncGlvX2luZm8gKmdpID0gZ3Bpb190b19k ZXNjKGdwaW8pOwpAQCAtMjA3LDIyICsyNTYsMTQgQEAgaW50IGdwaW9fZGlyZWN0aW9uX2lucHV0 KHVuc2lnbmVkIGdwaW8pCiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlmICghZ2ktPmNo aXAtPm9wcy0+ZGlyZWN0aW9uX2lucHV0KQotCQlyZXR1cm4gLUVOT1NZUzsKLQlyZXR1cm4gZ2kt PmNoaXAtPm9wcy0+ZGlyZWN0aW9uX2lucHV0KGdpLT5jaGlwLCBncGlvIC0gZ2ktPmNoaXAtPmJh c2UpOworCXJldHVybiBncGlvaW5mb19kaXJlY3Rpb25faW5wdXQoZ2kpOwogfQogRVhQT1JUX1NZ TUJPTChncGlvX2RpcmVjdGlvbl9pbnB1dCk7CiAKLS8qKgotICogZ3Bpb19yZXF1ZXN0X29uZSAt IHJlcXVlc3QgYSBzaW5nbGUgR1BJTyB3aXRoIGluaXRpYWwgY29uZmlndXJhdGlvbgotICogQGdw aW86CXRoZSBHUElPIG51bWJlcgotICogQGZsYWdzOglHUElPIGNvbmZpZ3VyYXRpb24gYXMgc3Bl Y2lmaWVkIGJ5IEdQSU9GXyoKLSAqIEBsYWJlbDoJYSBsaXRlcmFsIGRlc2NyaXB0aW9uIHN0cmlu ZyBvZiB0aGlzIEdQSU8KLSAqLwotaW50IGdwaW9fcmVxdWVzdF9vbmUodW5zaWduZWQgZ3Bpbywg dW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqbGFiZWwpCitzdGF0aWMgaW50IGdwaW9p bmZvX3JlcXVlc3Rfb25lKHN0cnVjdCBncGlvX2luZm8gKmdpLCB1bnNpZ25lZCBsb25nIGZsYWdz LAorCQkJCWNvbnN0IGNoYXIgKmxhYmVsKQogewogCWludCBlcnI7Ci0Jc3RydWN0IGdwaW9faW5m byAqZ2kgPSBncGlvX3RvX2Rlc2MoZ3Bpbyk7CiAKIAkvKgogCSAqIE5vdCBhbGwgb2YgdGhlIGZs YWdzIGJlbG93IGFyZSBtdWxpdC1iaXQsIGJ1dCwgZm9yIHRoZSBzYWtlCkBAIC0yMzQsMjQgKzI3 NSw0MCBAQCBpbnQgZ3Bpb19yZXF1ZXN0X29uZSh1bnNpZ25lZCBncGlvLCB1bnNpZ25lZCBsb25n IGZsYWdzLCBjb25zdCBjaGFyICpsYWJlbCkKIAljb25zdCBib29sIGluaXRfYWN0aXZlID0gKGZs YWdzICYgR1BJT0ZfSU5JVF9BQ1RJVkUpID09IEdQSU9GX0lOSVRfQUNUSVZFOwogCWNvbnN0IGJv b2wgaW5pdF9oaWdoICAgPSAoZmxhZ3MgJiBHUElPRl9JTklUX0hJR0gpID09IEdQSU9GX0lOSVRf SElHSDsKIAotCWVyciA9IGdwaW9fcmVxdWVzdChncGlvLCBsYWJlbCk7CisJZXJyID0gZ3Bpb2lu Zm9fcmVxdWVzdChnaSwgbGFiZWwpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKIAlnaS0+ YWN0aXZlX2xvdyA9IGFjdGl2ZV9sb3c7CiAKIAlpZiAoZGlyX2luKQotCQllcnIgPSBncGlvX2Rp cmVjdGlvbl9pbnB1dChncGlvKTsKKwkJZXJyID0gZ3Bpb2luZm9fZGlyZWN0aW9uX2lucHV0KGdp KTsKIAllbHNlIGlmIChsb2dpY2FsKQotCQllcnIgPSBncGlvX2RpcmVjdGlvbl9hY3RpdmUoZ3Bp bywgaW5pdF9hY3RpdmUpOworCQllcnIgPSBncGlvaW5mb19kaXJlY3Rpb25fYWN0aXZlKGdpLCBp bml0X2FjdGl2ZSk7CiAJZWxzZQotCQllcnIgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoZ3Bpbywg aW5pdF9oaWdoKTsKKwkJZXJyID0gZ3Bpb2luZm9fZGlyZWN0aW9uX291dHB1dChnaSwgaW5pdF9o aWdoKTsKIAogCWlmIChlcnIpCi0JCWdwaW9fZnJlZShncGlvKTsKKwkJZ3Bpb2luZm9fZnJlZShn aSk7CiAKIAlyZXR1cm4gZXJyOwogfQorCisvKioKKyAqIGdwaW9fcmVxdWVzdF9vbmUgLSByZXF1 ZXN0IGEgc2luZ2xlIEdQSU8gd2l0aCBpbml0aWFsIGNvbmZpZ3VyYXRpb24KKyAqIEBncGlvOgl0 aGUgR1BJTyBudW1iZXIKKyAqIEBmbGFnczoJR1BJTyBjb25maWd1cmF0aW9uIGFzIHNwZWNpZmll ZCBieSBHUElPRl8qCisgKiBAbGFiZWw6CWEgbGl0ZXJhbCBkZXNjcmlwdGlvbiBzdHJpbmcgb2Yg dGhpcyBHUElPCisgKi8KK2ludCBncGlvX3JlcXVlc3Rfb25lKHVuc2lnbmVkIGdwaW8sIHVuc2ln bmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmxhYmVsKQoreworCXN0cnVjdCBncGlvX2luZm8g KmdpID0gZ3Bpb190b19kZXNjKGdwaW8pOworCisJaWYgKCFnaSkKKwkJcmV0dXJuIC1FTk9ERVY7 CisKKwlyZXR1cm4gZ3Bpb2luZm9fcmVxdWVzdF9vbmUoZ2ksIGZsYWdzLCBsYWJlbCk7Cit9CiBF WFBPUlRfU1lNQk9MX0dQTChncGlvX3JlcXVlc3Rfb25lKTsKIAogLyoqCi0tIAoyLjExLjAKCgpf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpiYXJlYm94IG1h aWxpbmcgbGlzdApiYXJlYm94QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJh ZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9iYXJlYm94Cg==