I2luY2x1ZGUgPENvcHlyaWdodC5oPgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3RTeXNDdHJsLmMKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIEFQSSBkZWZpbml0aW9ucyBmb3Igc3lzdGVtIGdsb2JhbCBjb250cm9sLgoqCiogREVQRU5ERU5DSUVTOgoqCiogRklMRSBSRVZJU0lPTiBOVU1CRVI6CiogICAgICAgJFJldmlzaW9uOiA1ICQKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDxtc0FwaS5oPgojaW5jbHVkZSA8Z3RId0NudGwuaD4KI2luY2x1ZGUgPGd0RHJ2U3dSZWdzLmg+CiNpbmNsdWRlIDxndFNlbS5oPgoKc3RhdGljIEdUX1NUQVRVUyB3cml0ZVN3aXRjaE1hY1JlZwooCiAgICBJTiBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOIEdUX0VUSEVSQUREUiAqbWFjCik7CgpzdGF0aWMgR1RfU1RBVFVTIHJlYWRTd2l0Y2hNYWNSZWcKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgT1VUIEdUX0VUSEVSQUREUiAqbWFjCik7CgpzdGF0aWMgR1RfU1RBVFVTIHdyaXRlRGlmZk1BQwooCiAgICBJTiBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOIEdUX1UxNgkJZGlmZkFkZHIKKTsKCnN0YXRpYyBHVF9TVEFUVVMgcmVhZERpZmZNQUMKKAogICAgSU4gIEdUX1FEX0RFVgkqZGV2LAogICAgT1VUIEdUX1UxNgkJKmRpZmZBZGRyCik7CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU3dSZXNldAoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyByb3V0aW5lIHByZWZvcm1zIHN3aXRjaCBzb2Z0d2FyZSByZXNldC4KKgoqIElOUFVUUzoKKiAgICAgICBOb25lLgoqCiogT1VUUFVUUzoKKiAgICAgICBOb25lLgoqCiogUkVUVVJOUzoKKiAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqCiogQ09NTUVOVFM6CiogICAgICAgTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1N3UmVzZXQKKAogICAgSU4gIEdUX1FEX0RFViAqZGV2CikKewogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBVc2VkIHRvIHBvbGwgdGhlIFNXUmVzZXQgYml0ICovCiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KCUdUX1U4CQkJcmVnT2Zmc2V0OwoKICAgIERCR19JTkZPKCgiZ3N5c1N3UmVzZXQgQ2FsbGVkLlxuIikpOwoKICAgIC8qIFNldCB0aGUgU29mdHdhcmUgcmVzZXQgYml0LiAgICAgICAgICAgICAgICAgICovCglpZiAoSVNfSU5fREVWX0dST1VQKGRldixERVZfR0lHQUJJVF9TV0lUQ0gpKQoJewoJCXJlZ09mZnNldCA9IFFEX1JFR19HTE9CQUxfQ09OVFJPTDsKCX0KCWVsc2UKCXsKCQlyZWdPZmZzZXQgPSBRRF9SRUdfQVRVX0NPTlRST0w7Cgl9CgogICAgcmV0VmFsID0gaHdTZXRHbG9iYWxSZWdGaWVsZChkZXYscmVnT2Zmc2V0LDE1LDEsMSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICAvKiBNYWtlIHN1cmUgdGhlIHJlc2V0IG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQuICAqLwogICAgZGF0YSA9IDE7CiAgICB3aGlsZShkYXRhICE9IDApCiAgICB7CiAgIAkgICAgcmV0VmFsID0gaHdHZXRHbG9iYWxSZWdGaWVsZChkZXYscmVnT2Zmc2V0LDE1LDEsJmRhdGEpOwoKICAgICAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICAgICAgewogICAgICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgICAgICB9CiAgICB9CgkKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldFBQVUVuCioKKiBERVNDUklQVElPTjoKKgkJVGhpcyByb3V0aW5lIGVuYWJsZXMvZGlzYWJsZXMgUGh5IFBvbGxpbmcgVW5pdC4KKgoqIElOUFVUUzoKKgkJZW4gLSBHVF9UUlVFIHRvIGVuYWJsZSBQUFUsIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIE9VVFBVVFM6CioJCU5vbmUuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRQUFVFbgooCglJTiBHVF9RRF9ERVYJKmRldiwKCUlOIEdUX0JPT0wgCQllbgopCnsKCUdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwoJR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBEYXRhIHRvIGJlIHNldCBpbnRvIHRoZSAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIuICAgICAgICAgICAgICAgICAgICAqLwoJREJHX0lORk8oKCJnc3lzU2V0UFBVRW4gQ2FsbGVkLlxuIikpOwoKCS8qIE9ubHkgR2lnYWJpdCBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0dJR0FCSVRfU1dJVENIKSkKCXsKCQlEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKCX0KCglpZiAoSVNfSU5fREVWX0dST1VQKGRldixERVZfUFBVX1JFQURfT05MWSkpCgl7CgkJREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7Cgl9CgoJQk9PTF8yX0JJVChlbixkYXRhKTsKCgkvKiBTZXQgdGhlIFBQVUVuIGJpdC4gICAgICAgICAgICAgICAgKi8KCXJldFZhbCA9IGh3U2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19HTE9CQUxfQ09OVFJPTCwxNCwxLGRhdGEpOwoJaWYocmV0VmFsICE9IEdUX09LKQoJewoJCURCR19JTkZPKCgiRmFpbGVkLlxuIikpOwoJCXJldHVybiByZXRWYWw7Cgl9CgkKCURCR19JTkZPKCgiT0suXG4iKSk7CglyZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldFBQVUVuCioKKiBERVNDUklQVElPTjoKKgkJVGhpcyByb3V0aW5lIGdldCB0aGUgUFBVIHN0YXRlLgoqCiogSU5QVVRTOgoqCQlOb25lLgoqCiogT1VUUFVUUzoKKgkJZW4gLSBHVF9UUlVFIGlmIFBQVSBpcyBlbmFibGVkLCBHVF9GQUxTRSBvdGhlcndpc2UuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgICAgICAgICAgLSBvbiBzdWNjZXNzCioJCUdUX0JBRF9QQVJBTSAgICAtIG9uIGJhZCBwYXJhbWV0ZXIKKgkJR1RfRkFJTCAgICAgICAgIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRQUFVFbgooCglJTiAgR1RfUURfREVWCSpkZXYsCglPVVQgR1RfQk9PTCAgCSplbgopCnsKCUdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwoJR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCgoJREJHX0lORk8oKCJnc3lzR2V0UFBVRW4gQ2FsbGVkLlxuIikpOwoJLyogT25seSBHaWdhYml0IFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfR0lHQUJJVF9TV0lUQ0gpKQoJewoJCURCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwoJfQoKCWlmIChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9QUFVfUkVBRF9PTkxZKSkKCXsKCQlEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKCX0KCglpZihlbiA9PSBOVUxMKQoJewoJCURCR19JTkZPKCgiRmFpbGVkLlxuIikpOwoJCXJldHVybiBHVF9CQURfUEFSQU07Cgl9CgoJLyogR2V0IHRoZSBHZXRQUFVFbiBiaXQuICAgICAgICAgICAgICAgICovCglyZXRWYWwgPSBod0dldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfR0xPQkFMX0NPTlRST0wsMTQsMSwmZGF0YSk7CglpZihyZXRWYWwgIT0gR1RfT0spCgl7CgkJREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CgkJcmV0dXJuIHJldFZhbDsKCX0KCglCSVRfMl9CT09MKGRhdGEsKmVuKTsKCURCR19JTkZPKCgiT0suXG4iKSk7CgoJcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXREaXNjYXJkRXhjZXNzaXZlCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIHJvdXRpbmUgc2V0IHRoZSBEaXNjYXJkIEV4Y2Vzc2l2ZSBzdGF0ZS4KKgoqIElOUFVUUzoKKiAgICAgICBlbiAtIEdUX1RSVUUgRGlzY2FyZCBpcyBlbmFibGVkLCBHVF9GQUxTRSBvdGhlcndpc2UuCioKKiBPVVRQVVRTOgoqICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCioKKiBDT01NRU5UUzoKKiAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0RGlzY2FyZEV4Y2Vzc2l2ZQooCiAgICBJTiAgR1RfUURfREVWICpkZXYsCiAgICBJTiBHVF9CT09MIGVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIERhdGEgdG8gYmUgc2V0IGludG8gdGhlICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIuICAgICAgICAgICAgICAgICAgICAqLwogICAgREJHX0lORk8oKCJnc3lzU2V0RGlzY2FyZEV4Y2Vzc2l2ZSBDYWxsZWQuXG4iKSk7CiAgICBCT09MXzJfQklUKGVuLGRhdGEpOwoKICAgIC8qIFNldCB0aGUgRGlzY2FyZCBFeGlzc2l2ZSBiaXQuICAgICAgICAgICAgICAgICovCiAgICByZXRWYWwgPSBod1NldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfR0xPQkFMX0NPTlRST0wsMTMsMSxkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0RGlzY2FyZEV4Y2Vzc2l2ZQoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyByb3V0aW5lIGdldCB0aGUgRGlzY2FyZCBFeGNlc3NpdmUgc3RhdGUuCioKKiBJTlBVVFM6CiogICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgZW4gLSBHVF9UUlVFIERpc2NhcmQgaXMgZW5hYmxlZCwgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogUkVUVVJOUzoKKiAgICAgICBHVF9PSyAgICAgICAgICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfQkFEX1BBUkFNICAgIC0gb24gYmFkIHBhcmFtZXRlcgoqICAgICAgIEdUX0ZBSUwgICAgICAgICAtIG9uIGVycm9yCioKKiBDT01NRU5UUzoKKiAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0RGlzY2FyZEV4Y2Vzc2l2ZQooCiAgICBJTiAgR1RfUURfREVWICpkZXYsCiAgICBJTiBHVF9CT09MICAgICplbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCgogICAgREJHX0lORk8oKCJnc3lzR2V0RGlzY2FyZEV4Y2Vzc2l2ZSBDYWxsZWQuXG4iKSk7CiAgICBpZihlbiA9PSBOVUxMKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiBHVF9CQURfUEFSQU07CiAgICB9CgogICAgLyogR2V0IHRoZSBEaXNjYXJkIEV4aXNzaXZlIGJpdC4gICAgICAgICAgICAgICAgKi8KICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19HTE9CQUxfQ09OVFJPTCwxMywxLCZkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIEJJVF8yX0JPT0woZGF0YSwqZW4pOwogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRTY2hlZHVsaW5nTW9kZQoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyByb3V0aW5lIHNldCB0aGUgU2NoZWR1bGluZyBNb2RlLgoqCiogSU5QVVRTOgoqICAgICAgIG1vZGUgLSBHVF9UUlVFIHdyciwgR1RfRkFMU0Ugc3RyaWN0LgoqCiogT1VUUFVUUzoKKiAgICAgICBOb25lLgoqCiogUkVUVVJOUzoKKiAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqCiogQ09NTUVOVFM6CiogICAgICAgTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldFNjaGVkdWxpbmdNb2RlCigKICAgIElOICBHVF9RRF9ERVYgKmRldiwKICAgIElOIEdUX0JPT0wgICAgbW9kZQopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBEYXRhIHRvIGJlIHNldCBpbnRvIHRoZSAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyLiAgICAgICAgICAgICAgICAgICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c1NldFNjaGVkdWxpbmdNb2RlIENhbGxlZC5cbiIpKTsKCglpZiAoSVNfSU5fREVWX0dST1VQKGRldixERVZfUE9SVF9NSVhFRF9TQ0hFRFVMRSkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgQk9PTF8yX0JJVChtb2RlLGRhdGEpOwogICAgZGF0YSA9IDEgLSBkYXRhOwoKICAgIC8qIFNldCB0aGUgU2NoZWNkdWxpbmcgYml0LiAgICAgICAgICAgICAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MLDExLDEsZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldFNjaGVkdWxpbmdNb2RlCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIHJvdXRpbmUgZ2V0IHRoZSBTY2hlZHVsaW5nIE1vZGUuCioKKiBJTlBVVFM6CiogICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgbW9kZSAtIEdUX1RSVUUgd3JyLCBHVF9GQUxTRSBzdHJpY3QuCioKKiBSRVRVUk5TOgoqICAgICAgIEdUX09LICAgICAgICAgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICBHVF9CQURfUEFSQU0gICAgLSBvbiBiYWQgcGFyYW1ldGVyCiogICAgICAgR1RfRkFJTCAgICAgICAgIC0gb24gZXJyb3IKKgoqIENPTU1FTlRTOgoqICAgICAgIE5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRTY2hlZHVsaW5nTW9kZQooCiAgICBJTiAgR1RfUURfREVWICpkZXYsCiAgICBPVVQgR1RfQk9PTCAgICptb2RlCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNHZXRTY2hlZHVsaW5nTW9kZSBDYWxsZWQuXG4iKSk7CgoJaWYgKElTX0lOX0RFVl9HUk9VUChkZXYsIERFVl9QT1JUX01JWEVEX1NDSEVEVUxFKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBpZihtb2RlID09IE5VTEwpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKICAgIH0KICAgIC8qIEdldCB0aGUgU2NoZWR1bGluZyBiaXQuICAgICAgICAgICAgICAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MLDExLDEsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgQklUXzJfQk9PTCgxIC0gZGF0YSwqbW9kZSk7CiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldE1heEZyYW1lU2l6ZQoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyByb3V0aW5lIFNldCB0aGUgbWF4IGZyYW1lIHNpemUgYWxsb3dlZC4KKgoqIElOUFVUUzoKKiAgICAgICBtb2RlIC0gR1RfVFJVRSBtYXggc2l6ZSAxNTIyLCAKKgkJCSAgIEdUX0ZBTFNFIG1heCBzaXplIDE1MzUsIDE2MzIsIG9yIDIwNDguCioKKiBPVVRQVVRTOgoqICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqCQlQbGVhc2UgcmVmZXIgdG8gdGhlIGRldmljZSBzcGVjLiB0byBnZXQgdGhlIG1heCBmcmFtZSBzaXplLgoqICAgICAgIDg4RTYwOTUgZGV2aWNlIHN1cHBvcnRzIHVwdG8gMTYzMi4gCiogICAgICAgODhFNjA2NS84OEU2MDYxIGRldmljZXMgc3VwcG9ydCB1cHRvIDIwNDguIAoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0TWF4RnJhbWVTaXplCigKICAgIElOICBHVF9RRF9ERVYgKmRldiwKICAgIElOICBHVF9CT09MICAgbW9kZQopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBEYXRhIHRvIGJlIHNldCBpbnRvIHRoZSAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyLiAgICAgICAgICAgICAgICAgICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c1NldE1heEZyYW1lU2l6ZSBDYWxsZWQuXG4iKSk7CgoJaWYgKElTX0lOX0RFVl9HUk9VUChkZXYsREVWX0pVTUJPX01PREUpKQoJewoJCURCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwoJfQoKICAgIEJPT0xfMl9CSVQobW9kZSxkYXRhKTsKICAgIGRhdGEgPSAxIC0gZGF0YTsKCiAgICAvKiBTZXQgdGhlIE1heCBGcmFtIFNpemUgYml0LiAgICAgICAgICAgICAgICovCiAgICByZXRWYWwgPSBod1NldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfR0xPQkFMX0NPTlRST0wsMTAsMSxkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRNYXhGcmFtZVNpemUKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgcm91dGluZSBHZXQgdGhlIG1heCBmcmFtZSBzaXplIGFsbG93ZWQuCioKKiBJTlBVVFM6CiogICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgbW9kZSAtIEdUX1RSVUUgbWF4IHNpemUgMTUyMiwgCioJCQkgICBHVF9GQUxTRSBtYXggc2l6ZSAxNTM1LCAxNjMyLCBvciAyMDQ4LgoqCiogUkVUVVJOUzoKKiAgICAgICBHVF9PSyAgICAgICAgICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfQkFEX1BBUkFNICAgIC0gb24gYmFkIHBhcmFtZXRlcgoqICAgICAgIEdUX0ZBSUwgICAgICAgICAtIG9uIGVycm9yCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqCQlQbGVhc2UgcmVmZXIgdG8gdGhlIGRldmljZSBzcGVjLiB0byBnZXQgdGhlIG1heCBmcmFtZSBzaXplLgoqICAgICAgIDg4RTYwOTUgZGV2aWNlIHN1cHBvcnRzIHVwdG8gMTYzMi4KKiAgICAgICA4OEU2MDY1Lzg4RTYwNjEgZGV2aWNlcyBzdXBwb3J0IHVwdG8gMjA0OC4gCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRNYXhGcmFtZVNpemUKKAogICAgSU4gIEdUX1FEX0RFViAqZGV2LAogICAgT1VUIEdUX0JPT0wgICAqbW9kZQopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCgogICAgREJHX0lORk8oKCJnc3lzR2V0TWF4RnJhbWVTaXplIENhbGxlZC5cbiIpKTsKICAgIGlmKG1vZGUgPT0gTlVMTCkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gR1RfQkFEX1BBUkFNOwogICAgfQoKCWlmIChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9KVU1CT19NT0RFKSkKCXsKCQlEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKCX0KCiAgICAvKiBHZXQgdGhlIE1heCBGcmFtZSBTaXplIGJpdC4gICAgICAgICAgKi8KICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19HTE9CQUxfQ09OVFJPTCwxMCwxLCZkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIEJJVF8yX0JPT0woMSAtIGRhdGEsKm1vZGUpOwogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNSZUxvYWQKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgcm91dGluZSBjYXVzZSB0byB0aGUgc3dpdGNoIHRvIHJlbG9hZCB0aGUgRUVQUk9NLgoqCiogSU5QVVRTOgoqICAgICAgIE5vbmUuCioKKiBPVVRQVVRTOgoqICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCioKKiBDT01NRU5UUzoKKiAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzUmVMb2FkCigKICAgIElOICBHVF9RRF9ERVYgKmRldgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c1JlTG9hZCBDYWxsZWQuXG4iKSk7CiAgICAvKiBTZXQgdGhlIFJlbG9hZCBiaXQuICAgICAgICAgICAgICAgICAgKi8KICAgIHJldFZhbCA9IGh3U2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19HTE9CQUxfQ09OVFJPTCw5LDEsMSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICAvKiBTaG91bGQgYSBjaGVjayBmb3IgcmVsb2FkIGNvbXBsZXRpb24uICovCgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRXYXRjaERvZwoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyByb3V0aW5lIFNldCB0aGUgdGhlIHdhdGNoIGRvZyBtb2RlLgoqCiogSU5QVVRTOgoqICAgICAgIGVuIC0gR1RfVFJVRSBlbmFibGVzLCBHVF9GQUxTRSBkaXNhYmxlLgoqCiogT1VUUFVUUzoKKiAgICAgICBOb25lLgoqCiogUkVUVVJOUzoKKiAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqCiogQ09NTUVOVFM6CiogICAgICAgTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldFdhdGNoRG9nCigKICAgIElOICBHVF9RRF9ERVYgKmRldiwKICAgIElOICBHVF9CT09MICAgZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogRGF0YSB0byBiZSBzZXQgaW50byB0aGUgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3Rlci4gICAgICAgICAgICAgICAgICAgICovCiAgICBEQkdfSU5GTygoImdzeXNTZXRXYXRjaERvZyBDYWxsZWQuXG4iKSk7CgoJLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gKi8KCWlmIChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9FTkhBTkNFRF9GRV9TV0lUQ0h8REVWX1dBVENIRE9HX0VWRU5UKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBCT09MXzJfQklUKGVuLGRhdGEpOwoKICAgIC8qIFNldCB0aGUgV2F0Y2hEb2cgYml0LiAgICAgICAgICAgICovCiAgICByZXRWYWwgPSBod1NldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfR0xPQkFMX0NPTlRST0wsNywxLGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRXYXRjaERvZwoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyByb3V0aW5lIEdldCB0aGUgdGhlIHdhdGNoIGRvZyBtb2RlLgoqCiogSU5QVVRTOgoqICAgICAgIE5vbmUuCioKKiBPVVRQVVRTOgoqICAgICAgIGVuIC0gR1RfVFJVRSBlbmFibGVzLCBHVF9GQUxTRSBkaXNhYmxlLgoqCiogUkVUVVJOUzoKKiAgICAgICBHVF9PSyAgICAgICAgICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfQkFEX1BBUkFNICAgIC0gb24gYmFkIHBhcmFtZXRlcgoqICAgICAgIEdUX0ZBSUwgICAgICAgICAtIG9uIGVycm9yCioKKiBDT01NRU5UUzoKKiAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0V2F0Y2hEb2cKKAogICAgSU4gIEdUX1FEX0RFViAqZGV2LAogICAgT1VUIEdUX0JPT0wgICAqZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c0dldFdhdGNoRG9nIENhbGxlZC5cbiIpKTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwoJaWYgKElTX0lOX0RFVl9HUk9VUChkZXYsREVWX0VOSEFOQ0VEX0ZFX1NXSVRDSCkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgaWYoZW4gPT0gTlVMTCkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gR1RfQkFEX1BBUkFNOwogICAgfQoKICAgIC8qIEdldCB0aGUgV2F0Y2hEb2cgYml0LiAgICAgICAgICAgICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfR0xPQkFMX0NPTlRST0wsNywxLCZkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIEJJVF8yX0JPT0woZGF0YSwqZW4pOwogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldER1cGxleFBhdXNlTWFjCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIHJvdXRpbmUgc2V0cyB0aGUgZnVsbCBkdXBsZXggcGF1c2Ugc3JjIE1hYyBBZGRyZXNzLgoqCQlNQUMgYWRkcmVzcyBzaG91bGQgYmUgYW4gVW5pY2FzdCBhZGRyZXNzLgoqCQlGb3IgZGlmZmVyZW50IE1BQyBBZGRyZXNzZXMgcGVyIHBvcnQgb3BlcmF0aW9uLCAKKgkJdXNlIGdzeXNTZXRQZXJQb3J0RHVwbGV4UGF1c2VNYWMgQVBJLgoqCiogSU5QVVRTOgoqICAgICAgIG1hYyAtIFRoZSBNYWMgYWRkcmVzcyB0byBiZSBzZXQuCioKKiBPVVRQVVRTOgoqICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgIEdUX09LICAgICAgICAgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICBHVF9CQURfUEFSQU0gICAgLSBvbiBiYWQgcGFyYW1ldGVyCiogICAgICAgR1RfRkFJTCAgICAgICAgIC0gb24gZXJyb3IKKgoqIENPTU1FTlRTOgoqICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXREdXBsZXhQYXVzZU1hYwooCiAgICBJTiBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOIEdUX0VUSEVSQUREUiAqbWFjCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIERhdGEgdG8gYmUgc2V0IGludG8gdGhlICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIuICAgICAgICAgICAgICAgICAgICAqLwogICAgREJHX0lORk8oKCJnc3lzU2V0RHVwbGV4UGF1c2VNYWMgQ2FsbGVkLlxuIikpOwogICAgaWYobWFjID09IE5VTEwpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKICAgIH0KCgkvKiBpZiB0aGUgZGV2aWNlIGhhcyBTd2l0Y2ggTUFDIFJlZ2lzdGVyLCB3ZSBuZWVkIHRoZSBzcGVjaWFsIG9wZXJhdGlvbiAqLwoJaWYgKElTX0lOX0RFVl9HUk9VUChkZXYsREVWX1NXSVRDSF9NQUNfUkVHKSkKICAgIHsKCQlyZXR1cm4gd3JpdGVTd2l0Y2hNYWNSZWcoZGV2LG1hYyk7CiAgICB9CgogICAgLyogU2V0IHRoZSBmaXJzdCBNYWMgcmVnaXN0ZXIgd2l0aCBkaWZmQWRkciBiaXQgcmVzZXQuICAqLwogICAgZGF0YSA9ICgoKCptYWMpLmFyRXRoZXJbMF0gJiAweEZFKSA8PCA4KSB8ICgqbWFjKS5hckV0aGVyWzFdOwogICAgcmV0VmFsID0gaHdXcml0ZUdsb2JhbFJlZyhkZXYsUURfUkVHX01BQ0FERFJfMDEsZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICAvKiBTZXQgdGhlIE1hYzIzIGFkZHJlc3MgcmVnaXN0ZXIuICAgKi8KICAgIGRhdGEgPSAoKCptYWMpLmFyRXRoZXJbMl0gPDwgOCkgfCAoKm1hYykuYXJFdGhlclszXTsKICAgIHJldFZhbCA9IGh3V3JpdGVHbG9iYWxSZWcoZGV2LFFEX1JFR19NQUNBRERSXzIzLGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgLyogU2V0IHRoZSBNYWM0NSBhZGRyZXNzIHJlZ2lzdGVyLiAgICovCiAgICBkYXRhID0gKCgqbWFjKS5hckV0aGVyWzRdIDw8IDgpIHwgKCptYWMpLmFyRXRoZXJbNV07CiAgICByZXRWYWwgPSBod1dyaXRlR2xvYmFsUmVnKGRldixRRF9SRUdfTUFDQUREUl80NSxkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldER1cGxleFBhdXNlTWFjCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIHJvdXRpbmUgR2V0cyB0aGUgZnVsbCBkdXBsZXggcGF1c2Ugc3JjIE1hYyBBZGRyZXNzLgoqCQlGb3IgZGlmZmVyZW50IE1BQyBBZGRyZXNzZXMgcGVyIHBvcnQgb3BlcmF0aW9uLCAKKgkJdXNlIGdzeXNHZXRQZXJQb3J0RHVwbGV4UGF1c2VNYWMgQVBJLgoqCiogSU5QVVRTOgoqICAgICAgIE5vbmUuCioKKiBPVVRQVVRTOgoqICAgICAgIG1hYyAtIHRoZSBNYWMgYWRkcmVzcy4KKgoqIFJFVFVSTlM6CiogICAgICAgR1RfT0sgICAgICAgICAgIC0gb24gc3VjY2VzcwoqICAgICAgIEdUX0JBRF9QQVJBTSAgICAtIG9uIGJhZCBwYXJhbWV0ZXIKKiAgICAgICBHVF9GQUlMICAgICAgICAgLSBvbiBlcnJvcgoqCiogQ09NTUVOVFM6CiogICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldER1cGxleFBhdXNlTWFjCigKICAgIElOICBHVF9RRF9ERVYgICAgKmRldiwKICAgIE9VVCBHVF9FVEhFUkFERFIgKm1hYwopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBEYXRhIHRvIHJlYWQgZnJvbSByZWdpc3Rlci4gICovCgogICAgREJHX0lORk8oKCJnc3lzR2V0RHVwbGV4UGF1c2VNYWMgQ2FsbGVkLlxuIikpOwogICAgaWYobWFjID09IE5VTEwpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKICAgIH0KCgkvKiBpZiB0aGUgZGV2aWNlIGhhcyBTd2l0Y2ggTUFDIFJlZ2lzdGVyLCB3ZSBuZWVkIHRoZSBzcGVjaWFsIG9wZXJhdGlvbiAqLwoJaWYgKElTX0lOX0RFVl9HUk9VUChkZXYsREVWX1NXSVRDSF9NQUNfUkVHKSkKICAgIHsKCQlyZXR1cm4gcmVhZFN3aXRjaE1hY1JlZyhkZXYsbWFjKTsKICAgIH0KCiAgICAvKiBHZXQgdGhlIE1hYzAxIHJlZ2lzdGVyLiAgICAgICovCiAgICByZXRWYWwgPSBod1JlYWRHbG9iYWxSZWcoZGV2LFFEX1JFR19NQUNBRERSXzAxLCZkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQojaWYgMAkvKiBUaGlzIHNob3VsZCBiZSBhbHdheXMgYSB1bmljYXN0LiAqLwogICAgLyogVGhlIG1hYyBpcyBhbGx3YXN5IGEgbXVsdGljYXN0IG1hYyAgICovCiAgICAoKm1hYykuYXJFdGhlclswXSA9IChkYXRhID4+IDgpIHwgMHgwMTsKICAgICgqbWFjKS5hckV0aGVyWzFdID0gZGF0YSAmIDB4RkY7CiNlbHNlCiAgICAoKm1hYykuYXJFdGhlclswXSA9IChkYXRhID4+IDgpICYgfjB4MDE7CiAgICAoKm1hYykuYXJFdGhlclsxXSA9IGRhdGEgJiAweEZGOwojZW5kaWYKICAgIC8qIEdldCB0aGUgTWFjMjMgcmVnaXN0ZXIuICAgICAgKi8KICAgIHJldFZhbCA9IGh3UmVhZEdsb2JhbFJlZyhkZXYsUURfUkVHX01BQ0FERFJfMjMsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CiAgICAoKm1hYykuYXJFdGhlclsyXSA9IGRhdGEgPj4gODsKICAgICgqbWFjKS5hckV0aGVyWzNdID0gZGF0YSAmIDB4RkY7CgogICAgLyogR2V0IHRoZSBNYWM0NSByZWdpc3Rlci4gICAgICAqLwogICAgcmV0VmFsID0gaHdSZWFkR2xvYmFsUmVnKGRldixRRF9SRUdfTUFDQUREUl80NSwmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KICAgICgqbWFjKS5hckV0aGVyWzRdID0gZGF0YSA+PiA4OwogICAgKCptYWMpLmFyRXRoZXJbNV0gPSBkYXRhICYgMHhGRjsKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0UGVyUG9ydER1cGxleFBhdXNlTWFjCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIHJvdXRpbmUgc2V0cyB3aGV0aGVyIHRoZSBmdWxsIGR1cGxleCBwYXVzZSBzcmMgTWFjIEFkZHJlc3MgaXMgcGVyCiogICAgICAgcG9ydCBvciBwZXIgZGV2aWNlLgoqCiogSU5QVVRTOgoqICAgICAgIGVuIC0gR1RfVFVSRSBwZXIgcG9ydCBtYWMsIEdUX0ZBTFNFIGdsb2JhbCBtYWMuCioKKiBPVVRQVVRTOgoqICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCioKKiBDT01NRU5UUzoKKiAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0UGVyUG9ydER1cGxleFBhdXNlTWFjCigKICAgIElOIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gR1RfQk9PTCAgICAgIGVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIERhdGEgdG8gYmUgc2V0IGludG8gdGhlICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIuICAgICAgICAgICAgICAgICAgICAqLwogICAgREJHX0lORk8oKCJnc3lzU2V0UGVyUG9ydER1cGxleFBhdXNlTWFjIENhbGxlZC5cbiIpKTsKICAgIEJPT0xfMl9CSVQoZW4sZGF0YSk7CgoJLyogaWYgdGhlIGRldmljZSBoYXMgU3dpdGNoIE1BQyBSZWdpc3Rlciwgd2UgbmVlZCB0aGUgc3BlY2lhbCBvcGVyYXRpb24gKi8KCWlmIChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9TV0lUQ0hfTUFDX1JFRykpCiAgICB7CgkJcmV0VmFsID0gd3JpdGVEaWZmTUFDKGRldixkYXRhKTsKICAgIH0KCWVsc2UKCXsKICAgIAlyZXRWYWwgPSBod1NldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfTUFDQUREUl8wMSw4LDEsZGF0YSk7Cgl9CgogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldFBlclBvcnREdXBsZXhQYXVzZU1hYwoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyByb3V0aW5lIEdldHMgd2hldGhlciB0aGUgZnVsbCBkdXBsZXggcGF1c2Ugc3JjIE1hYyBBZGRyZXNzIGlzIHBlcgoqICAgICAgIHBvcnQgb3IgcGVyIGRldmljZS4KKgoqIElOUFVUUzoKKiAgICAgICBlbiAtIEdUX1RVUkUgcGVyIHBvcnQgbWFjLCBHVF9GQUxTRSBnbG9iYWwgbWFjLgoqCiogT1VUUFVUUzoKKiAgICAgICBOb25lLgoqCiogUkVUVVJOUzoKKiAgICAgICBHVF9PSyAgICAgICAgICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfQkFEX1BBUkFNICAgIC0gb24gYmFkIHBhcmFtZXRlcgoqICAgICAgIEdUX0ZBSUwgICAgICAgICAtIG9uIGVycm9yCioKKiBDT01NRU5UUzoKKiAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0UGVyUG9ydER1cGxleFBhdXNlTWFjCigKICAgIElOICBHVF9RRF9ERVYgICAgKmRldiwKICAgIE9VVCBHVF9CT09MICAgICAgKmVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNHZXRQZXJQb3J0RHVwbGV4UGF1c2VNYWMgQ2FsbGVkLlxuIikpOwogICAgaWYoZW4gPT0gTlVMTCkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gR1RfQkFEX1BBUkFNOwogICAgfQoKCS8qIGlmIHRoZSBkZXZpY2UgaGFzIFN3aXRjaCBNQUMgUmVnaXN0ZXIsIHdlIG5lZWQgdGhlIHNwZWNpYWwgb3BlcmF0aW9uICovCglpZiAoSVNfSU5fREVWX0dST1VQKGRldixERVZfU1dJVENIX01BQ19SRUcpKQogICAgewoJCXJldFZhbCA9IHJlYWREaWZmTUFDKGRldiwmZGF0YSk7CiAgICB9CgllbHNlCgl7CgkgICAgcmV0VmFsID0gaHdHZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX01BQ0FERFJfMDEsOCwxLCZkYXRhKTsKCX0KCiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBCSVRfMl9CT09MKGRhdGEsKmVuKTsKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1JlYWRNaWlSZWcKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgcm91dGluZSByZWFkcyBRdWFydGVyRGVjayBSZWdpc3RlcnMuIFNpbmNlIHRoaXMgcm91dGluZSBpcyBvbmx5IGZvcgoqCQlEaWFnbm9zdGljIFB1cnBvc2UsIG5vIGVycm9yIGNoZWNraW5nIHdpbGwgYmUgcGVyZm9ybWVkLgoqCQlVc2VyIGhhcyB0byBrbm93IHdoaWNoIHBoeSBhZGRyZXNzKDAgfiAweDFGKSB3aWxsIGJlIHJlYWQuCQkKKgoqIElOUFVUUzoKKiAgICAgICBwaHlBZGRyIC0gUGh5IEFkZHJlc3MgdG8gcmVhZCB0aGUgcmVnaXN0ZXIgZm9yLiggMCB+IDB4MUYgKQoqICAgICAgIHJlZ0FkZHIgLSBUaGUgcmVnaXN0ZXIncyBhZGRyZXNzLgoqCiogT1VUUFVUUzoKKiAgICAgICBkYXRhICAgIC0gVGhlIHJlYWQgcmVnaXN0ZXIncyBkYXRhLgoqCiogUkVUVVJOUzoKKiAgICAgICBHVF9PSyAgICAgICAgICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfRkFJTCAgICAgICAgIC0gb24gZXJyb3IKKgoqIENPTU1FTlRTOgoqICAgICAgIE5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNSZWFkTWlpUmVnCigKICAgIElOICBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOICBHVF9VMzIJICAgICBwaHlBZGRyLAogICAgSU4gIEdUX1UzMgkgICAgIHJlZ0FkZHIsCiAgICBPVVQgR1RfVTMyCSAgICAgKmRhdGEKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICB1MTZEYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c1JlYWRNaWlSZWdpc3RlciBDYWxsZWQuXG4iKSk7CgogICAgLyogR2V0IHRoZSByZWdpc3RlciBkYXRhICovCiAgICByZXRWYWwgPSBod1JlYWRNaWlSZWcoZGV2LChHVF9VOClwaHlBZGRyLChHVF9VOClyZWdBZGRyLCZ1MTZEYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKCSpkYXRhID0gKEdUX1UzMil1MTZEYXRhOwoKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzV3JpdGVNaWlSZWcKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgcm91dGluZSB3cml0ZXMgUXVhcnRlckRlY2sgUmVnaXN0ZXJzLiBTaW5jZSB0aGlzIHJvdXRpbmUgaXMgb25seSBmb3IKKgkJRGlhZ25vc3RpYyBQdXJwb3NlLCBubyBlcnJvciBjaGVja2luZyB3aWxsIGJlIHBlcmZvcm1lZC4KKgkJVXNlciBoYXMgdG8ga25vdyB3aGljaCBwaHkgYWRkcmVzcygwIH4gMHgxRikgd2lsbCBiZSByZWFkLgkJCioKKiBJTlBVVFM6CiogICAgICAgcGh5QWRkciAtIFBoeSBBZGRyZXNzIHRvIHJlYWQgdGhlIHJlZ2lzdGVyIGZvci4oIDAgfiAweDFGICkKKiAgICAgICByZWdBZGRyIC0gVGhlIHJlZ2lzdGVyJ3MgYWRkcmVzcy4KKgoqIE9VVFBVVFM6CiogICAgICAgZGF0YSAgICAtIFRoZSByZWFkIHJlZ2lzdGVyJ3MgZGF0YS4KKgoqIFJFVFVSTlM6CiogICAgICAgR1RfT0sgICAgICAgICAgIC0gb24gc3VjY2VzcwoqICAgICAgIEdUX0ZBSUwgICAgICAgICAtIG9uIGVycm9yCioKKiBDT01NRU5UUzoKKiAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzV3JpdGVNaWlSZWcKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gIEdUX1UzMgkgICAgIHBoeUFkZHIsCiAgICBJTiAgR1RfVTMyCSAgICAgcmVnQWRkciwKICAgIElOICBHVF9VMTYJICAgICBkYXRhCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICAKICAgIERCR19JTkZPKCgiZ3N5c1dyaXRlTWlpUmVnaXN0ZXIgQ2FsbGVkLlxuIikpOwoKICAgIC8qIFNldCB0aGUgcmVnaXN0ZXIgZGF0YSAqLwogICAgcmV0VmFsID0gaHdXcml0ZU1paVJlZyhkZXYsKEdUX1U4KXBoeUFkZHIsKEdUX1U4KXJlZ0FkZHIsZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCglyZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRSZXRyYW5zbWl0TW9kZQoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyByb3V0aW5lIHNldCB0aGUgUmV0cmFuc21pdCBNb2RlLgoqCiogSU5QVVRTOgoqICAgICAgIGVuIC0gR1RfVFJVRSBSZXRyYW5zaW10IE1vZGUgaXMgZW5hYmxlZCwgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogT1VUUFVUUzoKKiAgICAgICBOb25lLgoqCiogUkVUVVJOUzoKKiAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqCiogQ09NTUVOVFM6CiogICAgICAgTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldFJldHJhbnNtaXRNb2RlCigKICAgIElOICBHVF9RRF9ERVYgICAgKmRldiwKICAgIElOICBHVF9CT09MICAgICAgZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogRGF0YSB0byBiZSBzZXQgaW50byB0aGUgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3Rlci4gICAgICAgICAgICAgICAgICAgICovCiAgICBEQkdfSU5GTygoImdzeXNTZXRSZXRyYW5zbWl0TW9kZSBDYWxsZWQuXG4iKSk7CgkvKiBPbmx5IEdpZ2FiaXQgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwoJaWYgKElTX0lOX0RFVl9HUk9VUChkZXYsREVWX0dJR0FCSVRfU1dJVENIKSkKCXsKCQlEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKCX0KICAgIEJPT0xfMl9CSVQoZW4sZGF0YSk7CgogICAgLyogU2V0IHRoZSBSZXRyYW5zbWl0IE1vZGUgYml0LiAgICAgICAgICAgICAgICAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MLDE1LDEsZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldFJldHJhbnNtaXRNb2RlCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIHJvdXRpbmUgZ2V0IHRoZSBSZXRyYW5zbWl0IE1vZGUuCioKKiBJTlBVVFM6CiogICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgZW4gLSBHVF9UUlVFIFJldHJhbnNtaXQgTW9kZSBpcyBlbmFibGVkLCBHVF9GQUxTRSBvdGhlcndpc2UuCioKKiBSRVRVUk5TOgoqICAgICAgIEdUX09LICAgICAgICAgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICBHVF9CQURfUEFSQU0gICAgLSBvbiBiYWQgcGFyYW1ldGVyCiogICAgICAgR1RfRkFJTCAgICAgICAgIC0gb24gZXJyb3IKKgoqIENPTU1FTlRTOgoqICAgICAgIE5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRSZXRyYW5zbWl0TW9kZQooCiAgICBJTiAgR1RfUURfREVWICAgICpkZXYsCiAgICBPVVQgR1RfQk9PTCAgICAgICplbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCgogICAgREJHX0lORk8oKCJnc3lzR2V0UmV0cmFuc21pdE1vZGUgQ2FsbGVkLlxuIikpOwogICAgaWYoZW4gPT0gTlVMTCkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gR1RfQkFEX1BBUkFNOwogICAgfQoKCS8qIE9ubHkgR2lnYWJpdCBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCglpZiAoSVNfSU5fREVWX0dST1VQKGRldixERVZfR0lHQUJJVF9TV0lUQ0gpKQoJewoJCURCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwoJfQogICAgLyogR2V0IHRoZSBiaXQuICAgICAgICAgICAgICAgICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfR0xPQkFMX0NPTlRST0wsMTUsMSwmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBCSVRfMl9CT09MKGRhdGEsKmVuKTsKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRMaW1pdEJhY2tvZmYKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgcm91dGluZSBzZXQgdGhlIExpbWl0IEJhY2tvZmYgYml0LgoqCiogSU5QVVRTOgoqICAgICAgIGVuIC0gR1RfVFJVRTogIHVzZXMgUW9TIGhhbGYgZHVwbGV4IGJhY2tvZmYgb3BlcmF0aW9uICAKKiAgICAgICAgICAgIEdUX0ZBTFNFOiB1c2VzIG5vcm1hbCBoYWxmIGR1cGxleCBiYWNrb2ZmIG9wZXJhdGlvbgoqCiogT1VUUFVUUzoKKiAgICAgICBOb25lLgoqCiogUkVUVVJOUzoKKiAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqCiogQ09NTUVOVFM6CiogICAgICAgTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldExpbWl0QmFja29mZgooCiAgICBJTiAgR1RfUURfREVWICAgICpkZXYsCiAgICBJTiAgR1RfQk9PTCAgICAgIGVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIERhdGEgdG8gYmUgc2V0IGludG8gdGhlICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIuICAgICAgICAgICAgICAgICAgICAqLwogICAgREJHX0lORk8oKCJnc3lzU2V0TGltaXRCYWNrb2ZmIENhbGxlZC5cbiIpKTsKCS8qIE9ubHkgR2lnYWJpdCBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCglpZiAoSVNfSU5fREVWX0dST1VQKGRldixERVZfR0lHQUJJVF9TV0lUQ0gpKQoJewoJCURCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwoJfQogICAgQk9PTF8yX0JJVChlbixkYXRhKTsKCiAgICAvKiBTZXQgdGhlIGJpdC4gICAgICAgICAgICAgICAgKi8KICAgIHJldFZhbCA9IGh3U2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19HTE9CQUxfQ09OVFJPTCwxNCwxLGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRMaW1pdEJhY2tvZmYKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgcm91dGluZSBzZXQgdGhlIExpbWl0IEJhY2tvZmYgYml0LgoqCiogSU5QVVRTOgoqICAgICAgIE5vbmUuCioKKiBPVVRQVVRTOgoqICAgICAgIGVuIC0gR1RfVFJVRTogIHVzZXMgUW9TIGhhbGYgZHVwbGV4IGJhY2tvZmYgb3BlcmF0aW9uICAKKiAgICAgICAgICAgIEdUX0ZBTFNFOiB1c2VzIG5vcm1hbCBoYWxmIGR1cGxleCBiYWNrb2ZmIG9wZXJhdGlvbgoqCiogUkVUVVJOUzoKKiAgICAgICBHVF9PSyAgICAgICAgICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfQkFEX1BBUkFNICAgIC0gb24gYmFkIHBhcmFtZXRlcgoqICAgICAgIEdUX0ZBSUwgICAgICAgICAtIG9uIGVycm9yCioKKiBDT01NRU5UUzoKKiAgICAgICBOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0TGltaXRCYWNrb2ZmCigKICAgIElOICBHVF9RRF9ERVYgICAgKmRldiwKICAgIE9VVCBHVF9CT09MICAgICAgKmVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNHZXRMaW1pdEJhY2tvZmYgQ2FsbGVkLlxuIikpOwogICAgaWYoZW4gPT0gTlVMTCkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gR1RfQkFEX1BBUkFNOwogICAgfQoJLyogT25seSBHaWdhYml0IFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KCWlmIChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9HSUdBQklUX1NXSVRDSCkpCgl7CgkJREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7Cgl9CgogICAgLyogR2V0IHRoZSBiaXQuICAgICAgICAgICAgICAgICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfR0xPQkFMX0NPTlRST0wsMTQsMSwmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBCSVRfMl9CT09MKGRhdGEsKmVuKTsKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRSc3ZSZXFQcmkKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgcm91dGluZSBzZXQgdGhlIFJlc2VydmVkIFF1ZXVlJ3MgUmVxdWVzdGluZyBQcmlvcml0eSAKKgoqIElOUFVUUzoKKiAgICAgICBlbiAtIEdUX1RSVUU6IHVzZSB0aGUgbGFzdCByZWNlaXZlZCBmcm9tZSdzIHByaW9yaXR5CiogICAgICAgICAgICBHVF9GQUxTRTp1c2UgdGhlIGxhc3Qgc3dpdGNoZWQgZnJhbWUncyBwcmlvcml0eSAKKgoqIE9VVFBVVFM6CiogICAgICAgTm9uZS4KKgoqIFJFVFVSTlM6CiogICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKgoqIENPTU1FTlRTOgoqICAgICAgIE5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRSc3ZSZXFQcmkKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gIEdUX0JPT0wgICAgICBlbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBEYXRhIHRvIGJlIHNldCBpbnRvIHRoZSAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyLiAgICAgICAgICAgICAgICAgICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c1NldFJzdlJlcVByaSBDYWxsZWQuXG4iKSk7CgkvKiBPbmx5IEdpZ2FiaXQgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwoJaWYgKElTX0lOX0RFVl9HUk9VUChkZXYsREVWX0dJR0FCSVRfU1dJVENIKSkKCXsKCQlEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKCX0KICAgIEJPT0xfMl9CSVQoZW4sZGF0YSk7CgogICAgLyogU2V0IHRoZSBiaXQuICAgICAgICAgICAgICAgICovCiAgICByZXRWYWwgPSBod1NldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfR0xPQkFMX0NPTlRST0wsMTIsMSxkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0UnN2UmVxUHJpCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIHJvdXRpbmUgZ2V0IHRoZSBSZXNlcnZlZCBRdWV1ZSdzIFJlcXVlc3RpbmcgUHJpb3JpdHkgCioKKiBJTlBVVFM6CiogICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgZW4gLSBHVF9UUlVFOiB1c2UgdGhlIGxhc3QgcmVjZWl2ZWQgZnJvbWUncyBwcmlvcml0eQoqICAgICAgICAgICAgR1RfRkFMU0U6dXNlIHRoZSBsYXN0IHN3aXRjaGVkIGZyYW1lJ3MgcHJpb3JpdHkgCioKKiBSRVRVUk5TOgoqICAgICAgIEdUX09LICAgICAgICAgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICBHVF9CQURfUEFSQU0gICAgLSBvbiBiYWQgcGFyYW1ldGVyCiogICAgICAgR1RfRkFJTCAgICAgICAgIC0gb24gZXJyb3IKKgoqIENPTU1FTlRTOgoqICAgICAgIE5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRSc3ZSZXFQcmkKKAogICAgSU4gIEdUX1FEX0RFViAgICAqZGV2LAogICAgT1VUIEdUX0JPT0wgICAgICAqZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c0dldFJzdlJlcVByaSBDYWxsZWQuXG4iKSk7CiAgICBpZihlbiA9PSBOVUxMKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiBHVF9CQURfUEFSQU07CiAgICB9CgkvKiBPbmx5IEdpZ2FiaXQgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwoJaWYgKElTX0lOX0RFVl9HUk9VUChkZXYsREVWX0dJR0FCSVRfU1dJVENIKSkKCXsKCQlEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKCX0KCiAgICAvKiBHZXQgdGhlIGJpdC4gICAgICAgICAgICAgICAgKi8KICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19HTE9CQUxfQ09OVFJPTCwxMiwxLCZkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIEJJVF8yX0JPT0woZGF0YSwqZW4pOwogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0Q2FzY2FkZVBvcnQKKgoqIERFU0NSSVBUSU9OOgoqCQlUaGlzIHJvdXRpbmUgc2V0cyBDYXNjYWRlIFBvcnQgbnVtYmVyLgoqCQlJbiBtdWx0aWNoaXAgc3lzdGVtcyBmcmFtZXMgY29taW5nIGZyb20gYSBDUFUgbmVlZCB0byBrbm93IHdoZW4gdGhleQoqCQloYXZlIHJlYWNoZWQgdGhlaXIgZGVzdGluYXRpb24gY2hpcC4KKgoqCQlVc2UgQ2FzY2FkZSBQb3J0ID0gMHhFIHRvIGluZGljYXRlIHRoaXMgY2hpcCBoYXMgbm8gQ2FzY2FkZSBwb3J0LgoqCQlVc2UgQ2FzY2FkZSBQb3J0ID0gMHhGIHRvIHVzZSBSb3V0aW5nIHRhYmxlIChnc3lzR2V0RGV2Um91dGluZ1RhYmxlKS4KKgoqIElOUFVUUzoKKgkJcG9ydCAtIENhc2NhZGUgUG9ydAoqCiogT1VUUFVUUzoKKgkJTm9uZS4KKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKgkJTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldENhc2NhZGVQb3J0CigKCUlOIEdUX1FEX0RFVgkqZGV2LAoJSU4gR1RfTFBPUlQgCXBvcnQKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwogICAgREJHX0lORk8oKCJnc3lzU2V0Q2FzY2FkZVBvcnQgQ2FsbGVkLlxuIikpOwoJLyogT25seSBHaWdhYml0IFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfQ0FTQ0FERV9QT1JUKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiB0cmFuc2xhdGUgTFBPUlQgdG8gaGFyZHdhcmUgcG9ydCAqLwoJaWYoKHBvcnQgPT0gMHhFKSB8fCAocG9ydCA9PSAweEYpKQoJCWRhdGEgPSAoR1RfVTE2KXBvcnQ7CgllbHNlCgl7CgkgICAgZGF0YSA9IChHVF9VMTYpKEdUX0xQT1JUXzJfUE9SVChwb3J0KSk7CgkJaWYgKGRhdGEgPT0gR1RfSU5WQUxJRF9QT1JUKQoJCQlyZXR1cm4gR1RfQkFEX1BBUkFNOwoJfQoKICAgIC8qIFNldCB0aGUgQ2FzY2FkZSBwb3J0LiAgICAgICAgICAgICAgICAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MMiwxMiw0LGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0Q2FzY2FkZVBvcnQKKgoqIERFU0NSSVBUSU9OOgoqCQlUaGlzIHJvdXRpbmUgZ2V0cyBDYXNjYWRlIFBvcnQgbnVtYmVyLgoqCQlJbiBtdWx0aWNoaXAgc3lzdGVtcyBmcmFtZXMgY29taW5nIGZyb20gYSBDUFUgbmVlZCB0byBrbm93IHdoZW4gdGhleQoqCQloYXZlIHJlYWNoZWQgdGhlaXIgZGVzdGluYXRpb24gY2hpcC4KKgoqCQlVc2UgQ2FzY2FkZSBQb3J0ID0gMHhFIHRvIGluZGljYXRlIHRoaXMgY2hpcCBoYXMgbm8gQ2FzY2FkZSBwb3J0LgoqCQlVc2UgQ2FzY2FkZSBQb3J0ID0gMHhGIHRvIHVzZSBSb3V0aW5nIHRhYmxlIChnc3lzR2V0RGV2Um91dGluZ1RhYmxlKS4KKgoqIElOUFVUUzoKKgkJTm9uZS4KKgoqIE9VVFBVVFM6CioJCXBvcnQgLSBDYXNjYWRlIFBvcnQKKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKgkJTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldENhc2NhZGVQb3J0CigKCUlOICBHVF9RRF9ERVYJKmRldiwKCU9VVCBHVF9MUE9SVCAJKnBvcnQKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwogICAgREJHX0lORk8oKCJnc3lzU2V0Q2FzY2FkZVBvcnQgQ2FsbGVkLlxuIikpOwoJLyogT25seSBHaWdhYml0IFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfQ0FTQ0FERV9QT1JUKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiBHZXQgdGhlIENhc2NhZGUgcG9ydC4gICAgICAgICAgICAgICAgKi8KICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19HTE9CQUxfQ09OVFJPTDIsMTIsNCwmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCglpZigoZGF0YSA9PSAweEUpIHx8IChkYXRhID09IDB4RikpCgl7CgkJKnBvcnQgPSAoR1RfTFBPUlQpZGF0YTsKCX0KCWVsc2UKCXsKCSAgICAqcG9ydCA9IEdUX1BPUlRfMl9MUE9SVCgoR1RfVTgpZGF0YSk7Cgl9CiAgICAKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldERldmljZU51bWJlcgoqCiogREVTQ1JJUFRJT046CioJCVRoaXMgcm91dGluZSBzZXRzIERldmljZSBOdW1iZXIuCioJCUluIG11bHRpY2hpcCBzeXN0ZW1zIGZyYW1lcyBjb21pbmcgZnJvbSBhIENQVSBuZWVkIHRvIGtub3cgd2hlbiB0aGV5CioJCWhhdmUgcmVhY2hlZCB0aGVpciBkZXN0aW5hdGlvbiBjaGlwLiBGcm9tIENQVSBmcmFtZXMgd2hvc2UgRGV2X051bQoqCQlmaWVsZG1hdGNoZXMgdGhlc2UgYml0cyBoYXZlIHJlYWNoZWR0aGVpciBkZXN0aW5hdGlvbiBjaGlwIGFuZCBhcmUgc2VudAoqCQlvdXQgdGhpcyBjaGlwIHVzaW5nIHRoZSBwb3J0IG51bWJlciBpbmRpY2F0ZWQgaW4gdGhlIGZyYW1lJ3MgVHJnX1BvcnQgCioJCWZpZWxkLgoqCiogSU5QVVRTOgoqCQlkZXZOdW0gLSBEZXZpY2UgTnVtYmVyICgwIH4gMzEpCioKKiBPVVRQVVRTOgoqCQlOb25lLgoqCiogUkVUVVJOUzoKKgkJR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKgkJR1RfRkFJTCAtIG9uIGVycm9yCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqCQlOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0RGV2aWNlTnVtYmVyCigKCUlOIEdUX1FEX0RFVgkqZGV2LAoJSU4gR1RfVTMyICAJCWRldk51bQopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCiAgICBEQkdfSU5GTygoImdzeXNTZXREZXZpY2VOdW1iZXIgQ2FsbGVkLlxuIikpOwoJLyogT25seSBHaWdhYml0IFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfR0lHQUJJVF9TV0lUQ0gpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIGRhdGEgPSAoKEdUX1UxNilkZXZOdW0pICYgMHgxRjsgLyogb25seSA1IGJpdHMgYXJlIHZhbGlkICovCgogICAgLyogU2V0IHRoZSBEZXZpY2UgTnVtYmVyLiAgICAgICAgICAgICAgICAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MMiwwLDUsZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXREZXZpY2VOdW1iZXIKKgoqIERFU0NSSVBUSU9OOgoqCQlUaGlzIHJvdXRpbmUgZ2V0cyBEZXZpY2UgTnVtYmVyLgoqCiogSU5QVVRTOgoqCQlOb25lLgoqCiogT1VUUFVUUzoKKgkJZGV2TnVtIC0gRGV2aWNlIE51bWJlciAoMCB+IDMxKQoqCiogUkVUVVJOUzoKKgkJR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKgkJR1RfRkFJTCAtIG9uIGVycm9yCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqCQlOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0RGV2aWNlTnVtYmVyCigKCUlOICBHVF9RRF9ERVYJKmRldiwKCU9VVCBHVF9VMzIgIAkqZGV2TnVtCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c0dldERldmljZU51bWJlciBDYWxsZWQuXG4iKSk7CgkvKiBPbmx5IEdpZ2FiaXQgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9HSUdBQklUX1NXSVRDSCkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHRoZSBEZXZpY2UgTnVtYmVyLiAgICAgICAgICAgICAgICAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MMiwwLDUsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgKmRldk51bSA9IChHVF9VMzIpZGF0YTsKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldENvcmVUYWdUeXBlCioKKiBERVNDUklQVElPTjoKKgkJVGhpcyByb3V0aW5lIHNldHMgRXRoZXIgQ29yZSBUYWcgVHlwZS4KKgkJVGhpcyBFdGhlciBUeXBlIGlzIGFkZGVkIHRvIGZyYW1lcyB0aGF0IGVncmVzcyB0aGUgc3dpdGNoIGFzIERvdWJsZSBUYWdnZWQgCioJCWZyYW1lcy4gSXQgaXMgYWxzbyB0aGUgRXRoZXIgVHlwZSBleHBlY3RlZCBkdXJpbmcgSW5ncmVzcyB0byBkZXRlcm1pbmUgaWYgCioJCWEgZnJhbWUgaXMgVGFnZ2VkIG9yIG5vdCBvbiBwb3J0cyBjb25maWd1cmVkIGFzIFVzZUNvcmVUYWcgbW9kZS4KKgoqIElOUFVUUzoKKgkJZXRoZXJUeXBlIC0gQ29yZSBUYWcgVHlwZSAoMiBieXRlcykKKgoqIE9VVFBVVFM6CioJCU5vbmUuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRDb3JlVGFnVHlwZQooCglJTiBHVF9RRF9ERVYJKmRldiwKCUlOIEdUX1UxNiAgCQlldGhlclR5cGUKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNTZXRDb3JlVGFnVHlwZSBDYWxsZWQuXG4iKSk7CgoJLyogT25seSBHaWdhYml0IFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfQ09SRV9UQUcpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIFNldCB0aGUgRXRoZXIgVHlwZSAqLwogICAgcmV0VmFsID0gaHdXcml0ZUdsb2JhbFJlZyhkZXYsUURfUkVHX0NPUkVUQUdfVFlQRSxldGhlclR5cGUpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0Q29yZVRhZ1R5cGUKKgoqIERFU0NSSVBUSU9OOgoqCQlUaGlzIHJvdXRpbmUgZ2V0cyBDb3JlVGFnVHlwZQoqCiogSU5QVVRTOgoqCQlOb25lLgoqCiogT1VUUFVUUzoKKgkJZXRoZXJUeXBlIC0gQ29yZSBUYWcgVHlwZSAoMiBieXRlcykKKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKgkJTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldENvcmVUYWdUeXBlCigKCUlOICBHVF9RRF9ERVYJKmRldiwKCU9VVCBHVF9VMTYgIAkqZXRoZXJUeXBlCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c0dldENvcmVUYWdUeXBlIENhbGxlZC5cbiIpKTsKCgkvKiBPbmx5IEdpZ2FiaXQgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9DT1JFX1RBRykpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHRoZSBEZXZpY2UgTnVtYmVyLiAgICAgICAgICAgICAgICAqLwogICAgcmV0VmFsID0gaHdSZWFkR2xvYmFsUmVnKGRldixRRF9SRUdfQ09SRVRBR19UWVBFLCZkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgICpldGhlclR5cGUgPSBkYXRhOwogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0SW5ncmVzc01vbml0b3JEZXN0CioKKiBERVNDUklQVElPTjoKKgkJVGhpcyByb3V0aW5lIHNldHMgSW5ncmVzcyBNb25pdG9yIERlc3RpbmF0aW9uIFBvcnQuIEZyYW1lcyB0aGF0IGFyZSAKKgkJdGFyZ2V0ZWQgdG93YXJkIGFuIEluZ3Jlc3MgTW9uaXRvciBEZXN0aW5hdGlvbiBnbyBvdXQgdGhlIHBvcnQgbnVtYmVyIAoqCQlpbmRpY2F0ZWQgaW4gdGhlc2UgYml0cy4gVGhpcyBpbmNsdWRlcyBmcmFtZXMgcmVjZWl2ZWQgb24gYSBNYXJ2ZWxsIFRhZyBwb3J0CioJCXdpdGggdGhlIEluZ3Jlc3MgTW9uaXRvciB0eXBlLCBhbmQgZnJhbWVzIHJlY2VpdmVkIG9uIGEgTmV0d29yayBwb3J0IHRoYXQgCioJCWlzIGVuYWJsZWQgdG8gYmUgdGhlIEluZ3Jlc3MgTW9uaXRvciBTb3VyY2UgUG9ydC4KKgkJSWYgdGhlIEluZ3Jlc3MgTW9uaXRvciBEZXN0aW5hdGlvbiBQb3J0IHJlc2lkZXMgaW4gdGhpcyBkZXZpY2UgdGhlc2UgYml0cyAKKgkJc2hvdWxkIHBvaW50IHRvIHRoZSBOZXR3b3JrIHBvcnQgd2hlcmUgdGhlc2UgZnJhbWVzIGFyZSB0byBlZ3Jlc3MuIElmIHRoZSAKKgkJSW5ncmVzcyBNb25pdG9yIERlc3RpbmF0aW9uIFBvcnQgcmVzaWRlcyBpbiBhbm90aGVyIGRldmljZSB0aGVzZSBiaXRzIAoqCQlzaG91bGQgcG9pbnQgdG8gdGhlIE1hcnZlbGwgVGFnIHBvcnQgaW4gdGhpcyBkZXZpY2UgdGhhdCBpcyB1c2VkIHRvIGdldCAKKgkJdG8gdGhlIGRldmljZSB0aGF0IGNvbnRhaW5zIHRoZSBJbmdyZXNzIE1vbml0b3IgRGVzdGluYXRpb24gUG9ydC4KKgoqIElOUFVUUzoKKgkJcG9ydCAgLSB0aGUgbG9naWNhbCBwb3J0IG51bWJlci4KKgoqIE9VVFBVVFM6CioJCU5vbmUuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRJbmdyZXNzTW9uaXRvckRlc3QKKAoJSU4gR1RfUURfREVWCSpkZXYsCglJTiBHVF9MUE9SVAkJcG9ydAopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTggICAgICAgICAgIGh3UG9ydDsgICAgICAgICAvKiB0aGUgcGh5c2ljYWwgcG9ydCBudW1iZXIgICAgICovCgogICAgREJHX0lORk8oKCJnc3lzU2V0SW5ncmVzc01vbml0b3JEZXN0IENhbGxlZC5cbiIpKTsKCiAgICAvKiB0cmFuc2xhdGUgTFBPUlQgdG8gaGFyZHdhcmUgcG9ydCAqLwogICAgaHdQb3J0ID0gR1RfTFBPUlRfMl9QT1JUKHBvcnQpOwoKCS8qIE9ubHkgR2lnYWJpdCBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWXzg4RTYwOTNfRkFNSUxZKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiB0cmFuc2xhdGUgTFBPUlQgdG8gaGFyZHdhcmUgcG9ydCAqLwoJaWYocG9ydCA9PSAweEYpCgkJaHdQb3J0ID0gKEdUX1U4KXBvcnQ7CgllbHNlCgl7CgkgICAgaHdQb3J0ID0gKEdUX1U4KUdUX0xQT1JUXzJfUE9SVChwb3J0KTsKCQlpZiAoaHdQb3J0ID09IEdUX0lOVkFMSURfUE9SVCkKCQkJcmV0dXJuIEdUX0JBRF9QQVJBTTsKCX0KCiAgICAvKiBTZXQgdGhlIEV0aGVyIFR5cGUgKi8KICAgIHJldFZhbCA9IGh3U2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19NT05JVE9SX0NPTlRST0wsIDEyLCA0LCAoR1RfVTE2KWh3UG9ydCk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRJbmdyZXNzTW9uaXRvckRlc3QKKgoqIERFU0NSSVBUSU9OOgoqCQlUaGlzIHJvdXRpbmUgZ2V0cyBJbmdyZXNzIE1vbml0b3IgRGVzdGluYXRpb24gUG9ydC4KKgoqIElOUFVUUzoKKgkJTm9uZS4KKgoqIE9VVFBVVFM6CioJCXBvcnQgIC0gdGhlIGxvZ2ljYWwgcG9ydCBudW1iZXIuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRJbmdyZXNzTW9uaXRvckRlc3QKKAoJSU4gIEdUX1FEX0RFVgkqZGV2LAoJT1VUIEdUX0xQT1JUICAJKnBvcnQKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwogICAgREJHX0lORk8oKCJnc3lzR2V0SW5ncmVzc01vbml0b3JEZXN0IENhbGxlZC5cbiIpKTsKCgkvKiBPbmx5IEdpZ2FiaXQgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl84OEU2MDkzX0ZBTUlMWSkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHRoZSBJbmdyZXNzTW9uaXRvckRlc3QuICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfTU9OSVRPUl9DT05UUk9MLCAxMiwgNCwgJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgoJaWYoZGF0YSA9PSAweEYpCgl7CgkJKnBvcnQgPSAoR1RfTFBPUlQpZGF0YTsKCX0KCWVsc2UKCXsKCSAgICAqcG9ydCA9IEdUX1BPUlRfMl9MUE9SVCgoR1RfVTgpZGF0YSk7Cgl9CiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRFZ3Jlc3NNb25pdG9yRGVzdAoqCiogREVTQ1JJUFRJT046CioJCVRoaXMgcm91dGluZSBzZXRzIEVncmVzcyBNb25pdG9yIERlc3RpbmF0aW9uIFBvcnQuIEZyYW1lcyB0aGF0IGFyZSAKKgkJdGFyZ2V0ZWQgdG93YXJkIGFuIEVncmVzcyBNb25pdG9yIERlc3RpbmF0aW9uIGdvIG91dCB0aGUgcG9ydCBudW1iZXIgCioJCWluZGljYXRlZCBpbiB0aGVzZSBiaXRzLiBUaGlzIGluY2x1ZGVzIGZyYW1lcyByZWNlaXZlZCBvbiBhIE1hcnZlbGwgVGFnIHBvcnQKKgkJd2l0aCB0aGUgRWdyZXNzIE1vbml0b3IgdHlwZSwgYW5kIGZyYW1lcyB0cmFuc21pdHRlZCBvbiBhIE5ldHdvcmsgcG9ydCB0aGF0IAoqCQlpcyBlbmFibGVkIHRvIGJlIHRoZSBFZ3Jlc3MgTW9uaXRvciBTb3VyY2UgUG9ydC4KKgkJSWYgdGhlIEVncmVzcyBNb25pdG9yIERlc3RpbmF0aW9uIFBvcnQgcmVzaWRlcyBpbiB0aGlzIGRldmljZSB0aGVzZSBiaXRzIAoqCQlzaG91bGQgcG9pbnQgdG8gdGhlIE5ldHdvcmsgcG9ydCB3aGVyZSB0aGVzZSBmcmFtZXMgYXJlIHRvIGVncmVzcy4gSWYgdGhlIAoqCQlFZ3Jlc3MgTW9uaXRvciBEZXN0aW5hdGlvbiBQb3J0IHJlc2lkZXMgaW4gYW5vdGhlciBkZXZpY2UgdGhlc2UgYml0cyAKKgkJc2hvdWxkIHBvaW50IHRvIHRoZSBNYXJ2ZWxsIFRhZyBwb3J0IGluIHRoaXMgZGV2aWNlIHRoYXQgaXMgdXNlZCB0byBnZXQgCioJCXRvIHRoZSBkZXZpY2UgdGhhdCBjb250YWlucyB0aGUgRWdyZXNzIE1vbml0b3IgRGVzdGluYXRpb24gUG9ydC4KKgoqIElOUFVUUzoKKgkJcG9ydCAgLSB0aGUgbG9naWNhbCBwb3J0IG51bWJlci4KKgoqIE9VVFBVVFM6CioJCU5vbmUuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRFZ3Jlc3NNb25pdG9yRGVzdAooCglJTiBHVF9RRF9ERVYJKmRldiwKCUlOIEdUX0xQT1JUCQlwb3J0CikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VOCAgICAgICAgICAgaHdQb3J0OyAgICAgICAgIC8qIHRoZSBwaHlzaWNhbCBwb3J0IG51bWJlciAgICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNTZXRFZ3Jlc3NNb25pdG9yRGVzdCBDYWxsZWQuXG4iKSk7CgogICAgLyogdHJhbnNsYXRlIExQT1JUIHRvIGhhcmR3YXJlIHBvcnQgKi8KICAgIGh3UG9ydCA9IEdUX0xQT1JUXzJfUE9SVChwb3J0KTsKCgkvKiBPbmx5IEdpZ2FiaXQgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl84OEU2MDkzX0ZBTUlMWSkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgoJaWYocG9ydCA9PSAweEYpCgkJaHdQb3J0ID0gKEdUX1U4KXBvcnQ7CgllbHNlCgl7CgkgICAgaHdQb3J0ID0gKEdUX1U4KUdUX0xQT1JUXzJfUE9SVChwb3J0KTsKCQlpZiAoaHdQb3J0ID09IEdUX0lOVkFMSURfUE9SVCkKCQkJcmV0dXJuIEdUX0JBRF9QQVJBTTsKCX0KCiAgICAvKiBTZXQgRWdyZXNzTW9uaXRvckRlc3QgKi8KICAgIHJldFZhbCA9IGh3U2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19NT05JVE9SX0NPTlRST0wsIDgsIDQsIChHVF9VMTYpaHdQb3J0KTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldEVncmVzc01vbml0b3JEZXN0CioKKiBERVNDUklQVElPTjoKKgkJVGhpcyByb3V0aW5lIGdldHMgRWdyZXNzIE1vbml0b3IgRGVzdGluYXRpb24gUG9ydC4KKgoqIElOUFVUUzoKKgkJTm9uZS4KKgoqIE9VVFBVVFM6CioJCXBvcnQgIC0gdGhlIGxvZ2ljYWwgcG9ydCBudW1iZXIuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRFZ3Jlc3NNb25pdG9yRGVzdAooCglJTiAgR1RfUURfREVWCSpkZXYsCglPVVQgR1RfTFBPUlQgIAkqcG9ydAopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCiAgICBEQkdfSU5GTygoImdzeXNHZXRFZ3Jlc3NNb25pdG9yRGVzdCBDYWxsZWQuXG4iKSk7CgoJLyogT25seSBHaWdhYml0IFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfODhFNjA5M19GQU1JTFkpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCB0aGUgRWdyZXNzTW9uaXRvckRlc3QuICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfTU9OSVRPUl9DT05UUk9MLCA4LCA0LCAmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCglpZihkYXRhID09IDB4RikKCXsKCQkqcG9ydCA9IChHVF9MUE9SVClkYXRhOwoJfQoJZWxzZQoJewoJICAgICpwb3J0ID0gR1RfUE9SVF8yX0xQT1JUKChHVF9VOClkYXRhKTsKCX0KICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRBUlBEZXN0CioKKiBERVNDUklQVElPTjoKKgkJVGhpcyByb3V0aW5lIHNldHMgQVJQIE1vbml0b3IgRGVzdGluYXRpb24gUG9ydC4gVGFnZ2VkIG9yIHVudGFnZ2VkIAoqCQlmcmFtZXMgaW5ncmVzcyBOZXR3b3JrIHBvcnRzIHRoYXQgaGF2ZSB0aGUgQnJvYWRjYXN0IERlc3RpbmF0aW9uIEFkZHJlc3MgCioJCXdpdGggYW4gRXRoZXJ0eXBlIG9mIDB4MDgwNiBhcmUgbWlycm9yZWQgdG8gdGhpcyBwb3J0LiBUaGUgQVJQRGVzdCAKKgkJc2hvdWxkIHBvaW50IHRvIHRoZSBwb3J0IHRoYXQgZGlyZWN0cyB0aGVzZSBmcmFtZXMgdG8gdGhlIHN3aXRjaCdzIENQVSAKKgkJdGhhdCB3aWxsIHByb2Nlc3MgQVJQcy4gVGhpcyB0YXJnZXQgcG9ydCBzaG91bGQgYmUgYSBNYXJ2ZWxsIFRhZyBwb3J0IHNvIAoqCQl0aGF0IGZyYW1lcyB3aWxsIGVncmVzcyB3aXRoIGEgVG8gQ1BVIE1hcnZlbGwgVGFnIHdpdGggYSBDUFUgQ29kZSBvZiBBUlAuCioJCVRvIENQVSBNYXJ2ZWxsIFRhZyBmcmFtZXMgd2l0aCBhIENQVSBDb2RlIG9mZiBBUlAgdGhhdCBpbmdyZXNzIGEgTWFydmVsbCAKKgkJVGFnIHBvcnQgd2lsbCBiZSBzZW50IHRvIHRoZSBwb3J0IG51bWJlciBkZWZpbmVkZWQgaW4gQVJQRGVzdC4KKgoqCQlJZiBBUlBEZXN0ID0gIDB4RiwgQVJQIE1vbml0b3JpbmcgaXMgZGlzYWJsZWQgYW5kIGluZ3Jlc3NpbmcgVG8gQ1BVIEFSUCAKKgkJZnJhbWVzIHdpbGwgYmUgZGlzY2FyZGVkLgoqCiogSU5QVVRTOgoqCQlwb3J0ICAtIHRoZSBsb2dpY2FsIHBvcnQgbnVtYmVyLgoqCiogT1VUUFVUUzoKKgkJTm9uZS4KKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKgkJTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldEFSUERlc3QKKAoJSU4gR1RfUURfREVWCSpkZXYsCglJTiBHVF9MUE9SVAkJcG9ydAopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTggICAgICAgICAgIGh3UG9ydDsgICAgICAgICAvKiB0aGUgcGh5c2ljYWwgcG9ydCBudW1iZXIgICAgICovCgogICAgREJHX0lORk8oKCJnc3lzU2V0QVJQRGVzdCBDYWxsZWQuXG4iKSk7CgogICAgLyogdHJhbnNsYXRlIExQT1JUIHRvIGhhcmR3YXJlIHBvcnQgKi8KICAgIGh3UG9ydCA9IEdUX0xQT1JUXzJfUE9SVChwb3J0KTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0FSUF9ERVNUX1NVUFBPUlQpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIHRyYW5zbGF0ZSBMUE9SVCB0byBoYXJkd2FyZSBwb3J0ICovCglpZihwb3J0ID09IDB4RikKCQlod1BvcnQgPSAoR1RfVTgpcG9ydDsKCWVsc2UKCXsKCSAgICBod1BvcnQgPSAoR1RfVTgpKEdUX0xQT1JUXzJfUE9SVChwb3J0KSk7CgkJaWYgKGh3UG9ydCA9PSBHVF9JTlZBTElEX1BPUlQpCgkJCXJldHVybiBHVF9CQURfUEFSQU07Cgl9CgogICAgLyogU2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod1NldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfTU9OSVRPUl9DT05UUk9MLCA0LCA0LCAoR1RfVTE2KWh3UG9ydCk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRBUlBEZXN0CioKKiBERVNDUklQVElPTjoKKgkJVGhpcyByb3V0aW5lIGdldHMgQVJQIE1vbml0b3IgRGVzdGluYXRpb24gUG9ydC4gVGFnZ2VkIG9yIHVudGFnZ2VkIAoqCQlmcmFtZXMgaW5ncmVzcyBOZXR3b3JrIHBvcnRzIHRoYXQgaGF2ZSB0aGUgQnJvYWRjYXN0IERlc3RpbmF0aW9uIEFkZHJlc3MgCioJCXdpdGggYW4gRXRoZXJ0eXBlIG9mIDB4MDgwNiBhcmUgbWlycm9yZWQgdG8gdGhpcyBwb3J0LiBUaGUgQVJQRGVzdCAKKgkJc2hvdWxkIHBvaW50IHRvIHRoZSBwb3J0IHRoYXQgZGlyZWN0cyB0aGVzZSBmcmFtZXMgdG8gdGhlIHN3aXRjaCdzIENQVSAKKgkJdGhhdCB3aWxsIHByb2Nlc3MgQVJQcy4gVGhpcyB0YXJnZXQgcG9ydCBzaG91bGQgYmUgYSBNYXJ2ZWxsIFRhZyBwb3J0IHNvIAoqCQl0aGF0IGZyYW1lcyB3aWxsIGVncmVzcyB3aXRoIGEgVG8gQ1BVIE1hcnZlbGwgVGFnIHdpdGggYSBDUFUgQ29kZSBvZiBBUlAuCioJCVRvIENQVSBNYXJ2ZWxsIFRhZyBmcmFtZXMgd2l0aCBhIENQVSBDb2RlIG9mZiBBUlAgdGhhdCBpbmdyZXNzIGEgTWFydmVsbCAKKgkJVGFnIHBvcnQgd2lsbCBiZSBzZW50IHRvIHRoZSBwb3J0IG51bWJlciBkZWZpbmVkZWQgaW4gQVJQRGVzdC4KKgoqCQlJZiBBUlBEZXN0ID0gIDB4RiwgQVJQIE1vbml0b3JpbmcgaXMgZGlzYWJsZWQgYW5kIGluZ3Jlc3NpbmcgVG8gQ1BVIEFSUCAKKgkJZnJhbWVzIHdpbGwgYmUgZGlzY2FyZGVkLgoqCiogSU5QVVRTOgoqCQlOb25lLgoqCiogT1VUUFVUUzoKKgkJcG9ydCAgLSB0aGUgbG9naWNhbCBwb3J0IG51bWJlci4KKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKgkJTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldEFSUERlc3QKKAoJSU4gIEdUX1FEX0RFVgkqZGV2LAoJT1VUIEdUX0xQT1JUICAJKnBvcnQKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwogICAgREJHX0lORk8oKCJnc3lzR2V0QVJQRGVzdCBDYWxsZWQuXG4iKSk7CgoJLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9BUlBfREVTVF9TVVBQT1JUKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiBHZXQgcmVsYXRlZCBiaXQgKi8KICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19NT05JVE9SX0NPTlRST0wsIDQsIDQsICZkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKCWlmKGRhdGEgPT0gMHhGKQoJewoJCSpwb3J0ID0gKEdUX0xQT1JUKWRhdGE7Cgl9CgllbHNlCgl7CgkgICAgKnBvcnQgPSBHVF9QT1JUXzJfTFBPUlQoKEdUX1U4KWRhdGEpOwoJfQogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldFJzdmQyQ3B1RW5hYmxlcwoqCiogREVTQ1JJUFRJT046CioJCVJlc2VydmVkIERBIEVuYWJsZXMuIFdoZW4gdGhlIFJzdmQyQ3B1KGdzeXNTZXRSc3ZkMkNwdSkgaXMgc2V0IHRvIGEgb25lLCAKKgkJdGhlIDE2IHJlc2VydmVkIG11bHRpY2FzdCBEQSBhZGRyZXNzZXMsIHdob3NlIGJpdCBpbiB0aGlzIHJlZ2lzdGVyIGFyZSAKKgkJYWxzbyBzZXQgdG8gYSBvbmUsIGFyZSB0cmVhZHRlZCBhcyBNR01UIGZyYW1lcy4gQWxsIHRoZSByZXNlcnZlZCBEQSdzIAoqCQl0YWtlIHRoZSBmb3JtIDAxOjgwOkMyOjAwOjAwOjB4LiBXaGVuIHggPSAweDAsIGJpdCAwIG9mIHRoaXMgcmVnaXN0ZXIgaXMgCioJCXRlc3RlZC4gV2hlbiB4ID0gMHgyLCBiaXQgMiBvZiB0aGlzIGZpZWxkIGlzIHRlc3RlZCBhbmQgc28gb24uCioJCUlmIHRoZSB0ZXN0ZWQgYml0IGluIHRoaXMgcmVnaXN0ZXIgaXMgY2xlYXJlZCB0byBhIHplcm8sIHRoZSBmcmFtZSB3aWxsIAoqCQliZSB0cmVhdGVkIGFzIGEgbm9ybWFsIChub24tTUdNVCkgZnJhbWUuCioKKiBJTlBVVFM6CioJCWVuQml0cyAtIGJpdCB2ZWN0b3Igb2YgZW5hYmxlZCBSZXNlcnZlZCBNdWx0aWNhc3QuCioKKiBPVVRQVVRTOgoqCQlOb25lLgoqCiogUkVUVVJOUzoKKgkJR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKgkJR1RfRkFJTCAtIG9uIGVycm9yCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqCQlOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0UnN2ZDJDcHVFbmFibGVzCigKCUlOIEdUX1FEX0RFVgkqZGV2LAoJSU4gR1RfVTE2CQllbkJpdHMKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNTZXRSc3ZkMkNwdUVuYWJsZXMgQ2FsbGVkLlxuIikpOwoKCS8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfRU5IQU5DRURfTVVMVElDQVNUKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiBTZXQgcmVsYXRlZCByZWdpc3RlciAqLwogICAgcmV0VmFsID0gaHdXcml0ZUdsb2JhbDJSZWcoZGV2LFFEX1JFR19NR01UX0VOQUJMRSwgKEdUX1UxNillbkJpdHMpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0UnN2ZDJDcHVFbmFibGVzCioKKiBERVNDUklQVElPTjoKKgkJUmVzZXJ2ZWQgREEgRW5hYmxlcy4gV2hlbiB0aGUgUnN2ZDJDcHUoZ3N5c1NldFJzdmQyQ3B1KSBpcyBzZXQgdG8gYSBvbmUsIAoqCQl0aGUgMTYgcmVzZXJ2ZWQgbXVsdGljYXN0IERBIGFkZHJlc3Nlcywgd2hvc2UgYml0IGluIHRoaXMgcmVnaXN0ZXIgYXJlIAoqCQlhbHNvIHNldCB0byBhIG9uZSwgYXJlIHRyZWFkdGVkIGFzIE1HTVQgZnJhbWVzLiBBbGwgdGhlIHJlc2VydmVkIERBJ3MgCioJCXRha2UgdGhlIGZvcm0gMDE6ODA6QzI6MDA6MDA6MHguIFdoZW4geCA9IDB4MCwgYml0IDAgb2YgdGhpcyByZWdpc3RlciBpcyAKKgkJdGVzdGVkLiBXaGVuIHggPSAweDIsIGJpdCAyIG9mIHRoaXMgZmllbGQgaXMgdGVzdGVkIGFuZCBzbyBvbi4KKgkJSWYgdGhlIHRlc3RlZCBiaXQgaW4gdGhpcyByZWdpc3RlciBpcyBjbGVhcmVkIHRvIGEgemVybywgdGhlIGZyYW1lIHdpbGwgCioJCWJlIHRyZWF0ZWQgYXMgYSBub3JtYWwgKG5vbi1NR01UKSBmcmFtZS4KKgoqIElOUFVUUzoKKgkJTm9uZS4KKgoqIE9VVFBVVFM6CioJCWVuQml0cyAtIGJpdCB2ZWN0b3Igb2YgZW5hYmxlZCBSZXNlcnZlZCBNdWx0aWNhc3QuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRSc3ZkMkNwdUVuYWJsZXMKKAoJSU4gIEdUX1FEX0RFVgkqZGV2LAoJT1VUIEdUX1UxNiAgCSplbkJpdHMKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNHZXRSc3ZkMkNwdUVuYWJsZXMgQ2FsbGVkLlxuIikpOwoKCS8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfRU5IQU5DRURfTVVMVElDQVNUKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiBHZXQgcmVsYXRlZCByZWdpc3RlciAqLwogICAgcmV0VmFsID0gaHdSZWFkR2xvYmFsMlJlZyhkZXYsIFFEX1JFR19NR01UX0VOQUJMRSwgZW5CaXRzKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRSc3ZkMkNwdQoqCiogREVTQ1JJUFRJT046CioJCVdoZW4gdGhlIFJzdmQyQ3B1IGlzIHNldCB0byBhIG9uZShHVF9UUlVFKSwgZnJhbWVzIHdpdGggYSBEZXN0aW5hdGlvbiAKKgkJQWRkcmVzcyBpbiB0aGUgcmFuZ2UgMDE6ODA6QzI6MDA6MDA6MHgsIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgVkxBTiAKKgkJbWVtYmVyc2hpcCwgd2lsbCBiZSBjb25zaWRlcmVkIE1HTVQgZnJhbWVzIGFuZCBzZW50IHRvIHRoZSBDUFUgUG9ydC4KKgkJSWYgZGV2aWNlIHN1cHBvcnRzIFJzdmQyQ3B1RW5hYmxlIChnc3lzU2V0UnN2ZDJDcHVFbmFibGUgZnVuY3Rpb24pLAoqCQl0aGUgZnJhbWUgd2lsbCBiZSBjb25zaWRlcmVkIE1HTVQgZnJhbWUgd2hlbiB0aGUgYXNzb2NpYXRlZCBSc3ZkMkNwdUVuYWJsZQoqCQliaXQgZm9yIHRoZSBmcmFtZXMncyBEQSBpcyBhbHNvIHNldCB0byBhIG9uZS4KKgoqIElOUFVUUzoKKgkJZW4gLSBHVF9UUlVFIGlmIFJzdmQyQ3B1IGlzIHNldC4gR1RfRkFMU0UsIG90aGVyd2lzZS4KKgoqIE9VVFBVVFM6CioJCU5vbmUuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRSc3ZkMkNwdQooCglJTiBHVF9RRF9ERVYJKmRldiwKCUlOIEdUX0JPT0wJCWVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCglHVF9VMTYJCQlkYXRhOwoKICAgIERCR19JTkZPKCgiZ3N5c1NldFJzdmQyQ3B1IENhbGxlZC5cbiIpKTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0VOSEFOQ0VEX01VTFRJQ0FTVHxERVZfTVVMVElDQVNUKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBCT09MXzJfQklUKGVuLGRhdGEpOwoKICAgIC8qIFNldCByZWxhdGVkIGJpdCAqLwoJaWYgKElTX0lOX0RFVl9HUk9VUChkZXYsREVWX01VTFRJQ0FTVCkpCgl7CgkgICAgcmV0VmFsID0gaHdTZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX01BTkdFTUVOVF9DT05UUk9MLDMsMSwgZGF0YSk7Cgl9CgllbHNlCgl7CgkgICAgcmV0VmFsID0gaHdTZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19NQU5BR0VNRU5ULCAzLCAxLCBkYXRhKTsKCX0KCiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRSc3ZkMkNwdQoqCiogREVTQ1JJUFRJT046CioJCVdoZW4gdGhlIFJzdmQyQ3B1IGlzIHNldCB0byBhIG9uZShHVF9UUlVFKSwgZnJhbWVzIHdpdGggYSBEZXN0aW5hdGlvbiAKKgkJQWRkcmVzcyBpbiB0aGUgcmFuZ2UgMDE6ODA6QzI6MDA6MDA6MHgsIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgVkxBTiAKKgkJbWVtYmVyc2hpcCwgd2lsbCBiZSBjb25zaWRlcmVkIE1HTVQgZnJhbWVzIGFuZCBzZW50IHRvIHRoZSBDUFUgUG9ydC4KKgkJSWYgZGV2aWNlIHN1cHBvcnRzIFJzdmQyQ3B1RW5hYmxlIChnc3lzU2V0UnN2ZDJDcHVFbmFibGUgZnVuY3Rpb24pLAoqCQl0aGUgZnJhbWUgd2lsbCBiZSBjb25zaWRlcmVkIE1HTVQgZnJhbWUgd2hlbiB0aGUgYXNzb2NpYXRlZCBSc3ZkMkNwdUVuYWJsZQoqCQliaXQgZm9yIHRoZSBmcmFtZXMncyBEQSBpcyBhbHNvIHNldCB0byBhIG9uZS4KKgoqIElOUFVUUzoKKgkJTm9uZS4KKgoqIE9VVFBVVFM6CioJCWVuIC0gR1RfVFJVRSBpZiBSc3ZkMkNwdSBpcyBzZXQuIEdUX0ZBTFNFLCBvdGhlcndpc2UuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRSc3ZkMkNwdQooCglJTiAgR1RfUURfREVWCSpkZXYsCglPVVQgR1RfQk9PTCAgCSplbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCiAgICBEQkdfSU5GTygoImdzeXNHZXRSc3ZkMkNwdSBDYWxsZWQuXG4iKSk7CgoJLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9FTkhBTkNFRF9NVUxUSUNBU1R8REVWX01VTFRJQ0FTVCkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHJlbGF0ZWQgYml0ICovCglpZiAoSVNfSU5fREVWX0dST1VQKGRldixERVZfTVVMVElDQVNUKSkKCXsKCSAgICByZXRWYWwgPSBod0dldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfTUFOR0VNRU5UX0NPTlRST0wsMywxLCZkYXRhKTsKCX0KCWVsc2UKCXsKCSAgICByZXRWYWwgPSBod0dldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX01BTkFHRU1FTlQsMywxLCZkYXRhKTsKCX0KCiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBCSVRfMl9CT09MKGRhdGEsKmVuKTsKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldE1HTVRQcmkKKgoqIERFU0NSSVBUSU9OOgoqCQlUaGVzZSBiaXRzIGFyZSB1c2VkIGFzIHRoZSBQUklbMjowXSBiaXRzIG9uIFJzdmQyQ1BVIGZyYW1lcy4KKgoqIElOUFVUUzoKKgkJcHJpIC0gUFJJWzI6MF0gYml0cyAoc2hvdWxkIGJlIGxlc3MgdGhhbiA4KQoqCiogT1VUUFVUUzoKKgkJTm9uZS4KKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9CQURfUEFSQU0gLSBJZiBwcmkgaXMgbm90IGxlc3MgdGhhbiA4LgoqCQlHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKgkJTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldE1HTVRQcmkKKAoJSU4gR1RfUURfREVWCSpkZXYsCglJTiBHVF9VMTYJCXByaQopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c1NldE1HTVRQcmkgQ2FsbGVkLlxuIikpOwoKCS8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0VOSEFOQ0VEX01VTFRJQ0FTVCkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgoJaWYgKHByaSA+IDB4NykKCXsKICAgICAgICBEQkdfSU5GTygoIkdUX0JBRF9QQVJBTVxuIikpOwoJCXJldHVybiBHVF9CQURfUEFSQU07Cgl9CgogICAgLyogU2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod1NldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX01BTkFHRU1FTlQsIDAsIDMsIHByaSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRNR01UUHJpCioKKiBERVNDUklQVElPTjoKKgkJVGhlc2UgYml0cyBhcmUgdXNlZCBhcyB0aGUgUFJJWzI6MF0gYml0cyBvbiBSc3ZkMkNQVSBmcmFtZXMuCioKKiBJTlBVVFM6CioJCU5vbmUuCioKKiBPVVRQVVRTOgoqCQlwcmkgLSBQUklbMjowXSBiaXRzIChzaG91bGQgYmUgbGVzcyB0aGFuIDgpCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRNR01UUHJpCigKCUlOICBHVF9RRF9ERVYJKmRldiwKCU9VVCBHVF9VMTYgIAkqcHJpCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBEQkdfSU5GTygoImdzeXNHZXRNR01UUHJpIENhbGxlZC5cbiIpKTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9FTkhBTkNFRF9NVUxUSUNBU1QpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19NQU5BR0VNRU5ULDAsMyxwcmkpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldFVzZURvdWJsZVRhZ0RhdGEKKgoqIERFU0NSSVBUSU9OOgoqCQlUaGlzIGJpdCBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBEb3VibGUgVGFnIGRhdGEgdGhhdCBpcyByZW1vdmVkIGZyb20gYSAKKgkJRG91YmxlIFRhZyBmcmFtZSBpcyB1c2VkIG9yIGlnbm9yZWQgd2hlbiBtYWtpbmcgc3dpdGNoaW5nIGRlY2lzaW9ucyBvbiAKKgkJdGhlIGZyYW1lLgoqCiogSU5QVVRTOgoqCQllbiAtIEdUX1RSVUUgdG8gdXNlIHJlbW92ZWQgdGFnIGRhdGEsIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIE9VVFBVVFM6CioJCU5vbmUuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRVc2VEb3VibGVUYWdEYXRhCigKCUlOIEdUX1FEX0RFVgkqZGV2LAoJSU4gR1RfQk9PTAkJZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KCUdUX1UxNgkJCWRhdGE7CgogICAgREJHX0lORk8oKCJnc3lzU2V0VXNlRG91YmxlVGFnRGF0YSBDYWxsZWQuXG4iKSk7CgoJLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfTUFSVkVMTF9UQUdfTE9PUF9CTE9DSykpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgQk9PTF8yX0JJVChlbixkYXRhKTsKCiAgICAvKiBTZXQgcmVsYXRlZCBiaXQgKi8KICAgIHJldFZhbCA9IGh3U2V0R2xvYmFsMlJlZ0ZpZWxkKGRldixRRF9SRUdfTUFOQUdFTUVOVCwgMTUsIDEsIGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0VXNlRG91YmxlVGFnRGF0YQoqCiogREVTQ1JJUFRJT046CioJCVRoaXMgYml0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIERvdWJsZSBUYWcgZGF0YSB0aGF0IGlzIHJlbW92ZWQgZnJvbSBhIAoqCQlEb3VibGUgVGFnIGZyYW1lIGlzIHVzZWQgb3IgaWdub3JlZCB3aGVuIG1ha2luZyBzd2l0Y2hpbmcgZGVjaXNpb25zIG9uIAoqCQl0aGUgZnJhbWUuCioKKiBJTlBVVFM6CioJCU5vbmUuCioKKiBPVVRQVVRTOgoqCQllbiAtIEdUX1RSVUUgaWYgcmVtb3ZlZCB0YWcgZGF0YSBpcyB1c2VkLCBHVF9GQUxTRSBvdGhlcndpc2UuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRVc2VEb3VibGVUYWdEYXRhCigKCUlOICBHVF9RRF9ERVYJKmRldiwKCU9VVCBHVF9CT09MICAJKmVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c0dldFVzZURvdWJsZVRhZ0RhdGEgQ2FsbGVkLlxuIikpOwoKCS8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX01BUlZFTExfVEFHX0xPT1BfQkxPQ0spKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19NQU5BR0VNRU5ULDE1LDEsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgQklUXzJfQk9PTChkYXRhLCplbik7CiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0UHJldmVudExvb3BzCioKKiBERVNDUklQVElPTjoKKgkJV2hlbiBhIE1hcnZlbGwgVGFnIHBvcnQgcmVjZWl2ZXMgYSBGb3J3YXJkIE1hcnZlbGwgVGFnIHdob3NlIFNyY19EZXYgCioJCWZpZWxkIGVxdWFscyB0aGlzIGRldmljZSdzIERldmljZSBOdW1iZXIsIHRoZSBmb2xsb3dpbmcgYWN0aW9uIHdpbGwgYmUgCioJCXRha2VuIGRlcGVuZGluZyB1cG9uIHRoZSB2YWx1ZSBvZiB0aGlzIGJpdC4KKgkJR1RfVFJVRSAoMSkgLSBUaGUgZnJhbWUgd2lsbCBiZSBkaXNjYXJkZWQuCioJCUdUX0ZBTFNFKDApIC0gVGhlIGZyYW1lIHdpbGwgYmUgcHJldmVudGVkIGZyb20gZ29pbmcgb3V0IGl0cyBvcmlnaW5hbCAKKgkJCQkJCXNvdXJjZSBwb3J0IGFzIGRlZmluZWQgYnkgdGhlIGZyYW1lJ3MgU3JjX1BvcnQgZmllbGQuCioKKiBJTlBVVFM6CioJCWVuIC0gR1RfVFJVRSB0byBkaXNjYXJkIHRoZSBmcmFtZSBhcyBkZXNjcmliZWQgYWJvdmUsIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIE9VVFBVVFM6CioJCU5vbmUuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRQcmV2ZW50TG9vcHMKKAoJSU4gR1RfUURfREVWCSpkZXYsCglJTiBHVF9CT09MCQllbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwoJR1RfVTE2CQkJZGF0YTsKCiAgICBEQkdfSU5GTygoImdzeXNTZXRQcmV2ZW50TG9vcHMgQ2FsbGVkLlxuIikpOwoKCS8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX01BUlZFTExfVEFHX0xPT1BfQkxPQ0spKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIEJPT0xfMl9CSVQoZW4sZGF0YSk7CgogICAgLyogU2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod1NldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX01BTkFHRU1FTlQsIDE0LCAxLCBkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldFByZXZlbnRMb29wcwoqCiogREVTQ1JJUFRJT046CioJCVdoZW4gYSBNYXJ2ZWxsIFRhZyBwb3J0IHJlY2VpdmVzIGEgRm9yd2FyZCBNYXJ2ZWxsIFRhZyB3aG9zZSBTcmNfRGV2IAoqCQlmaWVsZCBlcXVhbHMgdGhpcyBkZXZpY2UncyBEZXZpY2UgTnVtYmVyLCB0aGUgZm9sbG93aW5nIGFjdGlvbiB3aWxsIGJlIAoqCQl0YWtlbiBkZXBlbmRpbmcgdXBvbiB0aGUgdmFsdWUgb2YgdGhpcyBiaXQuCioJCUdUX1RSVUUgKDEpIC0gVGhlIGZyYW1lIHdpbGwgYmUgZGlzY2FyZGVkLgoqCQlHVF9GQUxTRSgwKSAtIFRoZSBmcmFtZSB3aWxsIGJlIHByZXZlbnRlZCBmcm9tIGdvaW5nIG91dCBpdHMgb3JpZ2luYWwgCioJCQkJCQlzb3VyY2UgcG9ydCBhcyBkZWZpbmVkIGJ5IHRoZSBmcmFtZSdzIFNyY19Qb3J0IGZpZWxkLgoqCiogSU5QVVRTOgoqCQlOb25lLgoqCiogT1VUUFVUUzoKKgkJZW4gLSBHVF9UUlVFIHRvIGRpc2NhcmQgdGhlIGZyYW1lIGFzIGRlc2NyaWJlZCBhYm92ZSwgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogUkVUVVJOUzoKKgkJR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKgkJR1RfRkFJTCAtIG9uIGVycm9yCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqCQlOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0UHJldmVudExvb3BzCigKCUlOICBHVF9RRF9ERVYJKmRldiwKCU9VVCBHVF9CT09MICAJKmVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c0dldFByZXZlbnRMb29wcyBDYWxsZWQuXG4iKSk7CgoJLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfTUFSVkVMTF9UQUdfTE9PUF9CTE9DSykpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX01BTkFHRU1FTlQsMTQsMSwmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBCSVRfMl9CT09MKGRhdGEsKmVuKTsKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldEZsb3dDb250cm9sTWVzc2FnZQoqCiogREVTQ1JJUFRJT046CioJCVdoZW4gdGhpcyBiaXQgaXMgc2V0IHRvIG9uZSwgTWFydmVsbCBUYWcgRmxvdyBDb250cm9sIG1lc3NhZ2VzIHdpbGwgYmUgCioJCWdlbmVyYXRlZCB3aGVuIGFuIG91dHB1dCBxdWV1ZSBiZWNvbWVzIGNvbmdlc3RlZCBhbmQgcmVjZWl2ZWQgTWFydmVsbCBUYWcgCioJCUZsb3cgQ29udHJvbCBtZXNzYWdlcyB3aWxsIHBhdXNlIE1BQ3MgaW5zaWRlIHRoaXMgZGV2aWNlLiBXaGVuIHRoaXMgYml0IAoqCQlpcyBjbGVhcmVkIHRvIGEgemVybyBNYXJ2ZWxsIFRhZyBGbG93IENvbnRyb2wgbWVzc2FnZXMgd2lsbCBub3QgYmUgCioJCWdlbmVyYXRlZCBhbmQgYW55IHJlY2VpdmVkIHdpbGwgYmUgaWdub3JlZCBhdCB0aGUgdGFyZ2V0IE1BQy4KKgoqIElOUFVUUzoKKgkJZW4gLSBHVF9UUlVFIHRvIHVzZSBNYXJ2ZWxsIFRhZyBGbG93IENvbnRyb2wgbWVzc2FnZSwgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogT1VUUFVUUzoKKgkJTm9uZS4KKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKgkJTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldEZsb3dDb250cm9sTWVzc2FnZQooCglJTiBHVF9RRF9ERVYJKmRldiwKCUlOIEdUX0JPT0wJCWVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCglHVF9VMTYJCQlkYXRhOwoKICAgIERCR19JTkZPKCgiZ3N5c1NldEZsb3dDb250cm9sTWVzc2FnZSBDYWxsZWQuXG4iKSk7CgoJLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfTUFSVkVMTF9UQUdfRkxPV19DVFJMKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBCT09MXzJfQklUKGVuLGRhdGEpOwoKICAgIC8qIFNldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19NQU5BR0VNRU5ULCAxMywgMSwgZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRGbG93Q29udHJvbE1lc3NhZ2UKKgoqIERFU0NSSVBUSU9OOgoqCQlXaGVuIHRoaXMgYml0IGlzIHNldCB0byBvbmUsIE1hcnZlbGwgVGFnIEZsb3cgQ29udHJvbCBtZXNzYWdlcyB3aWxsIGJlIAoqCQlnZW5lcmF0ZWQgd2hlbiBhbiBvdXRwdXQgcXVldWUgYmVjb21lcyBjb25nZXN0ZWQgYW5kIHJlY2VpdmVkIE1hcnZlbGwgVGFnIAoqCQlGbG93IENvbnRyb2wgbWVzc2FnZXMgd2lsbCBwYXVzZSBNQUNzIGluc2lkZSB0aGlzIGRldmljZS4gV2hlbiB0aGlzIGJpdCAKKgkJaXMgY2xlYXJlZCB0byBhIHplcm8gTWFydmVsbCBUYWcgRmxvdyBDb250cm9sIG1lc3NhZ2VzIHdpbGwgbm90IGJlIAoqCQlnZW5lcmF0ZWQgYW5kIGFueSByZWNlaXZlZCB3aWxsIGJlIGlnbm9yZWQgYXQgdGhlIHRhcmdldCBNQUMuCioKKiBJTlBVVFM6CioJCU5vbmUuCioKKiBPVVRQVVRTOgoqCQllbiAtIEdUX1RSVUUgdG8gdXNlIE1hcnZlbGwgVGFnIEZsb3cgQ29udHJvbCBtZXNzYWdlLCBHVF9GQUxTRSBvdGhlcndpc2UuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRGbG93Q29udHJvbE1lc3NhZ2UKKAoJSU4gIEdUX1FEX0RFVgkqZGV2LAoJT1VUIEdUX0JPT0wgIAkqZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwogICAgREJHX0lORk8oKCJnc3lzR2V0Rmxvd0NvbnRyb2xNZXNzYWdlIENhbGxlZC5cbiIpKTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9NQVJWRUxMX1RBR19GTE9XX0NUUkwpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19NQU5BR0VNRU5ULDEzLDEsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgQklUXzJfQk9PTChkYXRhLCplbik7CiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRGb3JjZUZsb3dDb250cm9sUHJpCioKKiBERVNDUklQVElPTjoKKgkJV2hlbiB0aGlzIGJpdCBpcyBzZXQgdG8gYSBvbmUgdGhlIFBSSVsyOjBdIGJpdHMgb2YgZ2VuZXJhdGVkIE1hcnZlbGwgVGFnIAoqCQlGbG93IENvbnRyb2wgZnJhbWVzIHdpbGwgYmUgc2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUgRkMgUHJpIGJpdHMgKHNldCBieSAKKgkJZ3N5c1NldEZDUHJpIGZ1bmN0aW9uIGNhbGwpLiBXaGVuIHRoaXMgYml0IGlzIGNsZWFyZWQgdG8gYSB6ZXJvIGdlbmVyYXRlZCAKKgkJTWFydmVsbCBUYWcgRmxvdyBDb250cm9sIGZyYW1lcyB3aWxsIHJldGFpbiB0aGUgUFJJWzI6MF0gYml0cyBmcm9tIHRoZSAKKgkJZnJhbWVzIHRoYXQgY2F1c2VkIHRoZSBjb25nZXN0aW9uLiBUaGlzIGJpdCB3aWxsIGhhdmUgbm8gZWZmZWN0IGlmIHRoZSAKKgkJRmxvd0NvbnRyb2xNZXNzYWdlIGJpdChnc3lzU2V0Rmxvd0NvbnRyb2xNZXNzYWdlIGZ1bmN0aW9uIGNhbGwpIGlzIAoqCQljbGVhcmVkIHRvIGEgemVyby4KKgoqIElOUFVUUzoKKgkJZW4gLSBHVF9UUlVFIHRvIHVzZSBkZWZpbmVkIFBSSSBiaXRzLCBHVF9GQUxTRSBvdGhlcndpc2UuCioKKiBPVVRQVVRTOgoqCQlOb25lLgoqCiogUkVUVVJOUzoKKgkJR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKgkJR1RfRkFJTCAtIG9uIGVycm9yCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqCQlOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0Rm9yY2VGbG93Q29udHJvbFByaQooCglJTiBHVF9RRF9ERVYJKmRldiwKCUlOIEdUX0JPT0wJCWVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCglHVF9VMTYJCQlkYXRhOwoKICAgIERCR19JTkZPKCgiZ3N5c1NldEZvcmNlRmxvd0NvbnRyb2xQcmkgQ2FsbGVkLlxuIikpOwoKCS8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX01BUlZFTExfVEFHX0ZMT1dfQ1RSTCkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgQk9PTF8yX0JJVChlbixkYXRhKTsKCiAgICAvKiBTZXQgcmVsYXRlZCBiaXQgKi8KICAgIHJldFZhbCA9IGh3U2V0R2xvYmFsMlJlZ0ZpZWxkKGRldixRRF9SRUdfTUFOQUdFTUVOVCwgNywgMSwgZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRGb3JjZUZsb3dDb250cm9sUHJpCioKKiBERVNDUklQVElPTjoKKgkJV2hlbiB0aGlzIGJpdCBpcyBzZXQgdG8gYSBvbmUgdGhlIFBSSVsyOjBdIGJpdHMgb2YgZ2VuZXJhdGVkIE1hcnZlbGwgVGFnIAoqCQlGbG93IENvbnRyb2wgZnJhbWVzIHdpbGwgYmUgc2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUgRkMgUHJpIGJpdHMgKHNldCBieSAKKgkJZ3N5c1NldEZDUHJpIGZ1bmN0aW9uIGNhbGwpLiBXaGVuIHRoaXMgYml0IGlzIGNsZWFyZWQgdG8gYSB6ZXJvIGdlbmVyYXRlZCAKKgkJTWFydmVsbCBUYWcgRmxvdyBDb250cm9sIGZyYW1lcyB3aWxsIHJldGFpbiB0aGUgUFJJWzI6MF0gYml0cyBmcm9tIHRoZSAKKgkJZnJhbWVzIHRoYXQgY2F1c2VkIHRoZSBjb25nZXN0aW9uLiBUaGlzIGJpdCB3aWxsIGhhdmUgbm8gZWZmZWN0IGlmIHRoZSAKKgkJRmxvd0NvbnRyb2xNZXNzYWdlIGJpdChnc3lzU2V0Rmxvd0NvbnRyb2xNZXNzYWdlIGZ1bmN0aW9uIGNhbGwpIGlzIAoqCQljbGVhcmVkIHRvIGEgemVyby4KKgoqIElOUFVUUzoKKgkJTm9uZS4KKgoqIE9VVFBVVFM6CioJCWVuIC0gR1RfVFJVRSB0byB1c2UgZGVmaW5lZCBQUkkgYml0cywgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogUkVUVVJOUzoKKgkJR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKgkJR1RfRkFJTCAtIG9uIGVycm9yCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqCQlOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0Rm9yY2VGbG93Q29udHJvbFByaQooCglJTiAgR1RfUURfREVWCSpkZXYsCglPVVQgR1RfQk9PTCAgCSplbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCiAgICBEQkdfSU5GTygoImdzeXNHZXRGb3JjZUZsb3dDb250cm9sUHJpIENhbGxlZC5cbiIpKTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9NQVJWRUxMX1RBR19GTE9XX0NUUkwpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19NQU5BR0VNRU5ULDcsMSwmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBCSVRfMl9CT09MKGRhdGEsKmVuKTsKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldEZDUHJpCioKKiBERVNDUklQVElPTjoKKgkJVGhlc2UgYml0cyBhcmUgdXNlZCBhcyB0aGUgUFJJWzI6MF0gYml0cyBvbiBnZW5lcmF0ZWQgTWFydmVsbCBUYWcgRmxvdyAKKgkJQ29udHJvbCBmcmFtZXMgaWYgdGhlIEZvcmNlRmxvd0NvbnRyb2xQcmkgYml0KGdzeXNTZXRGb3JjZUZsb3dDb250cm9sUHJpKQoqCQlpcyBzZXQgdG8gYSBvbmUuCioKKiBJTlBVVFM6CioJCXByaSAtIFBSSVsyOjBdIGJpdHMgKHNob3VsZCBiZSBsZXNzIHRoYW4gOCkKKgoqIE9VVFBVVFM6CioJCU5vbmUuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfQkFEX1BBUkFNIC0gSWYgcHJpIGlzIG5vdCBsZXNzIHRoYW4gOC4KKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRGQ1ByaQooCglJTiBHVF9RRF9ERVYJKmRldiwKCUlOIEdUX1UxNgkJcHJpCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCgogICAgREJHX0lORk8oKCJnc3lzU2V0RkNQcmkgQ2FsbGVkLlxuIikpOwoKCS8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX01BUlZFTExfVEFHX0ZMT1dfQ1RSTCkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgoJaWYgKHByaSA+IDB4NykKCXsKICAgICAgICBEQkdfSU5GTygoIkdUX0JBRF9QQVJBTVxuIikpOwoJCXJldHVybiBHVF9CQURfUEFSQU07Cgl9CgogICAgLyogU2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod1NldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX01BTkFHRU1FTlQsIDQsIDMsIHByaSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRGQ1ByaQoqCiogREVTQ1JJUFRJT046CioJCVRoZXNlIGJpdHMgYXJlIHVzZWQgYXMgdGhlIFBSSVsyOjBdIGJpdHMgb24gZ2VuZXJhdGVkIE1hcnZlbGwgVGFnIEZsb3cgCioJCUNvbnRyb2wgZnJhbWVzIGlmIHRoZSBGb3JjZUZsb3dDb250cm9sUHJpIGJpdChnc3lzU2V0Rm9yY2VGbG93Q29udHJvbFByaSkKKgkJaXMgc2V0IHRvIGEgb25lLgoqCiogSU5QVVRTOgoqCQlOb25lLgoqCiogT1VUUFVUUzoKKgkJcHJpIC0gUFJJWzI6MF0gYml0cyAoc2hvdWxkIGJlIGxlc3MgdGhhbiA4KQoqCiogUkVUVVJOUzoKKgkJR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKgkJR1RfRkFJTCAtIG9uIGVycm9yCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqCQlOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0RkNQcmkKKAoJSU4gIEdUX1FEX0RFVgkqZGV2LAoJT1VUIEdUX1UxNiAgCSpwcmkKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c0dldEZDUHJpIENhbGxlZC5cbiIpKTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9NQVJWRUxMX1RBR19GTE9XX0NUUkwpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19NQU5BR0VNRU5ULDQsMyxwcmkpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldEZsb3dDdHJsRGVsYXkKKgoqIERFU0NSSVBUSU9OOgoqCQlUaGlzIGZ1bmN0aW9uIHNldHMgRmxvdyBjb250cm9sIGRlbGF5IHRpbWUgZm9yIDEwTWJwcywgMTAwTWJwcywgYW5kIAoqCQkxMDAwTWJwcy4gCioKKiBJTlBVVFM6CioJCXNwIC0gUE9SVF9TUEVFRF8xMF9NQlBTLCBQT1JUX1NQRUVEXzEwMF9NQlBTLCBvciBQT1JUX1NQRUVEXzEwMDBfTUJQUwoqCQlkZWxheVRpbWUgLSBkZWxheSB0aW1lLgoqCiogT1VUUFVUUzoKKgkJTm9uZS4KKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9CQURfUEFSQU0gLSBpZiBzcCBpcyBub3QgdmFsaWQgb3IgZGVsYXlUaW1lIGlzID4gMHgxRkZGLgoqCQlHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKglBY3R1YWwgZGVsYXkgdGltZSB3aWxsIGJlIGRlbGF5VGltZSB4IDIuMDQ4dVMgKG9yIHggOC4xOTJ1UykgZGVwZW5kaW5nIG9uIAoqCXN3aXRjaCBkZXZpY2UuIFBsZWFzZSByZWZlciB0byB0aGUgZGV2aWNlIGRhdGFzaGVldCBmb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24uCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRGbG93Q3RybERlbGF5CigKCUlOIEdUX1FEX0RFVgkJCSpkZXYsCglJTiBHVF9QT1JUX1NQRUVEX01PREUJc3AsCglJTiBHVF9VMzIJCQkJZGVsYXlUaW1lCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCglHVF9VMTYJCQlkYXRhOwoKICAgIERCR19JTkZPKCgiZ3N5c1NldEZsb3dDdHJsRGVsYXkgQ2FsbGVkLlxuIikpOwoKCS8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfRkxPV19DVFJMX0RFTEFZKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCglndFNlbVRha2UoZGV2LGRldi0+dGJsUmVnc1NlbSxPU19XQUlUX0ZPUkVWRVIpOwoKCS8qIENoZWNrIGlmIHRoZSByZWdpc3RlciBjYW4gYmUgYWNjZXNzZWQuICovCglkbwoJewoJICAgIHJldFZhbCA9IGh3UmVhZEdsb2JhbDJSZWcoZGV2LFFEX1JFR19GTE9XQ1RSTF9ERUxBWSwmZGF0YSk7CiAgICAJaWYocmV0VmFsICE9IEdUX09LKQoJICAgIHsKICAgIAkgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CgkJCWd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKICAgICAgICAJcmV0dXJuIHJldFZhbDsKCSAgICB9Cgl9IHdoaWxlIChkYXRhICYgMHg4MDAwKTsKCglzd2l0Y2goc3ApCgl7CgkJY2FzZSBQT1JUX1NQRUVEXzEwX01CUFM6CgkJCQlkYXRhID0gMDsKCQkJCWJyZWFrOwoJCWNhc2UgUE9SVF9TUEVFRF8xMDBfTUJQUzoKCQkJCWRhdGEgPSAxIDw8IDEzOwoJCQkJYnJlYWs7CgkJY2FzZSBQT1JUX1NQRUVEXzEwMDBfTUJQUzoKCQkJCWRhdGEgPSAyIDw8IDEzOwoJCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkgICAgICAgIERCR19JTkZPKCgiR1RfQkFEX1BBUkFNIChzcClcbiIpKTsKCQkJCWd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKCQkJCXJldHVybiBHVF9CQURfUEFSQU07Cgl9CgoJaWYgKGRlbGF5VGltZSA+IDB4MUZGRikKCXsKCQlEQkdfSU5GTygoIkdUX0JBRF9QQVJBTSAoZGVsYXlUaW1lKVxuIikpOwoJCWd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKCQlyZXR1cm4gR1RfQkFEX1BBUkFNOwoJfQoKCWRhdGEgfD0gKEdUX1UxNikoMHg4MDAwIHwgZGVsYXlUaW1lKTsKCiAgICAvKiBTZXQgcmVsYXRlZCByZWdpc3RlciAqLwogICAgcmV0VmFsID0gaHdXcml0ZUdsb2JhbDJSZWcoZGV2LFFEX1JFR19GTE9XQ1RSTF9ERUxBWSxkYXRhKTsKCglndFNlbUdpdmUoZGV2LGRldi0+dGJsUmVnc1NlbSk7CgogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0Rmxvd0N0cmxEZWxheQoqCiogREVTQ1JJUFRJT046CioJCVRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIEZsb3cgY29udHJvbCBkZWxheSB0aW1lIGZvciAxME1icHMsIDEwME1icHMsIGFuZAoqCQkxMDAwTWJwcy4gCioKKiBJTlBVVFM6CioJCXNwIC0gUE9SVF9TUEVFRF8xMF9NQlBTLCBQT1JUX1NQRUVEXzEwMF9NQlBTLCBvciBQT1JUX1NQRUVEXzEwMDBfTUJQUwoqCiogT1VUUFVUUzoKKgkJZGVsYXlUaW1lIC0gZGVsYXkgdGltZQoqCiogUkVUVVJOUzoKKgkJR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKgkJR1RfRkFJTCAtIG9uIGVycm9yCioJCUdUX0JBRF9QQVJBTSAtIGlmIHNwIGlzIG5vdCB2YWxpZCBvciBkZWxheVRpbWUgaXMgPiAweDFGRkYuCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqCUFjdHVhbCBkZWxheSB0aW1lIHdpbGwgYmUgZGVsYXlUaW1lIHggMi4wNDh1UyAob3IgeCA4LjE5MnVTKSBkZXBlbmRpbmcgb24gCioJc3dpdGNoIGRldmljZS4gUGxlYXNlIHJlZmVyIHRvIHRoZSBkZXZpY2UgZGF0YXNoZWV0IGZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbi4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldEZsb3dDdHJsRGVsYXkKKAoJSU4gIEdUX1FEX0RFVgkqZGV2LAoJSU4gIEdUX1BPUlRfU1BFRURfTU9ERQlzcCwKCU9VVCBHVF9VMzIJCSpkZWxheVRpbWUKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwogICAgREJHX0lORk8oKCJnc3lzR2V0Rmxvd0N0cmxEZWxheSBDYWxsZWQuXG4iKSk7CgoJLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9GTE9XX0NUUkxfREVMQVkpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKCWd0U2VtVGFrZShkZXYsZGV2LT50YmxSZWdzU2VtLE9TX1dBSVRfRk9SRVZFUik7CgoJLyogQ2hlY2sgaWYgdGhlIHJlZ2lzdGVyIGNhbiBiZSBhY2Nlc3NlZC4gKi8KCWRvCgl7CgkgICAgcmV0VmFsID0gaHdSZWFkR2xvYmFsMlJlZyhkZXYsUURfUkVHX0ZMT1dDVFJMX0RFTEFZLCZkYXRhKTsKICAgIAlpZihyZXRWYWwgIT0gR1RfT0spCgkgICAgewogICAgCSAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKCQkJZ3RTZW1HaXZlKGRldixkZXYtPnRibFJlZ3NTZW0pOwogICAgICAgIAlyZXR1cm4gcmV0VmFsOwoJICAgIH0KCX0gd2hpbGUgKGRhdGEgJiAweDgwMDApOwoKCXN3aXRjaChzcCkKCXsKCQljYXNlIFBPUlRfU1BFRURfMTBfTUJQUzoKCQkJCWRhdGEgPSAwOwoJCQkJYnJlYWs7CgkJY2FzZSBQT1JUX1NQRUVEXzEwMF9NQlBTOgoJCQkJZGF0YSA9IDEgPDwgMTM7CgkJCQlicmVhazsKCQljYXNlIFBPUlRfU1BFRURfMTAwMF9NQlBTOgoJCQkJZGF0YSA9IDIgPDwgMTM7CgkJCQlicmVhazsKCQlkZWZhdWx0OgoJCSAgICAgICAgREJHX0lORk8oKCJHVF9CQURfUEFSQU0gKHNwKVxuIikpOwoJCQkJZ3RTZW1HaXZlKGRldixkZXYtPnRibFJlZ3NTZW0pOwoJCQkJcmV0dXJuIEdUX0JBRF9QQVJBTTsKCX0KCiAgICByZXRWYWwgPSBod1dyaXRlR2xvYmFsMlJlZyhkZXYsUURfUkVHX0ZMT1dDVFJMX0RFTEFZLGRhdGEpOwogICAJaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAJICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwoJCWd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKICAgICAgIAlyZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIHJldFZhbCA9IGh3UmVhZEdsb2JhbDJSZWcoZGV2LFFEX1JFR19GTE9XQ1RSTF9ERUxBWSwmZGF0YSk7CgoJZ3RTZW1HaXZlKGRldixkZXYtPnRibFJlZ3NTZW0pOwoKICAgCWlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgCSAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgIAlyZXR1cm4gcmV0VmFsOwogICAgfQoKCSpkZWxheVRpbWUgPSAoR1RfVTMyKShkYXRhICYgMHgxRkZGKTsKCQkKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXREZXZSb3V0aW5nVGFibGUKKgoqIERFU0NSSVBUSU9OOgoqCQlUaGlzIGZ1bmN0aW9uIHNldHMgRGV2aWNlIHRvIFBvcnQgbWFwcGluZyAod2hpY2ggZGV2aWNlIGlzIGNvbm5lY3RlZCB0byAKKgkJd2hpY2ggcG9ydCBvZiB0aGlzIGRldmljZSkuIAoqCiogSU5QVVRTOgoqCQlkZXZOdW0gLSB0YXJnZXQgZGV2aWNlIG51bWJlci4KKgkJcG9ydE51bSAtIHRoZSBsb2dpY2FsIHBvcnQgbnVtYmVyLgoqCiogT1VUUFVUUzoKKgkJTm9uZS4KKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9CQURfUEFSQU0gLSBpZiBzcCBpcyBub3QgdmFsaWQgb3IgZGVsYXlUaW1lIGlzID4gMHgxRkZGLgoqCQlHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKgkJTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldERldlJvdXRpbmdUYWJsZQooCglJTiBHVF9RRF9ERVYJKmRldiwKCUlOIEdUX1UzMiAgCQlkZXZOdW0sCglJTiBHVF9MUE9SVCAJcG9ydAopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTggICAgICAgICAgIGh3UG9ydDsgICAgICAgICAvKiB0aGUgcGh5c2ljYWwgcG9ydCBudW1iZXIgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNTZXREZXZSb3V0aW5nVGFibGUgQ2FsbGVkLlxuIikpOwoKCS8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfU1RBQ0tJTkcpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKCWd0U2VtVGFrZShkZXYsZGV2LT50YmxSZWdzU2VtLE9TX1dBSVRfRk9SRVZFUik7CgoJaWYoZGV2TnVtID4gMHgxRikKCXsKCQlEQkdfSU5GTygoIkdUX0JBRF9QQVJBTSAoZGV2TnVtKVxuIikpOwoJCWd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKCQlyZXR1cm4gR1RfQkFEX1BBUkFNOwoJfQoKCS8qIENoZWNrIGlmIHRoZSByZWdpc3RlciBjYW4gYmUgYWNjZXNzZWQuICovCglkbwoJewoJICAgIHJldFZhbCA9IGh3UmVhZEdsb2JhbDJSZWcoZGV2LFFEX1JFR19ST1VUSU5HX1RCTCwmZGF0YSk7CiAgICAJaWYocmV0VmFsICE9IEdUX09LKQoJICAgIHsKICAgIAkgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CgkJCWd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKICAgICAgICAJcmV0dXJuIHJldFZhbDsKCSAgICB9Cgl9IHdoaWxlIChkYXRhICYgMHg4MDAwKTsKCiAgICAvKiB0cmFuc2xhdGUgTFBPUlQgdG8gaGFyZHdhcmUgcG9ydCAqLwoJaWYocG9ydCA+PSBkZXYtPm51bU9mUG9ydHMpCgl7CgkJaHdQb3J0ID0gMHhGOwoJfQoJZWxzZQoJewoJICAgIGh3UG9ydCA9IEdUX0xQT1JUXzJfUE9SVChwb3J0KTsKCX0KCglkYXRhID0gKEdUX1UxNikoMHg4MDAwIHwgKGRldk51bSA8PCA4KSB8IGh3UG9ydCk7CgogICAgLyogU2V0IHJlbGF0ZWQgcmVnaXN0ZXIgKi8KICAgIHJldFZhbCA9IGh3V3JpdGVHbG9iYWwyUmVnKGRldixRRF9SRUdfUk9VVElOR19UQkwsZGF0YSk7CgoJZ3RTZW1HaXZlKGRldixkZXYtPnRibFJlZ3NTZW0pOwoKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldERldlJvdXRpbmdUYWJsZQoqCiogREVTQ1JJUFRJT046CioJCVRoaXMgZnVuY3Rpb24gZ2V0cyBEZXZpY2UgdG8gUG9ydCBtYXBwaW5nICh3aGljaCBkZXZpY2UgaXMgY29ubmVjdGVkIHRvIAoqCQl3aGljaCBwb3J0IG9mIHRoaXMgZGV2aWNlKS4gCioKKiBJTlBVVFM6CioJCWRldk51bSAtIHRhcmdldCBkZXZpY2UgbnVtYmVyLgoqCiogT1VUUFVUUzoKKgkJcG9ydE51bSAtIHRoZSBsb2dpY2FsIHBvcnQgbnVtYmVyLgoqCiogUkVUVVJOUzoKKgkJR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKgkJR1RfRkFJTCAtIG9uIGVycm9yCioJCUdUX0JBRF9QQVJBTSAtIGlmIHNwIGlzIG5vdCB2YWxpZCBvciBkZWxheVRpbWUgaXMgPiAweDFGRkYuCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqCQlOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0RGV2Um91dGluZ1RhYmxlCigKCUlOICBHVF9RRF9ERVYJKmRldiwKCUlOICBHVF9VMzIgCQlkZXZOdW0sCglPVVQgR1RfTFBPUlQgCSpwb3J0CikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNHZXREZXZSb3V0aW5nVGFibGUgQ2FsbGVkLlxuIikpOwoKCS8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfU1RBQ0tJTkcpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKCWd0U2VtVGFrZShkZXYsZGV2LT50YmxSZWdzU2VtLE9TX1dBSVRfRk9SRVZFUik7CgoJaWYoZGV2TnVtID4gMHgxRikKCXsKCQlEQkdfSU5GTygoIkdUX0JBRF9QQVJBTSAoZGV2TnVtKVxuIikpOwoJCWd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKCQlyZXR1cm4gR1RfQkFEX1BBUkFNOwoJfQoKCS8qIENoZWNrIGlmIHRoZSByZWdpc3RlciBjYW4gYmUgYWNjZXNzZWQuICovCglkbwoJewoJICAgIHJldFZhbCA9IGh3UmVhZEdsb2JhbDJSZWcoZGV2LFFEX1JFR19ST1VUSU5HX1RCTCwmZGF0YSk7CiAgICAJaWYocmV0VmFsICE9IEdUX09LKQoJICAgIHsKICAgIAkgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CgkJCWd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKICAgICAgICAJcmV0dXJuIHJldFZhbDsKCSAgICB9Cgl9IHdoaWxlIChkYXRhICYgMHg4MDAwKTsKCglkYXRhID0gKEdUX1UxNikoZGV2TnVtIDw8IDgpOwoKICAgIHJldFZhbCA9IGh3V3JpdGVHbG9iYWwyUmVnKGRldixRRF9SRUdfUk9VVElOR19UQkwsZGF0YSk7CiAgIAlpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgIAkgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CgkJZ3RTZW1HaXZlKGRldixkZXYtPnRibFJlZ3NTZW0pOwogICAgICAgCXJldHVybiByZXRWYWw7CiAgICB9CgogICAgcmV0VmFsID0gaHdSZWFkR2xvYmFsMlJlZyhkZXYsUURfUkVHX1JPVVRJTkdfVEJMLCZkYXRhKTsKCglndFNlbUdpdmUoZGV2LGRldi0+dGJsUmVnc1NlbSk7CgogICAJaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAJICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgCXJldHVybiByZXRWYWw7CiAgICB9CgoJKnBvcnQgPSBHVF9QT1JUXzJfTFBPUlQoKEdUX1U4KShkYXRhICYgMHhGKSk7CglpZigqcG9ydCA9PSBHVF9JTlZBTElEX1BPUlQpCgl7CgkJKnBvcnQgPSAweEY7Cgl9CQogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0VHJ1bmtNYXNrVGFibGUKKgoqIERFU0NSSVBUSU9OOgoqCQlUaGlzIGZ1bmN0aW9uIHNldHMgVHJ1bmsgTWFzayBmb3IgdGhlIGdpdmVuIFRydW5rIE51bWJlci4KKgoqIElOUFVUUzoKKgkJdHJ1bmtOdW0gLSBUcnVuayBOdW1iZXIuCioJCXRydW5rTWFzayAtIFRydW5rIG1hc2sgYml0cy4gQml0IDAgY29udHJvbHMgdHJ1bmsgbWFza2luZyBmb3IgcG9ydCAwLAoqCQkJCQliaXQgMSBmb3IgcG9ydCAxICwgZXRjLgoqCiogT1VUUFVUUzoKKgkJTm9uZS4KKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9CQURfUEFSQU0gLSBpZiB0cnVua051bSA+IDB4NyBmb3IgODhFNjA5NSBhbmQgODhFNjE4MyBmYW1pbHkgYW5kCioJCQkJCSAgIGlmIHRydW5rTnVtID4gMHgzIGZvciA4OEU2MDY1IGZhbWlseS4KKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRUcnVua01hc2tUYWJsZQooCglJTiBHVF9RRF9ERVYJKmRldiwKCUlOIEdUX1UzMiAgCQl0cnVua051bSwKCUlOIEdUX1UzMgkJdHJ1bmtNYXNrCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KCUdUX1UzMgkJCW1hc2s7CgogICAgREJHX0lORk8oKCJnc3lzU2V0VHJ1bmtNYXNrVGFibGUgQ2FsbGVkLlxuIikpOwoKCS8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfVFJVTkt8REVWX1JFRFVDRURfVFJVTkspKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKCWd0U2VtVGFrZShkZXYsZGV2LT50YmxSZWdzU2VtLE9TX1dBSVRfRk9SRVZFUik7CgoJLyogQ2hlY2sgaWYgdGhlIHJlZ2lzdGVyIGNhbiBiZSBhY2Nlc3NlZC4gKi8KCWRvCgl7CgkgICAgcmV0VmFsID0gaHdSZWFkR2xvYmFsMlJlZyhkZXYsUURfUkVHX1RSVU5LX01BU0tfVEJMLCZkYXRhKTsKICAgIAlpZihyZXRWYWwgIT0gR1RfT0spCgkgICAgewogICAgCSAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKCQkJZ3RTZW1HaXZlKGRldixkZXYtPnRibFJlZ3NTZW0pOwogICAgICAgIAlyZXR1cm4gcmV0VmFsOwoJICAgIH0KCX0gd2hpbGUgKGRhdGEgJiAweDgwMDApOwoKCWRhdGEgJj0gMHgwODAwOwoKCWlmKHRydW5rTnVtID4gMHg3KQoJewoJCURCR19JTkZPKCgiR1RfQkFEX1BBUkFNICh0cnVua051bSlcbiIpKTsKCQlndFNlbUdpdmUoZGV2LGRldi0+dGJsUmVnc1NlbSk7CgkJcmV0dXJuIEdUX0JBRF9QQVJBTTsKCX0KCglpZigodHJ1bmtOdW0gPiAweDMpICYmIElTX0lOX0RFVl9HUk9VUChkZXYsREVWX1JFRFVDRURfVFJVTkspKQoJewoJCURCR19JTkZPKCgiR1RfQkFEX1BBUkFNICh0cnVua051bSlcbiIpKTsKCQlndFNlbUdpdmUoZGV2LGRldi0+dGJsUmVnc1NlbSk7CgkJcmV0dXJuIEdUX0JBRF9QQVJBTTsKCX0KCgltYXNrID0gKDEgPDwgZGV2LT5udW1PZlBvcnRzKSAtIDE7CgoJaWYodHJ1bmtNYXNrID4gbWFzaykKCXsKCQlEQkdfSU5GTygoIkdUX0JBRF9QQVJBTSAodHJ1bmtNYXNrKVxuIikpOwoJCWd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKCQlyZXR1cm4gR1RfQkFEX1BBUkFNOwoJfQoKCW1hc2sgPSBHVF9MUE9SVFZFQ18yX1BPUlRWRUModHJ1bmtNYXNrKTsKCglkYXRhID0gKEdUX1UxNikoMHg4MDAwIHwgZGF0YSB8ICh0cnVua051bSA8PCAxMikgfCBtYXNrKTsKCiAgICAvKiBTZXQgcmVsYXRlZCByZWdpc3RlciAqLwogICAgcmV0VmFsID0gaHdXcml0ZUdsb2JhbDJSZWcoZGV2LFFEX1JFR19UUlVOS19NQVNLX1RCTCxkYXRhKTsKCglndFNlbUdpdmUoZGV2LGRldi0+dGJsUmVnc1NlbSk7CgogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0VHJ1bmtNYXNrVGFibGUKKgoqIERFU0NSSVBUSU9OOgoqCQlUaGlzIGZ1bmN0aW9uIGdldHMgVHJ1bmsgTWFzayBmb3IgdGhlIGdpdmVuIFRydW5rIE51bWJlci4KKgoqIElOUFVUUzoKKgkJdHJ1bmtOdW0gLSBUcnVuayBOdW1iZXIuCioKKiBPVVRQVVRTOgoqCQl0cnVua01hc2sgLSBUcnVuayBtYXNrIGJpdHMuIEJpdCAwIGNvbnRyb2xzIHRydW5rIG1hc2tpbmcgZm9yIHBvcnQgMCwKKgkJCQkJYml0IDEgZm9yIHBvcnQgMSAsIGV0Yy4KKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9CQURfUEFSQU0gLSBpZiB0cnVua051bSA+IDB4NyBmb3IgODhFNjA5NSBhbmQgODhFNjE4MyBmYW1pbHkgYW5kCioJCQkJCSAgIGlmIHRydW5rTnVtID4gMHgzIGZvciA4OEU2MDY1IGZhbWlseS4KKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRUcnVua01hc2tUYWJsZQooCglJTiAgR1RfUURfREVWCSpkZXYsCglJTiAgR1RfVTMyIAkJdHJ1bmtOdW0sCglPVVQgR1RfVTMyCQkqdHJ1bmtNYXNrCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KCUdUX1UzMgkJCW1hc2s7CgogICAgREJHX0lORk8oKCJnc3lzR2V0VHJ1bmtNYXNrVGFibGUgQ2FsbGVkLlxuIikpOwoKCS8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfVFJVTkt8REVWX1JFRFVDRURfVFJVTkspKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKCWd0U2VtVGFrZShkZXYsZGV2LT50YmxSZWdzU2VtLE9TX1dBSVRfRk9SRVZFUik7CgoJLyogQ2hlY2sgaWYgdGhlIHJlZ2lzdGVyIGNhbiBiZSBhY2Nlc3NlZC4gKi8KCWRvCgl7CgkgICAgcmV0VmFsID0gaHdSZWFkR2xvYmFsMlJlZyhkZXYsUURfUkVHX1RSVU5LX01BU0tfVEJMLCZkYXRhKTsKICAgIAlpZihyZXRWYWwgIT0gR1RfT0spCgkgICAgewogICAgCSAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKCQkJZ3RTZW1HaXZlKGRldixkZXYtPnRibFJlZ3NTZW0pOwogICAgICAgIAlyZXR1cm4gcmV0VmFsOwoJICAgIH0KCX0gd2hpbGUgKGRhdGEgJiAweDgwMDApOwoKCWRhdGEgJj0gMHgwODAwOwoKCWlmKHRydW5rTnVtID4gMHg3KQoJewoJCURCR19JTkZPKCgiR1RfQkFEX1BBUkFNICh0cnVua0lkKVxuIikpOwoJCWd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKCQlyZXR1cm4gR1RfQkFEX1BBUkFNOwoJfQoKCWlmKCh0cnVua051bSA+IDB4MykgJiYgSVNfSU5fREVWX0dST1VQKGRldixERVZfUkVEVUNFRF9UUlVOSykpCgl7CgkJREJHX0lORk8oKCJHVF9CQURfUEFSQU0gKHRydW5rTnVtKVxuIikpOwoJCWd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKCQlyZXR1cm4gR1RfQkFEX1BBUkFNOwoJfQoKCWRhdGEgPSAoR1RfVTE2KShkYXRhIHwgKHRydW5rTnVtIDw8IDEyKSk7CgogICAgcmV0VmFsID0gaHdXcml0ZUdsb2JhbDJSZWcoZGV2LFFEX1JFR19UUlVOS19NQVNLX1RCTCxkYXRhKTsKICAgCWlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgCSAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKCQlndFNlbUdpdmUoZGV2LGRldi0+dGJsUmVnc1NlbSk7CiAgICAgICAJcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICByZXRWYWwgPSBod1JlYWRHbG9iYWwyUmVnKGRldixRRF9SRUdfVFJVTktfTUFTS19UQkwsJmRhdGEpOwoKCWd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKCiAgIAlpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgIAkgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAJcmV0dXJuIHJldFZhbDsKICAgIH0KCgltYXNrID0gKDEgPDwgZGV2LT5tYXhQb3J0cykgLSAxOwoKCSp0cnVua01hc2sgPSBHVF9QT1JUVkVDXzJfTFBPUlRWRUMoZGF0YSAmIG1hc2spOwoJCQkKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldEhhc2hUcnVuawoqCiogREVTQ1JJUFRJT046CioJCUhhc2ggREEgJiBTQSBmb3IgVHJ1bmtNYXNrIHNlbGVjdGlvbi4gVHJ1bmsgbG9hZCBiYWxhbmNpbmcgaXMgYWNjb21wbGlzaGVkIAoqCQlieSB1c2luZyB0aGUgZnJhbWUncyBEQSBhbmQgU0EgZmllbGRzIHRvIGFjY2VzcyBvbmUgb2YgZWlnaHQgVHJ1bmsgTWFza3MuIAoqCQlXaGVuIHRoaXMgYml0IGlzIHNldCB0byBhIG9uZSB0aGUgaGFzaGVkIGNvbXB1dGVkIGZvciBhZGRyZXNzIHRhYmxlIAoqCQlsb29rdXBzIGlzIHVzZWQgZm9yIHRoZSBUcnVua01hc2sgc2VsZWN0aW9uLiBXaGVuIHRoaXMgYml0IGlzIGNsZWFyZWQgdG8gCioJCWEgemVybyB0aGUgbG93ZXIgMyBiaXRzIG9mIHRoZSBmcmFtZSdzIERBIGFuZCBTQSBhcmUgWE9SJ2VkIHRvZ2V0aGVyIHRvIAoqCQlzZWxlY3QgdGhlIFRydW5rTWFzayB0byB1c2UuCioKKiBJTlBVVFM6CioJCWVuIC0gR1RfVFJVRSB0byB1c2UgbG9va3VwIHRhYmxlLCBHVF9GQUxTRSB0byB1c2UgWE9SLgoqCiogT1VUUFVUUzoKKgkJTm9uZS4KKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKgkJTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldEhhc2hUcnVuawooCglJTiBHVF9RRF9ERVYJKmRldiwKCUlOIEdUX0JPT0wJCWVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCglHVF9VMTYJCQlkYXRhOwoKICAgIERCR19JTkZPKCgiZ3N5c1NldEhhc2hUcnVuayBDYWxsZWQuXG4iKSk7CgoJLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfVFJVTkt8REVWX1JFRFVDRURfVFJVTkspKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIEJPT0xfMl9CSVQoZW4sZGF0YSk7CgogICAgLyogU2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod1NldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX1RSVU5LX01BU0tfVEJMLCAxMSwgMSwgZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRIYXNoVHJ1bmsKKgoqIERFU0NSSVBUSU9OOgoqCQlIYXNoIERBICYgU0EgZm9yIFRydW5rTWFzayBzZWxlY3Rpb24uIFRydW5rIGxvYWQgYmFsYW5jaW5nIGlzIGFjY29tcGxpc2hlZCAKKgkJYnkgdXNpbmcgdGhlIGZyYW1lJ3MgREEgYW5kIFNBIGZpZWxkcyB0byBhY2Nlc3Mgb25lIG9mIGVpZ2h0IFRydW5rIE1hc2tzLiAKKgkJV2hlbiB0aGlzIGJpdCBpcyBzZXQgdG8gYSBvbmUgdGhlIGhhc2hlZCBjb21wdXRlZCBmb3IgYWRkcmVzcyB0YWJsZSAKKgkJbG9va3VwcyBpcyB1c2VkIGZvciB0aGUgVHJ1bmtNYXNrIHNlbGVjdGlvbi4gV2hlbiB0aGlzIGJpdCBpcyBjbGVhcmVkIHRvIAoqCQlhIHplcm8gdGhlIGxvd2VyIDMgYml0cyBvZiB0aGUgZnJhbWUncyBEQSBhbmQgU0EgYXJlIFhPUidlZCB0b2dldGhlciB0byAKKgkJc2VsZWN0IHRoZSBUcnVua01hc2sgdG8gdXNlLgoqCiogSU5QVVRTOgoqCQlOb25lLgoqCiogT1VUUFVUUzoKKgkJZW4gLSBHVF9UUlVFIHRvIHVzZSBsb29rdXAgdGFibGUsIEdUX0ZBTFNFIHRvIHVzZSBYT1IuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRIYXNoVHJ1bmsKKAoJSU4gIEdUX1FEX0RFVgkqZGV2LAoJT1VUIEdUX0JPT0wgIAkqZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwogICAgREJHX0lORk8oKCJnc3lzR2V0SGFzaFRydW5rIENhbGxlZC5cbiIpKTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9UUlVOS3xERVZfUkVEVUNFRF9UUlVOSykpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX1RSVU5LX01BU0tfVEJMLDExLDEsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgQklUXzJfQk9PTChkYXRhLCplbik7CiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRUcnVua1JvdXRpbmcKKgoqIERFU0NSSVBUSU9OOgoqCQlUaGlzIGZ1bmN0aW9uIHNldHMgcm91dGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIFRydW5rIElELgoqCiogSU5QVVRTOgoqCQl0cnVua0lkIC0gVHJ1bmsgSUQuCioJCXRydW5rUm91dGUgLSBUcnVuayByb3V0ZSBiaXRzLiBCaXQgMCBjb250cm9scyB0cnVuayByb3V0aW5nIGZvciBwb3J0IDAsCioJCQkJCWJpdCAxIGZvciBwb3J0IDEgLCBldGMuCioKKiBPVVRQVVRTOgoqCQlOb25lLgoqCiogUkVUVVJOUzoKKgkJR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKgkJR1RfRkFJTCAtIG9uIGVycm9yCioJCUdUX0JBRF9QQVJBTSAtIGlmIHRydW5rSWQgPiAweEYuCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqCQlOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0VHJ1bmtSb3V0aW5nCigKCUlOIEdUX1FEX0RFVgkqZGV2LAoJSU4gR1RfVTMyICAJCXRydW5rSWQsCglJTiBHVF9VMzIJCXRydW5rUm91dGUKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwoJR1RfVTMyCQkJbWFzazsKCUdUX1UzMgkJCW1heFRydW5rOwoKICAgIERCR19JTkZPKCgiZ3N5c1NldFRydW5rUm91dGluZyBDYWxsZWQuXG4iKSk7CgoJLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9UUlVOSykpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgoJZ3RTZW1UYWtlKGRldixkZXYtPnRibFJlZ3NTZW0sT1NfV0FJVF9GT1JFVkVSKTsKCgkvKiBDaGVjayBpZiB0aGUgcmVnaXN0ZXIgY2FuIGJlIGFjY2Vzc2VkLiAqLwoJZG8KCXsKCSAgICByZXRWYWwgPSBod1JlYWRHbG9iYWwyUmVnKGRldixRRF9SRUdfVFJVTktfUk9VVElORywmZGF0YSk7CiAgICAJaWYocmV0VmFsICE9IEdUX09LKQoJICAgIHsKICAgIAkgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CgkJCWd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKICAgICAgICAJcmV0dXJuIHJldFZhbDsKCSAgICB9Cgl9IHdoaWxlIChkYXRhICYgMHg4MDAwKTsKCglpZiAoSVNfSU5fREVWX0dST1VQKGRldixERVZfOF9UUlVOS0lORykpCgkJbWF4VHJ1bmsgPSA4OwoJZWxzZQoJCW1heFRydW5rID0gMTY7CgoJaWYodHJ1bmtJZCA+PSBtYXhUcnVuaykKCXsKCQlEQkdfSU5GTygoIkdUX0JBRF9QQVJBTSAodHJ1bmtJZClcbiIpKTsKCQlndFNlbUdpdmUoZGV2LGRldi0+dGJsUmVnc1NlbSk7CgkJcmV0dXJuIEdUX0JBRF9QQVJBTTsKCX0KCgltYXNrID0gKDEgPDwgZGV2LT5udW1PZlBvcnRzKSAtIDE7CgoJaWYodHJ1bmtSb3V0ZSA+IG1hc2spCgl7CgkJREJHX0lORk8oKCJHVF9CQURfUEFSQU0gKHRydW5rUm91dGUpXG4iKSk7CgkJZ3RTZW1HaXZlKGRldixkZXYtPnRibFJlZ3NTZW0pOwoJCXJldHVybiBHVF9CQURfUEFSQU07Cgl9CgoJbWFzayA9IEdUX0xQT1JUVkVDXzJfUE9SVFZFQyh0cnVua1JvdXRlKTsKCglkYXRhID0gKEdUX1UxNikoMHg4MDAwIHwgKHRydW5rSWQgPDwgMTEpIHwgbWFzayk7CgogICAgLyogU2V0IHJlbGF0ZWQgcmVnaXN0ZXIgKi8KICAgIHJldFZhbCA9IGh3V3JpdGVHbG9iYWwyUmVnKGRldixRRF9SRUdfVFJVTktfUk9VVElORyxkYXRhKTsKCglndFNlbUdpdmUoZGV2LGRldi0+dGJsUmVnc1NlbSk7CgogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0VHJ1bmtSb3V0aW5nCioKKiBERVNDUklQVElPTjoKKgkJVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgcm91dGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIFRydW5rIElELgoqCiogSU5QVVRTOgoqCQl0cnVua0lkIC0gVHJ1bmsgSUQuCioKKiBPVVRQVVRTOgoqCQl0cnVua1JvdXRlIC0gVHJ1bmsgcm91dGUgYml0cy4gQml0IDAgY29udHJvbHMgdHJ1bmsgcm91dGluZyBmb3IgcG9ydCAwLAoqCQkJCQliaXQgMSBmb3IgcG9ydCAxICwgZXRjLgoqCiogUkVUVVJOUzoKKgkJR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKgkJR1RfRkFJTCAtIG9uIGVycm9yCioJCUdUX0JBRF9QQVJBTSAtIGlmIHRydW5rSWQgPiAweEYuCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqCQlOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0VHJ1bmtSb3V0aW5nCigKCUlOICBHVF9RRF9ERVYJKmRldiwKCUlOICBHVF9VMzIgCQl0cnVua0lkLAoJT1VUIEdUX1UzMgkJKnRydW5rUm91dGUKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwoJR1RfVTMyCQkJbWFzazsKCUdUX1UzMgkJCW1heFRydW5rOwoKICAgIERCR19JTkZPKCgiZ3N5c0dldFRydW5rUm91dGluZyBDYWxsZWQuXG4iKSk7CgoJLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9UUlVOSykpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgoJZ3RTZW1UYWtlKGRldixkZXYtPnRibFJlZ3NTZW0sT1NfV0FJVF9GT1JFVkVSKTsKCgkvKiBDaGVjayBpZiB0aGUgcmVnaXN0ZXIgY2FuIGJlIGFjY2Vzc2VkLiAqLwoJZG8KCXsKCSAgICByZXRWYWwgPSBod1JlYWRHbG9iYWwyUmVnKGRldixRRF9SRUdfVFJVTktfUk9VVElORywmZGF0YSk7CiAgICAJaWYocmV0VmFsICE9IEdUX09LKQoJICAgIHsKICAgIAkgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CgkJCWd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKICAgICAgICAJcmV0dXJuIHJldFZhbDsKCSAgICB9Cgl9IHdoaWxlIChkYXRhICYgMHg4MDAwKTsKCglpZiAoSVNfSU5fREVWX0dST1VQKGRldixERVZfOF9UUlVOS0lORykpCgkJbWF4VHJ1bmsgPSA4OwoJZWxzZQoJCW1heFRydW5rID0gMTY7CgoJaWYodHJ1bmtJZCA+PSBtYXhUcnVuaykKCXsKCQlEQkdfSU5GTygoIkdUX0JBRF9QQVJBTSAodHJ1bmtJZClcbiIpKTsKCQlndFNlbUdpdmUoZGV2LGRldi0+dGJsUmVnc1NlbSk7CgkJcmV0dXJuIEdUX0JBRF9QQVJBTTsKCX0KCglkYXRhID0gKEdUX1UxNikodHJ1bmtJZCA8PCAxMSk7CgogICAgcmV0VmFsID0gaHdXcml0ZUdsb2JhbDJSZWcoZGV2LFFEX1JFR19UUlVOS19ST1VUSU5HLGRhdGEpOwogICAJaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAJICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwoJCWd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKICAgICAgIAlyZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIHJldFZhbCA9IGh3UmVhZEdsb2JhbDJSZWcoZGV2LFFEX1JFR19UUlVOS19ST1VUSU5HLCZkYXRhKTsKCWd0U2VtR2l2ZShkZXYsZGV2LT50YmxSZWdzU2VtKTsKICAgCWlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgCSAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgIAlyZXR1cm4gcmV0VmFsOwogICAgfQoKCW1hc2sgPSAoMSA8PCBkZXYtPm1heFBvcnRzKSAtIDE7CgoJKnRydW5rUm91dGUgPSBHVF9QT1JUVkVDXzJfTFBPUlRWRUMoZGF0YSAmIG1hc2spOwoJCQkKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRSYXRlTGltaXRNb2RlCioKKiBERVNDUklQVElPTjoKKgkJSW5ncmVzcyBSYXRlIExpbWl0aW5nIGNhbiBiZSBlaXRoZXIgUHJpb3JpdHkgYmFzZWQgb3IgQnVyc3QgU2l6ZSBiYXNlZC4KKgkJVGhpcyByb3V0aW5lIHNldHMgd2hpY2ggbW9kZSB0byB1c2UuCioKKiBJTlBVVFM6CioJCW1vZGUgLSBlaXRoZXIgR1RfUkFURV9QUklfQkFTRSBvciBHVF9SQVRFX0JVUlNUX0JBU0UKKgoqIE9VVFBVVFM6CioJCU5vbmUuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfQkFEX1BBUkFNIC0gaWYgaW52YWxpZCBtb2RlIGlzIHVzZWQuCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqCQlOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0UmF0ZUxpbWl0TW9kZQooCglJTiBHVF9RRF9ERVYJKmRldiwKCUlOIEdUX0lOR1JFU1NfUkFURV9NT0RFIG1vZGUKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KCUdUX1UxNgkJCWRhdGE7CiAgICBHVF9VOCAgICAgICAgICAgaHdQb3J0OyAgICAgICAgIC8qIHRoZSBwaHlzaWNhbCBwb3J0IG51bWJlciAgICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNTZXRSYXRlTGltaXRNb2RlIENhbGxlZC5cbiIpKTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9CVVJTVF9SQVRFKSkKCXsKCQlpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX05FV19GRUFUVVJFX0lOX1JFVikgfHwgCgkJCSgoR1RfREVWSUNFX1JFVilkZXYtPnJldmlzaW9uIDwgR1RfUkVWXzIpKQoJICAgIHsKICAgIAkgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwoJICAgIH0KCX0KCglzd2l0Y2ggKG1vZGUpCgl7CgkJY2FzZSBHVF9SQVRFX1BSSV9CQVNFOgoJCQlkYXRhID0gMDsKCQkJYnJlYWs7CgkJY2FzZSBHVF9SQVRFX0JVUlNUX0JBU0U6CgkJCWRhdGEgPSAxOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJICAgICAgICBEQkdfSU5GTygoIk5vdCBzdXBwb3J0ZWQgbW9kZSAlaVxuIixtb2RlKSk7CgkJCXJldHVybiBHVF9CQURfUEFSQU07Cgl9CgogICAgaHdQb3J0ID0gNzsKCiAgICAvKiBTZXQgcmVsYXRlZCBiaXQgKi8KICAgIHJldFZhbCA9IGh3U2V0UG9ydFJlZ0ZpZWxkKGRldixod1BvcnQsIDB4MUEsIDE1LCAxLCBkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldFJhdGVMaW1pdE1vZGUKKgoqIERFU0NSSVBUSU9OOgoqCQlJbmdyZXNzIFJhdGUgTGltaXRpbmcgY2FuIGJlIGVpdGhlciBQcmlvcml0eSBiYXNlZCBvciBCdXJzdCBTaXplIGJhc2VkLgoqCQlUaGlzIHJvdXRpbmUgZ2V0cyB3aGljaCBtb2RlIGlzIGJlaW5nIHVzZWQuCioKKiBJTlBVVFM6CioJCU5vbmUuCioKKiBPVVRQVVRTOgoqCQltb2RlIC0gZWl0aGVyIEdUX1JBVEVfUFJJX0JBU0Ugb3IgR1RfUkFURV9CVVJTVF9CQVNFCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRSYXRlTGltaXRNb2RlCigKCUlOICBHVF9RRF9ERVYJKmRldiwKCU9VVCBHVF9JTkdSRVNTX1JBVEVfTU9ERSAqbW9kZQopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwoJR1RfVTE2CQkJZGF0YTsKICAgIEdUX1U4ICAgICAgICAgICBod1BvcnQ7ICAgICAgICAgLyogdGhlIHBoeXNpY2FsIHBvcnQgbnVtYmVyICAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c0dldFJhdGVMaW1pdE1vZGUgQ2FsbGVkLlxuIikpOwoKCS8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0JVUlNUX1JBVEUpKQoJewoJCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfTkVXX0ZFQVRVUkVfSU5fUkVWKSB8fCAKCQkJKChHVF9ERVZJQ0VfUkVWKWRldi0+cmV2aXNpb24gPCBHVF9SRVZfMikpCgkgICAgewogICAgCSAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CgkgICAgfQoJfQoKICAgIGh3UG9ydCA9IDc7CglkYXRhID0gMDsKCiAgICAvKiBHZXQgcmVsYXRlZCBiaXQgKi8KICAgIHJldFZhbCA9IGh3R2V0UG9ydFJlZ0ZpZWxkKGRldixod1BvcnQsIDB4MUEsIDE1LCAxLCAmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCglpZiAoZGF0YSA9PSAwKQoJCSptb2RlID0gR1RfUkFURV9QUklfQkFTRTsKCWVsc2UKCQkqbW9kZSA9IEdUX1JBVEVfQlVSU1RfQkFTRTsKCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0QWdlSW50CioKKiBERVNDUklQVElPTjoKKgkJRW5hYmxlL0Rpc2FibGUgQWdlIFJlZnJlc2ggSW50ZXJydXB0LiBJZiBDUFUgRGlyZWN0ZWQgTGVhcm5pbmcgaXMgYmVpbmcKKgkJdXNlZCAoZ3BydFNldExvY2tlZFBvcnQpLCBpdCBtYXkgYmUgZGVzaXJhYmxlIHRvIGtub3cgd2hlbiBhbiBhZGRyZXNzIGlzCioJCXN0aWxsIGJlaW5nIHVzZWQgYmVmb3JlIGl0IHRvdGFsbHkgYWdlcyBvdXQgb2YgdGhlIHN3aXRjaC4gVGhpcyBjYW4gYmUgCioJCWFjY29tcGxpc2hlZCBieSBlbmFibGluZyBBZ2UgUmVmcmVzaCBJbnRlcnJ1cHQgKG9yIEFUVSBBZ2UgVmlvbGF0aW9uIEludCkuCioJCUFuIEFUVSBBZ2UgVmlvbGF0aW9uIGxvb2tzIGlkZW50aWNhbCB0byBhbmQgcmVwb3J0ZWQgdGhlIHNhbWUgYXMgYW4gQVRVIAoqCQlNaXNzIFZpb2xhdGlvbi4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB3aGVuIHRoaXMgcmVwb3J0ZWQuIE5vcm1hbCBBVFUgTWlzcwoqCQlWaW9sYXRpb24gb25seSBvY2N1ciBpZiBhIG5ldyBTQSBhcnJpdmVzIGF0IGEgTG9ja2VkUG9ydC4gVGhlIEFnZSB2ZXJzaW9uIAoqCQlvZiB0aGUgQVRVIE1pc3MgVmlvbGF0aW9uIG9jY3VycyBpZiBhbiBTQSBhcnJpdmVzIGF0IGEgTG9ja2VkUG9ydCwgd2hlcmUKKgkJdGhlIGFkZHJlc3MgaXMgY29udGFpbmVkIGluIHRoZSBBVFUncyBkYXRhYmFzZSwgYnV0IHdoZXJlIGl0cyBFbnRyeVN0YXRlIAoqCQlpcyBsZXNzIHRoYW4gMHg0IChpLmUuLCBpdCBoYXMgYWdlZCBtb3JlIHRoYW4gMS8yIHdheSkuCioJCUdUX0FUVV9QUk9CIEludGVycnVwdCBzaG91bGQgYmUgZW5hYmxlZCBmb3IgdGhpcyBpbnRlcnJ1cHQgdG8gb2NjdXIuCioJCVJlZmVyIHRvIGV2ZW50U2V0QWN0aXZlIHJvdXRpbmUgdG8gZW5hYmxlIEdUX0FUVV9QUk9CLgoqCioJCUlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgUmVmcmVzaCBMb2NrZWQgZmVhdHVyZSAoZ3BydFNldFJlZnJlc2hMb2NrZWQgQVBJKSwKKgkJdGhlIGZlYXR1cmUgbXVzdCBub3QgYmUgZW5hYmxlZCBmb3IgdGhpcyBNaXNzIFZpb2xhdGlvbiB0byBvY2N1ci4KKgoqIElOUFVUUzoKKgkJZW4gLSBHVF9UUlVFLCB0byBlbmFibGUsCioJCQkgR1RfRkFMU0UsIG90aGVyd2lzZS4KKgoqIE9VVFBVVFM6CioJCU5vbmUuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRBZ2VJbnQKKAoJSU4gR1RfUURfREVWCSpkZXYsCglJTiBHVF9CT09MCQllbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwoJR1RfVTE2CQkJZGF0YTsKICAgIEdUX1U4ICAgICAgICAgICBod1BvcnQ7ICAgICAgICAgLyogdGhlIHBoeXNpY2FsIHBvcnQgbnVtYmVyICAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c1NldEFnZUludCBDYWxsZWQuXG4iKSk7CgoJLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfQUdFX0lOVEVSUlVQVCkpCgl7CgkJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9ORVdfRkVBVFVSRV9JTl9SRVYpIHx8IAoJCQkoKEdUX0RFVklDRV9SRVYpZGV2LT5yZXZpc2lvbiA8IEdUX1JFVl8yKSkKCSAgICB7CiAgICAJICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKCSAgICB9Cgl9CgogICAgQk9PTF8yX0JJVChlbiwgZGF0YSk7CgoJaWYgKElTX0lOX0RFVl9HUk9VUChkZXYsREVWX0FHRV9JTlRfR0xPQkFMMikpCgl7CgkgICAgcmV0VmFsID0gaHdTZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19NQU5BR0VNRU5ULCAxMCwgMSwgZGF0YSk7Cgl9CgllbHNlCgl7CgkgICAgaHdQb3J0ID0gNzsKCSAgICAvKiBTZXQgcmVsYXRlZCBiaXQgKi8KICAgIAlyZXRWYWwgPSBod1NldFBvcnRSZWdGaWVsZChkZXYsaHdQb3J0LCAweDFBLCAxNCwgMSwgZGF0YSk7Cgl9CgogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0QWdlSW50CioKKiBERVNDUklQVElPTjoKKgkJR2V0IHN0YXRlIG9mIEFnZSBSZWZyZXNoIEludGVycnVwdCBtb2RlLiBJZiBDUFUgRGlyZWN0ZWQgTGVhcm5pbmcgaXMgYmVpbmcKKgkJdXNlZCAoZ3BydFNldExvY2tlZFBvcnQpLCBpdCBtYXkgYmUgZGVzaXJhYmxlIHRvIGtub3cgd2hlbiBhbiBhZGRyZXNzIGlzCioJCXN0aWxsIGJlaW5nIHVzZWQgYmVmb3JlIGl0IHRvdGFsbHkgYWdlcyBvdXQgb2YgdGhlIHN3aXRjaC4gVGhpcyBjYW4gYmUgCioJCWFjY29tcGxpc2hlZCBieSBlbmFibGluZyBBZ2UgUmVmcmVzaCBJbnRlcnJ1cHQgKG9yIEFUVSBBZ2UgVmlvbGF0aW9uIEludCkuCioJCUFuIEFUVSBBZ2UgVmlvbGF0aW9uIGxvb2tzIGlkZW50aWNhbCB0byBhbmQgcmVwb3J0ZWQgdGhlIHNhbWUgYXMgYW4gQVRVIAoqCQlNaXNzIFZpb2xhdGlvbi4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB3aGVuIHRoaXMgcmVwb3J0ZWQuIE5vcm1hbCBBVFUgTWlzcwoqCQlWaW9sYXRpb24gb25seSBvY2N1ciBpZiBhIG5ldyBTQSBhcnJpdmVzIGF0IGEgTG9ja2VkUG9ydC4gVGhlIEFnZSB2ZXJzaW9uIAoqCQlvZiB0aGUgQVRVIE1pc3MgVmlvbGF0aW9uIG9jY3VycyBpZiBhbiBTQSBhcnJpdmVzIGF0IGEgTG9ja2VkUG9ydCwgd2hlcmUKKgkJdGhlIGFkZHJlc3MgaXMgY29udGFpbmVkIGluIHRoZSBBVFUncyBkYXRhYmFzZSwgYnV0IHdoZXJlIGl0cyBFbnRyeVN0YXRlIAoqCQlpcyBsZXNzIHRoYW4gMHg0IChpLmUuLCBpdCBoYXMgYWdlZCBtb3JlIHRoYW4gMS8yIHdheSkuCioJCUdUX0FUVV9QUk9CIEludGVycnVwdCBzaG91bGQgYmUgZW5hYmxlZCBmb3IgdGhpcyBpbnRlcnJ1cHQgdG8gb2NjdXIuCioJCVJlZmVyIHRvIGV2ZW50U2V0QWN0aXZlIHJvdXRpbmUgdG8gZW5hYmxlIEdUX0FUVV9QUk9CLgoqCioJCUlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgUmVmcmVzaCBMb2NrZWQgZmVhdHVyZSAoZ3BydFNldFJlZnJlc2hMb2NrZWQgQVBJKSwKKgkJdGhlIGZlYXR1cmUgbXVzdCBub3QgYmUgZW5hYmxlZCBmb3IgdGhpcyBNaXNzIFZpb2xhdGlvbiB0byBvY2N1ci4KKgoqIElOUFVUUzoKKgkJTm9uZS4KKgoqIE9VVFBVVFM6CioJCWVuIC0gR1RfVFJVRSwgaWYgZW5hYmxlZCwKKgkJCSBHVF9GQUxTRSwgb3RoZXJ3aXNlLgoqCiogUkVUVVJOUzoKKgkJR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKgkJR1RfRkFJTCAtIG9uIGVycm9yCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqCQlOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0QWdlSW50CigKCUlOICBHVF9RRF9ERVYJKmRldiwKCU9VVCBHVF9CT09MCQkqZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KCUdUX1UxNgkJCWRhdGE7CiAgICBHVF9VOCAgICAgICAgICAgaHdQb3J0OyAgICAgICAgIC8qIHRoZSBwaHlzaWNhbCBwb3J0IG51bWJlciAgICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNHZXRBZ2VJbnQgQ2FsbGVkLlxuIikpOwoKCS8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0FHRV9JTlRFUlJVUFQpKQoJewoJCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfTkVXX0ZFQVRVUkVfSU5fUkVWKSB8fCAKCQkJKChHVF9ERVZJQ0VfUkVWKWRldi0+cmV2aXNpb24gPCBHVF9SRVZfMikpCgkgICAgewogICAgCSAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CgkgICAgfQoJfQoKCWRhdGEgPSAwOwoKCWlmIChJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9BR0VfSU5UX0dMT0JBTDIpKQoJewoJICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsMlJlZ0ZpZWxkKGRldixRRF9SRUdfTUFOQUdFTUVOVCwgMTAsIDEsICZkYXRhKTsKCX0KCWVsc2UKCXsKIAkgICBod1BvcnQgPSA3OwogICAgCS8qIEdldCByZWxhdGVkIGJpdCAqLwoJICAgIHJldFZhbCA9IGh3R2V0UG9ydFJlZ0ZpZWxkKGRldixod1BvcnQsIDB4MUEsIDE0LCAxLCAmZGF0YSk7Cgl9CgogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgQklUXzJfQk9PTChkYXRhLCAqZW4pOwoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRGb3JjZVNub29wUHJpCioKKiBERVNDUklQVElPTjoKKgkJRm9yY2UgU25vb3BpbmcgUHJpb3JpdHkuIFRoZSBwcmlvcml0eSBvbiBJR01QIG9yIE1MRCBTbm9vcCBmcmFtZXMgYXJlCioJCXNldCB0byB0aGUgU25vb3BQcmkgdmFsdWUgKGdzeXNTZXRTbm9vcFByaSBBUEkpIHdoZW4gRm9yY2UgU25vb3BpbmcKKiAgICAgICBQcmlvcml0eSBpcyBlbmFibGVkLiBXaGVuIGl0J3MgZGlzYWJsZWQsIHRoZSBwcmlvcml0eSBvbiB0aGVzZSBmcmFtZXMKKgkJaXMgbm90IG1vZGlmaWVkLgoqCiogSU5QVVRTOgoqCQllbiAtIEdUX1RSVUUgdG8gdXNlIGRlZmluZWQgUFJJIGJpdHMsIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIE9VVFBVVFM6CioJCU5vbmUuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRGb3JjZVNub29wUHJpCigKCUlOIEdUX1FEX0RFVgkqZGV2LAoJSU4gR1RfQk9PTAkJZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KCUdUX1UxNgkJCWRhdGE7CgogICAgREJHX0lORk8oKCJnc3lzU2V0Rm9yY2VTbm9vcFByaSBDYWxsZWQuXG4iKSk7CgoJLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfU05PT1BfUFJJKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBCT09MXzJfQklUKGVuLGRhdGEpOwoKICAgIC8qIFNldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19QUklPUklUWV9PVkVSUklERSwgNywgMSwgZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRGb3JjZVNub29wUHJpCioKKiBERVNDUklQVElPTjoKKgkJRm9yY2UgU25vb3BpbmcgUHJpb3JpdHkuIFRoZSBwcmlvcml0eSBvbiBJR01QIG9yIE1MRCBTbm9vcCBmcmFtZXMgYXJlCioJCXNldCB0byB0aGUgU25vb3BQcmkgdmFsdWUgKGdzeXNTZXRTbm9vcFByaSBBUEkpIHdoZW4gRm9yY2UgU25vb3BpbmcKKiAgICAgICBQcmlvcml0eSBpcyBlbmFibGVkLiBXaGVuIGl0J3MgZGlzYWJsZWQsIHRoZSBwcmlvcml0eSBvbiB0aGVzZSBmcmFtZXMKKgkJaXMgbm90IG1vZGlmaWVkLgoqCiogSU5QVVRTOgoqCQlOb25lLgoqCiogT1VUUFVUUzoKKgkJZW4gLSBHVF9UUlVFIHRvIHVzZSBkZWZpbmVkIFBSSSBiaXRzLCBHVF9GQUxTRSBvdGhlcndpc2UuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRGb3JjZVNub29wUHJpCigKCUlOICBHVF9RRF9ERVYJKmRldiwKCU9VVCBHVF9CT09MICAJKmVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c0dldEZvcmNlU25vb3BQcmkgQ2FsbGVkLlxuIikpOwoKCS8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX1NOT09QX1BSSSkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX1BSSU9SSVRZX09WRVJSSURFLDcsMSwmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBCSVRfMl9CT09MKGRhdGEsKmVuKTsKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldFNub29wUHJpCioKKiBERVNDUklQVElPTjoKKgkJU25vb3AgUHJpb3JpdHkuIFdoZW4gRm9yY2VTbm9vcFByaSAoZ3N5c1NldEZvcmNlU25vb3BQcmkgQVBJKSBpcyBlbmFibGVkLAoqICAgICAgIHRoaXMgcHJpb3JpdHkgaXMgdXNlZCBhcyB0aGUgZWdyZXNzaW5nIGZyYW1lJ3MgUFJJWzI6MF0gYml0cyBvbiBnZW5lcmF0ZWQKKiAgICAgICBNYXJ2ZWxsIFRhZyBUb19DUFUgU25vb3AgZnJhbWVzIGFuZCBoaWdoZXIgMiBiaXRzIG9mIHRoZSBwcmlvcml0eSBhcmUKKiAgICAgICB1c2VkIGFzIHRoZSBpbnRlcm5hbCBRdWV1ZSBQcmlvcml0eSB0byB1c2Ugb24gSUdNUC9NTEQgc25vb3AgZnJhbWVzLgoqCiogSU5QVVRTOgoqCQlwcmkgLSBQUklbMjowXSBiaXRzIChzaG91bGQgYmUgbGVzcyB0aGFuIDgpCioKKiBPVVRQVVRTOgoqCQlOb25lLgoqCiogUkVUVVJOUzoKKgkJR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKgkJR1RfRkFJTCAtIG9uIGVycm9yCioJCUdUX0JBRF9QQVJBTSAtIElmIHByaSBpcyBub3QgbGVzcyB0aGFuIDguCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqCQlOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0U25vb3BQcmkKKAoJSU4gR1RfUURfREVWCSpkZXYsCglJTiBHVF9VMTYJCXByaQopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c1NldFNub29wUHJpIENhbGxlZC5cbiIpKTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9TTk9PUF9QUkkpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKCWlmIChwcmkgPiAweDcpCgl7CiAgICAgICAgREJHX0lORk8oKCJHVF9CQURfUEFSQU1cbiIpKTsKCQlyZXR1cm4gR1RfQkFEX1BBUkFNOwoJfQoKICAgIC8qIFNldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19QUklPUklUWV9PVkVSUklERSwgNCwgMywgcHJpKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldFNub29wUHJpCioKKiBERVNDUklQVElPTjoKKgkJU25vb3AgUHJpb3JpdHkuIFdoZW4gRm9yY2VTbm9vcFByaSAoZ3N5c1NldEZvcmNlU25vb3BQcmkgQVBJKSBpcyBlbmFibGVkLAoqICAgICAgIHRoaXMgcHJpb3JpdHkgaXMgdXNlZCBhcyB0aGUgZWdyZXNzaW5nIGZyYW1lJ3MgUFJJWzI6MF0gYml0cyBvbiBnZW5lcmF0ZWQKKiAgICAgICBNYXJ2ZWxsIFRhZyBUb19DUFUgU25vb3AgZnJhbWVzIGFuZCBoaWdoZXIgMiBiaXRzIG9mIHRoZSBwcmlvcml0eSBhcmUKKiAgICAgICB1c2VkIGFzIHRoZSBpbnRlcm5hbCBRdWV1ZSBQcmlvcml0eSB0byB1c2Ugb24gSUdNUC9NTEQgc25vb3AgZnJhbWVzLgoqCiogSU5QVVRTOgoqCQlOb25lLgoqCiogT1VUUFVUUzoKKgkJcHJpIC0gUFJJWzI6MF0gYml0cyAoc2hvdWxkIGJlIGxlc3MgdGhhbiA4KQoqCiogUkVUVVJOUzoKKgkJR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKgkJR1RfRkFJTCAtIG9uIGVycm9yCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqCQlOb25lLgoqCiogR2FsVGlzOgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0U25vb3BQcmkKKAoJSU4gIEdUX1FEX0RFVgkqZGV2LAoJT1VUIEdUX1UxNiAgCSpwcmkKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c0dldFNub29wUHJpIENhbGxlZC5cbiIpKTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9TTk9PUF9QUkkpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19QUklPUklUWV9PVkVSUklERSw0LDMscHJpKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRGb3JjZUFSUFByaQoqCiogREVTQ1JJUFRJT046CioJCUZvcmNlIEFSUCBQcmlvcml0eS4gVGhlIHByaW9yaXR5IG9uIEFSUCBmcmFtZXMgYXJlIHNldCB0byB0aGUgQVJQUHJpIAoqICAgICAgIHZhbHVlIChnc3lzU2V0QVJQUHJpIEFQSSkgd2hlbiBGb3JjZSBBUlAgUHJpb3JpdHkgaXMgZW5hYmxlZC4gV2hlbiBpdCdzIAoqICAgICAgIGRpc2FibGVkLCB0aGUgcHJpb3JpdHkgb24gdGhlc2UgZnJhbWVzIGlzIG5vdCBtb2RpZmllZC4KKgoqIElOUFVUUzoKKgkJZW4gLSBHVF9UUlVFIHRvIHVzZSBkZWZpbmVkIFBSSSBiaXRzLCBHVF9GQUxTRSBvdGhlcndpc2UuCioKKiBPVVRQVVRTOgoqCQlOb25lLgoqCiogUkVUVVJOUzoKKgkJR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKgkJR1RfRkFJTCAtIG9uIGVycm9yCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqCQlOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0Rm9yY2VBUlBQcmkKKAoJSU4gR1RfUURfREVWCSpkZXYsCglJTiBHVF9CT09MCQllbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwoJR1RfVTE2CQkJZGF0YTsKCiAgICBEQkdfSU5GTygoImdzeXNTZXRGb3JjZUFSUFByaSBDYWxsZWQuXG4iKSk7CgoJLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfQVJQX1BSSSkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgQk9PTF8yX0JJVChlbixkYXRhKTsKCiAgICAvKiBTZXQgcmVsYXRlZCBiaXQgKi8KICAgIHJldFZhbCA9IGh3U2V0R2xvYmFsMlJlZ0ZpZWxkKGRldixRRF9SRUdfUFJJT1JJVFlfT1ZFUlJJREUsIDMsIDEsIGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0Rm9yY2VBUlBQcmkKKgoqIERFU0NSSVBUSU9OOgoqCQlGb3JjZSBBUlAgUHJpb3JpdHkuIFRoZSBwcmlvcml0eSBvbiBBUlAgZnJhbWVzIGFyZSBzZXQgdG8gdGhlIEFSUFByaSAKKiAgICAgICB2YWx1ZSAoZ3N5c1NldEFSUFByaSBBUEkpIHdoZW4gRm9yY2UgQVJQIFByaW9yaXR5IGlzIGVuYWJsZWQuIFdoZW4gaXQncyAKKiAgICAgICBkaXNhYmxlZCwgdGhlIHByaW9yaXR5IG9uIHRoZXNlIGZyYW1lcyBpcyBub3QgbW9kaWZpZWQuCioKKiBJTlBVVFM6CioJCU5vbmUuCioKKiBPVVRQVVRTOgoqCQllbiAtIEdUX1RSVUUgdG8gdXNlIGRlZmluZWQgUFJJIGJpdHMsIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKgkJTm9uZS4KKgoqIEdhbFRpczoKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldEZvcmNlQVJQUHJpCigKCUlOICBHVF9RRF9ERVYJKmRldiwKCU9VVCBHVF9CT09MICAJKmVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c0dldEZvcmNlQVJQUHJpIENhbGxlZC5cbiIpKTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9BUlBfUFJJKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiBHZXQgcmVsYXRlZCBiaXQgKi8KICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsMlJlZ0ZpZWxkKGRldixRRF9SRUdfUFJJT1JJVFlfT1ZFUlJJREUsMywxLCZkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIEJJVF8yX0JPT0woZGF0YSwqZW4pOwogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0QVJQUHJpCioKKiBERVNDUklQVElPTjoKKgkJQVJQIFByaW9yaXR5LiBXaGVuIEZvcmNlQVJQUHJpIChnc3lzU2V0Rm9yY2VBUlBQcmkgQVBJKSBpcyBlbmFibGVkLAoqICAgICAgIHRoaXMgcHJpb3JpdHkgaXMgdXNlZCBhcyB0aGUgZWdyZXNzaW5nIGZyYW1lJ3MgUFJJWzI6MF0gYml0cyBvbiBnZW5lcmF0ZWQKKiAgICAgICBNYXJ2ZWxsIFRhZyBUb19DUFUgQVJQIGZyYW1lcyBhbmQgaGlnaGVyIDIgYml0cyBvZiB0aGUgcHJpb3JpdHkgYXJlCiogICAgICAgdXNlZCBhcyB0aGUgaW50ZXJuYWwgUXVldWUgUHJpb3JpdHkgdG8gdXNlIG9uIEFSUCBmcmFtZXMuCioKKiBJTlBVVFM6CioJCXByaSAtIFBSSVsyOjBdIGJpdHMgKHNob3VsZCBiZSBsZXNzIHRoYW4gOCkKKgoqIE9VVFBVVFM6CioJCU5vbmUuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfQkFEX1BBUkFNIC0gSWYgcHJpIGlzIG5vdCBsZXNzIHRoYW4gOC4KKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRBUlBQcmkKKAoJSU4gR1RfUURfREVWCSpkZXYsCglJTiBHVF9VMTYJCXByaQopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c1NldEFSUFByaSBDYWxsZWQuXG4iKSk7CgoJLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfQVJQX1BSSSkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgoJaWYgKHByaSA+IDB4NykKCXsKICAgICAgICBEQkdfSU5GTygoIkdUX0JBRF9QQVJBTVxuIikpOwoJCXJldHVybiBHVF9CQURfUEFSQU07Cgl9CgogICAgLyogU2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod1NldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX1BSSU9SSVRZX09WRVJSSURFLCAwLCAzLCBwcmkpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0QVJQUHJpCioKKiBERVNDUklQVElPTjoKKgkJQVJQIFByaW9yaXR5LiBXaGVuIEZvcmNlQVJQUHJpIChnc3lzU2V0Rm9yY2VBUlBQcmkgQVBJKSBpcyBlbmFibGVkLAoqICAgICAgIHRoaXMgcHJpb3JpdHkgaXMgdXNlZCBhcyB0aGUgZWdyZXNzaW5nIGZyYW1lJ3MgUFJJWzI6MF0gYml0cyBvbiBnZW5lcmF0ZWQKKiAgICAgICBNYXJ2ZWxsIFRhZyBUb19DUFUgQVJQIGZyYW1lcyBhbmQgaGlnaGVyIDIgYml0cyBvZiB0aGUgcHJpb3JpdHkgYXJlCiogICAgICAgdXNlZCBhcyB0aGUgaW50ZXJuYWwgUXVldWUgUHJpb3JpdHkgdG8gdXNlIG9uIEFSUCBmcmFtZXMuCioKKiBJTlBVVFM6CioJCU5vbmUuCioKKiBPVVRQVVRTOgoqCQlwcmkgLSBQUklbMjowXSBiaXRzIChzaG91bGQgYmUgbGVzcyB0aGFuIDgpCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKiBHYWxUaXM6CioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRBUlBQcmkKKAoJSU4gIEdUX1FEX0RFVgkqZGV2LAoJT1VUIEdUX1UxNiAgCSpwcmkKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c0dldEFSUFByaSBDYWxsZWQuXG4iKSk7CgoJLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfQVJQX1BSSSkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX1BSSU9SSVRZX09WRVJSSURFLDAsMyxwcmkpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldFVzZVBvcnRTY2hlZHVsZQoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyByb3V0aW5lIHNldHMgcGVyIHBvcnQgc2NoZWR1bGluZyBtb2RlCioKKiBJTlBVVFM6CiogICAgICAgZW4gLSBHVF9UUlVFIGVuYWJsZXMgcGVyIHBvcnQgc2NoZWR1bGluZywgCioJCQkgR1RfRkFMU0UgZGlzYWJsZS4KKgoqIE9VVFBVVFM6CiogICAgICAgTm9uZS4KKgoqIFJFVFVSTlM6CiogICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKgoqIENPTU1FTlRTOgoqICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRVc2VQb3J0U2NoZWR1bGUKKAogICAgSU4gIEdUX1FEX0RFViAqZGV2LAogICAgSU4gIEdUX0JPT0wgICBlbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBEYXRhIHRvIGJlIHNldCBpbnRvIHRoZSAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZ2lzdGVyLiAgICAgICAgICAgICAgICAgICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c1NldFdhdGNoRG9nIENhbGxlZC5cbiIpKTsKCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX1BPUlRfU0NIRURVTEUpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIEJPT0xfMl9CSVQoZW4sZGF0YSk7CgogICAgLyogU2V0IHRoZSBVc2VQb3J0U2NoZWR1bGUgYml0LiAgICAgICAgICAgICovCiAgICByZXRWYWwgPSBod1NldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfR0xPQkFMX0NPTlRST0wsMTIsMSxkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRVc2VQb3J0U2NoZWR1bGUKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgcm91dGluZSBnZXRzIHBlciBwb3J0IHNjaGVkdWxpbmcgbW9kZQoqCiogSU5QVVRTOgoqICAgICAgIE5vbmUuCioKKiBPVVRQVVRTOgoqICAgICAgIGVuIC0gR1RfVFJVRSBlbmFibGVzIHBlciBwb3J0IHNjaGVkdWxpbmcsIAoqCQkJIEdUX0ZBTFNFIGRpc2FibGUuCioKKiBSRVRVUk5TOgoqICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCioKKiBDT01NRU5UUzoKKiAgICAgICBOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0VXNlUG9ydFNjaGVkdWxlCigKICAgIElOICBHVF9RRF9ERVYgKmRldiwKICAgIE9VVCBHVF9CT09MICAgKmVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIERhdGEgdG8gYmUgc2V0IGludG8gdGhlICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIuICAgICAgICAgICAgICAgICAgICAqLwogICAgREJHX0lORk8oKCJnc3lzU2V0V2F0Y2hEb2cgQ2FsbGVkLlxuIikpOwoKCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfUE9SVF9TQ0hFRFVMRSkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHRoZSBVc2VQb3J0U2NoZWR1bGUgYml0LiAgICAgICAgICAgICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfR0xPQkFMX0NPTlRST0wsMTIsMSwmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBCSVRfMl9CT09MKGRhdGEsICplbik7CiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0T2xkSGFkZXIKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgcm91dGluZSBzZXRzIEVncmVzcyBPbGQgSGVhZGVyLgoqCQlXaGVuIHRoaXMgZmVhdHVyZSBpcyBlbmFibGVkIGFuZCBmcmFtZXMgYXJlIGVncmVzc2VkIHdpdGggYSBNYXJ2ZWxsIEhlYWRlciwgCioJCXRoZSBmb3JtYXQgb2YgdGhlIEhlYWRlciBpcyBzbGlnaHRseSBtb2RpZmllZCB0byBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZSAKKgkJd2l0aCBwcmV2aW91cyBkZXZpY2VzIHRoYXQgdXNlZCB0aGUgb3JpZ2luYWwgSGVhZGVyLiBTcGVjaWZpY2FsbHksIGJpdCAzCioJCW9mIHRoZSBIZWFkZXIncyAybmQgb2N0ZXQgaXMgY2xlYXJlZCB0byBhIHplcm8gc3VjaCB0aGF0IG9ubHkgRlByaVsyOjFdCioJCWlzIGF2YWlsYWJsZSBpbiB0aGUgSGVhZGVyLgoqCiogSU5QVVRTOgoqICAgICAgIGVuIC0gR1RfVFJVRSB0byBlbmFibGUgT2xkIEhlYWRlciBNb2RlLAoqCQkJIEdUX0ZBTFNFIHRvIGRpc2FibGUKKgoqIE9VVFBVVFM6CiogICAgICAgTm9uZS4KKgoqIFJFVFVSTlM6CiogICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldE9sZEhhZGVyCigKICAgIElOICBHVF9RRF9ERVYgKmRldiwKICAgIElOICBHVF9CT09MICAgZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KCUdUX1UxNgkJCWRhdGE7CgogICAgREJHX0lORk8oKCJnc3lzU2V0QXJwUVByaSBDYWxsZWQuXG4iKSk7CgoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9PTERfSEVBREVSKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBCT09MXzJfQklUKGVuLGRhdGEpOwoKICAgIC8qIFNldCB0aGUgT2xkSGFkZXIgYml0LiAgICAgICAgICAgICovCiAgICByZXRWYWwgPSBod1NldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfTUFOR0VNRU5UX0NPTlRST0wsNSwxLGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldE9sZEhhZGVyCioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIHJvdXRpbmUgZ2V0cyBFZ3Jlc3MgT2xkIEhlYWRlci4KKgkJV2hlbiB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCBhbmQgZnJhbWVzIGFyZSBlZ3Jlc3NlZCB3aXRoIGEgTWFydmVsbCBIZWFkZXIsIAoqCQl0aGUgZm9ybWF0IG9mIHRoZSBIZWFkZXIgaXMgc2xpZ2h0bHkgbW9kaWZpZWQgdG8gYmUgYmFja3dhcmRzIGNvbXBhdGlibGUgCioJCXdpdGggcHJldmlvdXMgZGV2aWNlcyB0aGF0IHVzZWQgdGhlIG9yaWdpbmFsIEhlYWRlci4gU3BlY2lmaWNhbGx5LCBiaXQgMwoqCQlvZiB0aGUgSGVhZGVyJ3MgMm5kIG9jdGV0IGlzIGNsZWFyZWQgdG8gYSB6ZXJvIHN1Y2ggdGhhdCBvbmx5IEZQcmlbMjoxXQoqCQlpcyBhdmFpbGFibGUgaW4gdGhlIEhlYWRlci4KKgoqIElOUFVUUzoKKiAgICAgICBOb25lLgoqCiogT1VUUFVUUzoKKiAgICAgICBlbiAtIEdUX1RSVUUgdG8gZW5hYmxlIE9sZCBIZWFkZXIgTW9kZSwKKgkJCSBHVF9GQUxTRSB0byBkaXNhYmxlCioKKiBSRVRVUk5TOgoqICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRPbGRIYWRlcgooCiAgICBJTiAgR1RfUURfREVWICpkZXYsCiAgICBPVVQgR1RfQk9PTCAgICplbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwoJR1RfVTE2CQkJZGF0YTsKCiAgICBEQkdfSU5GTygoImdzeXNHZXRBcnBRUHJpIENhbGxlZC5cbiIpKTsKCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX09MRF9IRUFERVIpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCB0aGUgT2xkSGFkZXIgYml0LiAgICAgICAgICAgICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfTUFOR0VNRU5UX0NPTlRST0wsNSwxLCZkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIEJJVF8yX0JPT0woZGF0YSwgKmVuKTsKCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0UmVjdXJzaXZlU3RyaXBwaW5nRGlzYWJsZQoqCiogREVTQ1JJUFRJT046CiogICAgICAgVGhpcyByb3V0aW5lIGRldGVybWluZXMgaWYgcmVjdXJzaXZlIHRhZyBzdHJpcHBpbmcgZmVhdHVyZSBuZWVkcyB0byBiZQoqCQlkaXNhYmxlZC4KKgoqIElOUFVUUzoKKiAgICAgICBlbiAtIEdUX1RSVUUgdG8gZGlzYWJsZSBSZWN1cnNpdmUgVGFnIFN0cmlwcGluZywKKgkJCSBHVF9GQUxTRSB0byBlbmFibGUKKgoqIE9VVFBVVFM6CiogICAgICAgTm9uZS4KKgoqIFJFVFVSTlM6CiogICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldFJlY3Vyc2l2ZVN0cmlwcGluZ0Rpc2FibGUKKAogICAgSU4gIEdUX1FEX0RFViAqZGV2LAogICAgSU4gIEdUX0JPT0wgICBlbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwoJR1RfVTE2CQkJZGF0YTsKCiAgICBEQkdfSU5GTygoImdzeXNTZXRSZWN1cnNpdmVTdHJpcHBpbmdEaXNhYmxlIENhbGxlZC5cbiIpKTsKCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX1JFQ1VSU0lWRV9UQUdfU1RSSVApKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIEJPT0xfMl9CSVQoZW4sZGF0YSk7CgogICAgLyogU2V0IHRoZSBSZWN1cnNpdmVTdHJpcHBpbmdEaXNhYmxlIGJpdC4gICAgICAgICAgICAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MMiwxNSwxLGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldFJlY3Vyc2l2ZVN0cmlwcGluZ0Rpc2FibGUKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgcm91dGluZSBjaGVja3MgaWYgcmVjdXJzaXZlIHRhZyBzdHJpcHBpbmcgZmVhdHVyZSBpcyBkaXNhYmxlZC4KKgoqIElOUFVUUzoKKiAgICAgICBOb25lLgoqCiogT1VUUFVUUzoKKiAgICAgICBlbiAtIEdUX1RSVUUsIGlmIFJlY3Vyc2l2ZSBUYWcgU3RyaXBwaW5nIGlzIGRpc2FibGVkLAoqCQkJIEdUX0ZBTFNFLCBvdGhlcndpc2UKKgoqIFJFVFVSTlM6CiogICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldFJlY3Vyc2l2ZVN0cmlwcGluZ0Rpc2FibGUKKAogICAgSU4gIEdUX1FEX0RFViAqZGV2LAogICAgT1VUIEdUX0JPT0wgICAqZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KCUdUX1UxNgkJCWRhdGE7CgogICAgREJHX0lORk8oKCJnc3lzR2V0UmVjdXJzaXZlU3RyaXBwaW5nRGlzYWJsZSBDYWxsZWQuXG4iKSk7CgoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9SRUNVUlNJVkVfVEFHX1NUUklQKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiBHZXQgdGhlIFJlY3Vyc2l2ZVN0cmlwcGluZ0Rpc2FibGUgYml0LiAgICAgICAgICAgICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfR0xPQkFMX0NPTlRST0wyLDE1LDEsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgQklUXzJfQk9PTChkYXRhLCAqZW4pOwoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRDUFVQb3J0CioKKiBERVNDUklQVElPTjoKKiAgICAgICBUaGlzIHJvdXRpbmUgc2V0cyBDUFUgUG9ydCB3aGVyZSBSc3ZkMkNwdSBmcmFtZXMgYW5kIElHTVAvTUxEIFNub29wZWQgCioJCWZyYW1lcyBhcmUgZGVzdGluZWQuCioKKiBJTlBVVFM6CiogICAgICAgY3B1UG9ydCAtIENQVSBQb3J0CioKKiBPVVRQVVRTOgoqICAgICAgIE5vbmUuCioKKiBSRVRVUk5TOgoqICAgICAgIEdUX09LICAgLSBvbiBzdWNjZXNzCiogICAgICAgR1RfRkFJTCAtIG9uIGVycm9yCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqICAgICAgIE5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRDUFVQb3J0CigKICAgIElOICBHVF9RRF9ERVYgKmRldiwKICAgIElOICBHVF9MUE9SVCAgY3B1UG9ydAopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTggICAgICAgICAgIGh3UG9ydDsgICAgICAgICAvKiB0aGUgcGh5c2ljYWwgcG9ydCBudW1iZXIgICAgICovCgogICAgREJHX0lORk8oKCJnc3lzU2V0Q1BVUG9ydCBDYWxsZWQuXG4iKSk7CgogICAgLyogdHJhbnNsYXRlIExQT1JUIHRvIGhhcmR3YXJlIHBvcnQgKi8KICAgIGh3UG9ydCA9IEdUX0xQT1JUXzJfUE9SVChjcHVQb3J0KTsKCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0NQVV9QT1JUKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCglpZiAoY3B1UG9ydCA+PSBkZXYtPm51bU9mUG9ydHMpCgl7CgkJcmV0dXJuIEdUX0JBRF9QQVJBTTsKCX0KCiAgICAvKiBTZXQgdGhlIENQVSBQb3J0LiAgICAgICAgICAgICovCiAgICByZXRWYWwgPSBod1NldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfTUFOR0VNRU5UX0NPTlRST0wsMCwzLChHVF9VMTYpaHdQb3J0KTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldENQVVBvcnQKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIFRoaXMgcm91dGluZSBnZXRzIENQVSBQb3J0IHdoZXJlIFJzdmQyQ3B1IGZyYW1lcyBhbmQgSUdNUC9NTEQgU25vb3BlZCAKKgkJZnJhbWVzIGFyZSBkZXN0aW5lZC4KKgoqIElOUFVUUzoKKiAgICAgICBjcHVQb3J0IC0gQ1BVIFBvcnQKKgoqIE9VVFBVVFM6CiogICAgICAgTm9uZS4KKgoqIFJFVFVSTlM6CiogICAgICAgR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKiAgICAgICBHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CiogICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldENQVVBvcnQKKAogICAgSU4gIEdUX1FEX0RFViAqZGV2LAogICAgT1VUIEdUX0xQT1JUICAqY3B1UG9ydAopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGh3UG9ydDsgICAgICAgICAvKiB0aGUgcGh5c2ljYWwgcG9ydCBudW1iZXIgICAgICovCgogICAgREJHX0lORk8oKCJnc3lzR2V0Q1BVUG9ydCBDYWxsZWQuXG4iKSk7CgoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9DUFVfUE9SVCkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHRoZSBDUFUgUG9ydC4gICAgICAgICAgICAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX01BTkdFTUVOVF9DT05UUk9MLDAsMywmaHdQb3J0KTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIC8qIHRyYW5zbGF0ZSBoYXJkd2FyZSBwb3J0IHRvIExQT1JUICovCiAgICAqY3B1UG9ydCA9IChHVF9MUE9SVClHVF9QT1JUXzJfTFBPUlQoKEdUX1U4KWh3UG9ydCk7CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldENQVURlc3QKKgoqIERFU0NSSVBUSU9OOgoqCQlUaGlzIHJvdXRpbmUgc2V0cyBDUFUgRGVzdGluYXRpb24gUG9ydC4gQ1BVIERlc3RpbmF0aW9uIHBvcnQgaW5kaWNhdGVzIHRoZQoqCQlwb3J0IG51bWJlciBvbiB0aGlzIGRldmljZSB3aGVyZSB0aGUgQ1BVIGlzIGNvbm5lY3RlZCAoZWl0aGVyIGRpcmVjdGx5IG9yCioJCWluZGlyZWN0bHkgdGhyb3VnaCBhbm90aGVyIE1hcnZlbGwgc3dpdGNoIGRldmljZSkuCioKKgkJTWFueSBtb2RlcyBvZiBmcmFtZSBwcm9jZXNzaW5nIG5lZWQgdG8ga25vdyB3aGVyZSB0aGUgQ1BVIGlzIGxvY2F0ZWQuCioJCVRoZXNlIG1vZGVzIGFyZToKKgkJMS4gV2hlbiBJR01QL01MRCBmcmFtZSBpcyByZWNlaXZlZCBhbmQgU25vb3BpbmcgaXMgZW5hYmxlZAoqCQkyLiBXaGVuIHRoZSBwb3J0IGlzIGNvbmZpZ3VyZWQgYXMgYSBEU0EgcG9ydCBhbmQgaXQgcmVjZWl2ZXMgYSBUb19DUFUgZnJhbWUKKgkJMy4gV2hlbiBhIFJzdmQyQ1BVIGZyYW1lIGVudGVycyB0aGUgcG9ydAoqCQk0LiBXaGVuIHRoZSBwb3J0J3MgU0EgRmlsdGVyaW5nIG1vZGUgaXMgRHJvcCB0byBDUFUKKgkJNS4gV2hlbiBhbnkgb2YgdGhlIHBvcnQncyBQb2xpY3kgT3B0aW9ucyB0cmFwIHRoZSBmcmFtZSB0byB0aGUgQ1BVCioJCTYuIFdoZW4gdGhlIGluZ3Jlc3NpbmcgZnJhbWUgaXMgYW4gQVJQIGFuZCBBUlAgbWlycm9yaW5nIGlzIGVuYWJsZWQgaW4gdGhlCioJCSAgIGRldmljZQoqCioJCUluIGFsbCBjYXNlcywgZXhjZXB0IGZvciBBUlAsIHRoZSBmcmFtZXMgdGhhdCBtZWV0IHRoZSBlbmFibGVkIGNyaXRlcmlhIAoqCQlhcmUgbWFwcGVkIHRvIHRoZSBDUFUgRGVzdGluYXRpb24gcG9ydCwgb3ZlcnJpZGluZyB3aGVyZSB0aGUgZnJhbWUgd291bGQgCioJCW5vcm1hbGx5IGdvLiBJbiB0aGUgY2FzZSBvZiBBUlAsIHRoZSBmcmFtZSB3aWxsIGJlIG1hcHBlZCBub3JtYWxseSBhbmQgaXQgCioJCXdpbGwgYWxzbyBnZXQgY29waWVkIHRvIHRoaXMgcG9ydC4KKgkJRnJhbWVzIHRoYXQgZmlsdGVyZWQgb3IgZGlzY2FyZGVkIHdpbGwgbm90IGJlIG1hcHBlZCB0byB0aGUgQ1BVIERlc3RpbmF0aW9uIAoqCQlwb3J0IHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgUnN2ZDJDUFUgYW5kIERTQSBUYWcgY2FzZXMuCioKKgkJSWYgQ1BVRGVzdCA9IDB4RiwgdGhlIHJlbWFwcGVkIGZyYW1lcyB3aWxsIGJlIGRpc2NhcmRlZCwgbm8gQVJQIG1pcnJvcmluZyAKKgkJd2lsbCBvY2N1ciBhbmQgaW5ncmVzc2luZyBUb19DUFUgZnJhbWVzIHdpbGwgYmUgZGlzY2FyZGVkLgoqCiogSU5QVVRTOgoqCQlwb3J0ICAtIHRoZSBsb2dpY2FsIHBvcnQgbnVtYmVyLgoqCiogT1VUUFVUUzoKKgkJTm9uZS4KKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKgkJTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldENQVURlc3QKKAoJSU4gR1RfUURfREVWCSpkZXYsCglJTiBHVF9MUE9SVAkJcG9ydAopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTggICAgICAgICAgIGh3UG9ydDsgICAgICAgICAvKiB0aGUgcGh5c2ljYWwgcG9ydCBudW1iZXIgICAgICovCgogICAgREJHX0lORk8oKCJnc3lzU2V0Q1BVRGVzdCBDYWxsZWQuXG4iKSk7CgogICAgLyogdHJhbnNsYXRlIExQT1JUIHRvIGhhcmR3YXJlIHBvcnQgKi8KICAgIGh3UG9ydCA9IEdUX0xQT1JUXzJfUE9SVChwb3J0KTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0NQVV9ERVNUKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiB0cmFuc2xhdGUgTFBPUlQgdG8gaGFyZHdhcmUgcG9ydCAqLwoJaWYocG9ydCA9PSAweEYpCgkJaHdQb3J0ID0gKEdUX1U4KXBvcnQ7CgllbHNlCgl7CgkgICAgaHdQb3J0ID0gKEdUX1U4KShHVF9MUE9SVF8yX1BPUlQocG9ydCkpOwoJCWlmIChod1BvcnQgPT0gR1RfSU5WQUxJRF9QT1JUKQoJCQlyZXR1cm4gR1RfQkFEX1BBUkFNOwoJfQoKICAgIC8qIFNldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX01PTklUT1JfQ09OVFJPTCwgNCwgNCwgKEdUX1UxNilod1BvcnQpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0Q1BVRGVzdAoqCiogREVTQ1JJUFRJT046CioJCVRoaXMgcm91dGluZSBnZXRzIENQVSBEZXN0aW5hdGlvbiBQb3J0LiBDUFUgRGVzdGluYXRpb24gcG9ydCBpbmRpY2F0ZXMgdGhlCioJCXBvcnQgbnVtYmVyIG9uIHRoaXMgZGV2aWNlIHdoZXJlIHRoZSBDUFUgaXMgY29ubmVjdGVkIChlaXRoZXIgZGlyZWN0bHkgb3IKKgkJaW5kaXJlY3RseSB0aHJvdWdoIGFub3RoZXIgTWFydmVsbCBzd2l0Y2ggZGV2aWNlKS4KKgoqCQlNYW55IG1vZGVzIG9mIGZyYW1lIHByb2Nlc3NpbmcgbmVlZCB0byBrbm93IHdoZXJlIHRoZSBDUFUgaXMgbG9jYXRlZC4KKgkJVGhlc2UgbW9kZXMgYXJlOgoqCQkxLiBXaGVuIElHTVAvTUxEIGZyYW1lIGlzIHJlY2VpdmVkIGFuZCBTbm9vcGluZyBpcyBlbmFibGVkCioJCTIuIFdoZW4gdGhlIHBvcnQgaXMgY29uZmlndXJlZCBhcyBhIERTQSBwb3J0IGFuZCBpdCByZWNlaXZlcyBhIFRvX0NQVSBmcmFtZQoqCQkzLiBXaGVuIGEgUnN2ZDJDUFUgZnJhbWUgZW50ZXJzIHRoZSBwb3J0CioJCTQuIFdoZW4gdGhlIHBvcnQncyBTQSBGaWx0ZXJpbmcgbW9kZSBpcyBEcm9wIHRvIENQVQoqCQk1LiBXaGVuIGFueSBvZiB0aGUgcG9ydCdzIFBvbGljeSBPcHRpb25zIHRyYXAgdGhlIGZyYW1lIHRvIHRoZSBDUFUKKgkJNi4gV2hlbiB0aGUgaW5ncmVzc2luZyBmcmFtZSBpcyBhbiBBUlAgYW5kIEFSUCBtaXJyb3JpbmcgaXMgZW5hYmxlZCBpbiB0aGUKKgkJICAgZGV2aWNlCioKKgkJSW4gYWxsIGNhc2VzLCBleGNlcHQgZm9yIEFSUCwgdGhlIGZyYW1lcyB0aGF0IG1lZXQgdGhlIGVuYWJsZWQgY3JpdGVyaWEgCioJCWFyZSBtYXBwZWQgdG8gdGhlIENQVSBEZXN0aW5hdGlvbiBwb3J0LCBvdmVycmlkaW5nIHdoZXJlIHRoZSBmcmFtZSB3b3VsZCAKKgkJbm9ybWFsbHkgZ28uIEluIHRoZSBjYXNlIG9mIEFSUCwgdGhlIGZyYW1lIHdpbGwgYmUgbWFwcGVkIG5vcm1hbGx5IGFuZCBpdCAKKgkJd2lsbCBhbHNvIGdldCBjb3BpZWQgdG8gdGhpcyBwb3J0LgoqCQlGcmFtZXMgdGhhdCBmaWx0ZXJlZCBvciBkaXNjYXJkZWQgd2lsbCBub3QgYmUgbWFwcGVkIHRvIHRoZSBDUFUgRGVzdGluYXRpb24gCioJCXBvcnQgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBSc3ZkMkNQVSBhbmQgRFNBIFRhZyBjYXNlcy4KKgoqCQlJZiBDUFVEZXN0ID0gMHhGLCB0aGUgcmVtYXBwZWQgZnJhbWVzIHdpbGwgYmUgZGlzY2FyZGVkLCBubyBBUlAgbWlycm9yaW5nIAoqCQl3aWxsIG9jY3VyIGFuZCBpbmdyZXNzaW5nIFRvX0NQVSBmcmFtZXMgd2lsbCBiZSBkaXNjYXJkZWQuCioKKiBJTlBVVFM6CioJCU5vbmUuCioKKiBPVVRQVVRTOgoqCQlwb3J0ICAtIHRoZSBsb2dpY2FsIHBvcnQgbnVtYmVyLgoqCiogUkVUVVJOUzoKKgkJR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKgkJR1RfRkFJTCAtIG9uIGVycm9yCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqCQlOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0Q1BVRGVzdAooCglJTiAgR1RfUURfREVWCSpkZXYsCglPVVQgR1RfTFBPUlQgIAkqcG9ydAopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCiAgICBEQkdfSU5GTygoImdzeXNHZXRDUFVEZXN0IENhbGxlZC5cbiIpKTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0NQVV9ERVNUKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiBHZXQgcmVsYXRlZCBiaXQgKi8KICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19NT05JVE9SX0NPTlRST0wsIDQsIDQsICZkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKCWlmKGRhdGEgPT0gMHhGKQoJewoJCSpwb3J0ID0gKEdUX0xQT1JUKWRhdGE7Cgl9CgllbHNlCgl7CgkgICAgKnBvcnQgPSBHVF9QT1JUXzJfTFBPUlQoKEdUX1U4KWRhdGEpOwoJfQogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldE1pcnJvckRlc3QKKgoqIERFU0NSSVBUSU9OOgoqCQlUaGlzIHJvdXRpbmUgc2V0cyBNaXJyb3IgRGVzdGluYXRpb24gUG9ydC4gRnJhbWVzIHRoYXQgaW5ncmVzcyBhIHBvcnQgCioJCXRoYXQgdHJpZ2dlciBhIHBvbGljeSBtaXJyb3IgYXJlIG1hcHBlZCAoY29waWVkKSB0byB0aGlzIHBvcnQgYXMgbG9uZyBhcyAKKgkJdGhlIGZyYW1lIGlzIG5vdCBmaWx0ZXJlZCBvciBkaXNjYXJkZWQuIAoqCQlUaGUgTWlycm9yIERlc3RpbmF0aW9uIHBvcnQgc2hvdWxkIHBvaW50IHRvIHRoZSBwb3J0IHRoYXQgZGlyZWN0cyB0aGVzZSAKKgkJZnJhbWVzIHRvIHRoZSBDUFUgdGhhdCB3aWxsIHByb2Nlc3MgdGhlc2UgZnJhbWVzLiBUaGlzIHRhcmdldCBwb3J0IHNob3VsZCAKKgkJYmUgYSBEU0EgVGFnIHBvcnQgc28gdGhlIGZyYW1lcyB3aWxsIGVncmVzcyB3aXRoIGEgVG9fQ1BVIERTQSBUYWcgd2l0aCBhIAoqCQlDUFUgQ29kZSBvZiBQb2xpY3kgTWlycm9yLgoqCQlUb19DUFUgRFNBIFRhZyBmcmFtZXMgd2l0aCBhIENQVSBDb2RlIG9mIFBvbGljeSBNaXJyb3IgdGhhdCBpbmdyZXNzIGEgRFNBIAoqCQlUYWcgcG9ydCB3aWxsIGJlIHNlbnQgdG8gdGhlIHBvcnQgbnVtYmVyIGRlZmluZWQgaW4gTWlycm9yRGVzdC4KKgoqCQlJZiBNaXJyb3JEZXN0ID0gMHhGLCBQb2xpY3kgTWlycm9yaW5nIGlzIGRpc2FibGVkIGFuZCBpbmdyZXNzaW5nIFRvX0NQVSAKKgkJUG9saWN5IE1pcnJvciBmcmFtZXMgd2lsbCBiZSBkaXNjYXJkZWQuCioKKiBJTlBVVFM6CioJCXBvcnQgIC0gdGhlIGxvZ2ljYWwgcG9ydCBudW1iZXIuCioKKiBPVVRQVVRTOgoqCQlOb25lLgoqCiogUkVUVVJOUzoKKgkJR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKgkJR1RfRkFJTCAtIG9uIGVycm9yCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqCQlOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0TWlycm9yRGVzdAooCglJTiBHVF9RRF9ERVYJKmRldiwKCUlOIEdUX0xQT1JUCQlwb3J0CikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VOCAgICAgICAgICAgaHdQb3J0OyAgICAgICAgIC8qIHRoZSBwaHlzaWNhbCBwb3J0IG51bWJlciAgICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNTZXRNaXJyb3JEZXN0IENhbGxlZC5cbiIpKTsKCiAgICAvKiB0cmFuc2xhdGUgTFBPUlQgdG8gaGFyZHdhcmUgcG9ydCAqLwogICAgaHdQb3J0ID0gR1RfTFBPUlRfMl9QT1JUKHBvcnQpOwoKCS8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfTUlSUk9SX0RFU1QpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIHRyYW5zbGF0ZSBMUE9SVCB0byBoYXJkd2FyZSBwb3J0ICovCglpZihwb3J0ID09IDB4RikKCQlod1BvcnQgPSAoR1RfVTgpcG9ydDsKCWVsc2UKCXsKCSAgICBod1BvcnQgPSAoR1RfVTgpKEdUX0xQT1JUXzJfUE9SVChwb3J0KSk7CgkJaWYgKGh3UG9ydCA9PSBHVF9JTlZBTElEX1BPUlQpCgkJCXJldHVybiBHVF9CQURfUEFSQU07Cgl9CgogICAgLyogU2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod1NldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfTU9OSVRPUl9DT05UUk9MLCAwLCA0LCAoR1RfVTE2KWh3UG9ydCk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRNaXJyb3JEZXN0CioKKiBERVNDUklQVElPTjoKKgkJVGhpcyByb3V0aW5lIGdldHMgTWlycm9yIERlc3RpbmF0aW9uIFBvcnQuIEZyYW1lcyB0aGF0IGluZ3Jlc3MgYSBwb3J0IAoqCQl0aGF0IHRyaWdnZXIgYSBwb2xpY3kgbWlycm9yIGFyZSBtYXBwZWQgKGNvcGllZCkgdG8gdGhpcyBwb3J0IGFzIGxvbmcgYXMgCioJCXRoZSBmcmFtZSBpcyBub3QgZmlsdGVyZWQgb3IgZGlzY2FyZGVkLiAKKgkJVGhlIE1pcnJvciBEZXN0aW5hdGlvbiBwb3J0IHNob3VsZCBwb2ludCB0byB0aGUgcG9ydCB0aGF0IGRpcmVjdHMgdGhlc2UgCioJCWZyYW1lcyB0byB0aGUgQ1BVIHRoYXQgd2lsbCBwcm9jZXNzIHRoZXNlIGZyYW1lcy4gVGhpcyB0YXJnZXQgcG9ydCBzaG91bGQgCioJCWJlIGEgRFNBIFRhZyBwb3J0IHNvIHRoZSBmcmFtZXMgd2lsbCBlZ3Jlc3Mgd2l0aCBhIFRvX0NQVSBEU0EgVGFnIHdpdGggYSAKKgkJQ1BVIENvZGUgb2YgUG9saWN5IE1pcnJvci4KKgkJVG9fQ1BVIERTQSBUYWcgZnJhbWVzIHdpdGggYSBDUFUgQ29kZSBvZiBQb2xpY3kgTWlycm9yIHRoYXQgaW5ncmVzcyBhIERTQSAKKgkJVGFnIHBvcnQgd2lsbCBiZSBzZW50IHRvIHRoZSBwb3J0IG51bWJlciBkZWZpbmVkIGluIE1pcnJvckRlc3QuCioKKgkJSWYgTWlycm9yRGVzdCA9IDB4RiwgUG9saWN5IE1pcnJvcmluZyBpcyBkaXNhYmxlZCBhbmQgaW5ncmVzc2luZyBUb19DUFUgCioJCVBvbGljeSBNaXJyb3IgZnJhbWVzIHdpbGwgYmUgZGlzY2FyZGVkLgoqCiogSU5QVVRTOgoqCQlOb25lLgoqCiogT1VUUFVUUzoKKgkJcG9ydCAgLSB0aGUgbG9naWNhbCBwb3J0IG51bWJlci4KKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKgkJTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldE1pcnJvckRlc3QKKAoJSU4gIEdUX1FEX0RFVgkqZGV2LAoJT1VUIEdUX0xQT1JUICAJKnBvcnQKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwogICAgREJHX0lORk8oKCJnc3lzR2V0TWlycm9yRGVzdCBDYWxsZWQuXG4iKSk7CgoJLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9DUFVfREVTVCkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfTU9OSVRPUl9DT05UUk9MLCAwLCA0LCAmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCglpZihkYXRhID09IDB4RikKCXsKCQkqcG9ydCA9IChHVF9MUE9SVClkYXRhOwoJfQoJZWxzZQoJewoJICAgICpwb3J0ID0gR1RfUE9SVF8yX0xQT1JUKChHVF9VOClkYXRhKTsKCX0KICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldFJNUG9ydAoqCiogREVTQ1JJUFRJT046CioJCVJlbW90ZSBNYW5hZ2VtZW50IGZlYXR1cmUgaXMgZW5hYmxlZCBvbmx5IG9uIG9uZSBwb3J0LiBTaW5jZSBub3QgYWxsIHBvcnRzCioJCWNhbiBiZSBlbmFibGVkIGZvciBSZW1vdGUgTWFuYWdlbWVudCBmZWF0dXJlLCBwbGVhc2UgcmVmZXIgdG8gdGhlIGRldmljZQoqCQlkYXRhc2hlZXQgZm9yIGRldGFpbGVkIGluZm9ybWF0aW9uLgoqCQlGb3IgZXhhbXBsZSwgODhFNjA5NyBkZXZpY2UgYWxsb3dzIGxvZ2ljYWwgcG9ydCA5IG9yIDEwLCBhbmQgODhFNjA0NyAKKgkJZGV2aWNlIGFsbG93cyBsb2dpY2FsIHBvcnQgNCBhbmQgNS4KKgkJCiogSU5QVVRTOgoqCQlwb3J0IC0gUmVtb3RlIE1hbmFnZW1lbnQgUG9ydAoqCiogT1VUUFVUUzoKKgkJTm9uZS4KKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9CQURfUEFSQU0gICAgIC0gb24gdW5hbGxvd2FibGUgcG9ydAoqCQlHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKgkJT2Jzb2xldGUuIFBsZWFzZSB1c2VzIGdzeXNTZXRSTVVNb2RlIEFQSSwgaW5zdGVhZC4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldFJNUG9ydAooCglJTiBHVF9RRF9ERVYJKmRldiwKCUlOIEdUX0xQT1JUIAlwb3J0CikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNTZXRSTVBvcnQgQ2FsbGVkLlxuIikpOwoKCS8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfRlJBTUVfVE9fUkVHSVNURVIpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIHRyYW5zbGF0ZSBMUE9SVCB0byBoYXJkd2FyZSBwb3J0ICovCglzd2l0Y2goR1RfTFBPUlRfMl9QT1JUKHBvcnQpKQoJewoJCWNhc2UgOToKCQkJCWRhdGEgPSAwOwoJCQkJYnJlYWs7CgkJY2FzZSAxMDoKCQkJCWRhdGEgPSAxOwoJCQkJYnJlYWs7CgkJZGVmYXVsdDoKCSAgICAJICAgIERCR19JTkZPKCgiTm90IEFsbG93ZWQgUG9ydC5cbiIpKTsKICAgIAkgICAgCXJldHVybiBHVF9CQURfUEFSQU07Cgl9CgogICAgLyogU2V0IHRoZSBGMlIgcG9ydC4gKi8KICAgIHJldFZhbCA9IGh3U2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19HTE9CQUxfQ09OVFJPTDIsMTMsMSxkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldFJNUG9ydAoqCiogREVTQ1JJUFRJT046CioJCVJlbW90ZSBNYW5hZ2VtZW50IGZlYXR1cmUgaXMgZW5hYmxlZCBvbmx5IG9uIG9uZSBwb3J0LiBTaW5jZSBub3QgYWxsIHBvcnRzCioJCWNhbiBiZSBlbmFibGVkIGZvciBSZW1vdGUgTWFuYWdlbWVudCBmZWF0dXJlLCBwbGVhc2UgcmVmZXIgdG8gdGhlIGRldmljZQoqCQlkYXRhc2hlZXQgZm9yIGRldGFpbGVkIGluZm9ybWF0aW9uLgoqCQlGb3IgZXhhbXBsZSwgODhFNjA5NyBkZXZpY2UgYWxsb3dzIGxvZ2ljYWwgcG9ydCA5IG9yIDEwLCBhbmQgODhFNjA0NyAKKgkJZGV2aWNlIGFsbG93cyBsb2dpY2FsIHBvcnQgNCBhbmQgNS4KKgoqIElOUFVUUzoKKgkJTm9uZS4KKgoqIE9VVFBVVFM6CioJCXBvcnQgLSBSZW1vdGUgTWFuYWdlbWVudCBQb3J0CioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU9ic29sZXRlLiBQbGVhc2UgdXNlcyBnc3lzR2V0Uk1VTW9kZSBBUEksIGluc3RlYWQuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRSTVBvcnQKKAoJSU4gIEdUX1FEX0RFVgkqZGV2LAoJT1VUIEdUX0xQT1JUIAkqcG9ydAopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCgogICAgREJHX0lORk8oKCJnc3lzR2V0Uk1Qb3J0IENhbGxlZC5cbiIpKTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0ZSQU1FX1RPX1JFR0lTVEVSKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiBHZXQgdGhlIEYyUiBwb3J0LiAgICAgICAgICAgICAgICAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MMiwxMywxLCZkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKCWlmKGRhdGEgPT0gMSkKCXsKCQkqcG9ydCA9IEdUX1BPUlRfMl9MUE9SVCgxMCk7Cgl9CgllbHNlCgl7CgkgICAgKnBvcnQgPSBHVF9QT1JUXzJfTFBPUlQoOSk7Cgl9CiAgICAKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRSTURBQ2hlY2sKKgoqIERFU0NSSVBUSU9OOgoqCQlDaGVjayB0aGUgREEgb24gUmVtb3RlIE1hbmFnZW1lbnQgZnJhbWVzLiAKKgkJV2hlbiBEQSBDaGVjayBpcyBlbmFibGVkLCB0aGUgREEgb2YgUmVtb3RlIE1hbmFnZW1lbnQgZnJhbWVzIG11c3QgYmUgCioJCWNvbnRhaW5lZCBpbiB0aGlzIGRldmljZSdzIGFkZHJlc3MgZGF0YWJhc2UgKEFUVSkgYXMgYSBTdGF0aWMgZW50cnkgCioJCShlaXRoZXIgdW5pY2FzdCBvciBtdWx0aWNhc3QpLiBJZiB0aGUgREEgb2YgdGhlIGZyYW1lIGlzIG5vdCBjb250YWluZWQgCioJCWluIHRoaXMgZGV2aWNlJ3MgYWRkcmVzcyBkYXRhYmFzZSwgdGhlIGZyYW1lIHdpbGwgYmUgbm90IGJlIHByb2Nlc3NlZCBhcyAKKgkJYSBSZW1vdGUgTWFuYWdlbWVudCBmcmFtZS4KKgkJV2hlbiBEQSBDaGVjayBpcyBkaXNhYmxlZCwgdGhlIERBIG9mIFJlbW90ZSBNYW5hZ2VtZW50IGZyYW1lcyBpcyBub3QgCioJCXZhbGlkYXRlZCBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgZnJhbWUuCioJCQoqIElOUFVUUzoKKgkJZW4gLSBHVF9UUlVFIHRvIGVuYWJsZSBEQSBDaGVjaywgCioJCQkgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogT1VUUFVUUzoKKgkJTm9uZS4KKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKgkJTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldFJNREFDaGVjawooCglJTiBHVF9RRF9ERVYJKmRldiwKCUlOIEdUX0JPT0wgCQllbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCgogICAgREJHX0lORk8oKCJnc3lzU2V0Uk1EQUNoZWNrIENhbGxlZC5cbiIpKTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0ZSQU1FX1RPX1JFR0lTVEVSKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBCT09MXzJfQklUKGVuLGRhdGEpOwoKICAgIC8qIFNldCB0aGUgREEgQ2hlY2sgYml0LiAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MMiwxNCwxLGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0Uk1EQUNoZWNrCioKKiBERVNDUklQVElPTjoKKgkJQ2hlY2sgdGhlIERBIG9uIFJlbW90ZSBNYW5hZ2VtZW50IGZyYW1lcy4gCioJCVdoZW4gREEgQ2hlY2sgaXMgZW5hYmxlZCwgdGhlIERBIG9mIFJlbW90ZSBNYW5hZ2VtZW50IGZyYW1lcyBtdXN0IGJlIAoqCQljb250YWluZWQgaW4gdGhpcyBkZXZpY2UncyBhZGRyZXNzIGRhdGFiYXNlIChBVFUpIGFzIGEgU3RhdGljIGVudHJ5IAoqCQkoZWl0aGVyIHVuaWNhc3Qgb3IgbXVsdGljYXN0KS4gSWYgdGhlIERBIG9mIHRoZSBmcmFtZSBpcyBub3QgY29udGFpbmVkIAoqCQlpbiB0aGlzIGRldmljZSdzIGFkZHJlc3MgZGF0YWJhc2UsIHRoZSBmcmFtZSB3aWxsIGJlIG5vdCBiZSBwcm9jZXNzZWQgYXMgCioJCWEgRnJhbWUtdG8tUmVndGVyIGZyYW1lLgoqCQlXaGVuIERBIENoZWNrIGlzIGRpc2FibGVkLCB0aGUgREEgb2YgUmVtb3RlIE1hbmFnZW1lbnQgZnJhbWVzIGlzIG5vdCAKKgkJdmFsaWRhdGVkIGJlZm9yZSBwcm9jZXNzaW5nIHRoZSBmcmFtZS4KKgoqIElOUFVUUzoKKgkJTm9uZS4KKgoqIE9VVFBVVFM6CioJCWVuIC0gR1RfVFJVRSBpZiBEQSBDaGVjayBpcyBlbmFibGVkLCAKKgkJCSBHVF9GQUxTRSBvdGhlcndpc2UuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRSTURBQ2hlY2sKKAoJSU4gIEdUX1FEX0RFVgkqZGV2LAoJT1VUIEdUX0JPT0wgCSplbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCgogICAgREJHX0lORk8oKCJnc3lzR2V0Uk1EQUNoZWNrIENhbGxlZC5cbiIpKTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0ZSQU1FX1RPX1JFR0lTVEVSKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiBHZXQgdGhlIERBIENoZWNrIGJpdC4gICAgICAgICAgICAgICAgKi8KICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsUmVnRmllbGQoZGV2LFFEX1JFR19HTE9CQUxfQ09OVFJPTDIsMTQsMSwmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBCSVRfMl9CT09MKGRhdGEsKmVuKTsKCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0Uk1FbmFibGUKKgoqIERFU0NSSVBUSU9OOgoqCQlFbmFibGUgb3IgZGlzYWJsZSBSZW1vdGUgTWFuYWdlbWVudCBmZWF0dXJlLiBUaGlzIGZlYXR1cmUgY2FuIGJlIGVuYWJsZWQKKgkJb25seSBvbiBvbmUgcG9ydCAoc2VlIGdzeXNTZXRSTVBvcnQgQVBJKS4KKgkJCiogSU5QVVRTOgoqCQllbiAtIEdUX1RSVUUgdG8gZW5hYmxlIFJlbW90ZSBNYW5hZ2VtZW50IGZlYXR1cmUsIAoqCQkJIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIE9VVFBVVFM6CioJCU5vbmUuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU9ic29sZXRlLiBQbGVhc2UgdXNlcyBnc3lzU2V0Uk1VTW9kZSBBUEksIGluc3RlYWQuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRSTUVuYWJsZQooCglJTiBHVF9RRF9ERVYJKmRldiwKCUlOIEdUX0JPT0wgCQllbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCgogICAgREJHX0lORk8oKCJnc3lzU2V0Uk1FbmFibGUgQ2FsbGVkLlxuIikpOwoKCS8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfRlJBTUVfVE9fUkVHSVNURVIpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIEJPT0xfMl9CSVQoZW4sZGF0YSk7CgogICAgLyogU2V0IHRoZSBGMlIgRW4gYml0LiAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MMiwxMiwxLGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0Uk1FbmFibGUKKgoqIERFU0NSSVBUSU9OOgoqCQlFbmFibGUgb3IgZGlzYWJsZSBSZW1vdGUgTWFuYWdlbWVudCBmZWF0dXJlLiBUaGlzIGZlYXR1cmUgY2FuIGJlIGVuYWJsZWQKKgkJb25seSBvbiBvbmUgcG9ydCAoc2VlIGdzeXNTZXRSTVBvcnQgQVBJKS4KKgoqIElOUFVUUzoKKgkJTm9uZS4KKgoqIE9VVFBVVFM6CioJCWVuIC0gR1RfVFJVRSBpZiBSZW1vdGUgTWFuYWdlbWVudCBmZWF0dXJlIGlzIGVuYWJsZWQsIAoqCQkJIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKgkJT2Jzb2xldGUuIFBsZWFzZSB1c2VzIGdzeXNHZXRSTVVNb2RlIEFQSSwgaW5zdGVhZC4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldFJNRW5hYmxlCigKCUlOICBHVF9RRF9ERVYJKmRldiwKCU9VVCBHVF9CT09MIAkqZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c0dldFJNRW5hYmxlIENhbGxlZC5cbiIpKTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0ZSQU1FX1RPX1JFR0lTVEVSKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiBHZXQgdGhlIEYyUiBFbiBiaXQuICAgICAgICAgICAgICAgICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfR0xPQkFMX0NPTlRST0wyLDEyLDEsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgQklUXzJfQk9PTChkYXRhLCplbik7CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldFJNVU1vZGUKKgoqIERFU0NSSVBUSU9OOgoqCQlTZXQgUm1vdGUgTWFuYWdlbWVudCBVbml0IE1vZGU6IGRpc2FibGUsIGVuYWJsZSBvbiBwb3J0IDQgb3IgNSwgb3IgZW5hYmxlCioJCW9uIHBvcnQgOSBvciAxMC4gRGV2aWNlcywgc3VjaCBhcyA4OEU2MDk3LCBzdXBwb3J0IFJNVSBvbiBwb3J0IDkgYW5kIDEwLCAKKgkJd2hpbGUgb3RoZXIgZGV2aWNlcywgc3VjaCBhcyA4OEU2MTY1LCBzdXBwb3J0IFJNVSBvbiBwb3J0IDQgYW5kIDUuIFNvLAoqCQlwbGVhc2UgcmVmZXIgdG8gdGhlIGRldmljZSBkYXRhc2hlZXQgZm9yIGRldGFpbC4KKgkJV2hlbiBSTVUgaXMgZW5hYmxlZCBhbmQgdGhpcyBkZXZpY2UgcmVjZWl2ZXMgYSBSZW1vdGUgTWFuYWdlbWVudCBSZXF1ZXN0CioJCWZyYW1lIGRpcmVjdGVkIHRvIHRoaXMgZGV2aWNlLCB0aGUgZnJhbWUgd2lsbCBiZSBwcm9jZXNzZWQgYW5kIGEgUmVtb3RlIAoqCQlNYW5hZ2VtZW50IFJlc3BvbnNlIGZyYW1lIHdpbGwgYmUgZ2VuZXJhdGVkIGFuZCBzZW50IG91dC4KKgkJCioJCU5vdGU6IGVuYWJsaW5nIFJNVSBoYXMgbm8gZWZmZWN0IGlmIHRoZSBSZW1vdGUgTWFuYWdlbWVudCBwb3J0IGlzIGluIGhhbGYKKgkJZHVwbGV4IG1vZGUuIFRoZSBwb3J0J3MgRnJhbWVNb2RlIG11c3QgYmUgRFNBIG9yIEV0aGVyVHlwZSBEU0EgYXMgd2VsbC4KKgkJCiogSU5QVVRTOgoqCQlybXUgLSBHVF9STVUgc3RydWN0dXJlCioKKiBPVVRQVVRTOgoqCQlOb25lLgoqCiogUkVUVVJOUzoKKgkJR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKgkJR1RfRkFJTCAtIG9uIGVycm9yCioJCUdUX0JBRF9QQVJBTSAgICAgLSBvbiBiYWQgcGFyYW1ldGVyCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqCQlOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0Uk1VTW9kZQooCglJTiBHVF9RRF9ERVYJKmRldiwKCUlOIEdUX1JNVQkJKnJtdQopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCiAgICBHVF9VMTYgICAgICAgICAgcG9ydDsKCiAgICBEQkdfSU5GTygoImdzeXNTZXRSTVVNb2RlIENhbGxlZC5cbiIpKTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBzdGF0dXMuICovCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0ZSQU1FX1RPX1JFR0lTVEVSKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCglpZiAoSVNfSU5fREVWX0dST1VQKGRldixERVZfUk1VX01PREUpKQoJewoJCWlmIChybXUtPnJtdUVuID09IEdUX1RSVUUpCgkJewoJCQlwb3J0ID0gR1RfTFBPUlRfMl9QT1JUKHJtdS0+cG9ydCk7CgkJCWlmIChwb3J0ID09IEdUX0lOVkFMSURfUE9SVCkKCQkJCXJldHVybiBHVF9CQURfUEFSQU07CgoJCQlzd2l0Y2gocG9ydCkKCQkJewoJCQkJY2FzZSA0OgoJCQkJCWRhdGEgPSAxOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSA1OgoJCQkJCWRhdGEgPSAyOwoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQlyZXR1cm4gR1RfQkFEX1BBUkFNOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWRhdGEgPSAwOwoJCX0KCX0KCWVsc2UKCXsKCQlpZiAocm11LT5ybXVFbikKCQl7CgkJCXBvcnQgPSBHVF9MUE9SVF8yX1BPUlQocm11LT5wb3J0KTsKCQkJaWYgKHBvcnQgPT0gR1RfSU5WQUxJRF9QT1JUKQoJCQkJcmV0dXJuIEdUX0JBRF9QQVJBTTsKCgkJCXN3aXRjaChwb3J0KQoJCQl7CgkJCQljYXNlIDk6CgkJCQkJZGF0YSA9IDE7CgkJCQkJYnJlYWs7CgkJCQljYXNlIDEwOgoJCQkJCWRhdGEgPSAzOwoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQlyZXR1cm4gR1RfQkFEX1BBUkFNOwoJCQl9CgkJfQoJCWVsc2UKCQl7CgkJCWRhdGEgPSAwOwoJCX0KCX0KCiAgICAvKiBTZXQgdGhlIFJNVU1vZGUgYml0LiAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MMiwxMiwyLGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0Uk1VTW9kZQoqCiogREVTQ1JJUFRJT046CioJCUdldCBSbW90ZSBNYW5hZ2VtZW50IFVuaXQgTW9kZTogZGlzYWJsZSwgZW5hYmxlIG9uIHBvcnQgNCBvciA1LCBvciBlbmFibGUKKgkJb24gcG9ydCA5IG9yIDEwLiBEZXZpY2VzLCBzdWNoIGFzIDg4RTYwOTcsIHN1cHBvcnQgUk1VIG9uIHBvcnQgOSBhbmQgMTAsIAoqCQl3aGlsZSBvdGhlciBkZXZpY2VzLCBzdWNoIGFzIDg4RTYxNjUsIHN1cHBvcnQgUk1VIG9uIHBvcnQgNCBhbmQgNS4gU28sCioJCXBsZWFzZSByZWZlciB0byB0aGUgZGV2aWNlIGRhdGFzaGVldCBmb3IgZGV0YWlsLgoqCQlXaGVuIFJNVSBpcyBlbmFibGVkIGFuZCB0aGlzIGRldmljZSByZWNlaXZlcyBhIFJlbW90ZSBNYW5hZ2VtZW50IFJlcXVlc3QKKgkJZnJhbWUgZGlyZWN0ZWQgdG8gdGhpcyBkZXZpY2UsIHRoZSBmcmFtZSB3aWxsIGJlIHByb2Nlc3NlZCBhbmQgYSBSZW1vdGUgCioJCU1hbmFnZW1lbnQgUmVzcG9uc2UgZnJhbWUgd2lsbCBiZSBnZW5lcmF0ZWQgYW5kIHNlbnQgb3V0LgoqCQkKKgkJTm90ZTogZW5hYmxpbmcgUk1VIGhhcyBubyBlZmZlY3QgaWYgdGhlIFJlbW90ZSBNYW5hZ2VtZW50IHBvcnQgaXMgaW4gaGFsZgoqCQlkdXBsZXggbW9kZS4gVGhlIHBvcnQncyBGcmFtZU1vZGUgbXVzdCBiZSBEU0Egb3IgRXRoZXJUeXBlIERTQSBhcyB3ZWxsLgoqCQkKKiBJTlBVVFM6CioJCU5vbmUuCioKKiBPVVRQVVRTOgoqCQlybXUgLSBHVF9STVUgc3RydWN0dXJlCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRSTVVNb2RlCigKCUlOICBHVF9RRF9ERVYJKmRldiwKCU9VVCBHVF9STVUJCSpybXUKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c0dldFJNVU1vZGUgQ2FsbGVkLlxuIikpOwoKCS8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfRlJBTUVfVE9fUkVHSVNURVIpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCB0aGUgUk1VTW9kZSBiaXQuICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbFJlZ0ZpZWxkKGRldixRRF9SRUdfR0xPQkFMX0NPTlRST0wyLDEyLDIsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgoJaWYgKElTX0lOX0RFVl9HUk9VUChkZXYsREVWX1JNVV9NT0RFKSkKCXsKCQlzd2l0Y2ggKGRhdGEpCgkJewoJCQljYXNlIDA6CgkJCQkJcm11LT5ybXVFbiA9IEdUX0ZBTFNFOwoJCQkJCWJyZWFrOwoKCQkJY2FzZSAxOgoJCQkJCXJtdS0+cm11RW4gPSBHVF9UUlVFOwoJCQkJCXJtdS0+cG9ydCA9IEdUX1BPUlRfMl9MUE9SVCg0KTsKCQkJCQlicmVhazsKCgkJCWNhc2UgMjoKCQkJCQlybXUtPnJtdUVuID0gR1RfVFJVRTsKCQkJCQlybXUtPnBvcnQgPSBHVF9QT1JUXzJfTFBPUlQoNSk7CgkJCQkJYnJlYWs7CgoJCQlkZWZhdWx0OgoJCQkJCXJldHVybiBHVF9GQUlMOwoJCX0KCX0KCWVsc2UKCXsKCQlzd2l0Y2ggKGRhdGEpCgkJewoJCQljYXNlIDA6CgkJCQkJcm11LT5ybXVFbiA9IEdUX0ZBTFNFOwoJCQkJCWJyZWFrOwoKCQkJY2FzZSAxOgoJCQkJCXJtdS0+cm11RW4gPSBHVF9UUlVFOwoJCQkJCXJtdS0+cG9ydCA9IEdUX1BPUlRfMl9MUE9SVCg5KTsKCQkJCQlicmVhazsKCgkJCWNhc2UgMzoKCQkJCQlybXUtPnJtdUVuID0gR1RfVFJVRTsKCQkJCQlybXUtPnBvcnQgPSBHVF9QT1JUXzJfTFBPUlQoMTApOwoJCQkJCWJyZWFrOwoKCQkJZGVmYXVsdDoKCQkJCQlybXUtPnJtdUVuID0gR1RfRkFMU0U7CgkJCQkJYnJlYWs7CgkJfQoJfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRSc3ZkMkNwdUVuYWJsZXMyWAoqCiogREVTQ1JJUFRJT046CioJCVJlc2VydmVkIERBIEVuYWJsZXMgZm9yIHRoZSBmb3JtIG9mIDAxOjgwOkMyOjAwOjAwOjJ4LgoqCQlXaGVuIHRoZSBSc3ZkMkNwdShnc3lzU2V0UnN2ZDJDcHUpIGlzIHNldCB0byBhIG9uZSwgdGhlIDE2IHJlc2VydmVkIAoqCQltdWx0aWNhc3QgREEgYWRkcmVzc2VzLCB3aG9zZSBiaXQgaW4gdGhpcyByZWdpc3RlciBhcmUgYWxzbyBzZXQgdG8gYSBvbmUsIAoqCQlhcmUgdHJlYWR0ZWQgYXMgTUdNVCBmcmFtZXMuIEFsbCB0aGUgcmVzZXJ2ZWQgREEncyB0YWtlIHRoZSBmb3JtIAoqCQkwMTo4MDpDMjowMDowMDoyeC4gV2hlbiB4ID0gMHgwLCBiaXQgMCBvZiB0aGlzIHJlZ2lzdGVyIGlzIHRlc3RlZC4gCioJCVdoZW4geCA9IDB4MiwgYml0IDIgb2YgdGhpcyBmaWVsZCBpcyB0ZXN0ZWQgYW5kIHNvIG9uLgoqCQlJZiB0aGUgdGVzdGVkIGJpdCBpbiB0aGlzIHJlZ2lzdGVyIGlzIGNsZWFyZWQgdG8gYSB6ZXJvLCB0aGUgZnJhbWUgd2lsbCAKKgkJYmUgdHJlYXRlZCBhcyBhIG5vcm1hbCAobm9uLU1HTVQpIGZyYW1lLgoqCiogSU5QVVRTOgoqCQllbkJpdHMgLSBiaXQgdmVjdG9yIG9mIGVuYWJsZWQgUmVzZXJ2ZWQgTXVsdGljYXN0LgoqCiogT1VUUFVUUzoKKgkJTm9uZS4KKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKgkJTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldFJzdmQyQ3B1RW5hYmxlczJYCigKCUlOIEdUX1FEX0RFVgkqZGV2LAoJSU4gR1RfVTE2CQllbkJpdHMKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KCiAgICBEQkdfSU5GTygoImdzeXNTZXRSc3ZkMkNwdUVuYWJsZXMyWCBDYWxsZWQuXG4iKSk7CgoJLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgc3RhdHVzLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9FTkhBTkNFRF9NVUxUSUNBU1RfMlgpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIFNldCByZWxhdGVkIHJlZ2lzdGVyICovCiAgICByZXRWYWwgPSBod1dyaXRlR2xvYmFsMlJlZyhkZXYsUURfUkVHX01HTVRfRU5BQkxFXzJYLCAoR1RfVTE2KWVuQml0cyk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRSc3ZkMkNwdUVuYWJsZXMyWAoqCiogREVTQ1JJUFRJT046CioJCVJlc2VydmVkIERBIEVuYWJsZXMgZm9yIHRoZSBmb3JtIG9mIDAxOjgwOkMyOjAwOjAwOjJ4LgoqCQlXaGVuIHRoZSBSc3ZkMkNwdShnc3lzU2V0UnN2ZDJDcHUpIGlzIHNldCB0byBhIG9uZSwgdGhlIDE2IHJlc2VydmVkIAoqCQltdWx0aWNhc3QgREEgYWRkcmVzc2VzLCB3aG9zZSBiaXQgaW4gdGhpcyByZWdpc3RlciBhcmUgYWxzbyBzZXQgdG8gYSBvbmUsIAoqCQlhcmUgdHJlYWR0ZWQgYXMgTUdNVCBmcmFtZXMuIEFsbCB0aGUgcmVzZXJ2ZWQgREEncyB0YWtlIHRoZSBmb3JtIAoqCQkwMTo4MDpDMjowMDowMDoyeC4gV2hlbiB4ID0gMHgwLCBiaXQgMCBvZiB0aGlzIHJlZ2lzdGVyIGlzIHRlc3RlZC4gCioJCVdoZW4geCA9IDB4MiwgYml0IDIgb2YgdGhpcyBmaWVsZCBpcyB0ZXN0ZWQgYW5kIHNvIG9uLgoqCQlJZiB0aGUgdGVzdGVkIGJpdCBpbiB0aGlzIHJlZ2lzdGVyIGlzIGNsZWFyZWQgdG8gYSB6ZXJvLCB0aGUgZnJhbWUgd2lsbCAKKgkJYmUgdHJlYXRlZCBhcyBhIG5vcm1hbCAobm9uLU1HTVQpIGZyYW1lLgoqCiogSU5QVVRTOgoqCQlOb25lLgoqCiogT1VUUFVUUzoKKgkJZW5CaXRzIC0gYml0IHZlY3RvciBvZiBlbmFibGVkIFJlc2VydmVkIE11bHRpY2FzdC4KKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKgkJTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldFJzdmQyQ3B1RW5hYmxlczJYCigKCUlOICBHVF9RRF9ERVYJKmRldiwKCU9VVCBHVF9VMTYgIAkqZW5CaXRzCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCgogICAgREJHX0lORk8oKCJnc3lzR2V0UnN2ZDJDcHVFbmFibGVzMlggQ2FsbGVkLlxuIikpOwoKCS8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIHN0YXR1cy4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfRU5IQU5DRURfTVVMVElDQVNUXzJYKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiBHZXQgcmVsYXRlZCByZWdpc3RlciAqLwogICAgcmV0VmFsID0gaHdSZWFkR2xvYmFsMlJlZyhkZXYsIFFEX1JFR19NR01UX0VOQUJMRV8yWCwgZW5CaXRzKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNTZXRMb29wYmFja0ZpbHRlcgoqCiogREVTQ1JJUFRJT046CioJCUxvb3BiYWNrIEZpbHRlci4KKgkJV2hlbiBMb29wYmFjayBGaWx0ZXIgaXMgZW5hYmxlZCxGb3J3YXJkIERTQSBmcmFtZXMgdGhhdCBpbmdyZXNzIGEgRFNBIHBvcnQKKgkJdGhhdCBjYW1lIGZyb20gdGhlIHNhbWUgU3JjX0RldiB3aWxsIGJlIGZpbHRlcmVkIHRvIHRoZSBzYW1lIFNyY19Qb3J0LAoqCQlpLmUuLCB0aGUgZnJhbWUgd2lsbCBub3QgYmUgYWxsb3dlZCB0byBlZ3Jlc3MgdGhlIHNvdXJjZSBwb3J0IG9uIHRoZSAKKgkJc291cmNlIGRldmljZSBhcyBpbmRpY2F0ZWQgaW4gdGhlIERTQSBGb3J3YXJkJ3MgVGFnLgoqCiogSU5QVVRTOgoqCQllbiAtIEdUX1RSVUUgdG8gZW5hYmxlIExvb3BiYWNrRmlsdGVyLCBHVF9GQUxTRSBvdGhlcndpc2UuCioKKiBPVVRQVVRTOgoqCQlOb25lLgoqCiogUkVUVVJOUzoKKgkJR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKgkJR1RfRkFJTCAtIG9uIGVycm9yCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqCQlOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0TG9vcGJhY2tGaWx0ZXIKKAoJSU4gR1RfUURfREVWCSpkZXYsCglJTiBHVF9CT09MCQllbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwoJR1RfVTE2CQkJZGF0YTsKCiAgICBEQkdfSU5GTygoImdzeXNTZXRMb29wYmFja0ZpbHRlciBDYWxsZWQuXG4iKSk7CgoJLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfTE9PUEJBQ0tfRklMVEVSKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBCT09MXzJfQklUKGVuLGRhdGEpOwoKICAgIC8qIFNldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19NQU5BR0VNRU5ULCAxNSwgMSwgZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRMb29wYmFja0ZpbHRlcgoqCiogREVTQ1JJUFRJT046CioJCUxvb3BiYWNrIEZpbHRlci4KKgkJV2hlbiBMb29wYmFjayBGaWx0ZXIgaXMgZW5hYmxlZCxGb3J3YXJkIERTQSBmcmFtZXMgdGhhdCBpbmdyZXNzIGEgRFNBIHBvcnQKKgkJdGhhdCBjYW1lIGZyb20gdGhlIHNhbWUgU3JjX0RldiB3aWxsIGJlIGZpbHRlcmVkIHRvIHRoZSBzYW1lIFNyY19Qb3J0LAoqCQlpLmUuLCB0aGUgZnJhbWUgd2lsbCBub3QgYmUgYWxsb3dlZCB0byBlZ3Jlc3MgdGhlIHNvdXJjZSBwb3J0IG9uIHRoZSAKKgkJc291cmNlIGRldmljZSBhcyBpbmRpY2F0ZWQgaW4gdGhlIERTQSBGb3J3YXJkJ3MgVGFnLgoqCiogSU5QVVRTOgoqCQlOb25lLgoqCiogT1VUUFVUUzoKKgkJZW4gLSBHVF9UUlVFIGlmIExvb3BiYWNrRmlsdGVyIGlzIGVuYWJsZWQsIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKgkJTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldExvb3BiYWNrRmlsdGVyCigKCUlOICBHVF9RRF9ERVYJKmRldiwKCU9VVCBHVF9CT09MICAJKmVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c0dldExvb3BiYWNrRmlsdGVyIENhbGxlZC5cbiIpKTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9MT09QQkFDS19GSUxURVIpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19NQU5BR0VNRU5ULDE1LDEsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgQklUXzJfQk9PTChkYXRhLCplbik7CiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0Rmxvb2RCQwoqCiogREVTQ1JJUFRJT046CioJCUZsb29kIEJyb2FkY2FzdC4KKgkJV2hlbiBGbG9vZCBCcm9hZGNhc3QgaXMgZW5hYmxlZCwgZnJhbWVzIHdpdGggdGhlIEJyb2FkY2FzdCBkZXN0aW5hdGlvbiAKKgkJYWRkcmVzcyB3aWxsIGZsb29kIG91dCBhbGwgdGhlIHBvcnRzIHJlZ2FyZGxlc3Mgb2YgdGhlIHNldHRpbmcgb2YgdGhlCioJCXBvcnQncyBFZ3Jlc3MgRmxvb2RzIG1vZGUgKHNlZSBncHJ0U2V0RWdyZXNzRmxvb2QgQVBJKS4gVkxBTiBydWxlcyBhbmQgCioJCW90aGVyIHN3aXRjaCBwb2xpY3kgc3RpbGwgYXBwbGllcyB0byB0aGVzZSBCcm9hZGNhc3QgZnJhbWVzLiAKKgkJV2hlbiB0aGlzIGZlYXR1cmUgaXMgZGlzYWJsZWQsIGZyYW1lcyB3aXRoIHRoZSBCcm9hZGNhc3QgZGVzdGluYXRpb24KKgkJYWRkcmVzcyBhcmUgY29uc2lkZXJlZCBNdWx0aWNhc3QgZnJhbWVzIGFuZCB3aWxsIGJlIGFmZmVjdGVkIGJ5IHBvcnQncyAKKgkJRWdyZXNzIEZsb29kcyBtb2RlLgoqCiogSU5QVVRTOgoqCQllbiAtIEdUX1RSVUUgdG8gZW5hYmxlIEZsb29kIEJyb2FkY2FzdCwgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogT1VUUFVUUzoKKgkJTm9uZS4KKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKgkJTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldEZsb29kQkMKKAoJSU4gR1RfUURfREVWCSpkZXYsCglJTiBHVF9CT09MCQllbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwoJR1RfVTE2CQkJZGF0YTsKCiAgICBEQkdfSU5GTygoImdzeXNTZXRGbG9vZEJDIENhbGxlZC5cbiIpKTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9GTE9PRF9CUk9BRENBU1QpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIEJPT0xfMl9CSVQoZW4sZGF0YSk7CgogICAgLyogU2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod1NldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX01BTkFHRU1FTlQsIDEyLCAxLCBkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldEZsb29kQkMKKgoqIERFU0NSSVBUSU9OOgoqCQlGbG9vZCBCcm9hZGNhc3QuCioJCVdoZW4gRmxvb2QgQnJvYWRjYXN0IGlzIGVuYWJsZWQsIGZyYW1lcyB3aXRoIHRoZSBCcm9hZGNhc3QgZGVzdGluYXRpb24gCioJCWFkZHJlc3Mgd2lsbCBmbG9vZCBvdXQgYWxsIHRoZSBwb3J0cyByZWdhcmRsZXNzIG9mIHRoZSBzZXR0aW5nIG9mIHRoZQoqCQlwb3J0J3MgRWdyZXNzIEZsb29kcyBtb2RlIChzZWUgZ3BydFNldEVncmVzc0Zsb29kIEFQSSkuIFZMQU4gcnVsZXMgYW5kIAoqCQlvdGhlciBzd2l0Y2ggcG9saWN5IHN0aWxsIGFwcGxpZXMgdG8gdGhlc2UgQnJvYWRjYXN0IGZyYW1lcy4gCioJCVdoZW4gdGhpcyBmZWF0dXJlIGlzIGRpc2FibGVkLCBmcmFtZXMgd2l0aCB0aGUgQnJvYWRjYXN0IGRlc3RpbmF0aW9uCioJCWFkZHJlc3MgYXJlIGNvbnNpZGVyZWQgTXVsdGljYXN0IGZyYW1lcyBhbmQgd2lsbCBiZSBhZmZlY3RlZCBieSBwb3J0J3MgCioJCUVncmVzcyBGbG9vZHMgbW9kZS4KKgoqIElOUFVUUzoKKgkJTm9uZS4KKgoqIE9VVFBVVFM6CioJCWVuIC0gR1RfVFJVRSBpZiBGbG9vZCBCcm9hZGNhc3QgaXMgZW5hYmxlZCwgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogUkVUVVJOUzoKKgkJR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKgkJR1RfRkFJTCAtIG9uIGVycm9yCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqCQlOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0Rmxvb2RCQwooCglJTiAgR1RfUURfREVWCSpkZXYsCglPVVQgR1RfQk9PTCAgCSplbgopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCiAgICBEQkdfSU5GTygoImdzeXNHZXRGbG9vZEJDIENhbGxlZC5cbiIpKTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9GTE9PRF9CUk9BRENBU1QpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19NQU5BR0VNRU5ULDEyLDEsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgQklUXzJfQk9PTChkYXRhLCplbik7CiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0UmVtb3ZlMVBUYWcKKgoqIERFU0NSSVBUSU9OOgoqCQlSZW1vdmUgT25lIFByb3ZpZGVyIFRhZy4KKgkJV2hlbiB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCBhbmQgYSBwb3J0IGlzIGNvbmZpZ3VyZWQgYXMgYSBQcm92aWRlciBQb3J0CioJCShzZWUgZ3BydFNldEZyYW1lTW9kZSBBUEkpLCByZWN1cnNpdmUgUHJvdmlkZXIgVGFnIHN0cmlwcGluZyB3aWxsIE5PVCBiZSAKKgkJcGVyZm9ybWVkLiBPbmx5IHRoZSBmaXJzdCBQcm92aWRlciBUYWcgZm91bmQgb24gdGhlIGZyYW1lIHdpbGwgYmUgCioJCWV4dHJhY3RlZCBhbmQgcmVtb3ZlZC4gSXRzIGV4dHJhY3RlZCBkYXRhIHdpbGwgYmUgdXNlZCBmb3Igc3dpdGNoaW5nLgoqCQlXaGVuIGl0J3MgZGlzYWJsZWQgYW5kIGEgcG9ydCBpcyBjb25maWd1cmVkIGFzIGEgUHJvdmlkZXIgUG9ydCwgcmVjdXJzaXZlIAoqCQlQcm92aWRlciBUYWcgc3RyaXBwaW5nIHdpbGwgYmUgcGVyZm9ybWVkLiBUaGUgZmlyc3QgUHJvdmlkZXIgVGFnJ3MgZGF0YSAKKgkJd2lsbCBiZSBleHRyYWN0ZWQgYW5kIHVzZWQgZm9yIHN3aXRjaGluZywgYW5kIHRoZW4gYWxsIHN1YnNlcXVlbnQgUHJvdmlkZXIgCioJCVRhZ3MgZm91bmQgaW4gdGhlIGZyYW1lIHdpbGwgYWxzbyBiZSByZW1vdmVkLiBUaGlzIHdpbGwgb25seSBvY2N1ciBpZiB0aGUgCioJCXBvcnQncyBQb3J0RVR5cGUgKHNlZSBncHJ0U2V0UG9ydEVUeXBlIEFQSSkgaXMgbm90IDB4ODEwMC4KKgoqIElOUFVUUzoKKgkJZW4gLSBHVF9UUlVFIHRvIGVuYWJsZSBSZW1vdmUgT25lIFByb3ZpZGVyIFRhZywgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogT1VUUFVUUzoKKgkJTm9uZS4KKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKgkJTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldFJlbW92ZTFQVGFnCigKCUlOIEdUX1FEX0RFVgkqZGV2LAoJSU4gR1RfQk9PTAkJZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KCUdUX1UxNgkJCWRhdGE7CgogICAgREJHX0lORk8oKCJnc3lzU2V0UmVtb3ZlMVBUYWcgQ2FsbGVkLlxuIikpOwoKCS8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX1JNX09ORV9QVEFHKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBCT09MXzJfQklUKGVuLGRhdGEpOwoKICAgIC8qIFNldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19NQU5BR0VNRU5ULCAxMSwgMSwgZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0UmVtb3ZlMVBUYWcKKgoqIERFU0NSSVBUSU9OOgoqCQlSZW1vdmUgT25lIFByb3ZpZGVyIFRhZy4KKgkJV2hlbiB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCBhbmQgYSBwb3J0IGlzIGNvbmZpZ3VyZWQgYXMgYSBQcm92aWRlciBQb3J0CioJCShzZWUgZ3BydFNldEZyYW1lTW9kZSBBUEkpLCByZWN1cnNpdmUgUHJvdmlkZXIgVGFnIHN0cmlwcGluZyB3aWxsIE5PVCBiZSAKKgkJcGVyZm9ybWVkLiBPbmx5IHRoZSBmaXJzdCBQcm92aWRlciBUYWcgZm91bmQgb24gdGhlIGZyYW1lIHdpbGwgYmUgCioJCWV4dHJhY3RlZCBhbmQgcmVtb3ZlZC4gSXRzIGV4dHJhY3RlZCBkYXRhIHdpbGwgYmUgdXNlZCBmb3Igc3dpdGNoaW5nLgoqCQlXaGVuIGl0J3MgZGlzYWJsZWQgYW5kIGEgcG9ydCBpcyBjb25maWd1cmVkIGFzIGEgUHJvdmlkZXIgUG9ydCwgcmVjdXJzaXZlIAoqCQlQcm92aWRlciBUYWcgc3RyaXBwaW5nIHdpbGwgYmUgcGVyZm9ybWVkLiBUaGUgZmlyc3QgUHJvdmlkZXIgVGFnJ3MgZGF0YSAKKgkJd2lsbCBiZSBleHRyYWN0ZWQgYW5kIHVzZWQgZm9yIHN3aXRjaGluZywgYW5kIHRoZW4gYWxsIHN1YnNlcXVlbnQgUHJvdmlkZXIgCioJCVRhZ3MgZm91bmQgaW4gdGhlIGZyYW1lIHdpbGwgYWxzbyBiZSByZW1vdmVkLiBUaGlzIHdpbGwgb25seSBvY2N1ciBpZiB0aGUgCioJCXBvcnQncyBQb3J0RVR5cGUgKHNlZSBncHJ0U2V0UG9ydEVUeXBlIEFQSSkgaXMgbm90IDB4ODEwMC4KKgoqIElOUFVUUzoKKgkJTm9uZS4KKgoqIE9VVFBVVFM6CioJCWVuIC0gR1RfVFJVRSBpZiBSZW1vdmUgT25lIFByb3ZpZGVyIFRhZyBpcyBlbmFibGVkLCBHVF9GQUxTRSBvdGhlcndpc2UuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRSZW1vdmUxUFRhZwooCglJTiAgR1RfUURfREVWCSpkZXYsCglPVVQgR1RfQk9PTAkJKmVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCglHVF9VMTYJCQlkYXRhOwoKICAgIERCR19JTkZPKCgiZ3N5c0dldFJlbW92ZTFQVGFnIENhbGxlZC5cbiIpKTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9STV9PTkVfUFRBRykpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX01BTkFHRU1FTlQsIDExLCAxLCAmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBCSVRfMl9CT09MKGRhdGEsKmVuKTsKCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0VGFnRmxvd0NvbnRyb2wKKgoqIERFU0NSSVBUSU9OOgoqCQlVc2UgYW5kIGdlbmVyYXRlIHNvdXJjZSBwb3J0IEZsb3cgQ29udHJvbCBzdGF0dXMgZm9yIENyb3NzLUNoaXAgRmxvdyAKKgkJQ29udHJvbC4KKgkJV2hlbiB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCwgYml0IDE3IG9mIHRoZSBEU0EgVGFnIEZvcndhcmQgZnJhbWVzIGlzIAoqCQlkZWZpbmVkIHRvIGJlIFNyY19GQyBhbmQgaXQgaXMgYWRkZWQgdG8gdGhlc2UgZnJhbWVzIHdoZW4gZ2VuZXJhdGVkIGFuZCAKKgkJaXQgaXMgaW5zcGVjdGVkIG9uIHRoZXNlIGZyYW1lcyB3aGVuIHJlY2VpdmVkLiBUaGUgUUMgd2lsbCB1c2UgdGhlIFNyY19GQyAKKgkJYml0IG9uIERTQSBwb3J0cyBpbnN0ZWFkIG9mIHRoZSBEU0EgcG9ydCdzIEZsb3cgQ29udHJvbCBtb2RlIGJpdCBmb3IgdGhlIAoqCQlRQyBGbG93IENvbnRyb2wgYWxnb3JpdGhtLgoqCQlXaGVuIGl0IGlzIGRpc2FibGVkLCBiaXQgMTcgb2YgdGhlIERTQSBUYWcgRm9yd2FyZCBmcmFtZXMgaXMgZGVmaW5lZCB0byAKKgkJYmUgUmVzZXJ2ZWQgYW5kIGl0IHdpbGwgYmUgemVybyBvbiB0aGVzZSBmcmFtZXMgd2hlbiBnZW5lcmF0ZWQgYW5kIGl0IAoqCQl3aWxsIG5vdCBiZSB1c2VkIG9uIHRoZXNlIGZyYW1lcyB3aGVuIHJlY2VpdmVkICh0aGlzIGlzIGEgYmFja3dhcmRzIAoqCQljb21wYXRpYmlsaXR5IG1vZGUpLgoqCiogSU5QVVRTOgoqCQllbiAtIEdUX1RSVUUgdG8gZW5hYmxlIFRhZyBGbG93IENvbnRyb2wsIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIE9VVFBVVFM6CioJCU5vbmUuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRUYWdGbG93Q29udHJvbAooCglJTiBHVF9RRF9ERVYJKmRldiwKCUlOIEdUX0JPT0wJCWVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCglHVF9VMTYJCQlkYXRhOwoKICAgIERCR19JTkZPKCgiZ3N5c1NldFRhZ0Zsb3dDb250cm9sIENhbGxlZC5cbiIpKTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9UQUdfRkxPV19DT05UUk9MKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICBCT09MXzJfQklUKGVuLGRhdGEpOwoKICAgIC8qIFNldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdTZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19NQU5BR0VNRU5ULCA5LCAxLCBkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldFRhZ0Zsb3dDb250cm9sCioKKiBERVNDUklQVElPTjoKKgkJVXNlIGFuZCBnZW5lcmF0ZSBzb3VyY2UgcG9ydCBGbG93IENvbnRyb2wgc3RhdHVzIGZvciBDcm9zcy1DaGlwIEZsb3cgCioJCUNvbnRyb2wuCioJCVdoZW4gdGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQsIGJpdCAxNyBvZiB0aGUgRFNBIFRhZyBGb3J3YXJkIGZyYW1lcyBpcyAKKgkJZGVmaW5lZCB0byBiZSBTcmNfRkMgYW5kIGl0IGlzIGFkZGVkIHRvIHRoZXNlIGZyYW1lcyB3aGVuIGdlbmVyYXRlZCBhbmQgCioJCWl0IGlzIGluc3BlY3RlZCBvbiB0aGVzZSBmcmFtZXMgd2hlbiByZWNlaXZlZC4gVGhlIFFDIHdpbGwgdXNlIHRoZSBTcmNfRkMgCioJCWJpdCBvbiBEU0EgcG9ydHMgaW5zdGVhZCBvZiB0aGUgRFNBIHBvcnQncyBGbG93IENvbnRyb2wgbW9kZSBiaXQgZm9yIHRoZSAKKgkJUUMgRmxvdyBDb250cm9sIGFsZ29yaXRobS4KKgkJV2hlbiBpdCBpcyBkaXNhYmxlZCwgYml0IDE3IG9mIHRoZSBEU0EgVGFnIEZvcndhcmQgZnJhbWVzIGlzIGRlZmluZWQgdG8gCioJCWJlIFJlc2VydmVkIGFuZCBpdCB3aWxsIGJlIHplcm8gb24gdGhlc2UgZnJhbWVzIHdoZW4gZ2VuZXJhdGVkIGFuZCBpdCAKKgkJd2lsbCBub3QgYmUgdXNlZCBvbiB0aGVzZSBmcmFtZXMgd2hlbiByZWNlaXZlZCAodGhpcyBpcyBhIGJhY2t3YXJkcyAKKgkJY29tcGF0aWJpbGl0eSBtb2RlKS4KKgoqIElOUFVUUzoKKgkJTm9uZS4KKgoqIE9VVFBVVFM6CioJCWVuIC0gR1RfVFJVRSBpZiBUYWcgRmxvdyBDb250cm9sIGlzIGVuYWJsZWQsIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKgkJTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldFRhZ0Zsb3dDb250cm9sCigKCUlOICBHVF9RRF9ERVYJKmRldiwKCU9VVCBHVF9CT09MICAJKmVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c0dldFRhZ0Zsb3dDb250cm9sIENhbGxlZC5cbiIpKTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9UQUdfRkxPV19DT05UUk9MKSkKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKICAgIH0KCiAgICAvKiBHZXQgcmVsYXRlZCBiaXQgKi8KICAgIHJldFZhbCA9IGh3R2V0R2xvYmFsMlJlZ0ZpZWxkKGRldixRRF9SRUdfTUFOQUdFTUVOVCw5LDEsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgQklUXzJfQk9PTChkYXRhLCplbik7CiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0QWx3YXlzVXNlVlRVCioKKiBERVNDUklQVElPTjoKKgkJQWx3YXlzIHVzZSBWVFUuIAoqCQlXaGVuIHRoaXMgZmVhdHVyZSBpcyBlbmFibGVkLCBWVFUgaGl0IGRhdGEgd2lsbCBiZSB1c2VkIHRvIG1hcCBmcmFtZXMgCioJCWV2ZW4gaWYgODAyLjFRIGlzIERpc2FibGVkIG9uIHRoZSBwb3J0LiAKKgkJV2hlbiBpdCdzIGRpc2FibGVkLCBkYXRhIHdpbGwgYmUgaWdub3JlZCB3aGVuIG1hcHBpbmcgZnJhbWVzIG9uIHBvcnRzIAoqCQl3aGVyZSA4MDIuMVEgaXMgRGlzYWJsZWQuCioKKiBJTlBVVFM6CioJCWVuIC0gR1RfVFJVRSB0byB1c2UgVlRVIGFsd2F5cywgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogT1VUUFVUUzoKKgkJTm9uZS4KKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKgkJTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldEFsd2F5c1VzZVZUVQooCglJTiBHVF9RRF9ERVYJKmRldiwKCUlOIEdUX0JPT0wJCWVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCglHVF9VMTYJCQlkYXRhOwoKICAgIERCR19JTkZPKCgiZ3N5c1NldEFsd2F5c1VzZVZUVSBDYWxsZWQuXG4iKSk7CgoJLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfQUxXQVlTX1VTRV9WVFUpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIEJPT0xfMl9CSVQoZW4sZGF0YSk7CgogICAgLyogU2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod1NldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX01BTkFHRU1FTlQsIDgsIDEsIGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0QWx3YXlzVXNlVlRVCioKKiBERVNDUklQVElPTjoKKgkJQWx3YXlzIHVzZSBWVFUuIAoqCQlXaGVuIHRoaXMgZmVhdHVyZSBpcyBlbmFibGVkLCBWVFUgaGl0IGRhdGEgd2lsbCBiZSB1c2VkIHRvIG1hcCBmcmFtZXMgCioJCWV2ZW4gaWYgODAyLjFRIGlzIERpc2FibGVkIG9uIHRoZSBwb3J0LiAKKgkJV2hlbiBpdCdzIGRpc2FibGVkLCBkYXRhIHdpbGwgYmUgaWdub3JlZCB3aGVuIG1hcHBpbmcgZnJhbWVzIG9uIHBvcnRzIAoqCQl3aGVyZSA4MDIuMVEgaXMgRGlzYWJsZWQuCioKKiBJTlBVVFM6CioJCU5vbmUuCioKKiBPVVRQVVRTOgoqCQllbiAtIEdUX1RSVUUgaWYgVlRVIGlzIGFsd2F5cyB1c2VkLCBHVF9GQUxTRSBvdGhlcndpc2UuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRBbHdheXNVc2VWVFUKKAoJSU4gIEdUX1FEX0RFVgkqZGV2LAoJT1VUIEdUX0JPT0wgIAkqZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwogICAgREJHX0lORk8oKCJnc3lzR2V0QWx3YXlzVXNlVlRVIENhbGxlZC5cbiIpKTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9BTFdBWVNfVVNFX1ZUVSkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgLyogR2V0IHJlbGF0ZWQgYml0ICovCiAgICByZXRWYWwgPSBod0dldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX01BTkFHRU1FTlQsOCwxLCZkYXRhKTsKICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgIHsKICAgICAgICBEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKICAgICAgICByZXR1cm4gcmV0VmFsOwogICAgfQoKICAgIEJJVF8yX0JPT0woZGF0YSwqZW4pOwogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldFFWbGFuc09ubHkKKgoqIERFU0NSSVBUSU9OOgoqCQk4MDIuMVEgVkxBTnMgT25seS4KKgkJV2hlbiB0aGlzIGZlYXR1cmUgaXMgZGlzYWJsZWQsIHRoZSBlZ3Jlc3MgbWFwcGluZyBvZiB0aGUgZnJhbWUgaXMgCioJCWxpbWl0ZWQgYnkgdGhlIGZyYW1lJ3MgVklEICh1c2luZyB0aGUgTWVtYmVyVGFnIGRhdGEgZm91bmQgaW4gdGhlIFZUVSkgCioJCXRvZ2V0aGVyIHdpdGggdGhlIHBvcnQgYmFzZWQgVkxBTnMgKHVzaW5nIHRoZSBzb3VyY2UgcG9ydCdzIFBvcnRWTEFOVGFibGUsIAoqCQlndmxuU2V0UG9ydFZsYW5Qb3J0cyBBUEkpLiBUaGUgdHdvIG1ldGhvZHMgYXJlIGFsd2F5cyB1c2VkIHRvZ2V0aGVyIGluIAoqCQl0aGlzIG1vZGUuCioJCVdoZW4gdGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQsIHRoZSBlZ3Jlc3MgbWFwcGluZyBvZiB0aGUgZnJhbWUgaXMgbGltaXRpZWQKKgkJYnkgdGhlIGZyYW1lJ3MgVklEIG9ubHksIGlmIHRoZSBWSUQgd2FzIGZvdW5kIGluIHRoZSBWVFUuIElmIHRoZSBmcmFtZSdzCioJCVZJRCB3YXMgbm90IGZvdW5kIGluIHRoZSBWVFUgdGhlIGVncmVzcyBtYXBwaW5nIG9mIHRoZSBmcmFtZSBpcyBsaW1pdGVkCioJCWJ5IHRoZSBzb3VyY2UgcG9ydCdzIFBvcnRWTEFOVGFibGUgb25seS4gVGhlIHR3byBtZXRob2RzIGFyZSBuZXZlcgoqCQl1c2VkIHRvZ2V0aGVyIGluIHRoaXMgbW9kZS4KKgoqIElOUFVUUzoKKgkJZW4gLSBHVF9UUlVFIHRvIHVzZSA4MDIuMVEgVmxhbiBPbmx5IGZlYXR1cmUsIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIE9VVFBVVFM6CioJCU5vbmUuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNTZXRRVmxhbnNPbmx5CigKCUlOIEdUX1FEX0RFVgkqZGV2LAoJSU4gR1RfQk9PTAkJZW4KKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KCUdUX1UxNgkJCWRhdGE7CgogICAgREJHX0lORk8oKCJnc3lzU2V0UVZsYW5zT25seSBDYWxsZWQuXG4iKSk7CgoJLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfUVZMQU5fT05MWSkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgQk9PTF8yX0JJVChlbixkYXRhKTsKCiAgICAvKiBTZXQgcmVsYXRlZCBiaXQgKi8KICAgIHJldFZhbCA9IGh3U2V0R2xvYmFsMlJlZ0ZpZWxkKGRldixRRF9SRUdfU0RFVF9QT0xBUklUWSwgMTUsIDEsIGRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0UVZsYW5zT25seQoqCiogREVTQ1JJUFRJT046CioJCTgwMi4xUSBWTEFOcyBPbmx5LgoqCQlXaGVuIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCwgdGhlIGVncmVzcyBtYXBwaW5nIG9mIHRoZSBmcmFtZSBpcyAKKgkJbGltaXRlZCBieSB0aGUgZnJhbWUncyBWSUQgKHVzaW5nIHRoZSBNZW1iZXJUYWcgZGF0YSBmb3VuZCBpbiB0aGUgVlRVKSAKKgkJdG9nZXRoZXIgd2l0aCB0aGUgcG9ydCBiYXNlZCBWTEFOcyAodXNpbmcgdGhlIHNvdXJjZSBwb3J0J3MgUG9ydFZMQU5UYWJsZSwgCioJCWd2bG5TZXRQb3J0VmxhblBvcnRzIEFQSSkuIFRoZSB0d28gbWV0aG9kcyBhcmUgYWx3YXlzIHVzZWQgdG9nZXRoZXIgaW4gCioJCXRoaXMgbW9kZS4KKgkJV2hlbiB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCwgdGhlIGVncmVzcyBtYXBwaW5nIG9mIHRoZSBmcmFtZSBpcyBsaW1pdGllZAoqCQlieSB0aGUgZnJhbWUncyBWSUQgb25seSwgaWYgdGhlIFZJRCB3YXMgZm91bmQgaW4gdGhlIFZUVS4gSWYgdGhlIGZyYW1lJ3MKKgkJVklEIHdhcyBub3QgZm91bmQgaW4gdGhlIFZUVSB0aGUgZWdyZXNzIG1hcHBpbmcgb2YgdGhlIGZyYW1lIGlzIGxpbWl0ZWQKKgkJYnkgdGhlIHNvdXJjZSBwb3J0J3MgUG9ydFZMQU5UYWJsZSBvbmx5LiBUaGUgdHdvIG1ldGhvZHMgYXJlIG5ldmVyCioJCXVzZWQgdG9nZXRoZXIgaW4gdGhpcyBtb2RlLgoqCiogSU5QVVRTOgoqCQlOb25lLgoqCiogT1VUUFVUUzoKKgkJZW4gLSBHVF9UUlVFIGlmIDgwMi4xUSBWbGFuIE9ubHkgZmVhdHVyZSBpcyBlbmFibGVkLCBHVF9GQUxTRSBvdGhlcndpc2UuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRRVmxhbnNPbmx5CigKCUlOICBHVF9RRF9ERVYJKmRldiwKCU9VVCBHVF9CT09MICAJKmVuCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIFRoZSByZWdpc3RlcidzIHJlYWQgZGF0YS4gICAgKi8KICAgIERCR19JTkZPKCgiZ3N5c0dldFFWbGFuc09ubHkgQ2FsbGVkLlxuIikpOwoKCS8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX1FWTEFOX09OTFkpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCByZWxhdGVkIGJpdCAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19TREVUX1BPTEFSSVRZLDE1LDEsJmRhdGEpOwogICAgaWYocmV0VmFsICE9IEdUX09LKQogICAgewogICAgICAgIERCR19JTkZPKCgiRmFpbGVkLlxuIikpOwogICAgICAgIHJldHVybiByZXRWYWw7CiAgICB9CgogICAgQklUXzJfQk9PTChkYXRhLCplbik7CiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0NUJpdFBvcnQKKgoqIERFU0NSSVBUSU9OOgoqCQlVc2UgNSBiaXRzIGZvciBQb3J0IGRhdGEgaW4gdGhlIFBvcnQgVkxBTiBUYWJsZSAoUFZUKS4gCioJCVdoZW4gdGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQsIHRoZSA5IGJpdHMgdXNlZCB0byBhY2Nlc3MgdGhlIFBWVCBtZW1vcnkgaXM6CioJCQlBZGRyWzg6NV0gPSBTb3VyY2UgRGV2aWNlWzM6MF0gb3IgRGV2aWNlIE51bWJlclszOjBdCioJCQlBZGRyWzQ6MF0gPSBTb3VyY2UgUG9ydC9UcnVua1s0OjBdCioJCVdoZW4gaXQncyBkaXNhYmxlZCwgdGhlIDkgYml0cyB1c2VkIHRvIGFjY2VzcyB0aGUgUFZUIG1lbW9yeSBpczoKKgkJCUFkZHJbODo0XSA9IFNvdXJjZSBEZXZpY2VbNDowXSBvciBEZXZpY2UgTnVtYmVyWzQ6MF0KKgkJCUFkZHJbMzowXSA9IFNvdXJjZSBQb3J0L1RydW5rWzM6MF0KKgoqIElOUFVUUzoKKgkJZW4gLSBHVF9UUlVFIHRvIHVzZSA1IGJpdCBhcyBhIFNvdXJjZSBwb3J0IGluIFBWVCwgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogT1VUUFVUUzoKKgkJTm9uZS4KKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKgkJTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldDVCaXRQb3J0CigKCUlOIEdUX1FEX0RFVgkqZGV2LAoJSU4gR1RfQk9PTAkJZW4KKQp7CglHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KCUdUX1UxNgkJCWRhdGE7CgoJREJHX0lORk8oKCJnc3lzU2V0NUJpdFBvcnQgQ2FsbGVkLlxuIikpOwoKCS8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWXzVCSVRfUE9SVCkpCgl7CgkJREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7Cgl9CgoJQk9PTF8yX0JJVChlbixkYXRhKTsKCgkvKiBTZXQgcmVsYXRlZCBiaXQgKi8KCXJldFZhbCA9IGh3U2V0R2xvYmFsMlJlZ0ZpZWxkKGRldixRRF9SRUdfU0RFVF9QT0xBUklUWSwgMTQsIDEsIGRhdGEpOwoJaWYocmV0VmFsICE9IEdUX09LKQoJewoJCURCR19JTkZPKCgiRmFpbGVkLlxuIikpOwoJCXJldHVybiByZXRWYWw7Cgl9CgoJREJHX0lORk8oKCJPSy5cbiIpKTsKCXJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzR2V0NUJpdFBvcnQKKgoqIERFU0NSSVBUSU9OOgoqCQlVc2UgNSBiaXRzIGZvciBQb3J0IGRhdGEgaW4gdGhlIFBvcnQgVkxBTiBUYWJsZSAoUFZUKS4gCioJCVdoZW4gdGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQsIHRoZSA5IGJpdHMgdXNlZCB0byBhY2Nlc3MgdGhlIFBWVCBtZW1vcnkgaXM6CioJCQlBZGRyWzg6NV0gPSBTb3VyY2UgRGV2aWNlWzM6MF0gb3IgRGV2aWNlIE51bWJlclszOjBdCioJCQlBZGRyWzQ6MF0gPSBTb3VyY2UgUG9ydC9UcnVua1s0OjBdCioJCVdoZW4gaXQncyBkaXNhYmxlZCwgdGhlIDkgYml0cyB1c2VkIHRvIGFjY2VzcyB0aGUgUFZUIG1lbW9yeSBpczoKKgkJCUFkZHJbODo0XSA9IFNvdXJjZSBEZXZpY2VbNDowXSBvciBEZXZpY2UgTnVtYmVyWzQ6MF0KKgkJCUFkZHJbMzowXSA9IFNvdXJjZSBQb3J0L1RydW5rWzM6MF0KKgoqIElOUFVUUzoKKgkJTm9uZS4KKgoqIE9VVFBVVFM6CioJCWVuIC0gR1RfVFJVRSBpZiA1IGJpdCBpcyB1c2VkIGFzIGEgU291cmNlIFBvcnQgaW4gUFZULCBHVF9GQUxTRSBvdGhlcndpc2UuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXQ1Qml0UG9ydAooCglJTiAgR1RfUURfREVWCSpkZXYsCglPVVQgR1RfQk9PTCAgCSplbgopCnsKCUdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwoJR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCgkKCURCR19JTkZPKCgiZ3N5c0dldDVCaXRQb3J0IENhbGxlZC5cbiIpKTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl81QklUX1BPUlQpKQoJewoJCURCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwoJfQoKCS8qIEdldCByZWxhdGVkIGJpdCAqLwoJcmV0VmFsID0gaHdHZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19TREVUX1BPTEFSSVRZLDE0LDEsJmRhdGEpOwoJaWYocmV0VmFsICE9IEdUX09LKQoJewoJCURCR19JTkZPKCgiRmFpbGVkLlxuIikpOwoJCXJldHVybiByZXRWYWw7Cgl9CgoJQklUXzJfQk9PTChkYXRhLCplbik7CglEQkdfSU5GTygoIk9LLlxuIikpOwoKCXJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldFNERVRQb2xhcml0eQoqCiogREVTQ1JJUFRJT046CioJCVNERVQgKFNpZ25hbCBEZXRlY3QpIFBvbGFyaXR5IHNlbGVjdCBiaXRzIGZvciBlYWNoIHBvcnQuIAoqCQlCaXQgMTAgaXMgZm9yIFBvcnQgMTAsIGJpdCA5IGlzIGZvciBQb3J0IDksIGV0Yy4gU0RFVCBpcyB1c2VkIHRvIGhlbHAgCioJCWRldGVybWluZSBsaW5rIG9uIGZpYmVyIHBvcnRzLiBUaGlzIGJpdCBhZmZlY3RzIHRoZSBhY3RpdmUgbGV2ZWwgb2YgYSAKKgkJcG9ydCdzIFNERVQgcGlucyBhcyBmb2xsb3dzOgoqCQkJMCA9IFNERVQgaXMgYWN0aXZlIGxvdy4gQSBsb3cgbGV2ZWwgb24gdGhlIHBvcnQncyBTREVUIHBpbiBpcyAKKgkJCQlyZXF1aXJlZCBmb3IgbGluayB0byBvY2N1ci4KKgkJCTEgPSBTREVUIGlzIGFjdGl2ZSBoaWdoLiBBIGhpZ2ggbGV2ZWwgb24gdGhlIHBvcnSScyBTREVUIHBpbiBpcyAKKgkJCQlyZXF1aXJlZCBmb3IgbGluayB0byBvY2N1ci4KKgkJU0RFVCBpcyB1c2VkIHdoZW4gdGhlIHBvcnQgaXMgY29uZmlndXJlZCBhcyBhIGZpYmVyIHBvcnQuIEluIGFsbCBvdGhlciAKKgkJcG9ydCBtb2RlcyB0aGUgU0RFVCBwaW5zIGFyZSBpZ25vcmVkIGFuZCB0aGVzZSBiaXRzIGhhdmUgbm8gZWZmZWN0LgoqCiogSU5QVVRTOgoqCQlzZGV0VmVjIC0gU0RFVCBQb2xhcml0eSBmb3IgZWFjaCBwb3J0IGluIFZlY3RvciBmb3JtYXQKKgoqIE9VVFBVVFM6CioJCU5vbmUuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfQkFEX1BBUkFNIC0gaWYgc2RldFZlYyBpcyBpbnZhbGlkCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqCQlOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzU2V0U0RFVFBvbGFyaXR5CigKCUlOIEdUX1FEX0RFVgkqZGV2LAoJSU4gR1RfVTMyICAJCXNkZXRWZWMKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KICAgIEdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwoKICAgIERCR19JTkZPKCgiZ3N5c1NldFNERVRQb2xhcml0eSBDYWxsZWQuXG4iKSk7CgoJLyogQ2hlY2sgaWYgU3dpdGNoIHN1cHBvcnRzIHRoaXMgZmVhdHVyZS4gKi8KCWlmICghSVNfSU5fREVWX0dST1VQKGRldixERVZfU0RFVF9QT0xBUklUWSkpCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJHVF9OT1RfU1VQUE9SVEVEXG4iKSk7CgkJcmV0dXJuIEdUX05PVF9TVVBQT1JURUQ7CiAgICB9CgogICAgaWYgKChHVF9VMTYpc2RldFZlYyA+ICgoMSA8PCBkZXYtPm51bU9mUG9ydHMpIC0gMSkpCgl7CgkJREJHX0lORk8oKCJHVF9CQURfUEFSQU0gXG4iKSk7CgkJcmV0dXJuIEdUX0JBRF9QQVJBTTsKCX0KCglkYXRhID0gKEdUX1UxNilHVF9MUE9SVFZFQ18yX1BPUlRWRUMoc2RldFZlYyk7CgoJaWYgKElTX0lOX0RFVl9HUk9VUChkZXYsREVWX0xJTUlURURfU0RFVCkpCgl7CgkJaWYgKGRhdGEgJiAofjB4MzApKQkvKiBvbmx5IHBvcnQgNCBhbmQgNSBvZiB0aGlzIGRldmljZSBzdXBwb3J0IFNERVQgKi8KCQl7CgkJCURCR19JTkZPKCgiR1RfQkFEX1BBUkFNIFxuIikpOwoJCQlyZXR1cm4gR1RfQkFEX1BBUkFNOwoJCX0KCX0KCiAgICAvKiBTZXQgdGhlIHJlbGF0ZWQgYml0cy4gKi8KICAgIHJldFZhbCA9IGh3U2V0R2xvYmFsMlJlZ0ZpZWxkKGRldixRRF9SRUdfU0RFVF9QT0xBUklUWSwwLGRldi0+bWF4UG9ydHMsZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNHZXRTREVUUG9sYXJpdHkKKgoqIERFU0NSSVBUSU9OOgoqCQlTREVUIChTaWduYWwgRGV0ZWN0KSBQb2xhcml0eSBzZWxlY3QgYml0cyBmb3IgZWFjaCBwb3J0LiAKKgkJQml0IDEwIGlzIGZvciBQb3J0IDEwLCBiaXQgOSBpcyBmb3IgUG9ydCA5LCBldGMuIFNERVQgaXMgdXNlZCB0byBoZWxwIAoqCQlkZXRlcm1pbmUgbGluayBvbiBmaWJlciBwb3J0cy4gVGhpcyBiaXQgYWZmZWN0cyB0aGUgYWN0aXZlIGxldmVsIG9mIGEgCioJCXBvcnQncyBTREVUIHBpbnMgYXMgZm9sbG93czoKKgkJCTAgPSBTREVUIGlzIGFjdGl2ZSBsb3cuIEEgbG93IGxldmVsIG9uIHRoZSBwb3J0J3MgU0RFVCBwaW4gaXMgCioJCQkJcmVxdWlyZWQgZm9yIGxpbmsgdG8gb2NjdXIuCioJCQkxID0gU0RFVCBpcyBhY3RpdmUgaGlnaC4gQSBoaWdoIGxldmVsIG9uIHRoZSBwb3J0knMgU0RFVCBwaW4gaXMgCioJCQkJcmVxdWlyZWQgZm9yIGxpbmsgdG8gb2NjdXIuCioJCVNERVQgaXMgdXNlZCB3aGVuIHRoZSBwb3J0IGlzIGNvbmZpZ3VyZWQgYXMgYSBmaWJlciBwb3J0LiBJbiBhbGwgb3RoZXIgCioJCXBvcnQgbW9kZXMgdGhlIFNERVQgcGlucyBhcmUgaWdub3JlZCBhbmQgdGhlc2UgYml0cyBoYXZlIG5vIGVmZmVjdC4KKgoqIElOUFVUUzoKKgkJTm9uZS4KKgoqIE9VVFBVVFM6CioJCXNkZXRWZWMgLSBTREVUIFBvbGFyaXR5IGZvciBlYWNoIHBvcnQgaW4gVmVjdG9yIGZvcm1hdAoqCiogUkVUVVJOUzoKKgkJR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKgkJR1RfRkFJTCAtIG9uIGVycm9yCioJCUdUX05PVF9TVVBQT1JURUQgLSBpZiBjdXJyZW50IGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4KKgoqIENPTU1FTlRTOgoqCQlOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzR2V0U0RFVFBvbGFyaXR5CigKCUlOICBHVF9RRF9ERVYJKmRldiwKCU9VVCBHVF9VMzIgIAkqc2RldFZlYwopCnsKICAgIEdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCiAgICBEQkdfSU5GTygoImdzeXNHZXRTREVUUG9sYXJpdHkgQ2FsbGVkLlxuIikpOwoKCS8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX1NERVRfUE9MQVJJVFkpKQogICAgewogICAgICAgIERCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIEdldCB0aGUgcmVsYXRlZCBiaXRzLiAqLwogICAgcmV0VmFsID0gaHdHZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19TREVUX1BPTEFSSVRZLDAsZGV2LT5tYXhQb3J0cywmZGF0YSk7CiAgICBpZihyZXRWYWwgIT0gR1RfT0spCiAgICB7CiAgICAgICAgREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIHJldFZhbDsKICAgIH0KCglpZiAoSVNfSU5fREVWX0dST1VQKGRldixERVZfTElNSVRFRF9TREVUKSkKCXsKCQlkYXRhICY9IDB4MzA7Cgl9CgoJKnNkZXRWZWMgPSBHVF9QT1JUVkVDXzJfTFBPUlRWRUMoZGF0YSk7CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c1NldEFSUHdvQkMKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIEFSUCBkZXRlY3Rpb24gd2l0aG91dCBCcm9hZGNhc3QgY2hlY2tpbmcuIFdoZW4gZW5hYmxlZCB0aGUgc3dpdGNoIGNvcmUKKiAgICAgICBkb2VzIG5vdCBjaGVjayBmb3IgYSBCdG9hZGNhc3QgTUFDIGFkZHJlc3MgYXMgcGFydCBvZiB0aGUgQVJQIGZyYW1lCiogICAgICAgZGV0ZWN0aW9uLiBJdCBvbmx5IGNoZWNrZXMgdGhlIEV0aGVyIFR5cGUgKDB4MDgwNikuCioKKiBJTlBVVFM6CiogICAgICAgZW4gLSBHVF9UUlVFIHRvIGVuYWJsZSwgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogT1VUUFVUUzoKKiAgICAgICBOb25lLgoqCiogUkVUVVJOUzoKKiAgICAgICBHVF9PSyAgIC0gb24gc3VjY2VzcwoqICAgICAgIEdUX0ZBSUwgLSBvbiBlcnJvcgoqCiogQ09NTUVOVFM6CiogICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldEFSUHdvQkMKKAoJSU4gIEdUX1FEX0RFVgkqZGV2LAoJSU4gIEdUX0JPT0wgCWVuCikKewoJR1RfU1RBVFVTICAgICAgIHJldFZhbDsgICAgICAgICAvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlLiAgICAgICovCglHVF9VMTYgICAgICAgICAgZGF0YTsgICAgICAgICAgIC8qIERhdGEgdG8gYmUgc2V0IGludG8gdGhlICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3Rlci4gICAgICAgICAgICAgICAgICAgICovCglEQkdfSU5GTygoInN5c1NldEFSUHdvQkMgQ2FsbGVkLlxuIikpOwoJQk9PTF8yX0JJVChlbixkYXRhKTsKCgkvKiBTZXQgdGhlIERpc2NhcmQgRXhpc3NpdmUgYml0LiAgICAgICAgICAgICAgICAqLwoJcmV0VmFsID0gaHdTZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MLDEyLDEsZGF0YSk7CglpZihyZXRWYWwgIT0gR1RfT0spCgl7CgkJREJHX0lORk8oKCJGYWlsZWQuXG4iKSk7CgkJcmV0dXJuIHJldFZhbDsKCX0KCglEQkdfSU5GTygoIk9LLlxuIikpOwoJcmV0dXJuIEdUX09LOwp9CgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldEFSUHdvQkMKKgoqIERFU0NSSVBUSU9OOgoqICAgICAgIEFSUCBkZXRlY3Rpb24gd2l0aG91dCBCcm9hZGNhc3QgY2hlY2tpbmcuIFdoZW4gZW5hYmxlZCB0aGUgc3dpdGNoIGNvcmUKKiAgICAgICBkb2VzIG5vdCBjaGVjayBmb3IgYSBCdG9hZGNhc3QgTUFDIGFkZHJlc3MgYXMgcGFydCBvZiB0aGUgQVJQIGZyYW1lCiogICAgICAgZGV0ZWN0aW9uLiBJdCBvbmx5IGNoZWNrZXMgdGhlIEV0aGVyIFR5cGUgKDB4MDgwNikuCioKKiBJTlBVVFM6CiogICAgICAgTm9uZS4KKgoqIE9VVFBVVFM6CiogICAgICAgZW4gLSBHVF9UUlVFIGlmIGVuYWJsZWQsIEdUX0ZBTFNFIG90aGVyd2lzZS4KKgoqIFJFVFVSTlM6CiogICAgICAgR1RfT0sgICAgICAgICAgIC0gb24gc3VjY2VzcwoqICAgICAgIEdUX0JBRF9QQVJBTSAgICAtIG9uIGJhZCBwYXJhbWV0ZXIKKiAgICAgICBHVF9GQUlMICAgICAgICAgLSBvbiBlcnJvcgoqCiogQ09NTUVOVFM6CiogICAgICAgTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0dldEFSUHdvQkMKKAoJSU4gIEdUX1FEX0RFViAJKmRldiwKCUlOICBHVF9CT09MCQkqZW4KKQp7CglHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KCUdUX1UxNiAgICAgICAgICBkYXRhOyAgICAgICAgICAgLyogVGhlIHJlZ2lzdGVyJ3MgcmVhZCBkYXRhLiAgICAqLwoKCURCR19JTkZPKCgiZ3N5c0dldEFSUHdvQkMgQ2FsbGVkLlxuIikpOwoJaWYoZW4gPT0gTlVMTCkKCXsKCQlEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKCQlyZXR1cm4gR1RfQkFEX1BBUkFNOwoJfQoKCS8qIEdldCB0aGUgYml0LiAqLwoJcmV0VmFsID0gaHdHZXRHbG9iYWxSZWdGaWVsZChkZXYsUURfUkVHX0dMT0JBTF9DT05UUk9MLDEyLDEsJmRhdGEpOwoJaWYocmV0VmFsICE9IEdUX09LKQoJewoJCURCR19JTkZPKCgiRmFpbGVkLlxuIikpOwoJCXJldHVybiByZXRWYWw7Cgl9CgoJQklUXzJfQk9PTChkYXRhLCplbik7CglEQkdfSU5GTygoIk9LLlxuIikpOwoJcmV0dXJuIEdUX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzU2V0Q0xLMTI1RW4KKgoqIERFU0NSSVBUSU9OOgoqCQlDbG9jayAxMjVNSHogRW5hYmxlLgoqCQlXaGVuIHRoaXMgZmVhdHVyZSBpcyBlbmFibGVkLCB0aGUgQ0xLMTI1IHBpbiBoYXMgYSBmcmVlIHJ1bm5pbmcgMTI1IE1IegoqCQljbG9jayBvdXRwdXQuCioJCVdoZW4gaXQncyBkaXNhYmxlZCwgdGhlIENMSzEyNSBwaW4gd2lsbCBiZSBpbiB0cmktc3RhdGUuCioKKiBJTlBVVFM6CioJCWVuIC0gR1RfVFJVRSB0byBlbmFibGUgMTI1IE1IeiBjbG9jaywgR1RfRkFMU0Ugb3RoZXJ3aXNlLgoqCiogT1VUUFVUUzoKKgkJTm9uZS4KKgoqIFJFVFVSTlM6CioJCUdUX09LICAgLSBvbiBzdWNjZXNzCioJCUdUX0ZBSUwgLSBvbiBlcnJvcgoqCQlHVF9OT1RfU1VQUE9SVEVEIC0gaWYgY3VycmVudCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCioKKiBDT01NRU5UUzoKKgkJTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c1NldENMSzEyNUVuCigKCUlOIEdUX1FEX0RFVgkqZGV2LAoJSU4gR1RfQk9PTAkJZW4KKQp7CglHVF9TVEFUVVMgICAgICAgcmV0VmFsOyAgICAgICAgIC8qIEZ1bmN0aW9ucyByZXR1cm4gdmFsdWUuICAgICAgKi8KCUdUX1UxNgkJCWRhdGE7CgoJREJHX0lORk8oKCJnc3lzU2V0Q0xLMTI1RW4gQ2FsbGVkLlxuIikpOwoKCS8qIENoZWNrIGlmIFN3aXRjaCBzdXBwb3J0cyB0aGlzIGZlYXR1cmUuICovCglpZiAoIUlTX0lOX0RFVl9HUk9VUChkZXYsREVWX0NMS18xMjUpKQoJewoJCURCR19JTkZPKCgiR1RfTk9UX1NVUFBPUlRFRFxuIikpOwoJCXJldHVybiBHVF9OT1RfU1VQUE9SVEVEOwoJfQoKCUJPT0xfMl9CSVQoZW4sZGF0YSk7CgoJLyogU2V0IHJlbGF0ZWQgYml0ICovCglyZXRWYWwgPSBod1NldEdsb2JhbDJSZWdGaWVsZChkZXYsUURfUkVHX1NERVRfUE9MQVJJVFksIDExLCAxLCBkYXRhKTsKCWlmKHJldFZhbCAhPSBHVF9PSykKCXsKCQlEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKCQlyZXR1cm4gcmV0VmFsOwoJfQoKCURCR19JTkZPKCgiT0suXG4iKSk7CglyZXR1cm4gR1RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogZ3N5c0dldENMSzEyNUVuCioKKiBERVNDUklQVElPTjoKKgkJQ2xvY2sgMTI1TUh6IEVuYWJsZS4KKgkJV2hlbiB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCwgdGhlIENMSzEyNSBwaW4gaGFzIGEgZnJlZSBydW5uaW5nIDEyNSBNSHoKKgkJY2xvY2sgb3V0cHV0LgoqCQlXaGVuIGl0J3MgZGlzYWJsZWQsIHRoZSBDTEsxMjUgcGluIHdpbGwgYmUgaW4gdHJpLXN0YXRlLgoqCiogSU5QVVRTOgoqCQlOb25lLgoqCiogT1VUUFVUUzoKKgkJZW4gLSBHVF9UUlVFIGlmIDEyNU1IeiBjbG9jayBpcyBlbmFibGVkLCBHVF9GQUxTRSBvdGhlcndpc2UuCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgkJR1RfTk9UX1NVUFBPUlRFRCAtIGlmIGN1cnJlbnQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgoqCiogQ09NTUVOVFM6CioJCU5vbmUuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KR1RfU1RBVFVTIGdzeXNHZXRDTEsxMjVFbgooCglJTiAgR1RfUURfREVWCSpkZXYsCglPVVQgR1RfQk9PTCAgCSplbgopCnsKCUdUX1NUQVRVUyAgICAgICByZXRWYWw7ICAgICAgICAgLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZS4gICAgICAqLwoJR1RfVTE2ICAgICAgICAgIGRhdGE7ICAgICAgICAgICAvKiBUaGUgcmVnaXN0ZXIncyByZWFkIGRhdGEuICAgICovCgkKCURCR19JTkZPKCgiZ3N5c0dldENMSzEyNUVuIENhbGxlZC5cbiIpKTsKCgkvKiBDaGVjayBpZiBTd2l0Y2ggc3VwcG9ydHMgdGhpcyBmZWF0dXJlLiAqLwoJaWYgKCFJU19JTl9ERVZfR1JPVVAoZGV2LERFVl9DTEtfMTI1KSkKCXsKCQlEQkdfSU5GTygoIkdUX05PVF9TVVBQT1JURURcbiIpKTsKCQlyZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKCX0KCgkvKiBHZXQgcmVsYXRlZCBiaXQgKi8KCXJldFZhbCA9IGh3R2V0R2xvYmFsMlJlZ0ZpZWxkKGRldixRRF9SRUdfU0RFVF9QT0xBUklUWSwxMSwxLCZkYXRhKTsKCWlmKHJldFZhbCAhPSBHVF9PSykKCXsKCQlEQkdfSU5GTygoIkZhaWxlZC5cbiIpKTsKCQlyZXR1cm4gcmV0VmFsOwoJfQoKCUJJVF8yX0JPT0woZGF0YSwqZW4pOwoJREJHX0lORk8oKCJPSy5cbiIpKTsKCglyZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNQb3J0Mkxwb3J0CioKKiBERVNDUklQVElPTjoKKgkJVGhpcyByb3V0aW5lIGNvbnZlcnRzIHBoeXNpY2FsIHBvcnQgbnVtYmVyIHRvIGxvZ2ljYWwgcG9ydCBudW1iZXIuCioKKiBJTlBVVFM6CioJCXBvcnQgLSBwaHlzaWNhbCBwb3J0IG51bWJlcgoqCiogT1VUUFVUUzoKKgkJbHBvcnQgLSBsb2dpY2FsIHBvcnQgbnVtYmVyCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgoqIENPTU1FTlRTOgoqCQlOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzUG9ydDJMcG9ydAooCglJTiAgR1RfUURfREVWCSpkZXYsCglJTiAgR1RfVTMyIAkJcG9ydCwKCU9VVCBHVF9MUE9SVAkqbHBvcnQKKQp7CiAgICBEQkdfSU5GTygoImdzeXNQb3J0Mkxwb3J0IENhbGxlZC5cbiIpKTsKCglpZiAocG9ydCA+IDB4RkYpCgl7CgkJcmV0dXJuIEdUX0ZBSUw7Cgl9CgoJKmxwb3J0ID0gR1RfUE9SVF8yX0xQT1JUKChHVF9VOClwb3J0KTsKCglpZiAoKmxwb3J0ID09IEdUX0lOVkFMSURfUE9SVCkKCXsKCQlyZXR1cm4gR1RfRkFJTDsKCX0KCiAgICBEQkdfSU5GTygoIk9LLlxuIikpOwogICAgcmV0dXJuIEdUX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNMcG9ydDJQb3J0CioKKiBERVNDUklQVElPTjoKKgkJVGhpcyByb3V0aW5lIGNvbnZlcnRzIGxvZ2ljYWwgcG9ydCBudW1iZXIgdG8gcGh5c2ljYWwgcG9ydCBudW1iZXIuCioKKiBJTlBVVFM6CioJCWxwb3J0IC0gbG9naWNhbCBwb3J0IG51bWJlcgoqCiogT1VUUFVUUzoKKgkJcG9ydCAtIHBoeXNpY2FsIHBvcnQgbnVtYmVyCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgoqIENPTU1FTlRTOgoqCQlOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzTHBvcnQyUG9ydAooCglJTiAgR1RfUURfREVWCSpkZXYsCglJTiAgR1RfTFBPUlQJbHBvcnQsCglPVVQgR1RfVTMyIAkJKnBvcnQKKQp7CiAgICBEQkdfSU5GTygoImdzeXNMcG9ydDJQb3J0IENhbGxlZC5cbiIpKTsKCgkqcG9ydCA9IChHVF9VMzIpR1RfTFBPUlRfMl9QT1JUKGxwb3J0KTsKCglpZiAoKnBvcnQgPT0gR1RfSU5WQUxJRF9QT1JUKQoJewoJCXJldHVybiBHVF9GQUlMOwoJfQoKICAgIERCR19JTkZPKCgiT0suXG4iKSk7CiAgICByZXR1cm4gR1RfT0s7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGdzeXNQb3J0dmVjMkxwb3J0dmVjCioKKiBERVNDUklQVElPTjoKKgkJVGhpcyByb3V0aW5lIGNvbnZlcnRzIHBoeXNpY2FsIHBvcnQgdmVjdG9yIHRvIGxvZ2ljYWwgcG9ydCB2ZWN0b3IuCioKKiBJTlBVVFM6CioJCXBvcnR2ZWMgLSBwaHlzaWNhbCBwb3J0IHZlY3RvcgoqCiogT1VUUFVUUzoKKgkJbHBvcnR2ZWMgLSBsb2dpY2FsIHBvcnQgdmVjdG9yCioKKiBSRVRVUk5TOgoqCQlHVF9PSyAgIC0gb24gc3VjY2VzcwoqCQlHVF9GQUlMIC0gb24gZXJyb3IKKgoqIENPTU1FTlRTOgoqCQlOb25lLgoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkdUX1NUQVRVUyBnc3lzUG9ydHZlYzJMcG9ydHZlYwooCglJTiAgR1RfUURfREVWCSpkZXYsCglJTiAgR1RfVTMyCQlwb3J0dmVjLAoJT1VUIEdUX1UzMiAJCSpscG9ydHZlYwopCnsKICAgIERCR19JTkZPKCgiZ3N5c1BvcnR2ZWMyTHBvcnR2ZWMgQ2FsbGVkLlxuIikpOwoKCWlmIChwb3J0dmVjICYgKH4oKEdUX1UzMilkZXYtPnZhbGlkUG9ydFZlYykpKQoJewoJCXJldHVybiBHVF9GQUlMOwoJfQoKCSpscG9ydHZlYyA9IEdUX1BPUlRWRUNfMl9MUE9SVFZFQyhwb3J0dmVjKTsKCglpZiAoKmxwb3J0dmVjID09IEdUX0lOVkFMSURfUE9SVF9WRUMpCgl7CgkJcmV0dXJuIEdUX0ZBSUw7Cgl9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBnc3lzTHBvcnR2ZWMyUG9ydHZlYwoqCiogREVTQ1JJUFRJT046CioJCVRoaXMgcm91dGluZSBjb252ZXJ0cyBsb2dpY2FsIHBvcnQgdmVjdG9yIHRvIHBoeXNpY2FsIHBvcnQgdmVjdG9yLgoqCiogSU5QVVRTOgoqCQlscG9ydHZlYyAtIGxvZ2ljYWwgcG9ydCB2ZWN0b3IKKgoqIE9VVFBVVFM6CioJCXBvcnR2ZWMgLSBwaHlzaWNhbCBwb3J0IHZlY3RvcgoqCiogUkVUVVJOUzoKKgkJR1RfT0sgICAtIG9uIHN1Y2Nlc3MKKgkJR1RfRkFJTCAtIG9uIGVycm9yCioKKiBDT01NRU5UUzoKKgkJTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpHVF9TVEFUVVMgZ3N5c0xwb3J0dmVjMlBvcnR2ZWMKKAoJSU4gIEdUX1FEX0RFVgkqZGV2LAoJSU4gIEdUX1UzMgkJbHBvcnR2ZWMsCglPVVQgR1RfVTMyIAkJKnBvcnR2ZWMKKQp7CiAgICBEQkdfSU5GTygoImdzeXNMcG9ydHZlYzJQb3J0dmVjIENhbGxlZC5cbiIpKTsKCgkqcG9ydHZlYyA9IEdUX0xQT1JUVkVDXzJfUE9SVFZFQyhscG9ydHZlYyk7CgoJaWYgKCpwb3J0dmVjID09IEdUX0lOVkFMSURfUE9SVF9WRUMpCgl7CgkJcmV0dXJuIEdUX0ZBSUw7Cgl9CgogICAgREJHX0lORk8oKCJPSy5cbiIpKTsKICAgIHJldHVybiBHVF9PSzsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogSW50ZXJuYWwgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiBXcml0ZSB0byBTd2l0Y2ggTUFDIFJlZ2lzdGVyCiAqLwpzdGF0aWMgR1RfU1RBVFVTIHdyaXRlU3dpdGNoTWFjUmVnCigKICAgIElOIEdUX1FEX0RFViAgICAqZGV2LAogICAgSU4gR1RfRVRIRVJBRERSICptYWMKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOwkvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgCS8qIHRlbXBvcmFyeSBEYXRhIHN0b3JhZ2UgKi8KCUdUX1UxNgkJCWk7CgoJZm9yIChpPTA7IGk8R1RfRVRIRVJORVRfSEVBREVSX1NJWkU7IGkrKykKCXsKCSAgICAvKiBXYWl0IHVudGlsIHRoZSBkZXZpY2UgaXMgcmVhZHkuICovCgkgICAgZGF0YSA9IDE7CiAgICAJd2hpbGUoZGF0YSA9PSAxKQoJICAgIHsKICAgIAkgICAgcmV0VmFsID0gaHdHZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19TV0lUQ0hfTUFDLDE1LDEsJmRhdGEpOwogICAgICAgIAlpZihyZXRWYWwgIT0gR1RfT0spCgkgICAgICAgIHsKICAgICAgICAJICAgIHJldHVybiByZXRWYWw7CgkgICAgICAgIH0KICAgIAl9CgoJCWRhdGEgPSAoMSA8PCAxNSkgfCAoaSA8PCA4KSB8IG1hYy0+YXJFdGhlcltpXTsKCgkJcmV0VmFsID0gaHdXcml0ZUdsb2JhbDJSZWcoZGV2LFFEX1JFR19TV0lUQ0hfTUFDLGRhdGEpOwogICAgICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgCSAgICB7CiAgICAgICAgICAgCXJldHVybiByZXRWYWw7CiAgICAgICAgfQoJfQoKCXJldHVybiBHVF9PSzsKfQoKLyoKICogUmVhZCBmcm9tIFN3aXRjaCBNQUMgUmVnaXN0ZXIKICovCnN0YXRpYyBHVF9TVEFUVVMgcmVhZFN3aXRjaE1hY1JlZwooCiAgICBJTiAgR1RfUURfREVWICAgICpkZXYsCiAgICBPVVQgR1RfRVRIRVJBRERSICptYWMKKQp7CiAgICBHVF9TVEFUVVMgICAgICAgcmV0VmFsOwkvKiBGdW5jdGlvbnMgcmV0dXJuIHZhbHVlICovCiAgICBHVF9VMTYgICAgICAgICAgZGF0YTsgCS8qIHRlbXBvcmFyeSBEYXRhIHN0b3JhZ2UgKi8KCUdUX1UxNgkJCWk7CgogICAgLyogV2FpdCB1bnRpbCB0aGUgZGV2aWNlIGlzIHJlYWR5LiAqLwogICAgZGF0YSA9IDE7CiAgIAl3aGlsZShkYXRhID09IDEpCiAgICB7CiAgIAkgICAgcmV0VmFsID0gaHdHZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19TV0lUQ0hfTUFDLDE1LDEsJmRhdGEpOwogICAgICAgCWlmKHJldFZhbCAhPSBHVF9PSykKICAgICAgICB7CiAgICAgICAJICAgIHJldHVybiByZXRWYWw7CiAgICAgICAgfQogICAJfQoKCWZvciAoaT0wOyBpPEdUX0VUSEVSTkVUX0hFQURFUl9TSVpFOyBpKyspCgl7CgkJZGF0YSA9IGkgPDwgODsKCgkJcmV0VmFsID0gaHdXcml0ZUdsb2JhbDJSZWcoZGV2LFFEX1JFR19TV0lUQ0hfTUFDLGRhdGEpOwogICAgICAgIGlmKHJldFZhbCAhPSBHVF9PSykKICAgCSAgICB7CiAgICAgICAgICAgCXJldHVybiByZXRWYWw7CiAgICAgICAgfQoKCQlyZXRWYWwgPSBod1JlYWRHbG9iYWwyUmVnKGRldixRRF9SRUdfU1dJVENIX01BQywmZGF0YSk7CiAgICAgICAgaWYocmV0VmFsICE9IEdUX09LKQogICAJICAgIHsKICAgICAgICAgICAJcmV0dXJuIHJldFZhbDsKICAgICAgICB9CgoJCWlmIChpID09IDApCgkJCW1hYy0+YXJFdGhlcltpXSA9IGRhdGEgJiAweEZFOwkvKiBiaXQgMCBpcyBmb3IgZGlmZkFkZHIgKi8KCQllbHNlCgkJCW1hYy0+YXJFdGhlcltpXSA9IGRhdGEgJiAweEZGOwoJfQoKCXJldHVybiBHVF9PSzsKfQoKCi8qCiAqIFdyaXRlIHRvIERpZmZlcmVudCBNQUMgQWRkcmVzcyBwZXIgcG9ydCBiaXQgaW4gU3dpdGNoIE1BQyBSZWdpc3RlcgogKi8Kc3RhdGljIEdUX1NUQVRVUyB3cml0ZURpZmZNQUMKKAogICAgSU4gR1RfUURfREVWICAgICpkZXYsCiAgICBJTiBHVF9VMTYJCWRpZmZBZGRyCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsJLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZSAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7IAkvKiB0ZW1wb3JhcnkgRGF0YSBzdG9yYWdlICovCgogICAgLyogV2FpdCB1bnRpbCB0aGUgZGV2aWNlIGlzIHJlYWR5LiAqLwogICAgZGF0YSA9IDE7CiAgIAl3aGlsZShkYXRhID09IDEpCiAgICB7CiAgIAkgICAgcmV0VmFsID0gaHdHZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19TV0lUQ0hfTUFDLDE1LDEsJmRhdGEpOwogICAgICAgCWlmKHJldFZhbCAhPSBHVF9PSykKICAgICAgICB7CiAgICAgICAJICAgIHJldHVybiByZXRWYWw7CiAgICAgICAgfQogICAJfQoKICAgIC8qIFdyaXRlIHRvIFN3aXRoIE1BQyBSZWcgZm9yIHJlYWRpbmcgb3BlcmF0aW9uICovCglkYXRhID0gMDsKCXJldFZhbCA9IGh3V3JpdGVHbG9iYWwyUmVnKGRldixRRF9SRUdfU1dJVENIX01BQyxkYXRhKTsKCWlmKHJldFZhbCAhPSBHVF9PSykKCXsKCQlyZXR1cm4gcmV0VmFsOwoJfQoKICAgIC8qIFJlYWQgU3dpdGggTUFDIFJlZyAqLwoJcmV0VmFsID0gaHdSZWFkR2xvYmFsMlJlZyhkZXYsUURfUkVHX1NXSVRDSF9NQUMsJmRhdGEpOwoJaWYocmV0VmFsICE9IEdUX09LKQoJewoJCXJldHVybiByZXRWYWw7Cgl9CgoJZGF0YSA9ICgxIDw8IDE1KSB8IChkYXRhICYgMHhGRSkgfCAoZGlmZkFkZHIgJiAweDEpOwoKICAgIC8qIFdyaXRlIGJhY2sgdG8gU3dpdGggTUFDIFJlZyB3aXRoIHVwZGF0ZWQgZGlmZkFkZHIgKi8KCXJldFZhbCA9IGh3V3JpdGVHbG9iYWwyUmVnKGRldixRRF9SRUdfU1dJVENIX01BQyxkYXRhKTsKCWlmKHJldFZhbCAhPSBHVF9PSykKCXsKCQlyZXR1cm4gcmV0VmFsOwoJfQoKCXJldHVybiBHVF9PSzsKfQoKLyoKICogUmVhZCBEaWZmZXJlbnQgTUFDIEFkZHJlc3MgcGVyIHBvcnQgYml0IGluIFN3aXRjaCBNQUMgUmVnaXN0ZXIKICovCnN0YXRpYyBHVF9TVEFUVVMgcmVhZERpZmZNQUMKKAogICAgSU4gIEdUX1FEX0RFVgkqZGV2LAogICAgT1VUIEdUX1UxNgkJKmRpZmZBZGRyCikKewogICAgR1RfU1RBVFVTICAgICAgIHJldFZhbDsJLyogRnVuY3Rpb25zIHJldHVybiB2YWx1ZSAqLwogICAgR1RfVTE2ICAgICAgICAgIGRhdGE7IAkvKiB0ZW1wb3JhcnkgRGF0YSBzdG9yYWdlICovCgogICAgLyogV2FpdCB1bnRpbCB0aGUgZGV2aWNlIGlzIHJlYWR5LiAqLwogICAgZGF0YSA9IDE7CiAgIAl3aGlsZShkYXRhID09IDEpCiAgICB7CiAgIAkgICAgcmV0VmFsID0gaHdHZXRHbG9iYWwyUmVnRmllbGQoZGV2LFFEX1JFR19TV0lUQ0hfTUFDLDE1LDEsJmRhdGEpOwogICAgICAgCWlmKHJldFZhbCAhPSBHVF9PSykKICAgICAgICB7CiAgICAgICAJICAgIHJldHVybiByZXRWYWw7CiAgICAgICAgfQogICAJfQoKICAgIC8qIFdyaXRlIHRvIFN3aXRoIE1BQyBSZWcgZm9yIHJlYWRpbmcgb3BlcmF0aW9uICovCglkYXRhID0gMDsKCXJldFZhbCA9IGh3V3JpdGVHbG9iYWwyUmVnKGRldixRRF9SRUdfU1dJVENIX01BQyxkYXRhKTsKCWlmKHJldFZhbCAhPSBHVF9PSykKCXsKCQlyZXR1cm4gcmV0VmFsOwoJfQoKCXJldFZhbCA9IGh3UmVhZEdsb2JhbDJSZWcoZGV2LFFEX1JFR19TV0lUQ0hfTUFDLCZkYXRhKTsKCWlmKHJldFZhbCAhPSBHVF9PSykKCXsKCQlyZXR1cm4gcmV0VmFsOwoJfQoKCSpkaWZmQWRkciA9IGRhdGEgJiAweDE7CgoJcmV0dXJuIEdUX09LOwp9Cgo=