ZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX3N0YXRlLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9zdGF0ZS5jCmluZGV4IDc0YzJmZTguLjQyZThjZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX3N0YXRlLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fc3RhdGUuYwpAQCAtMzcsNTEgKzM3LDU4IEBACiAgKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBjbGllbnQgc3RhdGUgY2hlY2tpbmcgYW5kIGZpeHVwCiAgKi8KIAotc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCi0JCQkJCQkgICAgIGRybV9maWxlX3QgKmZpbHBfcHJpdiwKLQkJCQkJCSAgICAgdTMyICpvZmZzZXQgKSB7CitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoZHJtX3JhZGVvbl9wcml2YXRlX3QgKgorCQkJCQkJICAgIGRldl9wcml2LAorCQkJCQkJICAgIGRybV9maWxlX3QgKiBmaWxwX3ByaXYsCisJCQkJCQkgICAgdTMyICogb2Zmc2V0KQorewogCXUzMiBvZmYgPSAqb2Zmc2V0OwogCXN0cnVjdCBkcm1fcmFkZW9uX2RyaXZlcl9maWxlX2ZpZWxkcyAqcmFkZW9uX3ByaXY7CiAKLQlpZiAoIG9mZiA+PSBkZXZfcHJpdi0+ZmJfbG9jYXRpb24gJiYKLQkgICAgIG9mZiA8ICggZGV2X3ByaXYtPmdhcnRfdm1fc3RhcnQgKyBkZXZfcHJpdi0+Z2FydF9zaXplICkgKQorCWlmIChvZmYgPj0gZGV2X3ByaXYtPmZiX2xvY2F0aW9uICYmCisJICAgIG9mZiA8IChkZXZfcHJpdi0+Z2FydF92bV9zdGFydCArIGRldl9wcml2LT5nYXJ0X3NpemUpKQogCQlyZXR1cm4gMDsKIAogCXJhZGVvbl9wcml2ID0gZmlscF9wcml2LT5kcml2ZXJfcHJpdjsKIAlvZmYgKz0gcmFkZW9uX3ByaXYtPnJhZGVvbl9mYl9kZWx0YTsKIAotCURSTV9ERUJVRyggIm9mZnNldCBmaXhlZCB1cCB0byAweCV4XG4iLCBvZmYgKTsKKwlEUk1fREVCVUcoIm9mZnNldCBmaXhlZCB1cCB0byAweCV4XG4iLCBvZmYpOwogCi0JaWYgKCBvZmYgPCBkZXZfcHJpdi0+ZmJfbG9jYXRpb24gfHwKLQkgICAgIG9mZiA+PSAoIGRldl9wcml2LT5nYXJ0X3ZtX3N0YXJ0ICsgZGV2X3ByaXYtPmdhcnRfc2l6ZSApICkKLQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCWlmIChvZmYgPCBkZXZfcHJpdi0+ZmJfbG9jYXRpb24gfHwKKwkgICAgb2ZmID49IChkZXZfcHJpdi0+Z2FydF92bV9zdGFydCArIGRldl9wcml2LT5nYXJ0X3NpemUpKQorCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCiAJKm9mZnNldCA9IG9mZjsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9wYWNrZXRzKCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCi0JCQkJCQkgICAgICBkcm1fZmlsZV90ICpmaWxwX3ByaXYsCi0JCQkJCQkgICAgICBpbnQgaWQsCi0JCQkJCQkgICAgICB1MzIgX191c2VyICpkYXRhICkgewotCXN3aXRjaCAoIGlkICkgeworc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9jaGVja19hbmRfZml4dXBfcGFja2V0cyhkcm1fcmFkZW9uX3ByaXZhdGVfdCAqCisJCQkJCQkgICAgIGRldl9wcml2LAorCQkJCQkJICAgICBkcm1fZmlsZV90ICogZmlscF9wcml2LAorCQkJCQkJICAgICBpbnQgaWQsIHUzMiBfX3VzZXIgKiBkYXRhKQoreworCXN3aXRjaCAoaWQpIHsKIAogCWNhc2UgUkFERU9OX0VNSVRfUFBfTUlTQzoKLQkJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZGV2X3ByaXYsIGZpbHBfcHJpdiwKLQkJCQkJCSAgICAmZGF0YVsoIFJBREVPTl9SQjNEX0RFUFRIT0ZGU0VUCi0JCQkJCQkJICAgIC0gUkFERU9OX1BQX01JU0MgKSAvIDRdICkgKSB7Ci0JCQlEUk1fRVJST1IoICJJbnZhbGlkIGRlcHRoIGJ1ZmZlciBvZmZzZXRcbiIgKTsKLQkJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwkJaWYgKHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KGRldl9wcml2LCBmaWxwX3ByaXYsCisJCQkJCQkgICZkYXRhWyhSQURFT05fUkIzRF9ERVBUSE9GRlNFVAorCQkJCQkJCSAtCisJCQkJCQkJIFJBREVPTl9QUF9NSVNDKSAvCisJCQkJCQkJNF0pKSB7CisJCQlEUk1fRVJST1IoIkludmFsaWQgZGVwdGggYnVmZmVyIG9mZnNldFxuIik7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBSQURFT05fRU1JVF9QUF9DTlRMOgotCQlpZiAoIHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KCBkZXZfcHJpdiwgZmlscF9wcml2LAotCQkJCQkJICAgICZkYXRhWyggUkFERU9OX1JCM0RfQ09MT1JPRkZTRVQKLQkJCQkJCQkgICAgLSBSQURFT05fUFBfQ05UTCApIC8gNF0gKSApIHsKLQkJCURSTV9FUlJPUiggIkludmFsaWQgY29sb3VyIGJ1ZmZlciBvZmZzZXRcbiIgKTsKLQkJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwkJaWYgKHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KGRldl9wcml2LCBmaWxwX3ByaXYsCisJCQkJCQkgICZkYXRhWyhSQURFT05fUkIzRF9DT0xPUk9GRlNFVAorCQkJCQkJCSAtCisJCQkJCQkJIFJBREVPTl9QUF9DTlRMKSAvCisJCQkJCQkJNF0pKSB7CisJCQlEUk1fRVJST1IoIkludmFsaWQgY29sb3VyIGJ1ZmZlciBvZmZzZXRcbiIpOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAkJfQogCQlicmVhazsKIApAQCAtOTEsMjEgKzk4LDIzIEBACiAJY2FzZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfMzoKIAljYXNlIFIyMDBfRU1JVF9QUF9UWE9GRlNFVF80OgogCWNhc2UgUjIwMF9FTUlUX1BQX1RYT0ZGU0VUXzU6Ci0JCWlmICggcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoIGRldl9wcml2LCBmaWxwX3ByaXYsCi0JCQkJCQkgICAgJmRhdGFbMF0gKSApIHsKLQkJCURSTV9FUlJPUiggIkludmFsaWQgUjIwMCB0ZXh0dXJlIG9mZnNldFxuIiApOwotCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQlpZiAocmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJCSAgJmRhdGFbMF0pKSB7CisJCQlEUk1fRVJST1IoIkludmFsaWQgUjIwMCB0ZXh0dXJlIG9mZnNldFxuIik7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBSQURFT05fRU1JVF9QUF9UWEZJTFRFUl8wOgogCWNhc2UgUkFERU9OX0VNSVRfUFBfVFhGSUxURVJfMToKIAljYXNlIFJBREVPTl9FTUlUX1BQX1RYRklMVEVSXzI6Ci0JCWlmICggcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoIGRldl9wcml2LCBmaWxwX3ByaXYsCi0JCQkJCQkgICAgJmRhdGFbKCBSQURFT05fUFBfVFhPRkZTRVRfMAotCQkJCQkJCSAgICAtIFJBREVPTl9QUF9UWEZJTFRFUl8wICkgLyA0XSApICkgewotCQkJRFJNX0VSUk9SKCAiSW52YWxpZCBSMTAwIHRleHR1cmUgb2Zmc2V0XG4iICk7Ci0JCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldChkZXZfcHJpdiwgZmlscF9wcml2LAorCQkJCQkJICAmZGF0YVsoUkFERU9OX1BQX1RYT0ZGU0VUXzAKKwkJCQkJCQkgLQorCQkJCQkJCSBSQURFT05fUFBfVFhGSUxURVJfMCkgLworCQkJCQkJCTRdKSkgeworCQkJRFJNX0VSUk9SKCJJbnZhbGlkIFIxMDAgdGV4dHVyZSBvZmZzZXRcbiIpOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAkJfQogCQlicmVhazsKIApAQCAtMTE0LDE3ICsxMjMsMTggQEAKIAljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzI6CiAJY2FzZSBSMjAwX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU18zOgogCWNhc2UgUjIwMF9FTUlUX1BQX0NVQklDX09GRlNFVFNfNDoKLQljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzU6IHsKLQkJaW50IGk7Ci0JCWZvciAoIGkgPSAwOyBpIDwgNTsgaSsrICkgewotCQkJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZGV2X3ByaXYsIGZpbHBfcHJpdiwKLQkJCQkJCQkgICAgJmRhdGFbaV0gKSApIHsKLQkJCQlEUk1fRVJST1IoICJJbnZhbGlkIFIyMDAgY3ViaWMgdGV4dHVyZSBvZmZzZXRcbiIgKTsKLQkJCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJY2FzZSBSMjAwX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU181OnsKKwkJCWludCBpOworCQkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQkJCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldAorCQkJCSAgICAoZGV2X3ByaXYsIGZpbHBfcHJpdiwgJmRhdGFbaV0pKSB7CisJCQkJCURSTV9FUlJPUgorCQkJCQkgICAgKCJJbnZhbGlkIFIyMDAgY3ViaWMgdGV4dHVyZSBvZmZzZXRcbiIpOworCQkJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCQkJCX0KIAkJCX0KKwkJCWJyZWFrOwogCQl9Ci0JCWJyZWFrOwotCX0KIAogCWNhc2UgUkFERU9OX0VNSVRfUFBfQ1VCSUNfT0ZGU0VUU19UMDoKIAljYXNlIFJBREVPTl9FTUlUX1BQX0NVQklDX09GRlNFVFNfVDE6CkBAIC0yMjAsMjQzICsyMzAsMjQ3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJRFJNX0VSUk9SKCAiVW5rbm93biBzdGF0ZSBwYWNrZXQgSUQgJWRcbiIsIGlkICk7Ci0JCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwkJRFJNX0VSUk9SKCJVbmtub3duIHN0YXRlIHBhY2tldCBJRCAlZFxuIiwgaWQpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9wYWNrZXQzKCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCi0JCQkJCQkgICAgICBkcm1fZmlsZV90ICpmaWxwX3ByaXYsCi0JCQkJCQkgICAgICBkcm1fcmFkZW9uX2NtZF9idWZmZXJfdCAqY21kYnVmLAotCQkJCQkJICAgICAgdW5zaWduZWQgaW50ICpjbWRzeiApIHsKK3N0YXRpYyBfX2lubGluZV9fIGludCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX3BhY2tldDMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKgorCQkJCQkJICAgICBkZXZfcHJpdiwKKwkJCQkJCSAgICAgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdiwKKwkJCQkJCSAgICAgZHJtX3JhZGVvbl9jbWRfYnVmZmVyX3QgKgorCQkJCQkJICAgICBjbWRidWYsCisJCQkJCQkgICAgIHVuc2lnbmVkIGludCAqY21kc3opCit7CiAJdTMyICpjbWQgPSAodTMyICopIGNtZGJ1Zi0+YnVmOwogCi0JKmNtZHN6ID0gMiArICggKCBjbWRbMF0gJiBSQURFT05fQ1BfUEFDS0VUX0NPVU5UX01BU0sgKSA+PiAxNiApOworCSpjbWRzeiA9IDIgKyAoKGNtZFswXSAmIFJBREVPTl9DUF9QQUNLRVRfQ09VTlRfTUFTSykgPj4gMTYpOwogCi0JaWYgKCAoIGNtZFswXSAmIDB4YzAwMDAwMDAgKSAhPSBSQURFT05fQ1BfUEFDS0VUMyApIHsKLQkJRFJNX0VSUk9SKCAiTm90IGEgdHlwZSAzIHBhY2tldFxuIiApOwotCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJaWYgKChjbWRbMF0gJiAweGMwMDAwMDAwKSAhPSBSQURFT05fQ1BfUEFDS0VUMykgeworCQlEUk1fRVJST1IoIk5vdCBhIHR5cGUgMyBwYWNrZXRcbiIpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KIAotCWlmICggNCAqICpjbWRzeiA+IGNtZGJ1Zi0+YnVmc3ogKSB7Ci0JCURSTV9FUlJPUiggIlBhY2tldCBzaXplIGxhcmdlciB0aGFuIHNpemUgb2YgZGF0YSBwcm92aWRlZFxuIiApOwotCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJaWYgKDQgKiAqY21kc3ogPiBjbWRidWYtPmJ1ZnN6KSB7CisJCURSTV9FUlJPUigiUGFja2V0IHNpemUgbGFyZ2VyIHRoYW4gc2l6ZSBvZiBkYXRhIHByb3ZpZGVkXG4iKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9CiAKIAkvKiBDaGVjayBjbGllbnQgc3RhdGUgYW5kIGZpeCBpdCB1cCBpZiBuZWNlc3NhcnkgKi8KLQlpZiAoIGNtZFswXSAmIDB4ODAwMCApIHsgLyogTVNCIG9mIG9wY29kZTogbmV4dCBEV09SRCBHVUlfQ05UTCAqLworCWlmIChjbWRbMF0gJiAweDgwMDApIHsJLyogTVNCIG9mIG9wY29kZTogbmV4dCBEV09SRCBHVUlfQ05UTCAqLwogCQl1MzIgb2Zmc2V0OwogCi0JCWlmICggY21kWzFdICYgKCBSQURFT05fR01DX1NSQ19QSVRDSF9PRkZTRVRfQ05UTAotCQkJICAgICAgfCBSQURFT05fR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCApICkgeworCQlpZiAoY21kWzFdICYgKFJBREVPTl9HTUNfU1JDX1BJVENIX09GRlNFVF9DTlRMCisJCQkgICAgICB8IFJBREVPTl9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMKSkgewogCQkJb2Zmc2V0ID0gY21kWzJdIDw8IDEwOwotCQkJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZGV2X3ByaXYsIGZpbHBfcHJpdiwgJm9mZnNldCApICkgewotCQkJCURSTV9FUlJPUiggIkludmFsaWQgZmlyc3QgcGFja2V0IG9mZnNldFxuIiApOwotCQkJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwkJCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldAorCQkJICAgIChkZXZfcHJpdiwgZmlscF9wcml2LCAmb2Zmc2V0KSkgeworCQkJCURSTV9FUlJPUigiSW52YWxpZCBmaXJzdCBwYWNrZXQgb2Zmc2V0XG4iKTsKKwkJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCQkJfQotCQkJY21kWzJdID0gKCBjbWRbMl0gJiAweGZmYzAwMDAwICkgfCBvZmZzZXQgPj4gMTA7CisJCQljbWRbMl0gPSAoY21kWzJdICYgMHhmZmMwMDAwMCkgfCBvZmZzZXQgPj4gMTA7CiAJCX0KIAotCQlpZiAoICggY21kWzFdICYgUkFERU9OX0dNQ19TUkNfUElUQ0hfT0ZGU0VUX0NOVEwgKSAmJgotCQkgICAgICggY21kWzFdICYgUkFERU9OX0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgKSApIHsKKwkJaWYgKChjbWRbMV0gJiBSQURFT05fR01DX1NSQ19QSVRDSF9PRkZTRVRfQ05UTCkgJiYKKwkJICAgIChjbWRbMV0gJiBSQURFT05fR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCkpIHsKIAkJCW9mZnNldCA9IGNtZFszXSA8PCAxMDsKLQkJCWlmICggcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoIGRldl9wcml2LCBmaWxwX3ByaXYsICZvZmZzZXQgKSApIHsKLQkJCQlEUk1fRVJST1IoICJJbnZhbGlkIHNlY29uZCBwYWNrZXQgb2Zmc2V0XG4iICk7Ci0JCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQkJaWYgKHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0CisJCQkgICAgKGRldl9wcml2LCBmaWxwX3ByaXYsICZvZmZzZXQpKSB7CisJCQkJRFJNX0VSUk9SKCJJbnZhbGlkIHNlY29uZCBwYWNrZXQgb2Zmc2V0XG4iKTsKKwkJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCQkJfQotCQkJY21kWzNdID0gKCBjbWRbM10gJiAweGZmYzAwMDAwICkgfCBvZmZzZXQgPj4gMTA7CisJCQljbWRbM10gPSAoY21kWzNdICYgMHhmZmMwMDAwMCkgfCBvZmZzZXQgPj4gMTA7CiAJCX0KIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBDUCBoYXJkd2FyZSBzdGF0ZSBwcm9ncmFtbWluZyBmdW5jdGlvbnMKICAqLwogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIHJhZGVvbl9lbWl0X2NsaXBfcmVjdCggZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAotCQkJCQkgIGRybV9jbGlwX3JlY3RfdCAqYm94ICkKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgcmFkZW9uX2VtaXRfY2xpcF9yZWN0KGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsCisJCQkJCSAgICAgZHJtX2NsaXBfcmVjdF90ICogYm94KQogewogCVJJTkdfTE9DQUxTOwogCi0JRFJNX0RFQlVHKCAiICAgYm94OiAgeDE9JWQgeTE9JWQgIHgyPSVkIHkyPSVkXG4iLAotCQkgICBib3gtPngxLCBib3gtPnkxLCBib3gtPngyLCBib3gtPnkyICk7CisJRFJNX0RFQlVHKCIgICBib3g6ICB4MT0lZCB5MT0lZCAgeDI9JWQgeTI9JWRcbiIsCisJCSAgYm94LT54MSwgYm94LT55MSwgYm94LT54MiwgYm94LT55Mik7CiAKLQlCRUdJTl9SSU5HKCA0ICk7Ci0JT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9SRV9UT1BfTEVGVCwgMCApICk7Ci0JT1VUX1JJTkcoIChib3gtPnkxIDw8IDE2KSB8IGJveC0+eDEgKTsKLQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1JFX1dJRFRIX0hFSUdIVCwgMCApICk7Ci0JT1VUX1JJTkcoICgoYm94LT55MiAtIDEpIDw8IDE2KSB8IChib3gtPngyIC0gMSkgKTsKKwlCRUdJTl9SSU5HKDQpOworCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1JFX1RPUF9MRUZULCAwKSk7CisJT1VUX1JJTkcoKGJveC0+eTEgPDwgMTYpIHwgYm94LT54MSk7CisJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fUkVfV0lEVEhfSEVJR0hULCAwKSk7CisJT1VUX1JJTkcoKChib3gtPnkyIC0gMSkgPDwgMTYpIHwgKGJveC0+eDIgLSAxKSk7CiAJQURWQU5DRV9SSU5HKCk7CiB9CiAKIC8qIEVtaXQgMS4xIHN0YXRlCiAgKi8KLXN0YXRpYyBpbnQgcmFkZW9uX2VtaXRfc3RhdGUoIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKLQkJCSAgICAgIGRybV9maWxlX3QgKmZpbHBfcHJpdiwKLQkJCSAgICAgIGRybV9yYWRlb25fY29udGV4dF9yZWdzX3QgKmN0eCwKLQkJCSAgICAgIGRybV9yYWRlb25fdGV4dHVyZV9yZWdzX3QgKnRleCwKLQkJCSAgICAgIHVuc2lnbmVkIGludCBkaXJ0eSApCitzdGF0aWMgaW50IHJhZGVvbl9lbWl0X3N0YXRlKGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsCisJCQkgICAgIGRybV9maWxlX3QgKiBmaWxwX3ByaXYsCisJCQkgICAgIGRybV9yYWRlb25fY29udGV4dF9yZWdzX3QgKiBjdHgsCisJCQkgICAgIGRybV9yYWRlb25fdGV4dHVyZV9yZWdzX3QgKiB0ZXgsCisJCQkgICAgIHVuc2lnbmVkIGludCBkaXJ0eSkKIHsKIAlSSU5HX0xPQ0FMUzsKLQlEUk1fREVCVUcoICJkaXJ0eT0weCUwOHhcbiIsIGRpcnR5ICk7CisJRFJNX0RFQlVHKCJkaXJ0eT0weCUwOHhcbiIsIGRpcnR5KTsKIAotCWlmICggZGlydHkgJiBSQURFT05fVVBMT0FEX0NPTlRFWFQgKSB7Ci0JCWlmICggcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoIGRldl9wcml2LCBmaWxwX3ByaXYsCi0JCQkJCQkgICAgJmN0eC0+cmIzZF9kZXB0aG9mZnNldCApICkgewotCQkJRFJNX0VSUk9SKCAiSW52YWxpZCBkZXB0aCBidWZmZXIgb2Zmc2V0XG4iICk7Ci0JCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJaWYgKGRpcnR5ICYgUkFERU9OX1VQTE9BRF9DT05URVhUKSB7CisJCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldChkZXZfcHJpdiwgZmlscF9wcml2LAorCQkJCQkJICAmY3R4LT5yYjNkX2RlcHRob2Zmc2V0KSkgeworCQkJRFJNX0VSUk9SKCJJbnZhbGlkIGRlcHRoIGJ1ZmZlciBvZmZzZXRcbiIpOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAkJfQogCi0JCWlmICggcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoIGRldl9wcml2LCBmaWxwX3ByaXYsCi0JCQkJCQkgICAgJmN0eC0+cmIzZF9jb2xvcm9mZnNldCApICkgewotCQkJRFJNX0VSUk9SKCAiSW52YWxpZCBkZXB0aCBidWZmZXIgb2Zmc2V0XG4iICk7Ci0JCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldChkZXZfcHJpdiwgZmlscF9wcml2LAorCQkJCQkJICAmY3R4LT5yYjNkX2NvbG9yb2Zmc2V0KSkgeworCQkJRFJNX0VSUk9SKCJJbnZhbGlkIGRlcHRoIGJ1ZmZlciBvZmZzZXRcbiIpOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAkJfQogCi0JCUJFR0lOX1JJTkcoIDE0ICk7Ci0JCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUFBfTUlTQywgNiApICk7Ci0JCU9VVF9SSU5HKCBjdHgtPnBwX21pc2MgKTsKLQkJT1VUX1JJTkcoIGN0eC0+cHBfZm9nX2NvbG9yICk7Ci0JCU9VVF9SSU5HKCBjdHgtPnJlX3NvbGlkX2NvbG9yICk7Ci0JCU9VVF9SSU5HKCBjdHgtPnJiM2RfYmxlbmRjbnRsICk7Ci0JCU9VVF9SSU5HKCBjdHgtPnJiM2RfZGVwdGhvZmZzZXQgKTsKLQkJT1VUX1JJTkcoIGN0eC0+cmIzZF9kZXB0aHBpdGNoICk7Ci0JCU9VVF9SSU5HKCBjdHgtPnJiM2RfenN0ZW5jaWxjbnRsICk7Ci0JCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUFBfQ05UTCwgMiApICk7Ci0JCU9VVF9SSU5HKCBjdHgtPnBwX2NudGwgKTsKLQkJT1VUX1JJTkcoIGN0eC0+cmIzZF9jbnRsICk7Ci0JCU9VVF9SSU5HKCBjdHgtPnJiM2RfY29sb3JvZmZzZXQgKTsKLQkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9SQjNEX0NPTE9SUElUQ0gsIDAgKSApOwotCQlPVVRfUklORyggY3R4LT5yYjNkX2NvbG9ycGl0Y2ggKTsKKwkJQkVHSU5fUklORygxNCk7CisJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1BQX01JU0MsIDYpKTsKKwkJT1VUX1JJTkcoY3R4LT5wcF9taXNjKTsKKwkJT1VUX1JJTkcoY3R4LT5wcF9mb2dfY29sb3IpOworCQlPVVRfUklORyhjdHgtPnJlX3NvbGlkX2NvbG9yKTsKKwkJT1VUX1JJTkcoY3R4LT5yYjNkX2JsZW5kY250bCk7CisJCU9VVF9SSU5HKGN0eC0+cmIzZF9kZXB0aG9mZnNldCk7CisJCU9VVF9SSU5HKGN0eC0+cmIzZF9kZXB0aHBpdGNoKTsKKwkJT1VUX1JJTkcoY3R4LT5yYjNkX3pzdGVuY2lsY250bCk7CisJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1BQX0NOVEwsIDIpKTsKKwkJT1VUX1JJTkcoY3R4LT5wcF9jbnRsKTsKKwkJT1VUX1JJTkcoY3R4LT5yYjNkX2NudGwpOworCQlPVVRfUklORyhjdHgtPnJiM2RfY29sb3JvZmZzZXQpOworCQlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9SQjNEX0NPTE9SUElUQ0gsIDApKTsKKwkJT1VUX1JJTkcoY3R4LT5yYjNkX2NvbG9ycGl0Y2gpOwogCQlBRFZBTkNFX1JJTkcoKTsKIAl9CiAKLQlpZiAoIGRpcnR5ICYgUkFERU9OX1VQTE9BRF9WRVJURk1UICkgewotCQlCRUdJTl9SSU5HKCAyICk7Ci0JCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fU0VfQ09PUkRfRk1ULCAwICkgKTsKLQkJT1VUX1JJTkcoIGN0eC0+c2VfY29vcmRfZm10ICk7CisJaWYgKGRpcnR5ICYgUkFERU9OX1VQTE9BRF9WRVJURk1UKSB7CisJCUJFR0lOX1JJTkcoMik7CisJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1NFX0NPT1JEX0ZNVCwgMCkpOworCQlPVVRfUklORyhjdHgtPnNlX2Nvb3JkX2ZtdCk7CiAJCUFEVkFOQ0VfUklORygpOwogCX0KIAotCWlmICggZGlydHkgJiBSQURFT05fVVBMT0FEX0xJTkUgKSB7Ci0JCUJFR0lOX1JJTkcoIDUgKTsKLQkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9SRV9MSU5FX1BBVFRFUk4sIDEgKSApOwotCQlPVVRfUklORyggY3R4LT5yZV9saW5lX3BhdHRlcm4gKTsKLQkJT1VUX1JJTkcoIGN0eC0+cmVfbGluZV9zdGF0ZSApOwotCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1NFX0xJTkVfV0lEVEgsIDAgKSApOwotCQlPVVRfUklORyggY3R4LT5zZV9saW5lX3dpZHRoICk7CisJaWYgKGRpcnR5ICYgUkFERU9OX1VQTE9BRF9MSU5FKSB7CisJCUJFR0lOX1JJTkcoNSk7CisJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1JFX0xJTkVfUEFUVEVSTiwgMSkpOworCQlPVVRfUklORyhjdHgtPnJlX2xpbmVfcGF0dGVybik7CisJCU9VVF9SSU5HKGN0eC0+cmVfbGluZV9zdGF0ZSk7CisJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1NFX0xJTkVfV0lEVEgsIDApKTsKKwkJT1VUX1JJTkcoY3R4LT5zZV9saW5lX3dpZHRoKTsKIAkJQURWQU5DRV9SSU5HKCk7CiAJfQogCi0JaWYgKCBkaXJ0eSAmIFJBREVPTl9VUExPQURfQlVNUE1BUCApIHsKLQkJQkVHSU5fUklORyggNSApOwotCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1BQX0xVTV9NQVRSSVgsIDAgKSApOwotCQlPVVRfUklORyggY3R4LT5wcF9sdW1fbWF0cml4ICk7Ci0JCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUFBfUk9UX01BVFJJWF8wLCAxICkgKTsKLQkJT1VUX1JJTkcoIGN0eC0+cHBfcm90X21hdHJpeF8wICk7Ci0JCU9VVF9SSU5HKCBjdHgtPnBwX3JvdF9tYXRyaXhfMSApOworCWlmIChkaXJ0eSAmIFJBREVPTl9VUExPQURfQlVNUE1BUCkgeworCQlCRUdJTl9SSU5HKDUpOworCQlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9QUF9MVU1fTUFUUklYLCAwKSk7CisJCU9VVF9SSU5HKGN0eC0+cHBfbHVtX21hdHJpeCk7CisJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1BQX1JPVF9NQVRSSVhfMCwgMSkpOworCQlPVVRfUklORyhjdHgtPnBwX3JvdF9tYXRyaXhfMCk7CisJCU9VVF9SSU5HKGN0eC0+cHBfcm90X21hdHJpeF8xKTsKIAkJQURWQU5DRV9SSU5HKCk7CiAJfQogCi0JaWYgKCBkaXJ0eSAmIFJBREVPTl9VUExPQURfTUFTS1MgKSB7Ci0JCUJFR0lOX1JJTkcoIDQgKTsKLQkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9SQjNEX1NURU5DSUxSRUZNQVNLLCAyICkgKTsKLQkJT1VUX1JJTkcoIGN0eC0+cmIzZF9zdGVuY2lscmVmbWFzayApOwotCQlPVVRfUklORyggY3R4LT5yYjNkX3JvcGNudGwgKTsKLQkJT1VUX1JJTkcoIGN0eC0+cmIzZF9wbGFuZW1hc2sgKTsKKwlpZiAoZGlydHkgJiBSQURFT05fVVBMT0FEX01BU0tTKSB7CisJCUJFR0lOX1JJTkcoNCk7CisJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1JCM0RfU1RFTkNJTFJFRk1BU0ssIDIpKTsKKwkJT1VUX1JJTkcoY3R4LT5yYjNkX3N0ZW5jaWxyZWZtYXNrKTsKKwkJT1VUX1JJTkcoY3R4LT5yYjNkX3JvcGNudGwpOworCQlPVVRfUklORyhjdHgtPnJiM2RfcGxhbmVtYXNrKTsKIAkJQURWQU5DRV9SSU5HKCk7CiAJfQogCi0JaWYgKCBkaXJ0eSAmIFJBREVPTl9VUExPQURfVklFV1BPUlQgKSB7Ci0JCUJFR0lOX1JJTkcoIDcgKTsKLQkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9TRV9WUE9SVF9YU0NBTEUsIDUgKSApOwotCQlPVVRfUklORyggY3R4LT5zZV92cG9ydF94c2NhbGUgKTsKLQkJT1VUX1JJTkcoIGN0eC0+c2VfdnBvcnRfeG9mZnNldCApOwotCQlPVVRfUklORyggY3R4LT5zZV92cG9ydF95c2NhbGUgKTsKLQkJT1VUX1JJTkcoIGN0eC0+c2VfdnBvcnRfeW9mZnNldCApOwotCQlPVVRfUklORyggY3R4LT5zZV92cG9ydF96c2NhbGUgKTsKLQkJT1VUX1JJTkcoIGN0eC0+c2VfdnBvcnRfem9mZnNldCApOworCWlmIChkaXJ0eSAmIFJBREVPTl9VUExPQURfVklFV1BPUlQpIHsKKwkJQkVHSU5fUklORyg3KTsKKwkJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fU0VfVlBPUlRfWFNDQUxFLCA1KSk7CisJCU9VVF9SSU5HKGN0eC0+c2VfdnBvcnRfeHNjYWxlKTsKKwkJT1VUX1JJTkcoY3R4LT5zZV92cG9ydF94b2Zmc2V0KTsKKwkJT1VUX1JJTkcoY3R4LT5zZV92cG9ydF95c2NhbGUpOworCQlPVVRfUklORyhjdHgtPnNlX3Zwb3J0X3lvZmZzZXQpOworCQlPVVRfUklORyhjdHgtPnNlX3Zwb3J0X3pzY2FsZSk7CisJCU9VVF9SSU5HKGN0eC0+c2VfdnBvcnRfem9mZnNldCk7CiAJCUFEVkFOQ0VfUklORygpOwogCX0KIAotCWlmICggZGlydHkgJiBSQURFT05fVVBMT0FEX1NFVFVQICkgewotCQlCRUdJTl9SSU5HKCA0ICk7Ci0JCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fU0VfQ05UTCwgMCApICk7Ci0JCU9VVF9SSU5HKCBjdHgtPnNlX2NudGwgKTsKLQkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9TRV9DTlRMX1NUQVRVUywgMCApICk7Ci0JCU9VVF9SSU5HKCBjdHgtPnNlX2NudGxfc3RhdHVzICk7CisJaWYgKGRpcnR5ICYgUkFERU9OX1VQTE9BRF9TRVRVUCkgeworCQlCRUdJTl9SSU5HKDQpOworCQlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9TRV9DTlRMLCAwKSk7CisJCU9VVF9SSU5HKGN0eC0+c2VfY250bCk7CisJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1NFX0NOVExfU1RBVFVTLCAwKSk7CisJCU9VVF9SSU5HKGN0eC0+c2VfY250bF9zdGF0dXMpOwogCQlBRFZBTkNFX1JJTkcoKTsKIAl9CiAKLQlpZiAoIGRpcnR5ICYgUkFERU9OX1VQTE9BRF9NSVNDICkgewotCQlCRUdJTl9SSU5HKCAyICk7Ci0JCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUkVfTUlTQywgMCApICk7Ci0JCU9VVF9SSU5HKCBjdHgtPnJlX21pc2MgKTsKKwlpZiAoZGlydHkgJiBSQURFT05fVVBMT0FEX01JU0MpIHsKKwkJQkVHSU5fUklORygyKTsKKwkJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fUkVfTUlTQywgMCkpOworCQlPVVRfUklORyhjdHgtPnJlX21pc2MpOwogCQlBRFZBTkNFX1JJTkcoKTsKIAl9CiAKLQlpZiAoIGRpcnR5ICYgUkFERU9OX1VQTE9BRF9URVgwICkgewotCQlpZiAoIHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KCBkZXZfcHJpdiwgZmlscF9wcml2LAotCQkJCQkJICAgICZ0ZXhbMF0ucHBfdHhvZmZzZXQgKSApIHsKLQkJCURSTV9FUlJPUiggIkludmFsaWQgdGV4dHVyZSBvZmZzZXQgZm9yIHVuaXQgMFxuIiApOwotCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCWlmIChkaXJ0eSAmIFJBREVPTl9VUExPQURfVEVYMCkgeworCQlpZiAocmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJCSAgJnRleFswXS5wcF90eG9mZnNldCkpIHsKKwkJCURSTV9FUlJPUigiSW52YWxpZCB0ZXh0dXJlIG9mZnNldCBmb3IgdW5pdCAwXG4iKTsKKwkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJCX0KIAotCQlCRUdJTl9SSU5HKCA5ICk7Ci0JCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUFBfVFhGSUxURVJfMCwgNSApICk7Ci0JCU9VVF9SSU5HKCB0ZXhbMF0ucHBfdHhmaWx0ZXIgKTsKLQkJT1VUX1JJTkcoIHRleFswXS5wcF90eGZvcm1hdCApOwotCQlPVVRfUklORyggdGV4WzBdLnBwX3R4b2Zmc2V0ICk7Ci0JCU9VVF9SSU5HKCB0ZXhbMF0ucHBfdHhjYmxlbmQgKTsKLQkJT1VUX1JJTkcoIHRleFswXS5wcF90eGFibGVuZCApOwotCQlPVVRfUklORyggdGV4WzBdLnBwX3RmYWN0b3IgKTsKLQkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9QUF9CT1JERVJfQ09MT1JfMCwgMCApICk7Ci0JCU9VVF9SSU5HKCB0ZXhbMF0ucHBfYm9yZGVyX2NvbG9yICk7CisJCUJFR0lOX1JJTkcoOSk7CisJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1BQX1RYRklMVEVSXzAsIDUpKTsKKwkJT1VUX1JJTkcodGV4WzBdLnBwX3R4ZmlsdGVyKTsKKwkJT1VUX1JJTkcodGV4WzBdLnBwX3R4Zm9ybWF0KTsKKwkJT1VUX1JJTkcodGV4WzBdLnBwX3R4b2Zmc2V0KTsKKwkJT1VUX1JJTkcodGV4WzBdLnBwX3R4Y2JsZW5kKTsKKwkJT1VUX1JJTkcodGV4WzBdLnBwX3R4YWJsZW5kKTsKKwkJT1VUX1JJTkcodGV4WzBdLnBwX3RmYWN0b3IpOworCQlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9QUF9CT1JERVJfQ09MT1JfMCwgMCkpOworCQlPVVRfUklORyh0ZXhbMF0ucHBfYm9yZGVyX2NvbG9yKTsKIAkJQURWQU5DRV9SSU5HKCk7CiAJfQogCi0JaWYgKCBkaXJ0eSAmIFJBREVPTl9VUExPQURfVEVYMSApIHsKLQkJaWYgKCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldCggZGV2X3ByaXYsIGZpbHBfcHJpdiwKLQkJCQkJCSAgICAmdGV4WzFdLnBwX3R4b2Zmc2V0ICkgKSB7Ci0JCQlEUk1fRVJST1IoICJJbnZhbGlkIHRleHR1cmUgb2Zmc2V0IGZvciB1bml0IDFcbiIgKTsKLQkJCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwlpZiAoZGlydHkgJiBSQURFT05fVVBMT0FEX1RFWDEpIHsKKwkJaWYgKHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KGRldl9wcml2LCBmaWxwX3ByaXYsCisJCQkJCQkgICZ0ZXhbMV0ucHBfdHhvZmZzZXQpKSB7CisJCQlEUk1fRVJST1IoIkludmFsaWQgdGV4dHVyZSBvZmZzZXQgZm9yIHVuaXQgMVxuIik7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCQl9CiAKLQkJQkVHSU5fUklORyggOSApOwotCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1BQX1RYRklMVEVSXzEsIDUgKSApOwotCQlPVVRfUklORyggdGV4WzFdLnBwX3R4ZmlsdGVyICk7Ci0JCU9VVF9SSU5HKCB0ZXhbMV0ucHBfdHhmb3JtYXQgKTsKLQkJT1VUX1JJTkcoIHRleFsxXS5wcF90eG9mZnNldCApOwotCQlPVVRfUklORyggdGV4WzFdLnBwX3R4Y2JsZW5kICk7Ci0JCU9VVF9SSU5HKCB0ZXhbMV0ucHBfdHhhYmxlbmQgKTsKLQkJT1VUX1JJTkcoIHRleFsxXS5wcF90ZmFjdG9yICk7Ci0JCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fUFBfQk9SREVSX0NPTE9SXzEsIDAgKSApOwotCQlPVVRfUklORyggdGV4WzFdLnBwX2JvcmRlcl9jb2xvciApOworCQlCRUdJTl9SSU5HKDkpOworCQlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9QUF9UWEZJTFRFUl8xLCA1KSk7CisJCU9VVF9SSU5HKHRleFsxXS5wcF90eGZpbHRlcik7CisJCU9VVF9SSU5HKHRleFsxXS5wcF90eGZvcm1hdCk7CisJCU9VVF9SSU5HKHRleFsxXS5wcF90eG9mZnNldCk7CisJCU9VVF9SSU5HKHRleFsxXS5wcF90eGNibGVuZCk7CisJCU9VVF9SSU5HKHRleFsxXS5wcF90eGFibGVuZCk7CisJCU9VVF9SSU5HKHRleFsxXS5wcF90ZmFjdG9yKTsKKwkJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fUFBfQk9SREVSX0NPTE9SXzEsIDApKTsKKwkJT1VUX1JJTkcodGV4WzFdLnBwX2JvcmRlcl9jb2xvcik7CiAJCUFEVkFOQ0VfUklORygpOwogCX0KIAotCWlmICggZGlydHkgJiBSQURFT05fVVBMT0FEX1RFWDIgKSB7Ci0JCWlmICggcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoIGRldl9wcml2LCBmaWxwX3ByaXYsCi0JCQkJCQkgICAgJnRleFsyXS5wcF90eG9mZnNldCApICkgewotCQkJRFJNX0VSUk9SKCAiSW52YWxpZCB0ZXh0dXJlIG9mZnNldCBmb3IgdW5pdCAyXG4iICk7Ci0JCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJaWYgKGRpcnR5ICYgUkFERU9OX1VQTE9BRF9URVgyKSB7CisJCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldChkZXZfcHJpdiwgZmlscF9wcml2LAorCQkJCQkJICAmdGV4WzJdLnBwX3R4b2Zmc2V0KSkgeworCQkJRFJNX0VSUk9SKCJJbnZhbGlkIHRleHR1cmUgb2Zmc2V0IGZvciB1bml0IDJcbiIpOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAkJfQogCi0JCUJFR0lOX1JJTkcoIDkgKTsKLQkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9QUF9UWEZJTFRFUl8yLCA1ICkgKTsKLQkJT1VUX1JJTkcoIHRleFsyXS5wcF90eGZpbHRlciApOwotCQlPVVRfUklORyggdGV4WzJdLnBwX3R4Zm9ybWF0ICk7Ci0JCU9VVF9SSU5HKCB0ZXhbMl0ucHBfdHhvZmZzZXQgKTsKLQkJT1VUX1JJTkcoIHRleFsyXS5wcF90eGNibGVuZCApOwotCQlPVVRfUklORyggdGV4WzJdLnBwX3R4YWJsZW5kICk7Ci0JCU9VVF9SSU5HKCB0ZXhbMl0ucHBfdGZhY3RvciApOwotCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1BQX0JPUkRFUl9DT0xPUl8yLCAwICkgKTsKLQkJT1VUX1JJTkcoIHRleFsyXS5wcF9ib3JkZXJfY29sb3IgKTsKKwkJQkVHSU5fUklORyg5KTsKKwkJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fUFBfVFhGSUxURVJfMiwgNSkpOworCQlPVVRfUklORyh0ZXhbMl0ucHBfdHhmaWx0ZXIpOworCQlPVVRfUklORyh0ZXhbMl0ucHBfdHhmb3JtYXQpOworCQlPVVRfUklORyh0ZXhbMl0ucHBfdHhvZmZzZXQpOworCQlPVVRfUklORyh0ZXhbMl0ucHBfdHhjYmxlbmQpOworCQlPVVRfUklORyh0ZXhbMl0ucHBfdHhhYmxlbmQpOworCQlPVVRfUklORyh0ZXhbMl0ucHBfdGZhY3Rvcik7CisJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1BQX0JPUkRFUl9DT0xPUl8yLCAwKSk7CisJCU9VVF9SSU5HKHRleFsyXS5wcF9ib3JkZXJfY29sb3IpOwogCQlBRFZBTkNFX1JJTkcoKTsKIAl9CiAKQEAgLTQ2NSwxMzggKzQ3OSwxMzcgQEAKIAogLyogRW1pdCAxLjIgc3RhdGUKICAqLwotc3RhdGljIGludCByYWRlb25fZW1pdF9zdGF0ZTIoIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKLQkJCSAgICAgICBkcm1fZmlsZV90ICpmaWxwX3ByaXYsCi0JCQkgICAgICAgZHJtX3JhZGVvbl9zdGF0ZV90ICpzdGF0ZSApCitzdGF0aWMgaW50IHJhZGVvbl9lbWl0X3N0YXRlMihkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LAorCQkJICAgICAgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdiwKKwkJCSAgICAgIGRybV9yYWRlb25fc3RhdGVfdCAqIHN0YXRlKQogewogCVJJTkdfTE9DQUxTOwogCiAJaWYgKHN0YXRlLT5kaXJ0eSAmIFJBREVPTl9VUExPQURfWkJJQVMpIHsKLQkJQkVHSU5fUklORyggMyApOwotCQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1NFX1pCSUFTX0ZBQ1RPUiwgMSApICk7Ci0JCU9VVF9SSU5HKCBzdGF0ZS0+Y29udGV4dDIuc2VfemJpYXNfZmFjdG9yICk7IAotCQlPVVRfUklORyggc3RhdGUtPmNvbnRleHQyLnNlX3piaWFzX2NvbnN0YW50ICk7IAorCQlCRUdJTl9SSU5HKDMpOworCQlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9TRV9aQklBU19GQUNUT1IsIDEpKTsKKwkJT1VUX1JJTkcoc3RhdGUtPmNvbnRleHQyLnNlX3piaWFzX2ZhY3Rvcik7CisJCU9VVF9SSU5HKHN0YXRlLT5jb250ZXh0Mi5zZV96Ymlhc19jb25zdGFudCk7CiAJCUFEVkFOQ0VfUklORygpOwogCX0KIAotCXJldHVybiByYWRlb25fZW1pdF9zdGF0ZSggZGV2X3ByaXYsIGZpbHBfcHJpdiwgJnN0YXRlLT5jb250ZXh0LAotCQkJICAgc3RhdGUtPnRleCwgc3RhdGUtPmRpcnR5ICk7CisJcmV0dXJuIHJhZGVvbl9lbWl0X3N0YXRlKGRldl9wcml2LCBmaWxwX3ByaXYsICZzdGF0ZS0+Y29udGV4dCwKKwkJCQkgc3RhdGUtPnRleCwgc3RhdGUtPmRpcnR5KTsKIH0KIAogLyogTmV3ICgxLjMpIHN0YXRlIG1lY2hhbmlzbS4gIDMgY29tbWFuZHMgKHBhY2tldCwgc2NhbGFyLCB2ZWN0b3IpIGluCiAgKiAxLjMgY21kYnVmZmVycyBhbGxvdyBhbGwgcHJldmlvdXMgc3RhdGUgdG8gYmUgdXBkYXRlZCBhcyB3ZWxsIGFzCi0gKiB0aGUgdGNsIHNjYWxhciBhbmQgdmVjdG9yIGFyZWFzLiAgCisgKiB0aGUgdGNsIHNjYWxhciBhbmQgdmVjdG9yIGFyZWFzLgogICovCi1zdGF0aWMgc3RydWN0IHsgCi0JaW50IHN0YXJ0OyAKLQlpbnQgbGVuOyAKK3N0YXRpYyBzdHJ1Y3QgeworCWludCBzdGFydDsKKwlpbnQgbGVuOwogCWNvbnN0IGNoYXIgKm5hbWU7CiB9IHBhY2tldFtSQURFT05fTUFYX1NUQVRFX1BBQ0tFVFNdID0gewotCXsgUkFERU9OX1BQX01JU0MsNywiUkFERU9OX1BQX01JU0MiIH0sCi0JeyBSQURFT05fUFBfQ05UTCwzLCJSQURFT05fUFBfQ05UTCIgfSwKLQl7IFJBREVPTl9SQjNEX0NPTE9SUElUQ0gsMSwiUkFERU9OX1JCM0RfQ09MT1JQSVRDSCIgfSwKLQl7IFJBREVPTl9SRV9MSU5FX1BBVFRFUk4sMiwiUkFERU9OX1JFX0xJTkVfUEFUVEVSTiIgfSwKLQl7IFJBREVPTl9TRV9MSU5FX1dJRFRILDEsIlJBREVPTl9TRV9MSU5FX1dJRFRIIiB9LAotCXsgUkFERU9OX1BQX0xVTV9NQVRSSVgsMSwiUkFERU9OX1BQX0xVTV9NQVRSSVgiIH0sCi0JeyBSQURFT05fUFBfUk9UX01BVFJJWF8wLDIsIlJBREVPTl9QUF9ST1RfTUFUUklYXzAiIH0sCi0JeyBSQURFT05fUkIzRF9TVEVOQ0lMUkVGTUFTSywzLCJSQURFT05fUkIzRF9TVEVOQ0lMUkVGTUFTSyIgfSwKLQl7IFJBREVPTl9TRV9WUE9SVF9YU0NBTEUsNiwiUkFERU9OX1NFX1ZQT1JUX1hTQ0FMRSIgfSwKLQl7IFJBREVPTl9TRV9DTlRMLDIsIlJBREVPTl9TRV9DTlRMIiB9LAotCXsgUkFERU9OX1NFX0NOVExfU1RBVFVTLDEsIlJBREVPTl9TRV9DTlRMX1NUQVRVUyIgfSwKLQl7IFJBREVPTl9SRV9NSVNDLDEsIlJBREVPTl9SRV9NSVNDIiB9LAotCXsgUkFERU9OX1BQX1RYRklMVEVSXzAsNiwiUkFERU9OX1BQX1RYRklMVEVSXzAiIH0sCi0JeyBSQURFT05fUFBfQk9SREVSX0NPTE9SXzAsMSwiUkFERU9OX1BQX0JPUkRFUl9DT0xPUl8wIiB9LAotCXsgUkFERU9OX1BQX1RYRklMVEVSXzEsNiwiUkFERU9OX1BQX1RYRklMVEVSXzEiIH0sCi0JeyBSQURFT05fUFBfQk9SREVSX0NPTE9SXzEsMSwiUkFERU9OX1BQX0JPUkRFUl9DT0xPUl8xIiB9LAotCXsgUkFERU9OX1BQX1RYRklMVEVSXzIsNiwiUkFERU9OX1BQX1RYRklMVEVSXzIiIH0sCi0JeyBSQURFT05fUFBfQk9SREVSX0NPTE9SXzIsMSwiUkFERU9OX1BQX0JPUkRFUl9DT0xPUl8yIiB9LAotCXsgUkFERU9OX1NFX1pCSUFTX0ZBQ1RPUiwyLCJSQURFT05fU0VfWkJJQVNfRkFDVE9SIiB9LAotCXsgUkFERU9OX1NFX1RDTF9PVVRQVVRfVlRYX0ZNVCwxMSwiUkFERU9OX1NFX1RDTF9PVVRQVVRfVlRYX0ZNVCIgfSwKLQl7IFJBREVPTl9TRV9UQ0xfTUFURVJJQUxfRU1NSVNTSVZFX1JFRCwxNywiUkFERU9OX1NFX1RDTF9NQVRFUklBTF9FTU1JU1NJVkVfUkVEIiB9LAotCXsgUjIwMF9QUF9UWENCTEVORF8wLCA0LCAiUjIwMF9QUF9UWENCTEVORF8wIiB9LAotCXsgUjIwMF9QUF9UWENCTEVORF8xLCA0LCAiUjIwMF9QUF9UWENCTEVORF8xIiB9LAotCXsgUjIwMF9QUF9UWENCTEVORF8yLCA0LCAiUjIwMF9QUF9UWENCTEVORF8yIiB9LAotCXsgUjIwMF9QUF9UWENCTEVORF8zLCA0LCAiUjIwMF9QUF9UWENCTEVORF8zIiB9LAotCXsgUjIwMF9QUF9UWENCTEVORF80LCA0LCAiUjIwMF9QUF9UWENCTEVORF80IiB9LAotCXsgUjIwMF9QUF9UWENCTEVORF81LCA0LCAiUjIwMF9QUF9UWENCTEVORF81IiB9LAotCXsgUjIwMF9QUF9UWENCTEVORF82LCA0LCAiUjIwMF9QUF9UWENCTEVORF82IiB9LAotCXsgUjIwMF9QUF9UWENCTEVORF83LCA0LCAiUjIwMF9QUF9UWENCTEVORF83IiB9LAotCXsgUjIwMF9TRV9UQ0xfTElHSFRfTU9ERUxfQ1RMXzAsIDYsICJSMjAwX1NFX1RDTF9MSUdIVF9NT0RFTF9DVExfMCIgfSwKLQl7IFIyMDBfUFBfVEZBQ1RPUl8wLCA2LCAiUjIwMF9QUF9URkFDVE9SXzAiIH0sCi0JeyBSMjAwX1NFX1ZUWF9GTVRfMCwgNCwgIlIyMDBfU0VfVlRYX0ZNVF8wIiB9LAotCXsgUjIwMF9TRV9WQVBfQ05UTCwgMSwgIlIyMDBfU0VfVkFQX0NOVEwiIH0sCi0JeyBSMjAwX1NFX1RDTF9NQVRSSVhfU0VMXzAsIDUsICJSMjAwX1NFX1RDTF9NQVRSSVhfU0VMXzAiIH0sCi0JeyBSMjAwX1NFX1RDTF9URVhfUFJPQ19DVExfMiwgNSwgIlIyMDBfU0VfVENMX1RFWF9QUk9DX0NUTF8yIiB9LAotCXsgUjIwMF9TRV9UQ0xfVUNQX1ZFUlRfQkxFTkRfQ1RMLCAxLCAiUjIwMF9TRV9UQ0xfVUNQX1ZFUlRfQkxFTkRfQ1RMIiB9LAotCXsgUjIwMF9QUF9UWEZJTFRFUl8wLCA2LCAiUjIwMF9QUF9UWEZJTFRFUl8wIiB9LAotCXsgUjIwMF9QUF9UWEZJTFRFUl8xLCA2LCAiUjIwMF9QUF9UWEZJTFRFUl8xIiB9LAotCXsgUjIwMF9QUF9UWEZJTFRFUl8yLCA2LCAiUjIwMF9QUF9UWEZJTFRFUl8yIiB9LAotCXsgUjIwMF9QUF9UWEZJTFRFUl8zLCA2LCAiUjIwMF9QUF9UWEZJTFRFUl8zIiB9LAotCXsgUjIwMF9QUF9UWEZJTFRFUl80LCA2LCAiUjIwMF9QUF9UWEZJTFRFUl80IiB9LAotCXsgUjIwMF9QUF9UWEZJTFRFUl81LCA2LCAiUjIwMF9QUF9UWEZJTFRFUl81IiB9LAotCXsgUjIwMF9QUF9UWE9GRlNFVF8wLCAxLCAiUjIwMF9QUF9UWE9GRlNFVF8wIiB9LAotCXsgUjIwMF9QUF9UWE9GRlNFVF8xLCAxLCAiUjIwMF9QUF9UWE9GRlNFVF8xIiB9LAotCXsgUjIwMF9QUF9UWE9GRlNFVF8yLCAxLCAiUjIwMF9QUF9UWE9GRlNFVF8yIiB9LAotCXsgUjIwMF9QUF9UWE9GRlNFVF8zLCAxLCAiUjIwMF9QUF9UWE9GRlNFVF8zIiB9LAotCXsgUjIwMF9QUF9UWE9GRlNFVF80LCAxLCAiUjIwMF9QUF9UWE9GRlNFVF80IiB9LAotCXsgUjIwMF9QUF9UWE9GRlNFVF81LCAxLCAiUjIwMF9QUF9UWE9GRlNFVF81IiB9LAotCXsgUjIwMF9TRV9WVEVfQ05UTCwgMSwgIlIyMDBfU0VfVlRFX0NOVEwiIH0sCi0JeyBSMjAwX1NFX1RDTF9PVVRQVVRfVlRYX0NPTVBfU0VMLCAxLCAiUjIwMF9TRV9UQ0xfT1VUUFVUX1ZUWF9DT01QX1NFTCIgfSwKLQl7IFIyMDBfUFBfVEFNX0RFQlVHMywgMSwgIlIyMDBfUFBfVEFNX0RFQlVHMyIgfSwKLQl7IFIyMDBfUFBfQ05UTF9YLCAxLCAiUjIwMF9QUF9DTlRMX1giIH0sIAotCXsgUjIwMF9SQjNEX0RFUFRIWFlfT0ZGU0VULCAxLCAiUjIwMF9SQjNEX0RFUFRIWFlfT0ZGU0VUIiB9LCAKLQl7IFIyMDBfUkVfQVVYX1NDSVNTT1JfQ05UTCwgMSwgIlIyMDBfUkVfQVVYX1NDSVNTT1JfQ05UTCIgfSwgCi0JeyBSMjAwX1JFX1NDSVNTT1JfVExfMCwgMiwgIlIyMDBfUkVfU0NJU1NPUl9UTF8wIiB9LCAKLQl7IFIyMDBfUkVfU0NJU1NPUl9UTF8xLCAyLCAiUjIwMF9SRV9TQ0lTU09SX1RMXzEiIH0sIAotCXsgUjIwMF9SRV9TQ0lTU09SX1RMXzIsIDIsICJSMjAwX1JFX1NDSVNTT1JfVExfMiIgfSwgCi0JeyBSMjAwX1NFX1ZBUF9DTlRMX1NUQVRVUywgMSwgIlIyMDBfU0VfVkFQX0NOVExfU1RBVFVTIiB9LCAKLQl7IFIyMDBfU0VfVlRYX1NUQVRFX0NOVEwsIDEsICJSMjAwX1NFX1ZUWF9TVEFURV9DTlRMIiB9LCAKLQl7IFIyMDBfUkVfUE9JTlRTSVpFLCAxLCAiUjIwMF9SRV9QT0lOVFNJWkUiIH0sIAotCXsgUjIwMF9TRV9UQ0xfSU5QVVRfVlRYX1ZFQ1RPUl9BRERSXzAsIDQsICJSMjAwX1NFX1RDTF9JTlBVVF9WVFhfVkVDVE9SX0FERFJfMCIgfSwKLQl7IFIyMDBfUFBfQ1VCSUNfRkFDRVNfMCwgMSwgIlIyMDBfUFBfQ1VCSUNfRkFDRVNfMCIgfSwgLyogNjEgKi8KLQl7IFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzAsIDUsICJSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8wIiB9LCAvKiA2MiAqLwotCXsgUjIwMF9QUF9DVUJJQ19GQUNFU18xLCAxLCAiUjIwMF9QUF9DVUJJQ19GQUNFU18xIiB9LAotCXsgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMSwgNSwgIlIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzEiIH0sCi0JeyBSMjAwX1BQX0NVQklDX0ZBQ0VTXzIsIDEsICJSMjAwX1BQX0NVQklDX0ZBQ0VTXzIiIH0sCi0JeyBSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8yLCA1LCAiUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMiIgfSwKLQl7IFIyMDBfUFBfQ1VCSUNfRkFDRVNfMywgMSwgIlIyMDBfUFBfQ1VCSUNfRkFDRVNfMyIgfSwKLQl7IFIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzMsIDUsICJSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8zIiB9LAotCXsgUjIwMF9QUF9DVUJJQ19GQUNFU180LCAxLCAiUjIwMF9QUF9DVUJJQ19GQUNFU180IiB9LAotCXsgUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfNCwgNSwgIlIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzQiIH0sCi0JeyBSMjAwX1BQX0NVQklDX0ZBQ0VTXzUsIDEsICJSMjAwX1BQX0NVQklDX0ZBQ0VTXzUiIH0sCi0JeyBSMjAwX1BQX0NVQklDX09GRlNFVF9GMV81LCA1LCAiUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfNSIgfSwKLQl7IFJBREVPTl9QUF9URVhfU0laRV8wLCAyLCAiUkFERU9OX1BQX1RFWF9TSVpFXzAiIH0sCi0JeyBSQURFT05fUFBfVEVYX1NJWkVfMSwgMiwgIlJBREVPTl9QUF9URVhfU0laRV8xIiB9LAotCXsgUkFERU9OX1BQX1RFWF9TSVpFXzIsIDIsICJSQURFT05fUFBfVEVYX1NJWkVfMiIgfSwKLQl7IFIyMDBfUkIzRF9CTEVORENPTE9SLCAzLCAiUjIwMF9SQjNEX0JMRU5EQ09MT1IiIH0sCi0JeyBSMjAwX1NFX1RDTF9QT0lOVF9TUFJJVEVfQ05UTCwgMSwgIlIyMDBfU0VfVENMX1BPSU5UX1NQUklURV9DTlRMIiB9LAotCXsgUkFERU9OX1BQX0NVQklDX0ZBQ0VTXzAsIDEsICJSQURFT05fUFBfQ1VCSUNfRkFDRVNfMCJ9LAotCXsgUkFERU9OX1BQX0NVQklDX09GRlNFVF9UMF8wLCA1LCAiUkFERU9OX1BQX0NVQklDX09GRlNFVF9UMF8wIn0sCi0JeyBSQURFT05fUFBfQ1VCSUNfRkFDRVNfMSwgMSwgIlJBREVPTl9QUF9DVUJJQ19GQUNFU18xIn0sCi0JeyBSQURFT05fUFBfQ1VCSUNfT0ZGU0VUX1QxXzAsIDUsICJSQURFT05fUFBfQ1VCSUNfT0ZGU0VUX1QxXzAifSwKLQl7IFJBREVPTl9QUF9DVUJJQ19GQUNFU18yLCAxLCAiUkFERU9OX1BQX0NVQklDX0ZBQ0VTXzIifSwKLQl7IFJBREVPTl9QUF9DVUJJQ19PRkZTRVRfVDJfMCwgNSwgIlJBREVPTl9QUF9DVUJJQ19PRkZTRVRfVDJfMCJ9LAotCXsgUjIwMF9QUF9UUklfUEVSRiwgMiwgIlIyMDBfUFBfVFJJX1BFUkYifSwKLQl7IFIyMDBfUFBfQUZTXzAsIDMyLCAiUjIwMF9QUF9BRlNfMCJ9LCAgICAgLyogODUgKi8KLQl7IFIyMDBfUFBfQUZTXzEsIDMyLCAiUjIwMF9QUF9BRlNfMSJ9LAotCXsgUjIwMF9QUF9URkFDVE9SXzAsIDgsICJSMjAwX0FURl9URkFDVE9SIn0sCi0JeyBSMjAwX1BQX1RYRklMVEVSXzAsIDgsICJSMjAwX1BQX1RYQ1RMQUxMXzAifSwKLQl7IFIyMDBfUFBfVFhGSUxURVJfMSwgOCwgIlIyMDBfUFBfVFhDVExBTExfMSJ9LAotCXsgUjIwMF9QUF9UWEZJTFRFUl8yLCA4LCAiUjIwMF9QUF9UWENUTEFMTF8yIn0sCi0JeyBSMjAwX1BQX1RYRklMVEVSXzMsIDgsICJSMjAwX1BQX1RYQ1RMQUxMXzMifSwKLQl7IFIyMDBfUFBfVFhGSUxURVJfNCwgOCwgIlIyMDBfUFBfVFhDVExBTExfNCJ9LCAKLQl7IFIyMDBfUFBfVFhGSUxURVJfNSwgOCwgIlIyMDBfUFBfVFhDVExBTExfNSJ9LAorCXtSQURFT05fUFBfTUlTQywgNywgIlJBREVPTl9QUF9NSVNDIn0sCisJe1JBREVPTl9QUF9DTlRMLCAzLCAiUkFERU9OX1BQX0NOVEwifSwKKwl7UkFERU9OX1JCM0RfQ09MT1JQSVRDSCwgMSwgIlJBREVPTl9SQjNEX0NPTE9SUElUQ0gifSwKKwl7UkFERU9OX1JFX0xJTkVfUEFUVEVSTiwgMiwgIlJBREVPTl9SRV9MSU5FX1BBVFRFUk4ifSwKKwl7UkFERU9OX1NFX0xJTkVfV0lEVEgsIDEsICJSQURFT05fU0VfTElORV9XSURUSCJ9LAorCXtSQURFT05fUFBfTFVNX01BVFJJWCwgMSwgIlJBREVPTl9QUF9MVU1fTUFUUklYIn0sCisJe1JBREVPTl9QUF9ST1RfTUFUUklYXzAsIDIsICJSQURFT05fUFBfUk9UX01BVFJJWF8wIn0sCisJe1JBREVPTl9SQjNEX1NURU5DSUxSRUZNQVNLLCAzLCAiUkFERU9OX1JCM0RfU1RFTkNJTFJFRk1BU0sifSwKKwl7UkFERU9OX1NFX1ZQT1JUX1hTQ0FMRSwgNiwgIlJBREVPTl9TRV9WUE9SVF9YU0NBTEUifSwKKwl7UkFERU9OX1NFX0NOVEwsIDIsICJSQURFT05fU0VfQ05UTCJ9LAorCXtSQURFT05fU0VfQ05UTF9TVEFUVVMsIDEsICJSQURFT05fU0VfQ05UTF9TVEFUVVMifSwKKwl7UkFERU9OX1JFX01JU0MsIDEsICJSQURFT05fUkVfTUlTQyJ9LAorCXtSQURFT05fUFBfVFhGSUxURVJfMCwgNiwgIlJBREVPTl9QUF9UWEZJTFRFUl8wIn0sCisJe1JBREVPTl9QUF9CT1JERVJfQ09MT1JfMCwgMSwgIlJBREVPTl9QUF9CT1JERVJfQ09MT1JfMCJ9LAorCXtSQURFT05fUFBfVFhGSUxURVJfMSwgNiwgIlJBREVPTl9QUF9UWEZJTFRFUl8xIn0sCisJe1JBREVPTl9QUF9CT1JERVJfQ09MT1JfMSwgMSwgIlJBREVPTl9QUF9CT1JERVJfQ09MT1JfMSJ9LAorCXtSQURFT05fUFBfVFhGSUxURVJfMiwgNiwgIlJBREVPTl9QUF9UWEZJTFRFUl8yIn0sCisJe1JBREVPTl9QUF9CT1JERVJfQ09MT1JfMiwgMSwgIlJBREVPTl9QUF9CT1JERVJfQ09MT1JfMiJ9LAorCXtSQURFT05fU0VfWkJJQVNfRkFDVE9SLCAyLCAiUkFERU9OX1NFX1pCSUFTX0ZBQ1RPUiJ9LAorCXtSQURFT05fU0VfVENMX09VVFBVVF9WVFhfRk1ULCAxMSwgIlJBREVPTl9TRV9UQ0xfT1VUUFVUX1ZUWF9GTVQifSwKKwl7UkFERU9OX1NFX1RDTF9NQVRFUklBTF9FTU1JU1NJVkVfUkVELCAxNywKKwkJICAgICJSQURFT05fU0VfVENMX01BVEVSSUFMX0VNTUlTU0lWRV9SRUQifSwKKwl7UjIwMF9QUF9UWENCTEVORF8wLCA0LCAiUjIwMF9QUF9UWENCTEVORF8wIn0sCisJe1IyMDBfUFBfVFhDQkxFTkRfMSwgNCwgIlIyMDBfUFBfVFhDQkxFTkRfMSJ9LAorCXtSMjAwX1BQX1RYQ0JMRU5EXzIsIDQsICJSMjAwX1BQX1RYQ0JMRU5EXzIifSwKKwl7UjIwMF9QUF9UWENCTEVORF8zLCA0LCAiUjIwMF9QUF9UWENCTEVORF8zIn0sCisJe1IyMDBfUFBfVFhDQkxFTkRfNCwgNCwgIlIyMDBfUFBfVFhDQkxFTkRfNCJ9LAorCXtSMjAwX1BQX1RYQ0JMRU5EXzUsIDQsICJSMjAwX1BQX1RYQ0JMRU5EXzUifSwKKwl7UjIwMF9QUF9UWENCTEVORF82LCA0LCAiUjIwMF9QUF9UWENCTEVORF82In0sCisJe1IyMDBfUFBfVFhDQkxFTkRfNywgNCwgIlIyMDBfUFBfVFhDQkxFTkRfNyJ9LAorCXtSMjAwX1NFX1RDTF9MSUdIVF9NT0RFTF9DVExfMCwgNiwgIlIyMDBfU0VfVENMX0xJR0hUX01PREVMX0NUTF8wIn0sCisJe1IyMDBfUFBfVEZBQ1RPUl8wLCA2LCAiUjIwMF9QUF9URkFDVE9SXzAifSwKKwl7UjIwMF9TRV9WVFhfRk1UXzAsIDQsICJSMjAwX1NFX1ZUWF9GTVRfMCJ9LAorCXtSMjAwX1NFX1ZBUF9DTlRMLCAxLCAiUjIwMF9TRV9WQVBfQ05UTCJ9LAorCXtSMjAwX1NFX1RDTF9NQVRSSVhfU0VMXzAsIDUsICJSMjAwX1NFX1RDTF9NQVRSSVhfU0VMXzAifSwKKwl7UjIwMF9TRV9UQ0xfVEVYX1BST0NfQ1RMXzIsIDUsICJSMjAwX1NFX1RDTF9URVhfUFJPQ19DVExfMiJ9LAorCXtSMjAwX1NFX1RDTF9VQ1BfVkVSVF9CTEVORF9DVEwsIDEsICJSMjAwX1NFX1RDTF9VQ1BfVkVSVF9CTEVORF9DVEwifSwKKwl7UjIwMF9QUF9UWEZJTFRFUl8wLCA2LCAiUjIwMF9QUF9UWEZJTFRFUl8wIn0sCisJe1IyMDBfUFBfVFhGSUxURVJfMSwgNiwgIlIyMDBfUFBfVFhGSUxURVJfMSJ9LAorCXtSMjAwX1BQX1RYRklMVEVSXzIsIDYsICJSMjAwX1BQX1RYRklMVEVSXzIifSwKKwl7UjIwMF9QUF9UWEZJTFRFUl8zLCA2LCAiUjIwMF9QUF9UWEZJTFRFUl8zIn0sCisJe1IyMDBfUFBfVFhGSUxURVJfNCwgNiwgIlIyMDBfUFBfVFhGSUxURVJfNCJ9LAorCXtSMjAwX1BQX1RYRklMVEVSXzUsIDYsICJSMjAwX1BQX1RYRklMVEVSXzUifSwKKwl7UjIwMF9QUF9UWE9GRlNFVF8wLCAxLCAiUjIwMF9QUF9UWE9GRlNFVF8wIn0sCisJe1IyMDBfUFBfVFhPRkZTRVRfMSwgMSwgIlIyMDBfUFBfVFhPRkZTRVRfMSJ9LAorCXtSMjAwX1BQX1RYT0ZGU0VUXzIsIDEsICJSMjAwX1BQX1RYT0ZGU0VUXzIifSwKKwl7UjIwMF9QUF9UWE9GRlNFVF8zLCAxLCAiUjIwMF9QUF9UWE9GRlNFVF8zIn0sCisJe1IyMDBfUFBfVFhPRkZTRVRfNCwgMSwgIlIyMDBfUFBfVFhPRkZTRVRfNCJ9LAorCXtSMjAwX1BQX1RYT0ZGU0VUXzUsIDEsICJSMjAwX1BQX1RYT0ZGU0VUXzUifSwKKwl7UjIwMF9TRV9WVEVfQ05UTCwgMSwgIlIyMDBfU0VfVlRFX0NOVEwifSwKKwl7UjIwMF9TRV9UQ0xfT1VUUFVUX1ZUWF9DT01QX1NFTCwgMSwgIlIyMDBfU0VfVENMX09VVFBVVF9WVFhfQ09NUF9TRUwifSwKKwl7UjIwMF9QUF9UQU1fREVCVUczLCAxLCAiUjIwMF9QUF9UQU1fREVCVUczIn0sCisJe1IyMDBfUFBfQ05UTF9YLCAxLCAiUjIwMF9QUF9DTlRMX1gifSwKKwl7UjIwMF9SQjNEX0RFUFRIWFlfT0ZGU0VULCAxLCAiUjIwMF9SQjNEX0RFUFRIWFlfT0ZGU0VUIn0sCisJe1IyMDBfUkVfQVVYX1NDSVNTT1JfQ05UTCwgMSwgIlIyMDBfUkVfQVVYX1NDSVNTT1JfQ05UTCJ9LAorCXtSMjAwX1JFX1NDSVNTT1JfVExfMCwgMiwgIlIyMDBfUkVfU0NJU1NPUl9UTF8wIn0sCisJe1IyMDBfUkVfU0NJU1NPUl9UTF8xLCAyLCAiUjIwMF9SRV9TQ0lTU09SX1RMXzEifSwKKwl7UjIwMF9SRV9TQ0lTU09SX1RMXzIsIDIsICJSMjAwX1JFX1NDSVNTT1JfVExfMiJ9LAorCXtSMjAwX1NFX1ZBUF9DTlRMX1NUQVRVUywgMSwgIlIyMDBfU0VfVkFQX0NOVExfU1RBVFVTIn0sCisJe1IyMDBfU0VfVlRYX1NUQVRFX0NOVEwsIDEsICJSMjAwX1NFX1ZUWF9TVEFURV9DTlRMIn0sCisJe1IyMDBfUkVfUE9JTlRTSVpFLCAxLCAiUjIwMF9SRV9QT0lOVFNJWkUifSwKKwl7UjIwMF9TRV9UQ0xfSU5QVVRfVlRYX1ZFQ1RPUl9BRERSXzAsIDQsCisJCSAgICAiUjIwMF9TRV9UQ0xfSU5QVVRfVlRYX1ZFQ1RPUl9BRERSXzAifSwKKwl7UjIwMF9QUF9DVUJJQ19GQUNFU18wLCAxLCAiUjIwMF9QUF9DVUJJQ19GQUNFU18wIn0sCS8qIDYxICovCisJe1IyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzAsIDUsICJSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8wIn0sCS8qIDYyICovCisJe1IyMDBfUFBfQ1VCSUNfRkFDRVNfMSwgMSwgIlIyMDBfUFBfQ1VCSUNfRkFDRVNfMSJ9LAorCXtSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8xLCA1LCAiUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMSJ9LAorCXtSMjAwX1BQX0NVQklDX0ZBQ0VTXzIsIDEsICJSMjAwX1BQX0NVQklDX0ZBQ0VTXzIifSwKKwl7UjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMiwgNSwgIlIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzIifSwKKwl7UjIwMF9QUF9DVUJJQ19GQUNFU18zLCAxLCAiUjIwMF9QUF9DVUJJQ19GQUNFU18zIn0sCisJe1IyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzMsIDUsICJSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8zIn0sCisJe1IyMDBfUFBfQ1VCSUNfRkFDRVNfNCwgMSwgIlIyMDBfUFBfQ1VCSUNfRkFDRVNfNCJ9LAorCXtSMjAwX1BQX0NVQklDX09GRlNFVF9GMV80LCA1LCAiUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfNCJ9LAorCXtSMjAwX1BQX0NVQklDX0ZBQ0VTXzUsIDEsICJSMjAwX1BQX0NVQklDX0ZBQ0VTXzUifSwKKwl7UjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfNSwgNSwgIlIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzUifSwKKwl7UkFERU9OX1BQX1RFWF9TSVpFXzAsIDIsICJSQURFT05fUFBfVEVYX1NJWkVfMCJ9LAorCXtSQURFT05fUFBfVEVYX1NJWkVfMSwgMiwgIlJBREVPTl9QUF9URVhfU0laRV8xIn0sCisJe1JBREVPTl9QUF9URVhfU0laRV8yLCAyLCAiUkFERU9OX1BQX1RFWF9TSVpFXzIifSwKKwl7UjIwMF9SQjNEX0JMRU5EQ09MT1IsIDMsICJSMjAwX1JCM0RfQkxFTkRDT0xPUiJ9LAorCXtSMjAwX1NFX1RDTF9QT0lOVF9TUFJJVEVfQ05UTCwgMSwgIlIyMDBfU0VfVENMX1BPSU5UX1NQUklURV9DTlRMIn0sCisJe1JBREVPTl9QUF9DVUJJQ19GQUNFU18wLCAxLCAiUkFERU9OX1BQX0NVQklDX0ZBQ0VTXzAifSwKKwl7UkFERU9OX1BQX0NVQklDX09GRlNFVF9UMF8wLCA1LCAiUkFERU9OX1BQX0NVQklDX09GRlNFVF9UMF8wIn0sCisJe1JBREVPTl9QUF9DVUJJQ19GQUNFU18xLCAxLCAiUkFERU9OX1BQX0NVQklDX0ZBQ0VTXzEifSwKKwl7UkFERU9OX1BQX0NVQklDX09GRlNFVF9UMV8wLCA1LCAiUkFERU9OX1BQX0NVQklDX09GRlNFVF9UMV8wIn0sCisJe1JBREVPTl9QUF9DVUJJQ19GQUNFU18yLCAxLCAiUkFERU9OX1BQX0NVQklDX0ZBQ0VTXzIifSwKKwl7UkFERU9OX1BQX0NVQklDX09GRlNFVF9UMl8wLCA1LCAiUkFERU9OX1BQX0NVQklDX09GRlNFVF9UMl8wIn0sCisJe1IyMDBfUFBfVFJJX1BFUkYsIDIsICJSMjAwX1BQX1RSSV9QRVJGIn0sCisJe1IyMDBfUFBfQUZTXzAsIDMyLCAiUjIwMF9QUF9BRlNfMCJ9LAkvKiA4NSAqLworCXtSMjAwX1BQX0FGU18xLCAzMiwgIlIyMDBfUFBfQUZTXzEifSwKKwl7UjIwMF9QUF9URkFDVE9SXzAsIDgsICJSMjAwX0FURl9URkFDVE9SIn0sCisJe1IyMDBfUFBfVFhGSUxURVJfMCwgOCwgIlIyMDBfUFBfVFhDVExBTExfMCJ9LAorCXtSMjAwX1BQX1RYRklMVEVSXzEsIDgsICJSMjAwX1BQX1RYQ1RMQUxMXzEifSwKKwl7UjIwMF9QUF9UWEZJTFRFUl8yLCA4LCAiUjIwMF9QUF9UWENUTEFMTF8yIn0sCisJe1IyMDBfUFBfVFhGSUxURVJfMywgOCwgIlIyMDBfUFBfVFhDVExBTExfMyJ9LAorCXtSMjAwX1BQX1RYRklMVEVSXzQsIDgsICJSMjAwX1BQX1RYQ1RMQUxMXzQifSwKKwl7UjIwMF9QUF9UWEZJTFRFUl81LCA4LCAiUjIwMF9QUF9UWENUTEFMTF81In0sCiB9OwogCi0KLQogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogUGVyZm9ybWFuY2UgbW9uaXRvcmluZyBmdW5jdGlvbnMKICAqLwogCi1zdGF0aWMgdm9pZCByYWRlb25fY2xlYXJfYm94KCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCi0JCQkgICAgICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwKLQkJCSAgICAgIGludCByLCBpbnQgZywgaW50IGIgKQorc3RhdGljIHZvaWQgcmFkZW9uX2NsZWFyX2JveChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LAorCQkJICAgICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IHIsIGludCBnLCBpbnQgYikKIHsKIAl1MzIgY29sb3I7CiAJUklOR19MT0NBTFM7CkBAIC02MDQsNDkgKzYxNyw0NyBAQAogCXggKz0gZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmJveGVzWzBdLngxOwogCXkgKz0gZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmJveGVzWzBdLnkxOwogCi0Jc3dpdGNoICggZGV2X3ByaXYtPmNvbG9yX2ZtdCApIHsKKwlzd2l0Y2ggKGRldl9wcml2LT5jb2xvcl9mbXQpIHsKIAljYXNlIFJBREVPTl9DT0xPUl9GT1JNQVRfUkdCNTY1OgogCQljb2xvciA9ICgoKHIgJiAweGY4KSA8PCA4KSB8Ci0JCQkgKChnICYgMHhmYykgPDwgMykgfAotCQkJICgoYiAmIDB4ZjgpID4+IDMpKTsKKwkJCSAoKGcgJiAweGZjKSA8PCAzKSB8ICgoYiAmIDB4ZjgpID4+IDMpKTsKIAkJYnJlYWs7CiAJY2FzZSBSQURFT05fQ09MT1JfRk9STUFUX0FSR0I4ODg4OgogCWRlZmF1bHQ6Ci0JCWNvbG9yID0gKCgoMHhmZikgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgIDgpIHwgYik7CisJCWNvbG9yID0gKCgoMHhmZikgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiKTsKIAkJYnJlYWs7CiAJfQogCi0JQkVHSU5fUklORyggNCApOwotCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsJCQotCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fRFBfV1JJVEVfTUFTSywgMCApICk7Ci0JT1VUX1JJTkcoIDB4ZmZmZmZmZmYgKTsKKwlCRUdJTl9SSU5HKDQpOworCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsKKwlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9EUF9XUklURV9NQVNLLCAwKSk7CisJT1VUX1JJTkcoMHhmZmZmZmZmZik7CiAJQURWQU5DRV9SSU5HKCk7CiAKLQlCRUdJTl9SSU5HKCA2ICk7CisJQkVHSU5fUklORyg2KTsKIAotCU9VVF9SSU5HKCBDUF9QQUNLRVQzKCBSQURFT05fQ05UTF9QQUlOVF9NVUxUSSwgNCApICk7Ci0JT1VUX1JJTkcoIFJBREVPTl9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMIHwKLQkJICBSQURFT05fR01DX0JSVVNIX1NPTElEX0NPTE9SIHwKLQkJICAoZGV2X3ByaXYtPmNvbG9yX2ZtdCA8PCA4KSB8Ci0JCSAgUkFERU9OX0dNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAotCQkgIFJBREVPTl9ST1AzX1AgfAotCQkgIFJBREVPTl9HTUNfQ0xSX0NNUF9DTlRMX0RJUyApOworCU9VVF9SSU5HKENQX1BBQ0tFVDMoUkFERU9OX0NOVExfUEFJTlRfTVVMVEksIDQpKTsKKwlPVVRfUklORyhSQURFT05fR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCB8CisJCSBSQURFT05fR01DX0JSVVNIX1NPTElEX0NPTE9SIHwKKwkJIChkZXZfcHJpdi0+Y29sb3JfZm10IDw8IDgpIHwKKwkJIFJBREVPTl9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJIFJBREVPTl9ST1AzX1AgfCBSQURFT05fR01DX0NMUl9DTVBfQ05UTF9ESVMpOwogCi0gCWlmICggZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcgJiYgZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9PSAxICkgeyAKLQkJT1VUX1JJTkcoIGRldl9wcml2LT5mcm9udF9waXRjaF9vZmZzZXQgKTsKLSAJfSBlbHNlIHsJIAotCQlPVVRfUklORyggZGV2X3ByaXYtPmJhY2tfcGl0Y2hfb2Zmc2V0ICk7Ci0gCX0gCisJaWYgKGRldl9wcml2LT5wYWdlX2ZsaXBwaW5nICYmIGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMSkgeworCQlPVVRfUklORyhkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0KTsKKwl9IGVsc2UgeworCQlPVVRfUklORyhkZXZfcHJpdi0+YmFja19waXRjaF9vZmZzZXQpOworCX0KIAotCU9VVF9SSU5HKCBjb2xvciApOworCU9VVF9SSU5HKGNvbG9yKTsKIAotCU9VVF9SSU5HKCAoeCA8PCAxNikgfCB5ICk7Ci0JT1VUX1JJTkcoICh3IDw8IDE2KSB8IGggKTsKKwlPVVRfUklORygoeCA8PCAxNikgfCB5KTsKKwlPVVRfUklORygodyA8PCAxNikgfCBoKTsKIAogCUFEVkFOQ0VfUklORygpOwogfQogCi1zdGF0aWMgdm9pZCByYWRlb25fY3BfcGVyZm9ybWFuY2VfYm94ZXMoIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiApCitzdGF0aWMgdm9pZCByYWRlb25fY3BfcGVyZm9ybWFuY2VfYm94ZXMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdikKIHsKIAkvKiBDb2xsYXBzZSB2YXJpb3VzIHRoaW5ncyBpbnRvIGEgd2FpdCBmbGFnIC0tIHRyeWluZyB0bwogCSAqIGd1ZXNzIGlmIHVzZXJzcGFzZSBzbGVwdCAtLSBiZXR0ZXIganVzdCB0byBoYXZlIHRoZW0gdGVsbCB1cy4KQEAgLTY2Miw1MCArNjczLDUwIEBACiAKIAkvKiBQdXJwbGUgYm94IGZvciBwYWdlIGZsaXBwaW5nCiAJICovCi0JaWYgKCBkZXZfcHJpdi0+c3RhdHMuYm94ZXMgJiBSQURFT05fQk9YX0ZMSVAgKSAKLQkJcmFkZW9uX2NsZWFyX2JveCggZGV2X3ByaXYsIDQsIDQsIDgsIDgsIDI1NSwgMCwgMjU1ICk7CisJaWYgKGRldl9wcml2LT5zdGF0cy5ib3hlcyAmIFJBREVPTl9CT1hfRkxJUCkKKwkJcmFkZW9uX2NsZWFyX2JveChkZXZfcHJpdiwgNCwgNCwgOCwgOCwgMjU1LCAwLCAyNTUpOwogCiAJLyogUmVkIGJveCBpZiB3ZSBoYXZlIHRvIHdhaXQgZm9yIGlkbGUgYXQgYW55IHBvaW50CiAJICovCi0JaWYgKCBkZXZfcHJpdi0+c3RhdHMuYm94ZXMgJiBSQURFT05fQk9YX1dBSVRfSURMRSApIAotCQlyYWRlb25fY2xlYXJfYm94KCBkZXZfcHJpdiwgMTYsIDQsIDgsIDgsIDI1NSwgMCwgMCApOworCWlmIChkZXZfcHJpdi0+c3RhdHMuYm94ZXMgJiBSQURFT05fQk9YX1dBSVRfSURMRSkKKwkJcmFkZW9uX2NsZWFyX2JveChkZXZfcHJpdiwgMTYsIDQsIDgsIDgsIDI1NSwgMCwgMCk7CiAKIAkvKiBCbHVlIGJveDogbG9zdCBjb250ZXh0PwogCSAqLwogCiAJLyogWWVsbG93IGJveCBmb3IgdGV4dHVyZSBzd2FwcwogCSAqLwotCWlmICggZGV2X3ByaXYtPnN0YXRzLmJveGVzICYgUkFERU9OX0JPWF9URVhUVVJFX0xPQUQgKSAKLQkJcmFkZW9uX2NsZWFyX2JveCggZGV2X3ByaXYsIDQwLCA0LCA4LCA4LCAyNTUsIDI1NSwgMCApOworCWlmIChkZXZfcHJpdi0+c3RhdHMuYm94ZXMgJiBSQURFT05fQk9YX1RFWFRVUkVfTE9BRCkKKwkJcmFkZW9uX2NsZWFyX2JveChkZXZfcHJpdiwgNDAsIDQsIDgsIDgsIDI1NSwgMjU1LCAwKTsKIAogCS8qIEdyZWVuIGJveCBpZiBoYXJkd2FyZSBuZXZlciBpZGxlcyAoYXMgZmFyIGFzIHdlIGNhbiB0ZWxsKQogCSAqLwotCWlmICggIShkZXZfcHJpdi0+c3RhdHMuYm94ZXMgJiBSQURFT05fQk9YX0RNQV9JRExFKSApIAotCQlyYWRlb25fY2xlYXJfYm94KCBkZXZfcHJpdiwgNjQsIDQsIDgsIDgsIDAsIDI1NSwgMCApOworCWlmICghKGRldl9wcml2LT5zdGF0cy5ib3hlcyAmIFJBREVPTl9CT1hfRE1BX0lETEUpKQorCQlyYWRlb25fY2xlYXJfYm94KGRldl9wcml2LCA2NCwgNCwgOCwgOCwgMCwgMjU1LCAwKTsKIAotCi0JLyogRHJhdyBiYXJzIGluZGljYXRpbmcgbnVtYmVyIG9mIGJ1ZmZlcnMgYWxsb2NhdGVkIAorCS8qIERyYXcgYmFycyBpbmRpY2F0aW5nIG51bWJlciBvZiBidWZmZXJzIGFsbG9jYXRlZAogCSAqIChub3QgYSBncmVhdCBtZWFzdXJlLCBlYXNpbHkgY29uZnVzZWQpCiAJICovCiAJaWYgKGRldl9wcml2LT5zdGF0cy5yZXF1ZXN0ZWRfYnVmcykgewogCQlpZiAoZGV2X3ByaXYtPnN0YXRzLnJlcXVlc3RlZF9idWZzID4gMTAwKQogCQkJZGV2X3ByaXYtPnN0YXRzLnJlcXVlc3RlZF9idWZzID0gMTAwOwogCi0JCXJhZGVvbl9jbGVhcl9ib3goIGRldl9wcml2LCA0LCAxNiwgIAotCQkJCSAgZGV2X3ByaXYtPnN0YXRzLnJlcXVlc3RlZF9idWZzLCA0LAotCQkJCSAgMTk2LCAxMjgsIDEyOCApOworCQlyYWRlb25fY2xlYXJfYm94KGRldl9wcml2LCA0LCAxNiwKKwkJCQkgZGV2X3ByaXYtPnN0YXRzLnJlcXVlc3RlZF9idWZzLCA0LAorCQkJCSAxOTYsIDEyOCwgMTI4KTsKIAl9CiAKLQltZW1zZXQoICZkZXZfcHJpdi0+c3RhdHMsIDAsIHNpemVvZihkZXZfcHJpdi0+c3RhdHMpICk7CisJbWVtc2V0KCZkZXZfcHJpdi0+c3RhdHMsIDAsIHNpemVvZihkZXZfcHJpdi0+c3RhdHMpKTsKIAogfQorCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBDUCBjb21tYW5kIGRpc3BhdGNoIGZ1bmN0aW9ucwogICovCiAKLXN0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9jbGVhciggZHJtX2RldmljZV90ICpkZXYsCi0JCQkJICAgICAgZHJtX3JhZGVvbl9jbGVhcl90ICpjbGVhciwKLQkJCQkgICAgICBkcm1fcmFkZW9uX2NsZWFyX3JlY3RfdCAqZGVwdGhfYm94ZXMgKQorc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX2NsZWFyKGRybV9kZXZpY2VfdCAqIGRldiwKKwkJCQkgICAgIGRybV9yYWRlb25fY2xlYXJfdCAqIGNsZWFyLAorCQkJCSAgICAgZHJtX3JhZGVvbl9jbGVhcl9yZWN0X3QgKiBkZXB0aF9ib3hlcykKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwpAQCAtNzEzLDMyICs3MjQsMzQgQEAKIAlpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7CiAJZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7CiAJdW5zaWduZWQgaW50IGZsYWdzID0gY2xlYXItPmZsYWdzOwotCXUzMiByYjNkX2NudGwgPSAwLCByYjNkX3N0ZW5jaWxyZWZtYXNrPSAwOworCXUzMiByYjNkX2NudGwgPSAwLCByYjNkX3N0ZW5jaWxyZWZtYXNrID0gMDsKIAlpbnQgaTsKIAlSSU5HX0xPQ0FMUzsKLQlEUk1fREVCVUcoICJmbGFncyA9IDB4JXhcbiIsIGZsYWdzICk7CisJRFJNX0RFQlVHKCJmbGFncyA9IDB4JXhcbiIsIGZsYWdzKTsKIAogCWRldl9wcml2LT5zdGF0cy5jbGVhcnMrKzsKIAotCWlmICggZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcgJiYgZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9PSAxICkgeworCWlmIChkZXZfcHJpdi0+cGFnZV9mbGlwcGluZyAmJiBkZXZfcHJpdi0+Y3VycmVudF9wYWdlID09IDEpIHsKIAkJdW5zaWduZWQgaW50IHRtcCA9IGZsYWdzOwogCiAJCWZsYWdzICY9IH4oUkFERU9OX0ZST05UIHwgUkFERU9OX0JBQ0spOwotCQlpZiAoIHRtcCAmIFJBREVPTl9GUk9OVCApIGZsYWdzIHw9IFJBREVPTl9CQUNLOwotCQlpZiAoIHRtcCAmIFJBREVPTl9CQUNLICkgIGZsYWdzIHw9IFJBREVPTl9GUk9OVDsKKwkJaWYgKHRtcCAmIFJBREVPTl9GUk9OVCkKKwkJCWZsYWdzIHw9IFJBREVPTl9CQUNLOworCQlpZiAodG1wICYgUkFERU9OX0JBQ0spCisJCQlmbGFncyB8PSBSQURFT05fRlJPTlQ7CiAJfQogCi0JaWYgKCBmbGFncyAmIChSQURFT05fRlJPTlQgfCBSQURFT05fQkFDSykgKSB7CisJaWYgKGZsYWdzICYgKFJBREVPTl9GUk9OVCB8IFJBREVPTl9CQUNLKSkgewogCi0JCUJFR0lOX1JJTkcoIDQgKTsKKwkJQkVHSU5fUklORyg0KTsKIAogCQkvKiBFbnN1cmUgdGhlIDNEIHN0cmVhbSBpcyBpZGxlIGJlZm9yZSBkb2luZyBhCiAJCSAqIDJEIGZpbGwgdG8gY2xlYXIgdGhlIGZyb250IG9yIGJhY2sgYnVmZmVyLgogCQkgKi8KIAkJUkFERU9OX1dBSVRfVU5USUxfM0RfSURMRSgpOwotCQkKLQkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9EUF9XUklURV9NQVNLLCAwICkgKTsKLQkJT1VUX1JJTkcoIGNsZWFyLT5jb2xvcl9tYXNrICk7CisKKwkJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fRFBfV1JJVEVfTUFTSywgMCkpOworCQlPVVRfUklORyhjbGVhci0+Y29sb3JfbWFzayk7CiAKIAkJQURWQU5DRV9SSU5HKCk7CiAKQEAgLTc0NiwxMjEgKzc1OSwxMzAgQEAKIAkJICovCiAJCWRldl9wcml2LT5zYXJlYV9wcml2LT5jdHhfb3duZXIgPSAwOwogCi0JCWZvciAoIGkgPSAwIDsgaSA8IG5ib3ggOyBpKysgKSB7CisJCWZvciAoaSA9IDA7IGkgPCBuYm94OyBpKyspIHsKIAkJCWludCB4ID0gcGJveFtpXS54MTsKIAkJCWludCB5ID0gcGJveFtpXS55MTsKIAkJCWludCB3ID0gcGJveFtpXS54MiAtIHg7CiAJCQlpbnQgaCA9IHBib3hbaV0ueTIgLSB5OwogCi0JCQlEUk1fREVCVUcoICJkaXNwYXRjaCBjbGVhciAlZCwlZC0lZCwlZCBmbGFncyAweCV4XG4iLAotCQkJCSAgIHgsIHksIHcsIGgsIGZsYWdzICk7CisJCQlEUk1fREVCVUcoImRpc3BhdGNoIGNsZWFyICVkLCVkLSVkLCVkIGZsYWdzIDB4JXhcbiIsCisJCQkJICB4LCB5LCB3LCBoLCBmbGFncyk7CiAKLQkJCWlmICggZmxhZ3MgJiBSQURFT05fRlJPTlQgKSB7Ci0JCQkJQkVHSU5fUklORyggNiApOwotCQkJCQotCQkJCU9VVF9SSU5HKCBDUF9QQUNLRVQzKCBSQURFT05fQ05UTF9QQUlOVF9NVUxUSSwgNCApICk7Ci0JCQkJT1VUX1JJTkcoIFJBREVPTl9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMIHwKLQkJCQkJICBSQURFT05fR01DX0JSVVNIX1NPTElEX0NPTE9SIHwKLQkJCQkJICAoZGV2X3ByaXYtPmNvbG9yX2ZtdCA8PCA4KSB8Ci0JCQkJCSAgUkFERU9OX0dNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAotCQkJCQkgIFJBREVPTl9ST1AzX1AgfAotCQkJCQkgIFJBREVPTl9HTUNfQ0xSX0NNUF9DTlRMX0RJUyApOworCQkJaWYgKGZsYWdzICYgUkFERU9OX0ZST05UKSB7CisJCQkJQkVHSU5fUklORyg2KTsKIAotCQkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0ICk7Ci0JCQkJT1VUX1JJTkcoIGNsZWFyLT5jbGVhcl9jb2xvciApOwotCQkJCQotCQkJCU9VVF9SSU5HKCAoeCA8PCAxNikgfCB5ICk7Ci0JCQkJT1VUX1JJTkcoICh3IDw8IDE2KSB8IGggKTsKLQkJCQkKKwkJCQlPVVRfUklORyhDUF9QQUNLRVQzCisJCQkJCSAoUkFERU9OX0NOVExfUEFJTlRfTVVMVEksIDQpKTsKKwkJCQlPVVRfUklORyhSQURFT05fR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCB8CisJCQkJCSBSQURFT05fR01DX0JSVVNIX1NPTElEX0NPTE9SIHwKKwkJCQkJIChkZXZfcHJpdi0+CisJCQkJCSAgY29sb3JfZm10IDw8IDgpIHwKKwkJCQkJIFJBREVPTl9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJCQkJIFJBREVPTl9ST1AzX1AgfAorCQkJCQkgUkFERU9OX0dNQ19DTFJfQ01QX0NOVExfRElTKTsKKworCQkJCU9VVF9SSU5HKGRldl9wcml2LT5mcm9udF9waXRjaF9vZmZzZXQpOworCQkJCU9VVF9SSU5HKGNsZWFyLT5jbGVhcl9jb2xvcik7CisKKwkJCQlPVVRfUklORygoeCA8PCAxNikgfCB5KTsKKwkJCQlPVVRfUklORygodyA8PCAxNikgfCBoKTsKKwogCQkJCUFEVkFOQ0VfUklORygpOwogCQkJfQotCQkJCi0JCQlpZiAoIGZsYWdzICYgUkFERU9OX0JBQ0sgKSB7Ci0JCQkJQkVHSU5fUklORyggNiApOwotCQkJCQotCQkJCU9VVF9SSU5HKCBDUF9QQUNLRVQzKCBSQURFT05fQ05UTF9QQUlOVF9NVUxUSSwgNCApICk7Ci0JCQkJT1VUX1JJTkcoIFJBREVPTl9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMIHwKLQkJCQkJICBSQURFT05fR01DX0JSVVNIX1NPTElEX0NPTE9SIHwKLQkJCQkJICAoZGV2X3ByaXYtPmNvbG9yX2ZtdCA8PCA4KSB8Ci0JCQkJCSAgUkFERU9OX0dNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAotCQkJCQkgIFJBREVPTl9ST1AzX1AgfAotCQkJCQkgIFJBREVPTl9HTUNfQ0xSX0NNUF9DTlRMX0RJUyApOwotCQkJCQotCQkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+YmFja19waXRjaF9vZmZzZXQgKTsKLQkJCQlPVVRfUklORyggY2xlYXItPmNsZWFyX2NvbG9yICk7CiAKLQkJCQlPVVRfUklORyggKHggPDwgMTYpIHwgeSApOwotCQkJCU9VVF9SSU5HKCAodyA8PCAxNikgfCBoICk7CisJCQlpZiAoZmxhZ3MgJiBSQURFT05fQkFDSykgeworCQkJCUJFR0lOX1JJTkcoNik7CisKKwkJCQlPVVRfUklORyhDUF9QQUNLRVQzCisJCQkJCSAoUkFERU9OX0NOVExfUEFJTlRfTVVMVEksIDQpKTsKKwkJCQlPVVRfUklORyhSQURFT05fR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCB8CisJCQkJCSBSQURFT05fR01DX0JSVVNIX1NPTElEX0NPTE9SIHwKKwkJCQkJIChkZXZfcHJpdi0+CisJCQkJCSAgY29sb3JfZm10IDw8IDgpIHwKKwkJCQkJIFJBREVPTl9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJCQkJIFJBREVPTl9ST1AzX1AgfAorCQkJCQkgUkFERU9OX0dNQ19DTFJfQ01QX0NOVExfRElTKTsKKworCQkJCU9VVF9SSU5HKGRldl9wcml2LT5iYWNrX3BpdGNoX29mZnNldCk7CisJCQkJT1VUX1JJTkcoY2xlYXItPmNsZWFyX2NvbG9yKTsKKworCQkJCU9VVF9SSU5HKCh4IDw8IDE2KSB8IHkpOworCQkJCU9VVF9SSU5HKCh3IDw8IDE2KSB8IGgpOwogCiAJCQkJQURWQU5DRV9SSU5HKCk7CiAJCQl9CiAJCX0KIAl9Ci0JCisKIAkvKiBoeXBlciB6IGNsZWFyICovCiAJLyogbm8gZG9jcyBhdmFpbGFibGUsIGJhc2VkIG9uIHJldmVyc2UgZW5nZW5lZXJpbmcgYnkgU3RlcGhhbmUgTWFyY2hlc2luICovCi0JaWYgKChmbGFncyAmIChSQURFT05fREVQVEggfCBSQURFT05fU1RFTkNJTCkpICYmIChmbGFncyAmIFJBREVPTl9DTEVBUl9GQVNUWikpIHsKKwlpZiAoKGZsYWdzICYgKFJBREVPTl9ERVBUSCB8IFJBREVPTl9TVEVOQ0lMKSkKKwkgICAgJiYgKGZsYWdzICYgUkFERU9OX0NMRUFSX0ZBU1RaKSkgewogCiAJCWludCBpOwotCQlpbnQgZGVwdGhwaXhwZXJsaW5lID0gZGV2X3ByaXYtPmRlcHRoX2ZtdD09UkFERU9OX0RFUFRIX0ZPUk1BVF8xNkJJVF9JTlRfWj8gCi0JCQkoZGV2X3ByaXYtPmRlcHRoX3BpdGNoIC8gMik6IChkZXZfcHJpdi0+ZGVwdGhfcGl0Y2ggLyA0KTsKLQkJCisJCWludCBkZXB0aHBpeHBlcmxpbmUgPQorCQkgICAgZGV2X3ByaXYtPmRlcHRoX2ZtdCA9PQorCQkgICAgUkFERU9OX0RFUFRIX0ZPUk1BVF8xNkJJVF9JTlRfWiA/IChkZXZfcHJpdi0+ZGVwdGhfcGl0Y2ggLworCQkJCQkJICAgICAgIDIpIDogKGRldl9wcml2LT4KKwkJCQkJCQkgICAgIGRlcHRoX3BpdGNoIC8gNCk7CisKIAkJdTMyIGNsZWFybWFzazsKIAogCQl1MzIgdGVtcFJCM0RfREVQVEhDTEVBUlZBTFVFID0gY2xlYXItPmNsZWFyX2RlcHRoIHwKLQkJCSgoY2xlYXItPmRlcHRoX21hc2sgJiAweGZmKSA8PCAyNCk7Ci0JCi0JCQorCQkgICAgKChjbGVhci0+ZGVwdGhfbWFzayAmIDB4ZmYpIDw8IDI0KTsKKwogCQkvKiBNYWtlIHN1cmUgd2UgcmVzdG9yZSB0aGUgM0Qgc3RhdGUgbmV4dCB0aW1lLgogCQkgKiB3ZSBoYXZlbid0IHRvdWNoZWQgYW55ICJub3JtYWwiIHN0YXRlIC0gc3RpbGwgbmVlZCB0aGlzPwogCQkgKi8KIAkJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmN0eF9vd25lciA9IDA7CiAKLQkJaWYgKChkZXZfcHJpdi0+ZmxhZ3MgJiBDSElQX0hBU19ISUVSWikgJiYgKGZsYWdzICYgUkFERU9OX1VTRV9ISUVSWikpIHsKLQkJLyogRklYTUUgOiByZXZlcnNlIGVuZ2luZWVyIHRoYXQgZm9yIFJ4MDAgY2FyZHMgKi8KLQkJLyogRklYTUUgOiB0aGUgbWFzayBzdXBwb3NlZGx5IGNvbnRhaW5zIGxvdy1yZXMgeiB2YWx1ZXMuIFNvIGNhbid0IHNldAotCQkgICBqdXN0IHRvIHRoZSBtYXggKDB4ZmY/IG9yIGFjdHVhbGx5IDB4M2ZmZj8pLCBuZWVkIHRvIHRha2UgeiBjbGVhcgotCQkgICB2YWx1ZSBpbnRvIGFjY291bnQ/ICovCi0JCS8qIHBhdHRlcm4gc2VlbXMgdG8gd29yayBmb3IgcjEwMCwgdGhvdWdoIGdldCBzbGlnaHQKLQkJICAgcmVuZGVyaW5nIGVycm9ycyB3aXRoIGdseGdlYXJzLiBJZiBoaWVyeiBpcyBub3QgZW5hYmxlZCBmb3IgcjEwMCwKLQkJICAgb25seSA0IGJpdHMgd2hpY2ggaW5kaWNhdGUgY2xlYXIgKDE1LDE2LDMxLDMyLCBhbGwgemVybykgbWF0dGVyLCB0aGUKLQkJICAgb3RoZXIgb25lcyBhcmUgaWdub3JlZCwgYW5kIHRoZSBzYW1lIGNsZWFyIG1hc2sgY2FuIGJlIHVzZWQuIFRoYXQncwotCQkgICB2ZXJ5IGRpZmZlcmVudCBiZWhhdmlvdXIgdGhhbiBSMjAwIHdoaWNoIG5lZWRzIGRpZmZlcmVudCBjbGVhciBtYXNrCi0JCSAgIGFuZCBkaWZmZXJlbnQgbnVtYmVyIG9mIHRpbGVzIHRvIGNsZWFyIGlmIGhpZXJ6IGlzIGVuYWJsZWQgb3Igbm90ICE/IQotCQkqLwotCQkJY2xlYXJtYXNrID0gKDB4ZmY8PDIyKXwoMHhmZjw8Nil8IDB4MDAzZjAwM2Y7Ci0JCX0KLQkJZWxzZSB7Ci0JCS8qIGNsZWFyIG1hc2sgOiBjaG9vc2VzIHRoZSBjbGVhcmluZyBwYXR0ZXJuLgotCQkgICBydjI1MDogY291bGQgYmUgdXNlZCB0byBjbGVhciBvbmx5IHBhcnRzIG9mIG1hY3JvdGlsZXMKLQkJICAgKGJ1dCB0aGF0IHdvdWxkIGdldCByZWFsbHkgY29tcGxpY2F0ZWQuLi4pPwotCQkgICBiaXQgMCBhbmQgMSAoZWl0aGVyIG9yIGJvdGggb2YgdGhlbSA/IT8hKSBhcmUgdXNlZCB0bwotCQkgICBub3QgY2xlYXIgdGlsZSAob3IgbWF5YmUgb25lIG9mIHRoZSBiaXRzIGluZGljYXRlcyBpZiB0aGUgdGlsZSBpcwotCQkgICBjb21wcmVzc2VkIG9yIG5vdCksIGJpdCAyIGFuZCAzIHRvIG5vdCBjbGVhciB0aWxlIDEsLi4uLC4KLQkJICAgUGF0dGVybiBpcyBhcyBmb2xsb3dzOgotCQkgICAgICAgIHwgMCwxIHwgNCw1IHwgOCw5IHwxMiwxM3wxNiwxN3wyMCwyMXwyNCwyNXwyOCwyOXwKLQkJICAgYml0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCSAgICAgICAgfCAyLDMgfCA2LDcgfDEwLDExfDE0LDE1fDE4LDE5fDIyLDIzfDI2LDI3fDMwLDMxfAotCQkgICBydjEwMDogY2xlYXJtYXNrIGNvdmVycyAyeDggNHgxIHRpbGVzLCBidXQgb25lIGNsZWFyIHN0aWxsCi0JCSAgIGNvdmVycyAyNTYgcGl4ZWxzID8hPwotCQkqLworCQlpZiAoKGRldl9wcml2LT5mbGFncyAmIENISVBfSEFTX0hJRVJaKQorCQkgICAgJiYgKGZsYWdzICYgUkFERU9OX1VTRV9ISUVSWikpIHsKKwkJCS8qIEZJWE1FIDogcmV2ZXJzZSBlbmdpbmVlciB0aGF0IGZvciBSeDAwIGNhcmRzICovCisJCQkvKiBGSVhNRSA6IHRoZSBtYXNrIHN1cHBvc2VkbHkgY29udGFpbnMgbG93LXJlcyB6IHZhbHVlcy4gU28gY2FuJ3Qgc2V0CisJCQkgICBqdXN0IHRvIHRoZSBtYXggKDB4ZmY/IG9yIGFjdHVhbGx5IDB4M2ZmZj8pLCBuZWVkIHRvIHRha2UgeiBjbGVhcgorCQkJICAgdmFsdWUgaW50byBhY2NvdW50PyAqLworCQkJLyogcGF0dGVybiBzZWVtcyB0byB3b3JrIGZvciByMTAwLCB0aG91Z2ggZ2V0IHNsaWdodAorCQkJICAgcmVuZGVyaW5nIGVycm9ycyB3aXRoIGdseGdlYXJzLiBJZiBoaWVyeiBpcyBub3QgZW5hYmxlZCBmb3IgcjEwMCwKKwkJCSAgIG9ubHkgNCBiaXRzIHdoaWNoIGluZGljYXRlIGNsZWFyICgxNSwxNiwzMSwzMiwgYWxsIHplcm8pIG1hdHRlciwgdGhlCisJCQkgICBvdGhlciBvbmVzIGFyZSBpZ25vcmVkLCBhbmQgdGhlIHNhbWUgY2xlYXIgbWFzayBjYW4gYmUgdXNlZC4gVGhhdCdzCisJCQkgICB2ZXJ5IGRpZmZlcmVudCBiZWhhdmlvdXIgdGhhbiBSMjAwIHdoaWNoIG5lZWRzIGRpZmZlcmVudCBjbGVhciBtYXNrCisJCQkgICBhbmQgZGlmZmVyZW50IG51bWJlciBvZiB0aWxlcyB0byBjbGVhciBpZiBoaWVyeiBpcyBlbmFibGVkIG9yIG5vdCAhPyEKKwkJCSAqLworCQkJY2xlYXJtYXNrID0gKDB4ZmYgPDwgMjIpIHwgKDB4ZmYgPDwgNikgfCAweDAwM2YwMDNmOworCQl9IGVsc2UgeworCQkJLyogY2xlYXIgbWFzayA6IGNob29zZXMgdGhlIGNsZWFyaW5nIHBhdHRlcm4uCisJCQkgICBydjI1MDogY291bGQgYmUgdXNlZCB0byBjbGVhciBvbmx5IHBhcnRzIG9mIG1hY3JvdGlsZXMKKwkJCSAgIChidXQgdGhhdCB3b3VsZCBnZXQgcmVhbGx5IGNvbXBsaWNhdGVkLi4uKT8KKwkJCSAgIGJpdCAwIGFuZCAxIChlaXRoZXIgb3IgYm90aCBvZiB0aGVtID8hPyEpIGFyZSB1c2VkIHRvCisJCQkgICBub3QgY2xlYXIgdGlsZSAob3IgbWF5YmUgb25lIG9mIHRoZSBiaXRzIGluZGljYXRlcyBpZiB0aGUgdGlsZSBpcworCQkJICAgY29tcHJlc3NlZCBvciBub3QpLCBiaXQgMiBhbmQgMyB0byBub3QgY2xlYXIgdGlsZSAxLC4uLiwuCisJCQkgICBQYXR0ZXJuIGlzIGFzIGZvbGxvd3M6CisJCQkgICB8IDAsMSB8IDQsNSB8IDgsOSB8MTIsMTN8MTYsMTd8MjAsMjF8MjQsMjV8MjgsMjl8CisJCQkgICBiaXRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCSAgIHwgMiwzIHwgNiw3IHwxMCwxMXwxNCwxNXwxOCwxOXwyMiwyM3wyNiwyN3wzMCwzMXwKKwkJCSAgIHJ2MTAwOiBjbGVhcm1hc2sgY292ZXJzIDJ4OCA0eDEgdGlsZXMsIGJ1dCBvbmUgY2xlYXIgc3RpbGwKKwkJCSAgIGNvdmVycyAyNTYgcGl4ZWxzID8hPworCQkJICovCiAJCQljbGVhcm1hc2sgPSAweDA7CiAJCX0KIAotCQlCRUdJTl9SSU5HKCA4ICk7CisJCUJFR0lOX1JJTkcoOCk7CiAJCVJBREVPTl9XQUlUX1VOVElMXzJEX0lETEUoKTsKLQkJT1VUX1JJTkdfUkVHKCBSQURFT05fUkIzRF9ERVBUSENMRUFSVkFMVUUsCi0JCQl0ZW1wUkIzRF9ERVBUSENMRUFSVkFMVUUpOworCQlPVVRfUklOR19SRUcoUkFERU9OX1JCM0RfREVQVEhDTEVBUlZBTFVFLAorCQkJICAgICB0ZW1wUkIzRF9ERVBUSENMRUFSVkFMVUUpOwogCQkvKiB3aGF0IG9mZnNldCBpcyB0aGlzIGV4YWN0bHkgPyAqLwotCQlPVVRfUklOR19SRUcoIFJBREVPTl9SQjNEX1pNQVNLT0ZGU0VULCAwICk7CisJCU9VVF9SSU5HX1JFRyhSQURFT05fUkIzRF9aTUFTS09GRlNFVCwgMCk7CiAJCS8qIG5lZWQgY3Rsc3RhdCwgb3RoZXJ3aXNlIGdldCBzb21lIHN0cmFuZ2UgYmxhY2sgZmxpY2tlcmluZyAqLwotCQlPVVRfUklOR19SRUcoIFJBREVPTl9SQjNEX1pDQUNIRV9DVExTVEFULCBSQURFT05fUkIzRF9aQ19GTFVTSF9BTEwgKTsKKwkJT1VUX1JJTkdfUkVHKFJBREVPTl9SQjNEX1pDQUNIRV9DVExTVEFULAorCQkJICAgICBSQURFT05fUkIzRF9aQ19GTFVTSF9BTEwpOwogCQlBRFZBTkNFX1JJTkcoKTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgbmJveDsgaSsrKSB7CiAJCQlpbnQgdGlsZW9mZnNldCwgbnJ0aWxlc3gsIG5ydGlsZXN5LCBqOwogCQkJLyogaXQgbG9va3MgbGlrZSByMjAwIG5lZWRzIHJ2LXN0eWxlIGNsZWFycywgYXQgbGVhc3QgaWYgaGllcnogaXMgbm90IGVuYWJsZWQ/ICovCi0JCQlpZiAoKGRldl9wcml2LT5mbGFncyZDSElQX0hBU19ISUVSWikgJiYgIShkZXZfcHJpdi0+bWljcm9jb2RlX3ZlcnNpb249PVVDT0RFX1IyMDApKSB7CisJCQlpZiAoKGRldl9wcml2LT5mbGFncyAmIENISVBfSEFTX0hJRVJaKQorCQkJICAgICYmICEoZGV2X3ByaXYtPm1pY3JvY29kZV92ZXJzaW9uID09IFVDT0RFX1IyMDApKSB7CiAJCQkJLyogRklYTUUgOiBmaWd1cmUgdGhpcyBvdXQgZm9yIHIyMDAgKHdoZW4gaGllcnogaXMgZW5hYmxlZCkuIE9yCiAJCQkJICAgbWF5YmUgcjIwMCBhY3R1YWxseSBkb2Vzbid0IG5lZWQgdG8gcHV0IHRoZSBsb3ctcmVzIHogdmFsdWUgaW50bwogCQkJCSAgIHRoZSB0aWxlIGNhY2hlIGxpa2UgcjEwMCwgYnV0IGp1c3QgbmVlZHMgdG8gY2xlYXIgdGhlIGhpLWxldmVsIHotYnVmZmVyPwpAQCAtODY4LDU5ICs4OTAsNzQgQEAKIAkJCQkgICBSMTAwIHNlZW1zIHRvIG9wZXJhdGUgb24gMngxIDh4OCB0aWxlcywgYnV0Li4uCiAJCQkJICAgb2RkOiBvZmZzZXQvbnJ0aWxlcyBuZWVkIHRvIGJlIDY0IHBpeCAoNCBibG9jaykgYWxpZ25lZD8gUG90ZW50aWFsbHkKIAkJCQkgICBwcm9ibGVtYXRpYyB3aXRoIHJlc29sdXRpb25zIHdoaWNoIGFyZSBub3QgNjQgcGl4IGFsaWduZWQ/ICovCi0JCQkJdGlsZW9mZnNldCA9ICgocGJveFtpXS55MSA+PiAzKSAqIGRlcHRocGl4cGVybGluZSArIHBib3hbaV0ueDEpID4+IDY7Ci0JCQkJbnJ0aWxlc3ggPSAoKHBib3hbaV0ueDIgJiB+NjMpIC0gKHBib3hbaV0ueDEgJiB+NjMpKSA+PiA0OwotCQkJCW5ydGlsZXN5ID0gKHBib3hbaV0ueTIgPj4gMykgLSAocGJveFtpXS55MSA+PiAzKTsKKwkJCQl0aWxlb2Zmc2V0ID0KKwkJCQkgICAgKChwYm94W2ldLnkxID4+IDMpICogZGVwdGhwaXhwZXJsaW5lICsKKwkJCQkgICAgIHBib3hbaV0ueDEpID4+IDY7CisJCQkJbnJ0aWxlc3ggPQorCQkJCSAgICAoKHBib3hbaV0ueDIgJiB+NjMpIC0KKwkJCQkgICAgIChwYm94W2ldLngxICYgfjYzKSkgPj4gNDsKKwkJCQlucnRpbGVzeSA9CisJCQkJICAgIChwYm94W2ldLnkyID4+IDMpIC0gKHBib3hbaV0ueTEgPj4gMyk7CiAJCQkJZm9yIChqID0gMDsgaiA8PSBucnRpbGVzeTsgaisrKSB7Ci0JCQkJCUJFR0lOX1JJTkcoIDQgKTsKLQkJCQkJT1VUX1JJTkcoIENQX1BBQ0tFVDMoIFJBREVPTl8zRF9DTEVBUl9aTUFTSywgMiApICk7CisJCQkJCUJFR0lOX1JJTkcoNCk7CisJCQkJCU9VVF9SSU5HKENQX1BBQ0tFVDMKKwkJCQkJCSAoUkFERU9OXzNEX0NMRUFSX1pNQVNLLCAyKSk7CiAJCQkJCS8qIGZpcnN0IHRpbGUgKi8KLQkJCQkJT1VUX1JJTkcoIHRpbGVvZmZzZXQgKiA4ICk7CisJCQkJCU9VVF9SSU5HKHRpbGVvZmZzZXQgKiA4KTsKIAkJCQkJLyogdGhlIG51bWJlciBvZiB0aWxlcyB0byBjbGVhciAqLwotCQkJCQlPVVRfUklORyggbnJ0aWxlc3ggKyA0ICk7CisJCQkJCU9VVF9SSU5HKG5ydGlsZXN4ICsgNCk7CiAJCQkJCS8qIGNsZWFyIG1hc2sgOiBjaG9vc2VzIHRoZSBjbGVhcmluZyBwYXR0ZXJuLiAqLwotCQkJCQlPVVRfUklORyggY2xlYXJtYXNrICk7CisJCQkJCU9VVF9SSU5HKGNsZWFybWFzayk7CiAJCQkJCUFEVkFOQ0VfUklORygpOwogCQkJCQl0aWxlb2Zmc2V0ICs9IGRlcHRocGl4cGVybGluZSA+PiA2OwogCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGRldl9wcml2LT5taWNyb2NvZGVfdmVyc2lvbj09VUNPREVfUjIwMCkgeworCQkJfSBlbHNlIGlmIChkZXZfcHJpdi0+bWljcm9jb2RlX3ZlcnNpb24gPT0gVUNPREVfUjIwMCkgewogCQkJCS8qIHdvcmtzIGZvciBydjI1MC4gKi8KIAkJCQkvKiBmaW5kIGZpcnN0IG1hY3JvIHRpbGUgKDh4MiA0eDQgei1waXhlbHMgb24gcnYyNTApICovCi0JCQkJdGlsZW9mZnNldCA9ICgocGJveFtpXS55MSA+PiAzKSAqIGRlcHRocGl4cGVybGluZSArIHBib3hbaV0ueDEpID4+IDU7Ci0JCQkJbnJ0aWxlc3ggPSAocGJveFtpXS54MiA+PiA1KSAtIChwYm94W2ldLngxID4+IDUpOwotCQkJCW5ydGlsZXN5ID0gKHBib3hbaV0ueTIgPj4gMykgLSAocGJveFtpXS55MSA+PiAzKTsKKwkJCQl0aWxlb2Zmc2V0ID0KKwkJCQkgICAgKChwYm94W2ldLnkxID4+IDMpICogZGVwdGhwaXhwZXJsaW5lICsKKwkJCQkgICAgIHBib3hbaV0ueDEpID4+IDU7CisJCQkJbnJ0aWxlc3ggPQorCQkJCSAgICAocGJveFtpXS54MiA+PiA1KSAtIChwYm94W2ldLngxID4+IDUpOworCQkJCW5ydGlsZXN5ID0KKwkJCQkgICAgKHBib3hbaV0ueTIgPj4gMykgLSAocGJveFtpXS55MSA+PiAzKTsKIAkJCQlmb3IgKGogPSAwOyBqIDw9IG5ydGlsZXN5OyBqKyspIHsKLQkJCQkJQkVHSU5fUklORyggNCApOwotCQkJCQlPVVRfUklORyggQ1BfUEFDS0VUMyggUkFERU9OXzNEX0NMRUFSX1pNQVNLLCAyICkgKTsKKwkJCQkJQkVHSU5fUklORyg0KTsKKwkJCQkJT1VUX1JJTkcoQ1BfUEFDS0VUMworCQkJCQkJIChSQURFT05fM0RfQ0xFQVJfWk1BU0ssIDIpKTsKIAkJCQkJLyogZmlyc3QgdGlsZSAqLwogCQkJCQkvKiBqdWRnaW5nIGJ5IHRoZSBmaXJzdCB0aWxlIG9mZnNldCBuZWVkZWQsIGNvdWxkIHBvc3NpYmx5CiAJCQkJCSAgIGRpcmVjdGx5IGFkZHJlc3MvY2xlYXIgNHg0IHRpbGVzIGluc3RlYWQgb2YgOHgyICogNHg0CiAJCQkJCSAgIG1hY3JvIHRpbGVzLCB0aG91Z2ggd291bGQgc3RpbGwgbmVlZCBjbGVhciBtYXNrIGZvcgogCQkJCQkgICByaWdodC9ib3R0b20gaWYgdHJ1ZWx5IDR4NCBncmFudWxhcml0eSBpcyBkZXNpcmVkID8gKi8KLQkJCQkJT1VUX1JJTkcoIHRpbGVvZmZzZXQgKiAxNiApOworCQkJCQlPVVRfUklORyh0aWxlb2Zmc2V0ICogMTYpOwogCQkJCQkvKiB0aGUgbnVtYmVyIG9mIHRpbGVzIHRvIGNsZWFyICovCi0JCQkJCU9VVF9SSU5HKCBucnRpbGVzeCArIDEgKTsKKwkJCQkJT1VUX1JJTkcobnJ0aWxlc3ggKyAxKTsKIAkJCQkJLyogY2xlYXIgbWFzayA6IGNob29zZXMgdGhlIGNsZWFyaW5nIHBhdHRlcm4uICovCi0JCQkJCU9VVF9SSU5HKCBjbGVhcm1hc2sgKTsKKwkJCQkJT1VUX1JJTkcoY2xlYXJtYXNrKTsKIAkJCQkJQURWQU5DRV9SSU5HKCk7CiAJCQkJCXRpbGVvZmZzZXQgKz0gZGVwdGhwaXhwZXJsaW5lID4+IDU7CiAJCQkJfQotCQkJfQotCQkJZWxzZSB7IC8qIHJ2IDEwMCAqLworCQkJfSBlbHNlIHsJLyogcnYgMTAwICovCiAJCQkJLyogcnYxMDAgbWlnaHQgbm90IG5lZWQgNjQgcGl4IGFsaWdubWVudCwgd2hvIGtub3dzICovCiAJCQkJLyogb2Zmc2V0cyBhcmUsIGhtbSwgd2VpcmQgKi8KLQkJCQl0aWxlb2Zmc2V0ID0gKChwYm94W2ldLnkxID4+IDQpICogZGVwdGhwaXhwZXJsaW5lICsgcGJveFtpXS54MSkgPj4gNjsKLQkJCQlucnRpbGVzeCA9ICgocGJveFtpXS54MiAmIH42MykgLSAocGJveFtpXS54MSAmIH42MykpID4+IDQ7Ci0JCQkJbnJ0aWxlc3kgPSAocGJveFtpXS55MiA+PiA0KSAtIChwYm94W2ldLnkxID4+IDQpOworCQkJCXRpbGVvZmZzZXQgPQorCQkJCSAgICAoKHBib3hbaV0ueTEgPj4gNCkgKiBkZXB0aHBpeHBlcmxpbmUgKworCQkJCSAgICAgcGJveFtpXS54MSkgPj4gNjsKKwkJCQlucnRpbGVzeCA9CisJCQkJICAgICgocGJveFtpXS54MiAmIH42MykgLQorCQkJCSAgICAgKHBib3hbaV0ueDEgJiB+NjMpKSA+PiA0OworCQkJCW5ydGlsZXN5ID0KKwkJCQkgICAgKHBib3hbaV0ueTIgPj4gNCkgLSAocGJveFtpXS55MSA+PiA0KTsKIAkJCQlmb3IgKGogPSAwOyBqIDw9IG5ydGlsZXN5OyBqKyspIHsKLQkJCQkJQkVHSU5fUklORyggNCApOwotCQkJCQlPVVRfUklORyggQ1BfUEFDS0VUMyggUkFERU9OXzNEX0NMRUFSX1pNQVNLLCAyICkgKTsKLQkJCQkJT1VUX1JJTkcoIHRpbGVvZmZzZXQgKiAxMjggKTsKKwkJCQkJQkVHSU5fUklORyg0KTsKKwkJCQkJT1VUX1JJTkcoQ1BfUEFDS0VUMworCQkJCQkJIChSQURFT05fM0RfQ0xFQVJfWk1BU0ssIDIpKTsKKwkJCQkJT1VUX1JJTkcodGlsZW9mZnNldCAqIDEyOCk7CiAJCQkJCS8qIHRoZSBudW1iZXIgb2YgdGlsZXMgdG8gY2xlYXIgKi8KLQkJCQkJT1VUX1JJTkcoIG5ydGlsZXN4ICsgNCApOworCQkJCQlPVVRfUklORyhucnRpbGVzeCArIDQpOwogCQkJCQkvKiBjbGVhciBtYXNrIDogY2hvb3NlcyB0aGUgY2xlYXJpbmcgcGF0dGVybi4gKi8KLQkJCQkJT1VUX1JJTkcoIGNsZWFybWFzayApOworCQkJCQlPVVRfUklORyhjbGVhcm1hc2spOwogCQkJCQlBRFZBTkNFX1JJTkcoKTsKIAkJCQkJdGlsZW9mZnNldCArPSBkZXB0aHBpeHBlcmxpbmUgPj4gNjsKIAkJCQl9CkBAIC05MjgsMTggKzk2NSwxOSBAQAogCQl9CiAKIAkJLyogVE9ETyBkb24ndCBhbHdheXMgY2xlYXIgYWxsIGhpLWxldmVsIHogdGlsZXMgKi8KLQkJaWYgKChkZXZfcHJpdi0+ZmxhZ3MgJiBDSElQX0hBU19ISUVSWikgJiYgKGRldl9wcml2LT5taWNyb2NvZGVfdmVyc2lvbj09VUNPREVfUjIwMCkKLQkJCSYmIChmbGFncyAmIFJBREVPTl9VU0VfSElFUlopKQotCQkvKiByMTAwIGFuZCBjYXJkcyB3aXRob3V0IGhpZXJhcmNoaWNhbCB6LWJ1ZmZlciBoYXZlIG5vIGhpZ2gtbGV2ZWwgei1idWZmZXIgKi8KLQkJLyogRklYTUUgOiB0aGUgbWFzayBzdXBwb3NlZGx5IGNvbnRhaW5zIGxvdy1yZXMgeiB2YWx1ZXMuIFNvIGNhbid0IHNldAotCQkgICBqdXN0IHRvIHRoZSBtYXggKDB4ZmY/IG9yIGFjdHVhbGx5IDB4M2ZmZj8pLCBuZWVkIHRvIHRha2UgeiBjbGVhcgotCQkgICB2YWx1ZSBpbnRvIGFjY291bnQ/ICovCisJCWlmICgoZGV2X3ByaXYtPmZsYWdzICYgQ0hJUF9IQVNfSElFUlopCisJCSAgICAmJiAoZGV2X3ByaXYtPm1pY3JvY29kZV92ZXJzaW9uID09IFVDT0RFX1IyMDApCisJCSAgICAmJiAoZmxhZ3MgJiBSQURFT05fVVNFX0hJRVJaKSkKKwkJCS8qIHIxMDAgYW5kIGNhcmRzIHdpdGhvdXQgaGllcmFyY2hpY2FsIHotYnVmZmVyIGhhdmUgbm8gaGlnaC1sZXZlbCB6LWJ1ZmZlciAqLworCQkJLyogRklYTUUgOiB0aGUgbWFzayBzdXBwb3NlZGx5IGNvbnRhaW5zIGxvdy1yZXMgeiB2YWx1ZXMuIFNvIGNhbid0IHNldAorCQkJICAganVzdCB0byB0aGUgbWF4ICgweGZmPyBvciBhY3R1YWxseSAweDNmZmY/KSwgbmVlZCB0byB0YWtlIHogY2xlYXIKKwkJCSAgIHZhbHVlIGludG8gYWNjb3VudD8gKi8KIAkJewotCQkJQkVHSU5fUklORyggNCApOwotCQkJT1VUX1JJTkcoIENQX1BBQ0tFVDMoIFJBREVPTl8zRF9DTEVBUl9ISVosIDIgKSApOwotCQkJT1VUX1JJTkcoIDB4MCApOyAvKiBGaXJzdCB0aWxlICovCi0JCQlPVVRfUklORyggMHgzY2MwICk7Ci0JCQlPVVRfUklORyggKDB4ZmY8PDIyKXwoMHhmZjw8Nil8IDB4MDAzZjAwM2YpOworCQkJQkVHSU5fUklORyg0KTsKKwkJCU9VVF9SSU5HKENQX1BBQ0tFVDMoUkFERU9OXzNEX0NMRUFSX0hJWiwgMikpOworCQkJT1VUX1JJTkcoMHgwKTsJLyogRmlyc3QgdGlsZSAqLworCQkJT1VUX1JJTkcoMHgzY2MwKTsKKwkJCU9VVF9SSU5HKCgweGZmIDw8IDIyKSB8ICgweGZmIDw8IDYpIHwgMHgwMDNmMDAzZik7CiAJCQlBRFZBTkNFX1JJTkcoKTsKIAkJfQogCX0KQEAgLTk3NCwzMCArMTAxMiwyNyBAQAogCiAJCXRlbXBTRV9DTlRMID0gZGVwdGhfY2xlYXItPnNlX2NudGw7CiAKLQotCiAJCS8qIERpc2FibGUgVENMICovCiAKLQkJdGVtcFNFX1ZBUF9DTlRMID0gKC8qIFNFX1ZBUF9DTlRMX19GT1JDRV9XX1RPX09ORV9NQVNLIHwgICovCi0JCQkJICAgKDB4OSA8PCBTRV9WQVBfQ05UTF9fVkZfTUFYX1ZUWF9OVU1fX1NISUZUKSk7CisJCXRlbXBTRV9WQVBfQ05UTCA9ICgJLyogU0VfVkFQX0NOVExfX0ZPUkNFX1dfVE9fT05FX01BU0sgfCAgKi8KKwkJCQkJICAoMHg5IDw8CisJCQkJCSAgIFNFX1ZBUF9DTlRMX19WRl9NQVhfVlRYX05VTV9fU0hJRlQpKTsKIAogCQl0ZW1wUkIzRF9QTEFORU1BU0sgPSAweDA7CiAKIAkJdGVtcFJFX0FVWF9TQ0lTU09SX0NOVEwgPSAweDA7CiAKIAkJdGVtcFNFX1ZURV9DTlRMID0KLQkJCVNFX1ZURV9DTlRMX19WVFhfWFlfRk1UX01BU0sgfAotCQkJU0VfVlRFX0NOVExfX1ZUWF9aX0ZNVF9NQVNLOworCQkgICAgU0VfVlRFX0NOVExfX1ZUWF9YWV9GTVRfTUFTSyB8IFNFX1ZURV9DTlRMX19WVFhfWl9GTVRfTUFTSzsKIAotCQkvKiBWZXJ0ZXggZm9ybWF0IChYLCBZLCBaLCBXKSovCisJCS8qIFZlcnRleCBmb3JtYXQgKFgsIFksIFosIFcpICovCiAJCXRlbXBTRV9WVFhfRk1UXzAgPQotCQkJU0VfVlRYX0ZNVF8wX19WVFhfWjBfUFJFU0VOVF9NQVNLIHwKLQkJCVNFX1ZUWF9GTVRfMF9fVlRYX1cwX1BSRVNFTlRfTUFTSzsKKwkJICAgIFNFX1ZUWF9GTVRfMF9fVlRYX1owX1BSRVNFTlRfTUFTSyB8CisJCSAgICBTRV9WVFhfRk1UXzBfX1ZUWF9XMF9QUkVTRU5UX01BU0s7CiAJCXRlbXBTRV9WVFhfRk1UXzEgPSAweDA7CiAKLQotCQkvKiAKLQkJICogRGVwdGggYnVmZmVyIHNwZWNpZmljIGVuYWJsZXMgCisJCS8qCisJCSAqIERlcHRoIGJ1ZmZlciBzcGVjaWZpYyBlbmFibGVzCiAJCSAqLwogCQlpZiAoZmxhZ3MgJiBSQURFT05fREVQVEgpIHsKIAkJCS8qIEVuYWJsZSBkZXB0aCBidWZmZXIgKi8KQEAgLTEwMDcsMTIgKzEwNDIsMTIgQEAKIAkJCXRlbXBSQjNEX0NOVEwgJj0gflJBREVPTl9aX0VOQUJMRTsKIAkJfQogCi0JCS8qIAorCQkvKgogCQkgKiBTdGVuY2lsIGJ1ZmZlciBzcGVjaWZpYyBlbmFibGVzCiAJCSAqLwotCQlpZiAoIGZsYWdzICYgUkFERU9OX1NURU5DSUwgKSB7Ci0JCQl0ZW1wUkIzRF9DTlRMIHw9ICBSQURFT05fU1RFTkNJTF9FTkFCTEU7Ci0JCQl0ZW1wUkIzRF9TVEVOQ0lMUkVGTUFTSyA9IGNsZWFyLT5kZXB0aF9tYXNrOyAKKwkJaWYgKGZsYWdzICYgUkFERU9OX1NURU5DSUwpIHsKKwkJCXRlbXBSQjNEX0NOVEwgfD0gUkFERU9OX1NURU5DSUxfRU5BQkxFOworCQkJdGVtcFJCM0RfU1RFTkNJTFJFRk1BU0sgPSBjbGVhci0+ZGVwdGhfbWFzazsKIAkJfSBlbHNlIHsKIAkJCXRlbXBSQjNEX0NOVEwgJj0gflJBREVPTl9TVEVOQ0lMX0VOQUJMRTsKIAkJCXRlbXBSQjNEX1NURU5DSUxSRUZNQVNLID0gMHgwMDAwMDAwMDsKQEAgLTEwMjAsNzkgKzEwNTUsNzUgQEAKIAogCQlpZiAoZmxhZ3MgJiBSQURFT05fVVNFX0NPTVBfWkJVRikgewogCQkJdGVtcFJCM0RfWlNURU5DSUxDTlRMIHw9IFJBREVPTl9aX0NPTVBSRVNTSU9OX0VOQUJMRSB8Ci0JCQkJUkFERU9OX1pfREVDT01QUkVTU0lPTl9FTkFCTEU7CisJCQkgICAgUkFERU9OX1pfREVDT01QUkVTU0lPTl9FTkFCTEU7CiAJCX0KIAkJaWYgKGZsYWdzICYgUkFERU9OX1VTRV9ISUVSWikgewogCQkJdGVtcFJCM0RfWlNURU5DSUxDTlRMIHw9IFJBREVPTl9aX0hJRVJBUkNIWV9FTkFCTEU7CiAJCX0KIAotCQlCRUdJTl9SSU5HKCAyNiApOworCQlCRUdJTl9SSU5HKDI2KTsKIAkJUkFERU9OX1dBSVRfVU5USUxfMkRfSURMRSgpOwogCi0JCU9VVF9SSU5HX1JFRyggUkFERU9OX1BQX0NOVEwsIHRlbXBQUF9DTlRMICk7Ci0JCU9VVF9SSU5HX1JFRyggUjIwMF9SRV9DTlRMLCB0ZW1wUkVfQ05UTCApOwotCQlPVVRfUklOR19SRUcoIFJBREVPTl9SQjNEX0NOVEwsIHRlbXBSQjNEX0NOVEwgKTsKLQkJT1VUX1JJTkdfUkVHKCBSQURFT05fUkIzRF9aU1RFTkNJTENOVEwsCi0JCQkgICAgICB0ZW1wUkIzRF9aU1RFTkNJTENOVEwgKTsKLQkJT1VUX1JJTkdfUkVHKCBSQURFT05fUkIzRF9TVEVOQ0lMUkVGTUFTSywgCi0JCQkgICAgICB0ZW1wUkIzRF9TVEVOQ0lMUkVGTUFTSyApOwotCQlPVVRfUklOR19SRUcoIFJBREVPTl9SQjNEX1BMQU5FTUFTSywgdGVtcFJCM0RfUExBTkVNQVNLICk7Ci0JCU9VVF9SSU5HX1JFRyggUkFERU9OX1NFX0NOVEwsIHRlbXBTRV9DTlRMICk7Ci0JCU9VVF9SSU5HX1JFRyggUjIwMF9TRV9WVEVfQ05UTCwgdGVtcFNFX1ZURV9DTlRMICk7Ci0JCU9VVF9SSU5HX1JFRyggUjIwMF9TRV9WVFhfRk1UXzAsIHRlbXBTRV9WVFhfRk1UXzAgKTsKLQkJT1VUX1JJTkdfUkVHKCBSMjAwX1NFX1ZUWF9GTVRfMSwgdGVtcFNFX1ZUWF9GTVRfMSApOwotCQlPVVRfUklOR19SRUcoIFIyMDBfU0VfVkFQX0NOVEwsIHRlbXBTRV9WQVBfQ05UTCApOwotCQlPVVRfUklOR19SRUcoIFIyMDBfUkVfQVVYX1NDSVNTT1JfQ05UTCwgCi0JCQkgICAgICB0ZW1wUkVfQVVYX1NDSVNTT1JfQ05UTCApOworCQlPVVRfUklOR19SRUcoUkFERU9OX1BQX0NOVEwsIHRlbXBQUF9DTlRMKTsKKwkJT1VUX1JJTkdfUkVHKFIyMDBfUkVfQ05UTCwgdGVtcFJFX0NOVEwpOworCQlPVVRfUklOR19SRUcoUkFERU9OX1JCM0RfQ05UTCwgdGVtcFJCM0RfQ05UTCk7CisJCU9VVF9SSU5HX1JFRyhSQURFT05fUkIzRF9aU1RFTkNJTENOVEwsIHRlbXBSQjNEX1pTVEVOQ0lMQ05UTCk7CisJCU9VVF9SSU5HX1JFRyhSQURFT05fUkIzRF9TVEVOQ0lMUkVGTUFTSywKKwkJCSAgICAgdGVtcFJCM0RfU1RFTkNJTFJFRk1BU0spOworCQlPVVRfUklOR19SRUcoUkFERU9OX1JCM0RfUExBTkVNQVNLLCB0ZW1wUkIzRF9QTEFORU1BU0spOworCQlPVVRfUklOR19SRUcoUkFERU9OX1NFX0NOVEwsIHRlbXBTRV9DTlRMKTsKKwkJT1VUX1JJTkdfUkVHKFIyMDBfU0VfVlRFX0NOVEwsIHRlbXBTRV9WVEVfQ05UTCk7CisJCU9VVF9SSU5HX1JFRyhSMjAwX1NFX1ZUWF9GTVRfMCwgdGVtcFNFX1ZUWF9GTVRfMCk7CisJCU9VVF9SSU5HX1JFRyhSMjAwX1NFX1ZUWF9GTVRfMSwgdGVtcFNFX1ZUWF9GTVRfMSk7CisJCU9VVF9SSU5HX1JFRyhSMjAwX1NFX1ZBUF9DTlRMLCB0ZW1wU0VfVkFQX0NOVEwpOworCQlPVVRfUklOR19SRUcoUjIwMF9SRV9BVVhfU0NJU1NPUl9DTlRMLCB0ZW1wUkVfQVVYX1NDSVNTT1JfQ05UTCk7CiAJCUFEVkFOQ0VfUklORygpOwogCiAJCS8qIE1ha2Ugc3VyZSB3ZSByZXN0b3JlIHRoZSAzRCBzdGF0ZSBuZXh0IHRpbWUuCiAJCSAqLwogCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+Y3R4X293bmVyID0gMDsKIAotCQlmb3IgKCBpID0gMCA7IGkgPCBuYm94IDsgaSsrICkgewotCQkJCi0JCQkvKiBGdW5ueSB0aGF0IHRoaXMgc2hvdWxkIGJlIHJlcXVpcmVkIC0tIAorCQlmb3IgKGkgPSAwOyBpIDwgbmJveDsgaSsrKSB7CisKKwkJCS8qIEZ1bm55IHRoYXQgdGhpcyBzaG91bGQgYmUgcmVxdWlyZWQgLS0KIAkJCSAqICBzZXRzIHRvcC1sZWZ0PwogCQkJICovCi0JCQlyYWRlb25fZW1pdF9jbGlwX3JlY3QoIGRldl9wcml2LAotCQkJCQkgICAgICAgJnNhcmVhX3ByaXYtPmJveGVzW2ldICk7CisJCQlyYWRlb25fZW1pdF9jbGlwX3JlY3QoZGV2X3ByaXYsICZzYXJlYV9wcml2LT5ib3hlc1tpXSk7CiAKLQkJCUJFR0lOX1JJTkcoIDE0ICk7Ci0JCQlPVVRfUklORyggQ1BfUEFDS0VUMyggUjIwMF8zRF9EUkFXX0lNTURfMiwgMTIgKSApOwotCQkJT1VUX1JJTkcoIChSQURFT05fUFJJTV9UWVBFX1JFQ1RfTElTVCB8Ci0JCQkJICAgUkFERU9OX1BSSU1fV0FMS19SSU5HIHwKLQkJCQkgICAoMyA8PCBSQURFT05fTlVNX1ZFUlRJQ0VTX1NISUZUKSkgKTsKLQkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9YMV0gKTsKLQkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ZMV0gKTsKLQkJCU9VVF9SSU5HKCBkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ERVBUSF0gKTsKLQkJCU9VVF9SSU5HKCAweDNmODAwMDAwICk7Ci0JCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWDFdICk7Ci0JCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWTJdICk7Ci0JCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfREVQVEhdICk7Ci0JCQlPVVRfUklORyggMHgzZjgwMDAwMCApOwotCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1gyXSApOwotCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1kyXSApOwotCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX0RFUFRIXSApOwotCQkJT1VUX1JJTkcoIDB4M2Y4MDAwMDAgKTsKKwkJCUJFR0lOX1JJTkcoMTQpOworCQkJT1VUX1JJTkcoQ1BfUEFDS0VUMyhSMjAwXzNEX0RSQVdfSU1NRF8yLCAxMikpOworCQkJT1VUX1JJTkcoKFJBREVPTl9QUklNX1RZUEVfUkVDVF9MSVNUIHwKKwkJCQkgIFJBREVPTl9QUklNX1dBTEtfUklORyB8CisJCQkJICAoMyA8PCBSQURFT05fTlVNX1ZFUlRJQ0VTX1NISUZUKSkpOworCQkJT1VUX1JJTkcoZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWDFdKTsKKwkJCU9VVF9SSU5HKGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1kxXSk7CisJCQlPVVRfUklORyhkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ERVBUSF0pOworCQkJT1VUX1JJTkcoMHgzZjgwMDAwMCk7CisJCQlPVVRfUklORyhkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9YMV0pOworCQkJT1VUX1JJTkcoZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWTJdKTsKKwkJCU9VVF9SSU5HKGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX0RFUFRIXSk7CisJCQlPVVRfUklORygweDNmODAwMDAwKTsKKwkJCU9VVF9SSU5HKGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1gyXSk7CisJCQlPVVRfUklORyhkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ZMl0pOworCQkJT1VUX1JJTkcoZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfREVQVEhdKTsKKwkJCU9VVF9SSU5HKDB4M2Y4MDAwMDApOwogCQkJQURWQU5DRV9SSU5HKCk7CiAJCX0KLQl9IAotCWVsc2UgaWYgKCAoZmxhZ3MgJiAoUkFERU9OX0RFUFRIIHwgUkFERU9OX1NURU5DSUwpKSApIHsKKwl9IGVsc2UgaWYgKChmbGFncyAmIChSQURFT05fREVQVEggfCBSQURFT05fU1RFTkNJTCkpKSB7CiAKIAkJaW50IHRlbXBSQjNEX1pTVEVOQ0lMQ05UTCA9IGRlcHRoX2NsZWFyLT5yYjNkX3pzdGVuY2lsY250bDsKIAogCQlyYjNkX2NudGwgPSBkZXB0aF9jbGVhci0+cmIzZF9jbnRsOwogCi0JCWlmICggZmxhZ3MgJiBSQURFT05fREVQVEggKSB7Ci0JCQlyYjNkX2NudGwgfD0gIFJBREVPTl9aX0VOQUJMRTsKKwkJaWYgKGZsYWdzICYgUkFERU9OX0RFUFRIKSB7CisJCQlyYjNkX2NudGwgfD0gUkFERU9OX1pfRU5BQkxFOwogCQl9IGVsc2UgewogCQkJcmIzZF9jbnRsICY9IH5SQURFT05fWl9FTkFCTEU7CiAJCX0KIAotCQlpZiAoIGZsYWdzICYgUkFERU9OX1NURU5DSUwgKSB7Ci0JCQlyYjNkX2NudGwgfD0gIFJBREVPTl9TVEVOQ0lMX0VOQUJMRTsKLQkJCXJiM2Rfc3RlbmNpbHJlZm1hc2sgPSBjbGVhci0+ZGVwdGhfbWFzazsgLyogbWlzbmFtZWQgZmllbGQgKi8KKwkJaWYgKGZsYWdzICYgUkFERU9OX1NURU5DSUwpIHsKKwkJCXJiM2RfY250bCB8PSBSQURFT05fU1RFTkNJTF9FTkFCTEU7CisJCQlyYjNkX3N0ZW5jaWxyZWZtYXNrID0gY2xlYXItPmRlcHRoX21hc2s7CS8qIG1pc25hbWVkIGZpZWxkICovCiAJCX0gZWxzZSB7CiAJCQlyYjNkX2NudGwgJj0gflJBREVPTl9TVEVOQ0lMX0VOQUJMRTsKIAkJCXJiM2Rfc3RlbmNpbHJlZm1hc2sgPSAweDAwMDAwMDAwOwpAQCAtMTEwMCw2NiArMTEzMSw2MSBAQAogCiAJCWlmIChmbGFncyAmIFJBREVPTl9VU0VfQ09NUF9aQlVGKSB7CiAJCQl0ZW1wUkIzRF9aU1RFTkNJTENOVEwgfD0gUkFERU9OX1pfQ09NUFJFU1NJT05fRU5BQkxFIHwKLQkJCQlSQURFT05fWl9ERUNPTVBSRVNTSU9OX0VOQUJMRTsKKwkJCSAgICBSQURFT05fWl9ERUNPTVBSRVNTSU9OX0VOQUJMRTsKIAkJfQogCQlpZiAoZmxhZ3MgJiBSQURFT05fVVNFX0hJRVJaKSB7CiAJCQl0ZW1wUkIzRF9aU1RFTkNJTENOVEwgfD0gUkFERU9OX1pfSElFUkFSQ0hZX0VOQUJMRTsKIAkJfQogCi0JCUJFR0lOX1JJTkcoIDEzICk7CisJCUJFR0lOX1JJTkcoMTMpOwogCQlSQURFT05fV0FJVF9VTlRJTF8yRF9JRExFKCk7CiAKLQkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9QUF9DTlRMLCAxICkgKTsKLQkJT1VUX1JJTkcoIDB4MDAwMDAwMDAgKTsKLQkJT1VUX1JJTkcoIHJiM2RfY250bCApOwotCQkKLQkJT1VUX1JJTkdfUkVHKCBSQURFT05fUkIzRF9aU1RFTkNJTENOVEwsIHRlbXBSQjNEX1pTVEVOQ0lMQ05UTCApOwotCQlPVVRfUklOR19SRUcoIFJBREVPTl9SQjNEX1NURU5DSUxSRUZNQVNLLAotCQkJICAgICAgcmIzZF9zdGVuY2lscmVmbWFzayApOwotCQlPVVRfUklOR19SRUcoIFJBREVPTl9SQjNEX1BMQU5FTUFTSywKLQkJCSAgICAgIDB4MDAwMDAwMDAgKTsKLQkJT1VUX1JJTkdfUkVHKCBSQURFT05fU0VfQ05UTCwKLQkJCSAgICAgIGRlcHRoX2NsZWFyLT5zZV9jbnRsICk7CisJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1BQX0NOVEwsIDEpKTsKKwkJT1VUX1JJTkcoMHgwMDAwMDAwMCk7CisJCU9VVF9SSU5HKHJiM2RfY250bCk7CisKKwkJT1VUX1JJTkdfUkVHKFJBREVPTl9SQjNEX1pTVEVOQ0lMQ05UTCwgdGVtcFJCM0RfWlNURU5DSUxDTlRMKTsKKwkJT1VUX1JJTkdfUkVHKFJBREVPTl9SQjNEX1NURU5DSUxSRUZNQVNLLCByYjNkX3N0ZW5jaWxyZWZtYXNrKTsKKwkJT1VUX1JJTkdfUkVHKFJBREVPTl9SQjNEX1BMQU5FTUFTSywgMHgwMDAwMDAwMCk7CisJCU9VVF9SSU5HX1JFRyhSQURFT05fU0VfQ05UTCwgZGVwdGhfY2xlYXItPnNlX2NudGwpOwogCQlBRFZBTkNFX1JJTkcoKTsKIAogCQkvKiBNYWtlIHN1cmUgd2UgcmVzdG9yZSB0aGUgM0Qgc3RhdGUgbmV4dCB0aW1lLgogCQkgKi8KIAkJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmN0eF9vd25lciA9IDA7CiAKLQkJZm9yICggaSA9IDAgOyBpIDwgbmJveCA7IGkrKyApIHsKLQkJCQotCQkJLyogRnVubnkgdGhhdCB0aGlzIHNob3VsZCBiZSByZXF1aXJlZCAtLSAKKwkJZm9yIChpID0gMDsgaSA8IG5ib3g7IGkrKykgeworCisJCQkvKiBGdW5ueSB0aGF0IHRoaXMgc2hvdWxkIGJlIHJlcXVpcmVkIC0tCiAJCQkgKiAgc2V0cyB0b3AtbGVmdD8KIAkJCSAqLwotCQkJcmFkZW9uX2VtaXRfY2xpcF9yZWN0KCBkZXZfcHJpdiwKLQkJCQkJICAgICAgICZzYXJlYV9wcml2LT5ib3hlc1tpXSApOworCQkJcmFkZW9uX2VtaXRfY2xpcF9yZWN0KGRldl9wcml2LCAmc2FyZWFfcHJpdi0+Ym94ZXNbaV0pOwogCi0JCQlCRUdJTl9SSU5HKCAxNSApOworCQkJQkVHSU5fUklORygxNSk7CiAKLQkJCU9VVF9SSU5HKCBDUF9QQUNLRVQzKCBSQURFT05fM0RfRFJBV19JTU1ELCAxMyApICk7Ci0JCQlPVVRfUklORyggUkFERU9OX1ZUWF9aX1BSRVNFTlQgfAotCQkJCSAgUkFERU9OX1ZUWF9QS0NPTE9SX1BSRVNFTlQpOwotCQkJT1VUX1JJTkcoIChSQURFT05fUFJJTV9UWVBFX1JFQ1RfTElTVCB8Ci0JCQkJICAgUkFERU9OX1BSSU1fV0FMS19SSU5HIHwKLQkJCQkgICBSQURFT05fTUFPU19FTkFCTEUgfAotCQkJCSAgIFJBREVPTl9WVFhfRk1UX1JBREVPTl9NT0RFIHwKLQkJCQkgICAoMyA8PCBSQURFT05fTlVNX1ZFUlRJQ0VTX1NISUZUKSkgKTsKKwkJCU9VVF9SSU5HKENQX1BBQ0tFVDMoUkFERU9OXzNEX0RSQVdfSU1NRCwgMTMpKTsKKwkJCU9VVF9SSU5HKFJBREVPTl9WVFhfWl9QUkVTRU5UIHwKKwkJCQkgUkFERU9OX1ZUWF9QS0NPTE9SX1BSRVNFTlQpOworCQkJT1VUX1JJTkcoKFJBREVPTl9QUklNX1RZUEVfUkVDVF9MSVNUIHwKKwkJCQkgIFJBREVPTl9QUklNX1dBTEtfUklORyB8CisJCQkJICBSQURFT05fTUFPU19FTkFCTEUgfAorCQkJCSAgUkFERU9OX1ZUWF9GTVRfUkFERU9OX01PREUgfAorCQkJCSAgKDMgPDwgUkFERU9OX05VTV9WRVJUSUNFU19TSElGVCkpKTsKIAorCQkJT1VUX1JJTkcoZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWDFdKTsKKwkJCU9VVF9SSU5HKGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1kxXSk7CisJCQlPVVRfUklORyhkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ERVBUSF0pOworCQkJT1VUX1JJTkcoMHgwKTsKIAotCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1gxXSApOwotCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1kxXSApOwotCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX0RFUFRIXSApOwotCQkJT1VUX1JJTkcoIDB4MCApOworCQkJT1VUX1JJTkcoZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWDFdKTsKKwkJCU9VVF9SSU5HKGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1kyXSk7CisJCQlPVVRfUklORyhkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ERVBUSF0pOworCQkJT1VUX1JJTkcoMHgwKTsKIAotCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1gxXSApOwotCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1kyXSApOwotCQkJT1VUX1JJTkcoIGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX0RFUFRIXSApOwotCQkJT1VUX1JJTkcoIDB4MCApOwotCi0JCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWDJdICk7Ci0JCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWTJdICk7Ci0JCQlPVVRfUklORyggZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfREVQVEhdICk7Ci0JCQlPVVRfUklORyggMHgwICk7CisJCQlPVVRfUklORyhkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9YMl0pOworCQkJT1VUX1JJTkcoZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWTJdKTsKKwkJCU9VVF9SSU5HKGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX0RFUFRIXSk7CisJCQlPVVRfUklORygweDApOwogCiAJCQlBRFZBTkNFX1JJTkcoKTsKIAkJfQpAQCAtMTE3MSwxNSArMTE5NywxNSBAQAogCSAqLwogCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2NsZWFyKys7CiAKLQlCRUdJTl9SSU5HKCA0ICk7CisJQkVHSU5fUklORyg0KTsKIAotCVJBREVPTl9DTEVBUl9BR0UoIGRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2NsZWFyICk7CisJUkFERU9OX0NMRUFSX0FHRShkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9jbGVhcik7CiAJUkFERU9OX1dBSVRfVU5USUxfSURMRSgpOwogCiAJQURWQU5DRV9SSU5HKCk7CiB9CiAKLXN0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9zd2FwKCBkcm1fZGV2aWNlX3QgKmRldiApCitzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfc3dhcChkcm1fZGV2aWNlX3QgKiBkZXYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKQEAgLTExODcsNTkgKzEyMTMsNTUgQEAKIAlkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKIAlpbnQgaTsKIAlSSU5HX0xPQ0FMUzsKLQlEUk1fREVCVUcoICJcbiIgKTsKKwlEUk1fREVCVUcoIlxuIik7CiAKIAkvKiBEbyBzb21lIHRyaXZpYWwgcGVyZm9ybWFuY2UgbW9uaXRvcmluZy4uLgogCSAqLwogCWlmIChkZXZfcHJpdi0+ZG9fYm94ZXMpCi0JCXJhZGVvbl9jcF9wZXJmb3JtYW5jZV9ib3hlcyggZGV2X3ByaXYgKTsKLQorCQlyYWRlb25fY3BfcGVyZm9ybWFuY2VfYm94ZXMoZGV2X3ByaXYpOwogCiAJLyogV2FpdCBmb3IgdGhlIDNEIHN0cmVhbSB0byBpZGxlIGJlZm9yZSBkaXNwYXRjaGluZyB0aGUgYml0Ymx0LgogCSAqIFRoaXMgd2lsbCBwcmV2ZW50IGRhdGEgY29ycnVwdGlvbiBiZXR3ZWVuIHRoZSB0d28gc3RyZWFtcy4KIAkgKi8KLQlCRUdJTl9SSU5HKCAyICk7CisJQkVHSU5fUklORygyKTsKIAogCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsKIAogCUFEVkFOQ0VfUklORygpOwogCi0JZm9yICggaSA9IDAgOyBpIDwgbmJveCA7IGkrKyApIHsKKwlmb3IgKGkgPSAwOyBpIDwgbmJveDsgaSsrKSB7CiAJCWludCB4ID0gcGJveFtpXS54MTsKIAkJaW50IHkgPSBwYm94W2ldLnkxOwogCQlpbnQgdyA9IHBib3hbaV0ueDIgLSB4OwogCQlpbnQgaCA9IHBib3hbaV0ueTIgLSB5OwogCi0JCURSTV9ERUJVRyggImRpc3BhdGNoIHN3YXAgJWQsJWQtJWQsJWRcbiIsCi0JCQkgICB4LCB5LCB3LCBoICk7CisJCURSTV9ERUJVRygiZGlzcGF0Y2ggc3dhcCAlZCwlZC0lZCwlZFxuIiwgeCwgeSwgdywgaCk7CiAKLQkJQkVHSU5fUklORyggNyApOworCQlCRUdJTl9SSU5HKDcpOwogCi0JCU9VVF9SSU5HKCBDUF9QQUNLRVQzKCBSQURFT05fQ05UTF9CSVRCTFRfTVVMVEksIDUgKSApOwotCQlPVVRfUklORyggUkFERU9OX0dNQ19TUkNfUElUQ0hfT0ZGU0VUX0NOVEwgfAotCQkJICBSQURFT05fR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCB8Ci0JCQkgIFJBREVPTl9HTUNfQlJVU0hfTk9ORSB8Ci0JCQkgIChkZXZfcHJpdi0+Y29sb3JfZm10IDw8IDgpIHwKLQkJCSAgUkFERU9OX0dNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAotCQkJICBSQURFT05fUk9QM19TIHwKLQkJCSAgUkFERU9OX0RQX1NSQ19TT1VSQ0VfTUVNT1JZIHwKLQkJCSAgUkFERU9OX0dNQ19DTFJfQ01QX0NOVExfRElTIHwKLQkJCSAgUkFERU9OX0dNQ19XUl9NU0tfRElTICk7Ci0JCQorCQlPVVRfUklORyhDUF9QQUNLRVQzKFJBREVPTl9DTlRMX0JJVEJMVF9NVUxUSSwgNSkpOworCQlPVVRfUklORyhSQURFT05fR01DX1NSQ19QSVRDSF9PRkZTRVRfQ05UTCB8CisJCQkgUkFERU9OX0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAorCQkJIFJBREVPTl9HTUNfQlJVU0hfTk9ORSB8CisJCQkgKGRldl9wcml2LT5jb2xvcl9mbXQgPDwgOCkgfAorCQkJIFJBREVPTl9HTUNfU1JDX0RBVEFUWVBFX0NPTE9SIHwKKwkJCSBSQURFT05fUk9QM19TIHwKKwkJCSBSQURFT05fRFBfU1JDX1NPVVJDRV9NRU1PUlkgfAorCQkJIFJBREVPTl9HTUNfQ0xSX0NNUF9DTlRMX0RJUyB8IFJBREVPTl9HTUNfV1JfTVNLX0RJUyk7CisKIAkJLyogTWFrZSB0aGlzIHdvcmsgZXZlbiBpZiBmcm9udCAmIGJhY2sgYXJlIGZsaXBwZWQ6CiAJCSAqLwogCQlpZiAoZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9PSAwKSB7Ci0JCQlPVVRfUklORyggZGV2X3ByaXYtPmJhY2tfcGl0Y2hfb2Zmc2V0ICk7Ci0JCQlPVVRfUklORyggZGV2X3ByaXYtPmZyb250X3BpdGNoX29mZnNldCApOwotCQl9IAotCQllbHNlIHsKLQkJCU9VVF9SSU5HKCBkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0ICk7Ci0JCQlPVVRfUklORyggZGV2X3ByaXYtPmJhY2tfcGl0Y2hfb2Zmc2V0ICk7CisJCQlPVVRfUklORyhkZXZfcHJpdi0+YmFja19waXRjaF9vZmZzZXQpOworCQkJT1VUX1JJTkcoZGV2X3ByaXYtPmZyb250X3BpdGNoX29mZnNldCk7CisJCX0gZWxzZSB7CisJCQlPVVRfUklORyhkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0KTsKKwkJCU9VVF9SSU5HKGRldl9wcml2LT5iYWNrX3BpdGNoX29mZnNldCk7CiAJCX0KIAotCQlPVVRfUklORyggKHggPDwgMTYpIHwgeSApOwotCQlPVVRfUklORyggKHggPDwgMTYpIHwgeSApOwotCQlPVVRfUklORyggKHcgPDwgMTYpIHwgaCApOworCQlPVVRfUklORygoeCA8PCAxNikgfCB5KTsKKwkJT1VUX1JJTkcoKHggPDwgMTYpIHwgeSk7CisJCU9VVF9SSU5HKCh3IDw8IDE2KSB8IGgpOwogCiAJCUFEVkFOQ0VfUklORygpOwogCX0KQEAgLTEyNTAsNDQgKzEyNzIsNDMgQEAKIAkgKi8KIAlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9mcmFtZSsrOwogCi0JQkVHSU5fUklORyggNCApOworCUJFR0lOX1JJTkcoNCk7CiAKLQlSQURFT05fRlJBTUVfQUdFKCBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9mcmFtZSApOworCVJBREVPTl9GUkFNRV9BR0UoZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZnJhbWUpOwogCVJBREVPTl9XQUlUX1VOVElMXzJEX0lETEUoKTsKIAogCUFEVkFOQ0VfUklORygpOwogfQogCi1zdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfZmxpcCggZHJtX2RldmljZV90ICpkZXYgKQorc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX2ZsaXAoZHJtX2RldmljZV90ICogZGV2KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0JZHJtX3NhcmVhX3QgKnNhcmVhID0gKGRybV9zYXJlYV90ICopZGV2X3ByaXYtPnNhcmVhLT5oYW5kbGU7CisJZHJtX3NhcmVhX3QgKnNhcmVhID0gKGRybV9zYXJlYV90ICopIGRldl9wcml2LT5zYXJlYS0+aGFuZGxlOwogCWludCBvZmZzZXQgPSAoZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9PSAxKQotCQkgICA/IGRldl9wcml2LT5mcm9udF9vZmZzZXQgOiBkZXZfcHJpdi0+YmFja19vZmZzZXQ7CisJICAgID8gZGV2X3ByaXYtPmZyb250X29mZnNldCA6IGRldl9wcml2LT5iYWNrX29mZnNldDsKIAlSSU5HX0xPQ0FMUzsKLQlEUk1fREVCVUcoICIlczogcGFnZT0lZCBwZkN1cnJlbnRQYWdlPSVkXG4iLCAKLQkJX19GVU5DVElPTl9fLCAKLQkJZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSwKLQkJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmQ3VycmVudFBhZ2UpOworCURSTV9ERUJVRygiJXM6IHBhZ2U9JWQgcGZDdXJyZW50UGFnZT0lZFxuIiwKKwkJICBfX0ZVTkNUSU9OX18sCisJCSAgZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSwgZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmQ3VycmVudFBhZ2UpOwogCiAJLyogRG8gc29tZSB0cml2aWFsIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcuLi4KIAkgKi8KIAlpZiAoZGV2X3ByaXYtPmRvX2JveGVzKSB7CiAJCWRldl9wcml2LT5zdGF0cy5ib3hlcyB8PSBSQURFT05fQk9YX0ZMSVA7Ci0JCXJhZGVvbl9jcF9wZXJmb3JtYW5jZV9ib3hlcyggZGV2X3ByaXYgKTsKKwkJcmFkZW9uX2NwX3BlcmZvcm1hbmNlX2JveGVzKGRldl9wcml2KTsKIAl9CiAKIAkvKiBVcGRhdGUgdGhlIGZyYW1lIG9mZnNldHMgZm9yIGJvdGggQ1JUQ3MKIAkgKi8KLQlCRUdJTl9SSU5HKCA2ICk7CisJQkVHSU5fUklORyg2KTsKIAogCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsKLQlPVVRfUklOR19SRUcoIFJBREVPTl9DUlRDX09GRlNFVCwgKCAoIHNhcmVhLT5mcmFtZS55ICogZGV2X3ByaXYtPmZyb250X3BpdGNoCi0JCQkJCSAgICAgICsgc2FyZWEtPmZyYW1lLnggCi0JCQkJCSAgICAgICogKCBkZXZfcHJpdi0+Y29sb3JfZm10IC0gMiApICkgJiB+NyApCi0JCQkJCSAgKyBvZmZzZXQgKTsKLQlPVVRfUklOR19SRUcoIFJBREVPTl9DUlRDMl9PRkZTRVQsIGRldl9wcml2LT5zYXJlYV9wcml2LT5jcnRjMl9iYXNlCi0JCQkJCSAgICsgb2Zmc2V0ICk7CisJT1VUX1JJTkdfUkVHKFJBREVPTl9DUlRDX09GRlNFVCwKKwkJICAgICAoKHNhcmVhLT5mcmFtZS55ICogZGV2X3ByaXYtPmZyb250X3BpdGNoICsKKwkJICAgICAgIHNhcmVhLT5mcmFtZS54ICogKGRldl9wcml2LT5jb2xvcl9mbXQgLSAyKSkgJiB+NykKKwkJICAgICArIG9mZnNldCk7CisJT1VUX1JJTkdfUkVHKFJBREVPTl9DUlRDMl9PRkZTRVQsIGRldl9wcml2LT5zYXJlYV9wcml2LT5jcnRjMl9iYXNlCisJCSAgICAgKyBvZmZzZXQpOwogCiAJQURWQU5DRV9SSU5HKCk7CiAKQEAgLTEyOTcsMTYgKzEzMTgsMTYgQEAKIAkgKi8KIAlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9mcmFtZSsrOwogCWRldl9wcml2LT5zYXJlYV9wcml2LT5wZkN1cnJlbnRQYWdlID0gZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9Ci0JCQkJCSAgICAgIDEgLSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlOworCSAgICAxIC0gZGV2X3ByaXYtPmN1cnJlbnRfcGFnZTsKIAotCUJFR0lOX1JJTkcoIDIgKTsKKwlCRUdJTl9SSU5HKDIpOwogCi0JUkFERU9OX0ZSQU1FX0FHRSggZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZnJhbWUgKTsKKwlSQURFT05fRlJBTUVfQUdFKGRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2ZyYW1lKTsKIAogCUFEVkFOQ0VfUklORygpOwogfQogCi1zdGF0aWMgaW50IGJhZF9wcmltX3ZlcnRleF9uciggaW50IHByaW1pdGl2ZSwgaW50IG5yICkKK3N0YXRpYyBpbnQgYmFkX3ByaW1fdmVydGV4X25yKGludCBwcmltaXRpdmUsIGludCBucikKIHsKIAlzd2l0Y2ggKHByaW1pdGl2ZSAmIFJBREVPTl9QUklNX1RZUEVfTUFTSykgewogCWNhc2UgUkFERU9OX1BSSU1fVFlQRV9OT05FOgpAQCAtMTMyNiwyNCArMTM0NywyMSBAQAogCQlyZXR1cm4gbnIgPCAzOwogCWRlZmF1bHQ6CiAJCXJldHVybiAxOwotCX0JCisJfQogfQogCi0KLQogdHlwZWRlZiBzdHJ1Y3QgewogCXVuc2lnbmVkIGludCBzdGFydDsKIAl1bnNpZ25lZCBpbnQgZmluaXNoOwogCXVuc2lnbmVkIGludCBwcmltOwogCXVuc2lnbmVkIGludCBudW12ZXJ0czsKLQl1bnNpZ25lZCBpbnQgb2Zmc2V0OyAgIAotICAgICAgICB1bnNpZ25lZCBpbnQgdmNfZm9ybWF0OworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJdW5zaWduZWQgaW50IHZjX2Zvcm1hdDsKIH0gZHJtX3JhZGVvbl90Y2xfcHJpbV90OwogCi1zdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfdmVydGV4KCBkcm1fZGV2aWNlX3QgKmRldiwKLQkJCQkgICAgICAgZHJtX2J1Zl90ICpidWYsCi0JCQkJICAgICAgIGRybV9yYWRlb25fdGNsX3ByaW1fdCAqcHJpbSApCi0KK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF92ZXJ0ZXgoZHJtX2RldmljZV90ICogZGV2LAorCQkJCSAgICAgIGRybV9idWZfdCAqIGJ1ZiwKKwkJCQkgICAgICBkcm1fcmFkZW9uX3RjbF9wcmltX3QgKiBwcmltKQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CkBAIC0xMzU1LDQ1ICsxMzczLDM5IEBACiAKIAlEUk1fREVCVUcoImh3cHJpbSAweCV4IHZmbXQgMHgleCAlZC4uJWQgJWQgdmVydHNcbiIsCiAJCSAgcHJpbS0+cHJpbSwKLQkJICBwcmltLT52Y19mb3JtYXQsCi0JCSAgcHJpbS0+c3RhcnQsCi0JCSAgcHJpbS0+ZmluaXNoLAotCQkgIHByaW0tPm51bXZlcnRzKTsKKwkJICBwcmltLT52Y19mb3JtYXQsIHByaW0tPnN0YXJ0LCBwcmltLT5maW5pc2gsIHByaW0tPm51bXZlcnRzKTsKIAotCWlmIChiYWRfcHJpbV92ZXJ0ZXhfbnIoIHByaW0tPnByaW0sIHByaW0tPm51bXZlcnRzICkpIHsKLQkJRFJNX0VSUk9SKCAiYmFkIHByaW0gJXggbnVtdmVydHMgJWRcbiIsIAotCQkJICAgcHJpbS0+cHJpbSwgcHJpbS0+bnVtdmVydHMgKTsKKwlpZiAoYmFkX3ByaW1fdmVydGV4X25yKHByaW0tPnByaW0sIHByaW0tPm51bXZlcnRzKSkgeworCQlEUk1fRVJST1IoImJhZCBwcmltICV4IG51bXZlcnRzICVkXG4iLAorCQkJICBwcmltLT5wcmltLCBwcmltLT5udW12ZXJ0cyk7CiAJCXJldHVybjsKIAl9CiAKIAlkbyB7CiAJCS8qIEVtaXQgdGhlIG5leHQgY2xpcHJlY3QgKi8KLQkJaWYgKCBpIDwgbmJveCApIHsKLQkJCXJhZGVvbl9lbWl0X2NsaXBfcmVjdCggZGV2X3ByaXYsIAotCQkJCQkgICAgICAgJnNhcmVhX3ByaXYtPmJveGVzW2ldICk7CisJCWlmIChpIDwgbmJveCkgeworCQkJcmFkZW9uX2VtaXRfY2xpcF9yZWN0KGRldl9wcml2LCAmc2FyZWFfcHJpdi0+Ym94ZXNbaV0pOwogCQl9CiAKIAkJLyogRW1pdCB0aGUgdmVydGV4IGJ1ZmZlciByZW5kZXJpbmcgY29tbWFuZHMgKi8KLQkJQkVHSU5fUklORyggNSApOworCQlCRUdJTl9SSU5HKDUpOwogCi0JCU9VVF9SSU5HKCBDUF9QQUNLRVQzKCBSQURFT05fM0RfUk5EUl9HRU5fSU5EWF9QUklNLCAzICkgKTsKLQkJT1VUX1JJTkcoIG9mZnNldCApOwotCQlPVVRfUklORyggbnVtdmVydHMgKTsKLQkJT1VUX1JJTkcoIHByaW0tPnZjX2Zvcm1hdCApOwotCQlPVVRfUklORyggcHJpbS0+cHJpbSB8IFJBREVPTl9QUklNX1dBTEtfTElTVCB8Ci0JCQkgIFJBREVPTl9DT0xPUl9PUkRFUl9SR0JBIHwKLQkJCSAgUkFERU9OX1ZUWF9GTVRfUkFERU9OX01PREUgfAotCQkJICAobnVtdmVydHMgPDwgUkFERU9OX05VTV9WRVJUSUNFU19TSElGVCkgKTsKKwkJT1VUX1JJTkcoQ1BfUEFDS0VUMyhSQURFT05fM0RfUk5EUl9HRU5fSU5EWF9QUklNLCAzKSk7CisJCU9VVF9SSU5HKG9mZnNldCk7CisJCU9VVF9SSU5HKG51bXZlcnRzKTsKKwkJT1VUX1JJTkcocHJpbS0+dmNfZm9ybWF0KTsKKwkJT1VUX1JJTkcocHJpbS0+cHJpbSB8IFJBREVPTl9QUklNX1dBTEtfTElTVCB8CisJCQkgUkFERU9OX0NPTE9SX09SREVSX1JHQkEgfAorCQkJIFJBREVPTl9WVFhfRk1UX1JBREVPTl9NT0RFIHwKKwkJCSAobnVtdmVydHMgPDwgUkFERU9OX05VTV9WRVJUSUNFU19TSElGVCkpOwogCiAJCUFEVkFOQ0VfUklORygpOwogCiAJCWkrKzsKLQl9IHdoaWxlICggaSA8IG5ib3ggKTsKKwl9IHdoaWxlIChpIDwgbmJveCk7CiB9CiAKLQotCi1zdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoIGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fYnVmX3QgKmJ1ZiApCitzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoZHJtX2RldmljZV90ICogZGV2LCBkcm1fYnVmX3QgKiBidWYpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fcmFkZW9uX2J1Zl9wcml2X3QgKmJ1Zl9wcml2ID0gYnVmLT5kZXZfcHJpdmF0ZTsKQEAgLTE0MDIsMjQgKzE0MTQsMjIgQEAKIAlidWZfcHJpdi0+YWdlID0gKytkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9kaXNwYXRjaDsKIAogCS8qIEVtaXQgdGhlIHZlcnRleCBidWZmZXIgYWdlICovCi0JQkVHSU5fUklORyggMiApOwotCVJBREVPTl9ESVNQQVRDSF9BR0UoIGJ1Zl9wcml2LT5hZ2UgKTsKKwlCRUdJTl9SSU5HKDIpOworCVJBREVPTl9ESVNQQVRDSF9BR0UoYnVmX3ByaXYtPmFnZSk7CiAJQURWQU5DRV9SSU5HKCk7CiAKIAlidWYtPnBlbmRpbmcgPSAxOwogCWJ1Zi0+dXNlZCA9IDA7CiB9CiAKLXN0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9pbmRpcmVjdCggZHJtX2RldmljZV90ICpkZXYsCi0JCQkJCSBkcm1fYnVmX3QgKmJ1ZiwKLQkJCQkJIGludCBzdGFydCwgaW50IGVuZCApCitzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfaW5kaXJlY3QoZHJtX2RldmljZV90ICogZGV2LAorCQkJCQlkcm1fYnVmX3QgKiBidWYsIGludCBzdGFydCwgaW50IGVuZCkKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCVJJTkdfTE9DQUxTOwotCURSTV9ERUJVRyggImluZGlyZWN0OiBidWY9JWQgcz0weCV4IGU9MHgleFxuIiwKLQkJICAgYnVmLT5pZHgsIHN0YXJ0LCBlbmQgKTsKKwlEUk1fREVCVUcoImluZGlyZWN0OiBidWY9JWQgcz0weCV4IGU9MHgleFxuIiwgYnVmLT5pZHgsIHN0YXJ0LCBlbmQpOwogCi0JaWYgKCBzdGFydCAhPSBlbmQgKSB7CisJaWYgKHN0YXJ0ICE9IGVuZCkgewogCQlpbnQgb2Zmc2V0ID0gKGRldl9wcml2LT5nYXJ0X2J1ZmZlcnNfb2Zmc2V0CiAJCQkgICAgICArIGJ1Zi0+b2Zmc2V0ICsgc3RhcnQpOwogCQlpbnQgZHdvcmRzID0gKGVuZCAtIHN0YXJ0ICsgMykgLyBzaXplb2YodTMyKTsKQEAgLTE0MjgsMjggKzE0MzgsMjcgQEAKIAkJICogZHdvcmRzLCBzbyBpZiB3ZSd2ZSBiZWVuIGdpdmVuIGFuIG9kZCBudW1iZXIgd2UgbXVzdAogCQkgKiBwYWQgdGhlIGRhdGEgd2l0aCBhIFR5cGUtMiBDUCBwYWNrZXQuCiAJCSAqLwotCQlpZiAoIGR3b3JkcyAmIDEgKSB7CisJCWlmIChkd29yZHMgJiAxKSB7CiAJCQl1MzIgKmRhdGEgPSAodTMyICopCi0JCQkJKChjaGFyICopZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlCi0JCQkJICsgYnVmLT5vZmZzZXQgKyBzdGFydCk7CisJCQkgICAgKChjaGFyICopZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlCisJCQkgICAgICsgYnVmLT5vZmZzZXQgKyBzdGFydCk7CiAJCQlkYXRhW2R3b3JkcysrXSA9IFJBREVPTl9DUF9QQUNLRVQyOwogCQl9CiAKIAkJLyogRmlyZSBvZmYgdGhlIGluZGlyZWN0IGJ1ZmZlciAqLwotCQlCRUdJTl9SSU5HKCAzICk7CisJCUJFR0lOX1JJTkcoMyk7CiAKLQkJT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9DUF9JQl9CQVNFLCAxICkgKTsKLQkJT1VUX1JJTkcoIG9mZnNldCApOwotCQlPVVRfUklORyggZHdvcmRzICk7CisJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX0NQX0lCX0JBU0UsIDEpKTsKKwkJT1VUX1JJTkcob2Zmc2V0KTsKKwkJT1VUX1JJTkcoZHdvcmRzKTsKIAogCQlBRFZBTkNFX1JJTkcoKTsKIAl9CiB9CiAKLQotc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX2luZGljZXMoIGRybV9kZXZpY2VfdCAqZGV2LAotCQkJCQlkcm1fYnVmX3QgKmVsdF9idWYsCi0JCQkJCWRybV9yYWRlb25fdGNsX3ByaW1fdCAqcHJpbSApCitzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfaW5kaWNlcyhkcm1fZGV2aWNlX3QgKiBkZXYsCisJCQkJICAgICAgIGRybV9idWZfdCAqIGVsdF9idWYsCisJCQkJICAgICAgIGRybV9yYWRlb25fdGNsX3ByaW1fdCAqIHByaW0pCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKQEAgLTE0NjQsMzAgKzE0NzMsMjQgQEAKIAlEUk1fREVCVUcoImh3cHJpbSAweCV4IHZmbXQgMHgleCAlZC4uJWQgb2Zmc2V0OiAleCBuciAlZFxuIiwKIAkJICBwcmltLT5wcmltLAogCQkgIHByaW0tPnZjX2Zvcm1hdCwKLQkJICBwcmltLT5zdGFydCwKLQkJICBwcmltLT5maW5pc2gsCi0JCSAgcHJpbS0+b2Zmc2V0LAotCQkgIHByaW0tPm51bXZlcnRzKTsKKwkJICBwcmltLT5zdGFydCwgcHJpbS0+ZmluaXNoLCBwcmltLT5vZmZzZXQsIHByaW0tPm51bXZlcnRzKTsKIAotCWlmIChiYWRfcHJpbV92ZXJ0ZXhfbnIoIHByaW0tPnByaW0sIGNvdW50ICkpIHsKLQkJRFJNX0VSUk9SKCAiYmFkIHByaW0gJXggY291bnQgJWRcbiIsIAotCQkJICAgcHJpbS0+cHJpbSwgY291bnQgKTsKKwlpZiAoYmFkX3ByaW1fdmVydGV4X25yKHByaW0tPnByaW0sIGNvdW50KSkgeworCQlEUk1fRVJST1IoImJhZCBwcmltICV4IGNvdW50ICVkXG4iLCBwcmltLT5wcmltLCBjb3VudCk7CiAJCXJldHVybjsKIAl9CiAKLQotCWlmICggc3RhcnQgPj0gcHJpbS0+ZmluaXNoIHx8Ci0JICAgICAocHJpbS0+c3RhcnQgJiAweDcpICkgewotCQlEUk1fRVJST1IoICJidWZmZXIgcHJpbSAlZFxuIiwgcHJpbS0+cHJpbSApOworCWlmIChzdGFydCA+PSBwcmltLT5maW5pc2ggfHwgKHByaW0tPnN0YXJ0ICYgMHg3KSkgeworCQlEUk1fRVJST1IoImJ1ZmZlciBwcmltICVkXG4iLCBwcmltLT5wcmltKTsKIAkJcmV0dXJuOwogCX0KIAogCWR3b3JkcyA9IChwcmltLT5maW5pc2ggLSBwcmltLT5zdGFydCArIDMpIC8gc2l6ZW9mKHUzMik7CiAKLQlkYXRhID0gKHUzMiAqKSgoY2hhciAqKWRldi0+YWdwX2J1ZmZlcl9tYXAtPmhhbmRsZSArCi0JCSAgICAgICBlbHRfYnVmLT5vZmZzZXQgKyBwcmltLT5zdGFydCk7CisJZGF0YSA9ICh1MzIgKikgKChjaGFyICopZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlICsKKwkJCWVsdF9idWYtPm9mZnNldCArIHByaW0tPnN0YXJ0KTsKIAotCWRhdGFbMF0gPSBDUF9QQUNLRVQzKCBSQURFT05fM0RfUk5EUl9HRU5fSU5EWF9QUklNLCBkd29yZHMtMiApOworCWRhdGFbMF0gPSBDUF9QQUNLRVQzKFJBREVPTl8zRF9STkRSX0dFTl9JTkRYX1BSSU0sIGR3b3JkcyAtIDIpOwogCWRhdGFbMV0gPSBvZmZzZXQ7CiAJZGF0YVsyXSA9IHByaW0tPm51bXZlcnRzOwogCWRhdGFbM10gPSBwcmltLT52Y19mb3JtYXQ7CkBAIC0xNDk1LDI4ICsxNDk4LDI2IEBACiAJCSAgIFJBREVPTl9QUklNX1dBTEtfSU5EIHwKIAkJICAgUkFERU9OX0NPTE9SX09SREVSX1JHQkEgfAogCQkgICBSQURFT05fVlRYX0ZNVF9SQURFT05fTU9ERSB8Ci0JCSAgIChjb3VudCA8PCBSQURFT05fTlVNX1ZFUlRJQ0VTX1NISUZUKSApOworCQkgICAoY291bnQgPDwgUkFERU9OX05VTV9WRVJUSUNFU19TSElGVCkpOwogCiAJZG8gewotCQlpZiAoIGkgPCBuYm94ICkgCi0JCQlyYWRlb25fZW1pdF9jbGlwX3JlY3QoIGRldl9wcml2LCAKLQkJCQkJICAgICAgICZzYXJlYV9wcml2LT5ib3hlc1tpXSApOworCQlpZiAoaSA8IG5ib3gpCisJCQlyYWRlb25fZW1pdF9jbGlwX3JlY3QoZGV2X3ByaXYsICZzYXJlYV9wcml2LT5ib3hlc1tpXSk7CiAKLQkJcmFkZW9uX2NwX2Rpc3BhdGNoX2luZGlyZWN0KCBkZXYsIGVsdF9idWYsCi0JCQkJCSAgICAgcHJpbS0+c3RhcnQsCi0JCQkJCSAgICAgcHJpbS0+ZmluaXNoICk7CisJCXJhZGVvbl9jcF9kaXNwYXRjaF9pbmRpcmVjdChkZXYsIGVsdF9idWYsCisJCQkJCSAgICBwcmltLT5zdGFydCwgcHJpbS0+ZmluaXNoKTsKIAogCQlpKys7Ci0JfSB3aGlsZSAoIGkgPCBuYm94ICk7CisJfSB3aGlsZSAoaSA8IG5ib3gpOwogCiB9CiAKICNkZWZpbmUgUkFERU9OX01BWF9URVhUVVJFX1NJWkUgUkFERU9OX0JVRkZFUl9TSVpFCiAKLXN0YXRpYyBpbnQgcmFkZW9uX2NwX2Rpc3BhdGNoX3RleHR1cmUoIERSTUZJTEUgZmlscCwKLQkJCQkgICAgICAgZHJtX2RldmljZV90ICpkZXYsCi0JCQkJICAgICAgIGRybV9yYWRlb25fdGV4dHVyZV90ICp0ZXgsCi0JCQkJICAgICAgIGRybV9yYWRlb25fdGV4X2ltYWdlX3QgKmltYWdlICkKK3N0YXRpYyBpbnQgcmFkZW9uX2NwX2Rpc3BhdGNoX3RleHR1cmUoRFJNRklMRSBmaWxwLAorCQkJCSAgICAgIGRybV9kZXZpY2VfdCAqIGRldiwKKwkJCQkgICAgICBkcm1fcmFkZW9uX3RleHR1cmVfdCAqIHRleCwKKwkJCQkgICAgICBkcm1fcmFkZW9uX3RleF9pbWFnZV90ICogaW1hZ2UpCiB7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fZmlsZV90ICpmaWxwX3ByaXY7CkBAIC0xNTMxLDExICsxNTMyLDExIEBACiAJdTMyIG9mZnNldDsKIAlSSU5HX0xPQ0FMUzsKIAotCURSTV9HRVRfUFJJVl9XSVRIX1JFVFVSTiggZmlscF9wcml2LCBmaWxwICk7CisJRFJNX0dFVF9QUklWX1dJVEhfUkVUVVJOKGZpbHBfcHJpdiwgZmlscCk7CiAKLQlpZiAoIHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KCBkZXZfcHJpdiwgZmlscF9wcml2LCAmdGV4LT5vZmZzZXQgKSApIHsKLQkJRFJNX0VSUk9SKCAiSW52YWxpZCBkZXN0aW5hdGlvbiBvZmZzZXRcbiIgKTsKLQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldChkZXZfcHJpdiwgZmlscF9wcml2LCAmdGV4LT5vZmZzZXQpKSB7CisJCURSTV9FUlJPUigiSW52YWxpZCBkZXN0aW5hdGlvbiBvZmZzZXRcbiIpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KIAogCWRldl9wcml2LT5zdGF0cy5ib3hlcyB8PSBSQURFT05fQk9YX1RFWFRVUkVfTE9BRDsKQEAgLTE1NDQsNyArMTU0NSw3IEBACiAJICogdXAgd2l0aCB0aGUgdGV4dHVyZSBkYXRhIGZyb20gdGhlIGhvc3QgZGF0YSBibGl0LCBvdGhlcndpc2UKIAkgKiBwYXJ0IG9mIHRoZSB0ZXh0dXJlIGltYWdlIG1heSBiZSBjb3JydXB0ZWQuCiAJICovCi0JQkVHSU5fUklORyggNCApOworCUJFR0lOX1JJTkcoNCk7CiAJUkFERU9OX0ZMVVNIX0NBQ0hFKCk7CiAJUkFERU9OX1dBSVRfVU5USUxfSURMRSgpOwogCUFEVkFOQ0VfUklORygpOwpAQCAtMTU1Myw3ICsxNTU0LDcgQEAKIAkgKiBldmVuIGlmIHRoZSBvbmx5IGxlZ2FsIHZhbHVlcyBhcmUgcG93ZXJzIG9mIHR3by4gIFRodXMsIHdlJ2xsCiAJICogdXNlIGEgc2hpZnQgaW5zdGVhZC4KIAkgKi8KLQlzd2l0Y2ggKCB0ZXgtPmZvcm1hdCApIHsKKwlzd2l0Y2ggKHRleC0+Zm9ybWF0KSB7CiAJY2FzZSBSQURFT05fVFhGT1JNQVRfQVJHQjg4ODg6CiAJY2FzZSBSQURFT05fVFhGT1JNQVRfUkdCQTg4ODg6CiAJCWZvcm1hdCA9IFJBREVPTl9DT0xPUl9GT1JNQVRfQVJHQjg4ODg7CkBAIC0xNTc3LDcgKzE1NzgsNyBAQAogCQlibGl0X3dpZHRoID0gaW1hZ2UtPndpZHRoICogMTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJRFJNX0VSUk9SKCAiaW52YWxpZCB0ZXh0dXJlIGZvcm1hdCAlZFxuIiwgdGV4LT5mb3JtYXQgKTsKKwkJRFJNX0VSUk9SKCJpbnZhbGlkIHRleHR1cmUgZm9ybWF0ICVkXG4iLCB0ZXgtPmZvcm1hdCk7CiAJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJfQogCXNwaXRjaCA9IGJsaXRfd2lkdGggPj4gNjsKQEAgLTE1OTIsNDkgKzE1OTMsNDkgQEAKIAkJCS8qIHdlIGdvdCB0aWxlZCBjb29yZGluYXRlcywgdW50aWxlIHRoZW0gKi8KIAkJCWltYWdlLT54ICo9IDI7CiAJCX0KLQl9Ci0JZWxzZSBtaWNyb3RpbGUgPSAwOworCX0gZWxzZQorCQltaWNyb3RpbGUgPSAwOwogCi0JRFJNX0RFQlVHKCJ0ZXg9JWR4JWQgYmxpdD0lZFxuIiwgdGV4X3dpZHRoLCB0ZXgtPmhlaWdodCwgYmxpdF93aWR0aCApOworCURSTV9ERUJVRygidGV4PSVkeCVkIGJsaXQ9JWRcbiIsIHRleF93aWR0aCwgdGV4LT5oZWlnaHQsIGJsaXRfd2lkdGgpOwogCiAJZG8gewotCQlEUk1fREVCVUcoICJ0ZXg6IG9mcz0weCV4IHA9JWQgZj0lZCB4PSVoZCB5PSVoZCB3PSVoZCBoPSVoZFxuIiwKLQkJCSAgIHRleC0+b2Zmc2V0ID4+IDEwLCB0ZXgtPnBpdGNoLCB0ZXgtPmZvcm1hdCwKLQkJCSAgIGltYWdlLT54LCBpbWFnZS0+eSwgaW1hZ2UtPndpZHRoLCBpbWFnZS0+aGVpZ2h0ICk7CisJCURSTV9ERUJVRygidGV4OiBvZnM9MHgleCBwPSVkIGY9JWQgeD0laGQgeT0laGQgdz0laGQgaD0laGRcbiIsCisJCQkgIHRleC0+b2Zmc2V0ID4+IDEwLCB0ZXgtPnBpdGNoLCB0ZXgtPmZvcm1hdCwKKwkJCSAgaW1hZ2UtPngsIGltYWdlLT55LCBpbWFnZS0+d2lkdGgsIGltYWdlLT5oZWlnaHQpOwogCiAJCS8qIE1ha2UgYSBjb3B5IG9mIHNvbWUgcGFyYW1ldGVycyBpbiBjYXNlIHdlIGhhdmUgdG8KIAkJICogdXBkYXRlIHRoZW0gZm9yIGEgbXVsdGktcGFzcyB0ZXh0dXJlIGJsaXQuCiAJCSAqLwogCQloZWlnaHQgPSBpbWFnZS0+aGVpZ2h0OwogCQlkYXRhID0gKGNvbnN0IHU4IF9fdXNlciAqKWltYWdlLT5kYXRhOwotCQkKKwogCQlzaXplID0gaGVpZ2h0ICogYmxpdF93aWR0aDsKIAotCQlpZiAoIHNpemUgPiBSQURFT05fTUFYX1RFWFRVUkVfU0laRSApIHsKKwkJaWYgKHNpemUgPiBSQURFT05fTUFYX1RFWFRVUkVfU0laRSkgewogCQkJaGVpZ2h0ID0gUkFERU9OX01BWF9URVhUVVJFX1NJWkUgLyBibGl0X3dpZHRoOwogCQkJc2l6ZSA9IGhlaWdodCAqIGJsaXRfd2lkdGg7Ci0JCX0gZWxzZSBpZiAoIHNpemUgPCA0ICYmIHNpemUgPiAwICkgeworCQl9IGVsc2UgaWYgKHNpemUgPCA0ICYmIHNpemUgPiAwKSB7CiAJCQlzaXplID0gNDsKLQkJfSBlbHNlIGlmICggc2l6ZSA9PSAwICkgeworCQl9IGVsc2UgaWYgKHNpemUgPT0gMCkgewogCQkJcmV0dXJuIDA7CiAJCX0KIAotCQlidWYgPSByYWRlb25fZnJlZWxpc3RfZ2V0KCBkZXYgKTsKLQkJaWYgKCAwICYmICFidWYgKSB7Ci0JCQlyYWRlb25fZG9fY3BfaWRsZSggZGV2X3ByaXYgKTsKLQkJCWJ1ZiA9IHJhZGVvbl9mcmVlbGlzdF9nZXQoIGRldiApOworCQlidWYgPSByYWRlb25fZnJlZWxpc3RfZ2V0KGRldik7CisJCWlmICgwICYmICFidWYpIHsKKwkJCXJhZGVvbl9kb19jcF9pZGxlKGRldl9wcml2KTsKKwkJCWJ1ZiA9IHJhZGVvbl9mcmVlbGlzdF9nZXQoZGV2KTsKIAkJfQotCQlpZiAoICFidWYgKSB7CisJCWlmICghYnVmKSB7CiAJCQlEUk1fREVCVUcoInJhZGVvbl9jcF9kaXNwYXRjaF90ZXh0dXJlOiBFQUdBSU5cbiIpOwotCQkJaWYgKERSTV9DT1BZX1RPX1VTRVIoIHRleC0+aW1hZ2UsIGltYWdlLCBzaXplb2YoKmltYWdlKSApKQorCQkJaWYgKERSTV9DT1BZX1RPX1VTRVIodGV4LT5pbWFnZSwgaW1hZ2UsIHNpemVvZigqaW1hZ2UpKSkKIAkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwogCQkJcmV0dXJuIERSTV9FUlIoRUFHQUlOKTsKIAkJfQogCi0KIAkJLyogRGlzcGF0Y2ggdGhlIGluZGlyZWN0IGJ1ZmZlci4KIAkJICovCi0JCWJ1ZmZlciA9ICh1MzIqKSgoY2hhciopZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlICsgYnVmLT5vZmZzZXQpOworCQlidWZmZXIgPQorCQkgICAgKHUzMiAqKSAoKGNoYXIgKilkZXYtPmFncF9idWZmZXJfbWFwLT5oYW5kbGUgKyBidWYtPm9mZnNldCk7CiAJCWR3b3JkcyA9IHNpemUgLyA0OwogCiAJCWlmIChtaWNyb3RpbGUpIHsKQEAgLTE2NDksMjAgKzE2NTAsMjYgQEAKIAkJCWlmICh0ZXgtPmhlaWdodCA9PSAxKSB7CiAJCQkJaWYgKHRleF93aWR0aCA+PSA2NCB8fCB0ZXhfd2lkdGggPD0gMTYpIHsKIAkJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihidWZmZXIsIGRhdGEsCi0JCQkJCQkJICAgICAgIHRleF93aWR0aCAqIHNpemVvZih1MzIpKSkgewotCQkJCQkJRFJNX0VSUk9SKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwKLQkJCQkJCQkgIHRleF93aWR0aCk7CisJCQkJCQkJICAgICAgIHRleF93aWR0aCAqCisJCQkJCQkJICAgICAgIHNpemVvZih1MzIpKSkgeworCQkJCQkJRFJNX0VSUk9SCisJCQkJCQkgICAgKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwKKwkJCQkJCSAgICAgdGV4X3dpZHRoKTsKIAkJCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CiAJCQkJCX0KIAkJCQl9IGVsc2UgaWYgKHRleF93aWR0aCA9PSAzMikgewotCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGJ1ZmZlciwgZGF0YSwgMTYpKSB7Ci0JCQkJCQlEUk1fRVJST1IoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLAotCQkJCQkJCSAgdGV4X3dpZHRoKTsKKwkJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUgorCQkJCQkgICAgKGJ1ZmZlciwgZGF0YSwgMTYpKSB7CisJCQkJCQlEUk1fRVJST1IKKwkJCQkJCSAgICAoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLAorCQkJCQkJICAgICB0ZXhfd2lkdGgpOwogCQkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKIAkJCQkJfQotCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGJ1ZmZlciArIDgsIGRhdGEgKyAxNiwgMTYpKSB7Ci0JCQkJCQlEUk1fRVJST1IoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLAotCQkJCQkJCSAgdGV4X3dpZHRoKTsKKwkJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUgorCQkJCQkgICAgKGJ1ZmZlciArIDgsIGRhdGEgKyAxNiwgMTYpKSB7CisJCQkJCQlEUk1fRVJST1IKKwkJCQkJCSAgICAoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLAorCQkJCQkJICAgICB0ZXhfd2lkdGgpOwogCQkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKIAkJCQkJfQogCQkJCX0KQEAgLTE2NzUsOSArMTY4MiwxMSBAQAogCQkJCX0KIAkJCX0gZWxzZSBpZiAodGV4X3dpZHRoIDwgMTYpIHsKIAkJCQlmb3IgKGkgPSAwOyBpIDwgdGV4LT5oZWlnaHQ7IGkrKykgewotCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGJ1ZmZlciwgZGF0YSwgdGV4X3dpZHRoKSkgewotCQkJCQkJRFJNX0VSUk9SKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwKLQkJCQkJCQkgIHRleF93aWR0aCk7CisJCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIKKwkJCQkJICAgIChidWZmZXIsIGRhdGEsIHRleF93aWR0aCkpIHsKKwkJCQkJCURSTV9FUlJPUgorCQkJCQkJICAgICgiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsCisJCQkJCQkgICAgIHRleF93aWR0aCk7CiAJCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwogCQkJCQl9CiAJCQkJCWJ1ZmZlciArPSA0OwpAQCAtMTY4NywzNSArMTY5Niw0MiBAQAogCQkJCS8qIFRPRE86IG1ha2Ugc3VyZSB0aGlzIHdvcmtzIHdoZW4gbm90IGZpdHRpbmcgaW4gb25lIGJ1ZmZlcgogCQkJCSAgIChpLmUuIDMyYnl0ZXMgeCAyMDQ4Li4uKSAqLwogCQkJCWZvciAoaSA9IDA7IGkgPCB0ZXgtPmhlaWdodDsgaSArPSAyKSB7Ci0JCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoYnVmZmVyLCBkYXRhLCAxNikpIHsKLQkJCQkJCURSTV9FUlJPUigiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsCi0JCQkJCQkJICB0ZXhfd2lkdGgpOworCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSCisJCQkJCSAgICAoYnVmZmVyLCBkYXRhLCAxNikpIHsKKwkJCQkJCURSTV9FUlJPUgorCQkJCQkJICAgICgiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsCisJCQkJCQkgICAgIHRleF93aWR0aCk7CiAJCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwogCQkJCQl9CiAJCQkJCWRhdGEgKz0gMTY7Ci0JCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoYnVmZmVyICsgOCwgZGF0YSwgMTYpKSB7Ci0JCQkJCQlEUk1fRVJST1IoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLAotCQkJCQkJCSAgdGV4X3dpZHRoKTsKKwkJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUgorCQkJCQkgICAgKGJ1ZmZlciArIDgsIGRhdGEsIDE2KSkgeworCQkJCQkJRFJNX0VSUk9SCisJCQkJCQkgICAgKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwKKwkJCQkJCSAgICAgdGV4X3dpZHRoKTsKIAkJCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CiAJCQkJCX0KIAkJCQkJZGF0YSArPSAxNjsKLQkJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihidWZmZXIgKyA0LCBkYXRhLCAxNikpIHsKLQkJCQkJCURSTV9FUlJPUigiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsCi0JCQkJCQkJICB0ZXhfd2lkdGgpOworCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSCisJCQkJCSAgICAoYnVmZmVyICsgNCwgZGF0YSwgMTYpKSB7CisJCQkJCQlEUk1fRVJST1IKKwkJCQkJCSAgICAoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLAorCQkJCQkJICAgICB0ZXhfd2lkdGgpOwogCQkJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKIAkJCQkJfQogCQkJCQlkYXRhICs9IDE2OwotCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKGJ1ZmZlciArIDEyLCBkYXRhLCAxNikpIHsKLQkJCQkJCURSTV9FUlJPUigiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsCi0JCQkJCQkJICB0ZXhfd2lkdGgpOworCQkJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSCisJCQkJCSAgICAoYnVmZmVyICsgMTIsIGRhdGEsIDE2KSkgeworCQkJCQkJRFJNX0VSUk9SCisJCQkJCQkgICAgKCJFRkFVTFQgb24gcGFkLCAlZCBieXRlc1xuIiwKKwkJCQkJCSAgICAgdGV4X3dpZHRoKTsKIAkJCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CiAJCQkJCX0KIAkJCQkJZGF0YSArPSAxNjsKIAkJCQkJYnVmZmVyICs9IDE2OwogCQkJCX0KIAkJCX0KLQkJfQotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCWlmICh0ZXhfd2lkdGggPj0gMzIpIHsKIAkJCQkvKiBUZXh0dXJlIGltYWdlIHdpZHRoIGlzIGxhcmdlciB0aGFuIHRoZSBtaW5pbXVtLCBzbyB3ZQogCQkJCSAqIGNhbiB1cGxvYWQgaXQgZGlyZWN0bHkuCkBAIC0xNzMxLDkgKzE3NDcsMTIgQEAKIAkJCQkgKiBuZWVkIHRvIHBhZCBvdXQgZWFjaCBpbWFnZSBzY2FubGluZSB0byB0aGUgbWluaW11bQogCQkJCSAqIHdpZHRoLgogCQkJCSAqLwotCQkJCWZvciAoaSA9IDAgOyBpIDwgdGV4LT5oZWlnaHQgOyBpKyspIHsKLQkJCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihidWZmZXIsIGRhdGEsIHRleF93aWR0aCApKSB7Ci0JCQkJCQlEUk1fRVJST1IoIkVGQVVMVCBvbiBwYWQsICVkIGJ5dGVzXG4iLCB0ZXhfd2lkdGgpOworCQkJCWZvciAoaSA9IDA7IGkgPCB0ZXgtPmhlaWdodDsgaSsrKSB7CisJCQkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIKKwkJCQkJICAgIChidWZmZXIsIGRhdGEsIHRleF93aWR0aCkpIHsKKwkJCQkJCURSTV9FUlJPUgorCQkJCQkJICAgICgiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsCisJCQkJCQkgICAgIHRleF93aWR0aCk7CiAJCQkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwogCQkJCQl9CiAJCQkJCWJ1ZmZlciArPSA4OwpAQCAtMTc1NCw4ICsxNzczLDcgQEAKIAkJCSBSQURFT05fR01DX1NSQ19EQVRBVFlQRV9DT0xPUiB8CiAJCQkgUkFERU9OX1JPUDNfUyB8CiAJCQkgUkFERU9OX0RQX1NSQ19TT1VSQ0VfTUVNT1JZIHwKLQkJCSBSQURFT05fR01DX0NMUl9DTVBfQ05UTF9ESVMgfAotCQkJIFJBREVPTl9HTUNfV1JfTVNLX0RJUyApOworCQkJIFJBREVPTl9HTUNfQ0xSX0NNUF9DTlRMX0RJUyB8IFJBREVPTl9HTUNfV1JfTVNLX0RJUyk7CiAJCU9VVF9SSU5HKChzcGl0Y2ggPDwgMjIpIHwgKG9mZnNldCA+PiAxMCkpOwogCQlPVVRfUklORygodGV4cGl0Y2ggPDwgMjIpIHwgKHRleC0+b2Zmc2V0ID4+IDEwKSk7CiAJCU9VVF9SSU5HKDApOwpAQCAtMTc3Niw2MiArMTc5NCw2MiBAQAogCSAqIHRoZSB0ZXh0dXJlIGRhdGEgaXMgd3JpdHRlbiBvdXQgdG8gbWVtb3J5IGJlZm9yZSByZW5kZXJpbmcKIAkgKiBjb250aW51ZXMuCiAJICovCi0JQkVHSU5fUklORyggNCApOworCUJFR0lOX1JJTkcoNCk7CiAJUkFERU9OX0ZMVVNIX0NBQ0hFKCk7CiAJUkFERU9OX1dBSVRfVU5USUxfMkRfSURMRSgpOwogCUFEVkFOQ0VfUklORygpOwogCXJldHVybiAwOwogfQogCi0KLXN0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9zdGlwcGxlKCBkcm1fZGV2aWNlX3QgKmRldiwgdTMyICpzdGlwcGxlICkKK3N0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9zdGlwcGxlKGRybV9kZXZpY2VfdCAqIGRldiwgdTMyICogc3RpcHBsZSkKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWludCBpOwogCVJJTkdfTE9DQUxTOwotCURSTV9ERUJVRyggIlxuIiApOworCURSTV9ERUJVRygiXG4iKTsKIAotCUJFR0lOX1JJTkcoIDM1ICk7CisJQkVHSU5fUklORygzNSk7CiAKLQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1JFX1NUSVBQTEVfQUREUiwgMCApICk7Ci0JT1VUX1JJTkcoIDB4MDAwMDAwMDAgKTsKKwlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9SRV9TVElQUExFX0FERFIsIDApKTsKKwlPVVRfUklORygweDAwMDAwMDAwKTsKIAotCU9VVF9SSU5HKCBDUF9QQUNLRVQwX1RBQkxFKCBSQURFT05fUkVfU1RJUFBMRV9EQVRBLCAzMSApICk7Ci0JZm9yICggaSA9IDAgOyBpIDwgMzIgOyBpKysgKSB7Ci0JCU9VVF9SSU5HKCBzdGlwcGxlW2ldICk7CisJT1VUX1JJTkcoQ1BfUEFDS0VUMF9UQUJMRShSQURFT05fUkVfU1RJUFBMRV9EQVRBLCAzMSkpOworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCU9VVF9SSU5HKHN0aXBwbGVbaV0pOwogCX0KIAogCUFEVkFOQ0VfUklORygpOwogfQogCi1zdGF0aWMgdm9pZCByYWRlb25fYXBwbHlfc3VyZmFjZV9yZWdzKGludCBzdXJmX2luZGV4LCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYpCitzdGF0aWMgdm9pZCByYWRlb25fYXBwbHlfc3VyZmFjZV9yZWdzKGludCBzdXJmX2luZGV4LAorCQkJCSAgICAgIGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYpCiB7CiAJaWYgKCFkZXZfcHJpdi0+bW1pbykKIAkJcmV0dXJuOwogCiAJcmFkZW9uX2RvX2NwX2lkbGUoZGV2X3ByaXYpOwogCi0JUkFERU9OX1dSSVRFKFJBREVPTl9TVVJGQUNFMF9JTkZPICsgMTYqc3VyZl9pbmRleCwKLQkJZGV2X3ByaXYtPnN1cmZhY2VzW3N1cmZfaW5kZXhdLmZsYWdzKTsKLQlSQURFT05fV1JJVEUoUkFERU9OX1NVUkZBQ0UwX0xPV0VSX0JPVU5EICsgMTYqc3VyZl9pbmRleCwKLQkJZGV2X3ByaXYtPnN1cmZhY2VzW3N1cmZfaW5kZXhdLmxvd2VyKTsKLQlSQURFT05fV1JJVEUoUkFERU9OX1NVUkZBQ0UwX1VQUEVSX0JPVU5EICsgMTYqc3VyZl9pbmRleCwKLQkJZGV2X3ByaXYtPnN1cmZhY2VzW3N1cmZfaW5kZXhdLnVwcGVyKTsKKwlSQURFT05fV1JJVEUoUkFERU9OX1NVUkZBQ0UwX0lORk8gKyAxNiAqIHN1cmZfaW5kZXgsCisJCSAgICAgZGV2X3ByaXYtPnN1cmZhY2VzW3N1cmZfaW5kZXhdLmZsYWdzKTsKKwlSQURFT05fV1JJVEUoUkFERU9OX1NVUkZBQ0UwX0xPV0VSX0JPVU5EICsgMTYgKiBzdXJmX2luZGV4LAorCQkgICAgIGRldl9wcml2LT5zdXJmYWNlc1tzdXJmX2luZGV4XS5sb3dlcik7CisJUkFERU9OX1dSSVRFKFJBREVPTl9TVVJGQUNFMF9VUFBFUl9CT1VORCArIDE2ICogc3VyZl9pbmRleCwKKwkJICAgICBkZXZfcHJpdi0+c3VyZmFjZXNbc3VyZl9pbmRleF0udXBwZXIpOwogfQogCi0KIC8qIEFsbG9jYXRlcyBhIHZpcnR1YWwgc3VyZmFjZQotICogZG9lc24ndCBhbHdheXMgYWxsb2NhdGUgYSByZWFsIHN1cmZhY2UsIHdpbGwgc3RyZXRjaCBhbiBleGlzdGluZyAKKyAqIGRvZXNuJ3QgYWx3YXlzIGFsbG9jYXRlIGEgcmVhbCBzdXJmYWNlLCB3aWxsIHN0cmV0Y2ggYW4gZXhpc3RpbmcKICAqIHN1cmZhY2Ugd2hlbiBwb3NzaWJsZS4KICAqCiAgKiBOb3RlIHRoYXQgcmVmY291bnQgY2FuIGJlIGF0IG1vc3QgMiwgc2luY2UgZHVyaW5nIGEgZnJlZSByZWZjb3VudD0zCiAgKiBtaWdodCBtZWFuIHdlIGhhdmUgdG8gYWxsb2NhdGUgYSBuZXcgc3VyZmFjZSB3aGljaCBtaWdodCBub3QgYWx3YXlzCiAgKiBiZSBhdmFpbGFibGUuCi0gKiBGb3IgZXhhbXBsZSA6IHdlIGFsbG9jYXRlIHRocmVlIGNvbnRpZ291cyBzdXJmYWNlcyBBQkMuIElmIEIgaXMgCisgKiBGb3IgZXhhbXBsZSA6IHdlIGFsbG9jYXRlIHRocmVlIGNvbnRpZ291cyBzdXJmYWNlcyBBQkMuIElmIEIgaXMKICAqIGZyZWVkLCB3ZSBzdWRkZW5seSBuZWVkIHR3byBzdXJmYWNlcyB0byBzdG9yZSBBIGFuZCBDLCB3aGljaCBtaWdodAogICogbm90IGFsd2F5cyBiZSBhdmFpbGFibGUuCiAgKi8KLXN0YXRpYyBpbnQgYWxsb2Nfc3VyZmFjZShkcm1fcmFkZW9uX3N1cmZhY2VfYWxsb2NfdCogbmV3LCBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsIERSTUZJTEUgZmlscCkKK3N0YXRpYyBpbnQgYWxsb2Nfc3VyZmFjZShkcm1fcmFkZW9uX3N1cmZhY2VfYWxsb2NfdCAqIG5ldywKKwkJCSBkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LCBEUk1GSUxFIGZpbHApCiB7CiAJc3RydWN0IHJhZGVvbl92aXJ0X3N1cmZhY2UgKnM7CiAJaW50IGk7CkBAIC0xODQzLDM0ICsxODYxLDM3IEBACiAKIAkvKiBzYW5pdHkgY2hlY2sgKi8KIAlpZiAoKG5ld19sb3dlciA+PSBuZXdfdXBwZXIpIHx8IChuZXctPmZsYWdzID09IDApIHx8IChuZXctPnNpemUgPT0gMCkgfHwKLQkJKChuZXdfdXBwZXIgJiBSQURFT05fU1VSRl9BRERSRVNTX0ZJWEVEX01BU0spICE9IFJBREVPTl9TVVJGX0FERFJFU1NfRklYRURfTUFTSykgfHwKLQkJKChuZXdfbG93ZXIgJiBSQURFT05fU1VSRl9BRERSRVNTX0ZJWEVEX01BU0spICE9IDApKQorCSAgICAoKG5ld191cHBlciAmIFJBREVPTl9TVVJGX0FERFJFU1NfRklYRURfTUFTSykgIT0KKwkgICAgIFJBREVPTl9TVVJGX0FERFJFU1NfRklYRURfTUFTSykKKwkgICAgfHwgKChuZXdfbG93ZXIgJiBSQURFT05fU1VSRl9BRERSRVNTX0ZJWEVEX01BU0spICE9IDApKQogCQlyZXR1cm4gLTE7CiAKIAkvKiBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gb3ZlcmxhcCB3aXRoIGV4aXN0aW5nIHN1cmZhY2VzICovCiAJZm9yIChpID0gMDsgaSA8IFJBREVPTl9NQVhfU1VSRkFDRVM7IGkrKykgewogCQlpZiAoKGRldl9wcml2LT5zdXJmYWNlc1tpXS5yZWZjb3VudCAhPSAwKSAmJgotCQkoKCAobmV3X2xvd2VyID49IGRldl9wcml2LT5zdXJmYWNlc1tpXS5sb3dlcikgJiYKLQkJCShuZXdfbG93ZXIgPCBkZXZfcHJpdi0+c3VyZmFjZXNbaV0udXBwZXIpICkgfHwKLQkJICggKG5ld19sb3dlciA8IGRldl9wcml2LT5zdXJmYWNlc1tpXS5sb3dlcikgJiYKLQkJCShuZXdfdXBwZXIgPiBkZXZfcHJpdi0+c3VyZmFjZXNbaV0ubG93ZXIpICkpICl7Ci0JCXJldHVybiAtMTt9CisJCSAgICAoKChuZXdfbG93ZXIgPj0gZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmxvd2VyKSAmJgorCQkgICAgICAobmV3X2xvd2VyIDwgZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnVwcGVyKSkgfHwKKwkJICAgICAoKG5ld19sb3dlciA8IGRldl9wcml2LT5zdXJmYWNlc1tpXS5sb3dlcikgJiYKKwkJICAgICAgKG5ld191cHBlciA+IGRldl9wcml2LT5zdXJmYWNlc1tpXS5sb3dlcikpKSkgeworCQkJcmV0dXJuIC0xOworCQl9CiAJfQogCiAJLyogZmluZCBhIHZpcnR1YWwgc3VyZmFjZSAqLwotCWZvciAoaSA9IDA7IGkgPCAyKlJBREVPTl9NQVhfU1VSRkFDRVM7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgMiAqIFJBREVPTl9NQVhfU1VSRkFDRVM7IGkrKykKIAkJaWYgKGRldl9wcml2LT52aXJ0X3N1cmZhY2VzW2ldLmZpbHAgPT0gMCkKIAkJCWJyZWFrOwotCWlmIChpID09IDIqUkFERU9OX01BWF9TVVJGQUNFUykgewotCQlyZXR1cm4gLTE7fQorCWlmIChpID09IDIgKiBSQURFT05fTUFYX1NVUkZBQ0VTKSB7CisJCXJldHVybiAtMTsKKwl9CiAJdmlydF9zdXJmYWNlX2luZGV4ID0gaTsKIAogCS8qIHRyeSB0byByZXVzZSBhbiBleGlzdGluZyBzdXJmYWNlICovCiAJZm9yIChpID0gMDsgaSA8IFJBREVPTl9NQVhfU1VSRkFDRVM7IGkrKykgewogCQkvKiBleHRlbmQgYmVmb3JlICovCiAJCWlmICgoZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnJlZmNvdW50ID09IDEpICYmCi0JCSAgKG5ldy0+ZmxhZ3MgPT0gZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmZsYWdzKSAmJgotCQkgIChuZXdfdXBwZXIgKyAxID09IGRldl9wcml2LT5zdXJmYWNlc1tpXS5sb3dlcikpIHsKKwkJICAgIChuZXctPmZsYWdzID09IGRldl9wcml2LT5zdXJmYWNlc1tpXS5mbGFncykgJiYKKwkJICAgIChuZXdfdXBwZXIgKyAxID09IGRldl9wcml2LT5zdXJmYWNlc1tpXS5sb3dlcikpIHsKIAkJCXMgPSAmKGRldl9wcml2LT52aXJ0X3N1cmZhY2VzW3ZpcnRfc3VyZmFjZV9pbmRleF0pOwogCQkJcy0+c3VyZmFjZV9pbmRleCA9IGk7CiAJCQlzLT5sb3dlciA9IG5ld19sb3dlcjsKQEAgLTE4ODUsOCArMTkwNiw4IEBACiAKIAkJLyogZXh0ZW5kIGFmdGVyICovCiAJCWlmICgoZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnJlZmNvdW50ID09IDEpICYmCi0JCSAgKG5ldy0+ZmxhZ3MgPT0gZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmZsYWdzKSAmJgotCQkgIChuZXdfbG93ZXIgPT0gZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnVwcGVyICsgMSkpIHsKKwkJICAgIChuZXctPmZsYWdzID09IGRldl9wcml2LT5zdXJmYWNlc1tpXS5mbGFncykgJiYKKwkJICAgIChuZXdfbG93ZXIgPT0gZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnVwcGVyICsgMSkpIHsKIAkJCXMgPSAmKGRldl9wcml2LT52aXJ0X3N1cmZhY2VzW3ZpcnRfc3VyZmFjZV9pbmRleF0pOwogCQkJcy0+c3VyZmFjZV9pbmRleCA9IGk7CiAJCQlzLT5sb3dlciA9IG5ld19sb3dlcjsKQEAgLTE5MjIsMjYgKzE5NDMsMzQgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyBpbnQgZnJlZV9zdXJmYWNlKERSTUZJTEUgZmlscCwgZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LCBpbnQgbG93ZXIpCitzdGF0aWMgaW50IGZyZWVfc3VyZmFjZShEUk1GSUxFIGZpbHAsIGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsCisJCQlpbnQgbG93ZXIpCiB7CiAJc3RydWN0IHJhZGVvbl92aXJ0X3N1cmZhY2UgKnM7CiAJaW50IGk7CiAJLyogZmluZCB0aGUgdmlydHVhbCBzdXJmYWNlICovCi0JZm9yKGkgPSAwOyBpIDwgMipSQURFT05fTUFYX1NVUkZBQ0VTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgMiAqIFJBREVPTl9NQVhfU1VSRkFDRVM7IGkrKykgewogCQlzID0gJihkZXZfcHJpdi0+dmlydF9zdXJmYWNlc1tpXSk7CiAJCWlmIChzLT5maWxwKSB7CiAJCQlpZiAoKGxvd2VyID09IHMtPmxvd2VyKSAmJiAoZmlscCA9PSBzLT5maWxwKSkgewotCQkJCWlmIChkZXZfcHJpdi0+c3VyZmFjZXNbcy0+c3VyZmFjZV9pbmRleF0ubG93ZXIgPT0gcy0+bG93ZXIpCi0JCQkJCWRldl9wcml2LT5zdXJmYWNlc1tzLT5zdXJmYWNlX2luZGV4XS5sb3dlciA9IHMtPnVwcGVyOworCQkJCWlmIChkZXZfcHJpdi0+c3VyZmFjZXNbcy0+c3VyZmFjZV9pbmRleF0uCisJCQkJICAgIGxvd2VyID09IHMtPmxvd2VyKQorCQkJCQlkZXZfcHJpdi0+c3VyZmFjZXNbcy0+c3VyZmFjZV9pbmRleF0uCisJCQkJCSAgICBsb3dlciA9IHMtPnVwcGVyOwogCi0JCQkJaWYgKGRldl9wcml2LT5zdXJmYWNlc1tzLT5zdXJmYWNlX2luZGV4XS51cHBlciA9PSBzLT51cHBlcikKLQkJCQkJZGV2X3ByaXYtPnN1cmZhY2VzW3MtPnN1cmZhY2VfaW5kZXhdLnVwcGVyID0gcy0+bG93ZXI7CisJCQkJaWYgKGRldl9wcml2LT5zdXJmYWNlc1tzLT5zdXJmYWNlX2luZGV4XS4KKwkJCQkgICAgdXBwZXIgPT0gcy0+dXBwZXIpCisJCQkJCWRldl9wcml2LT5zdXJmYWNlc1tzLT5zdXJmYWNlX2luZGV4XS4KKwkJCQkJICAgIHVwcGVyID0gcy0+bG93ZXI7CiAKIAkJCQlkZXZfcHJpdi0+c3VyZmFjZXNbcy0+c3VyZmFjZV9pbmRleF0ucmVmY291bnQtLTsKLQkJCQlpZiAoZGV2X3ByaXYtPnN1cmZhY2VzW3MtPnN1cmZhY2VfaW5kZXhdLnJlZmNvdW50ID09IDApCi0JCQkJCWRldl9wcml2LT5zdXJmYWNlc1tzLT5zdXJmYWNlX2luZGV4XS5mbGFncyA9IDA7CisJCQkJaWYgKGRldl9wcml2LT5zdXJmYWNlc1tzLT5zdXJmYWNlX2luZGV4XS4KKwkJCQkgICAgcmVmY291bnQgPT0gMCkKKwkJCQkJZGV2X3ByaXYtPnN1cmZhY2VzW3MtPnN1cmZhY2VfaW5kZXhdLgorCQkJCQkgICAgZmxhZ3MgPSAwOwogCQkJCXMtPmZpbHAgPSBOVUxMOwotCQkJCXJhZGVvbl9hcHBseV9zdXJmYWNlX3JlZ3Mocy0+c3VyZmFjZV9pbmRleCwgZGV2X3ByaXYpOworCQkJCXJhZGVvbl9hcHBseV9zdXJmYWNlX3JlZ3Mocy0+c3VyZmFjZV9pbmRleCwKKwkJCQkJCQkgIGRldl9wcml2KTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJfQpAQCAtMTk0OSwxMyArMTk3OCwxNCBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZCByYWRlb25fc3VyZmFjZXNfcmVsZWFzZShEUk1GSUxFIGZpbHAsIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdikKK3N0YXRpYyB2b2lkIHJhZGVvbl9zdXJmYWNlc19yZWxlYXNlKERSTUZJTEUgZmlscCwKKwkJCQkgICAgZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdikKIHsKIAlpbnQgaTsKLQlmb3IoIGkgPSAwOyBpIDwgMipSQURFT05fTUFYX1NVUkZBQ0VTOyBpKyspCi0JeworCWZvciAoaSA9IDA7IGkgPCAyICogUkFERU9OX01BWF9TVVJGQUNFUzsgaSsrKSB7CiAJCWlmIChkZXZfcHJpdi0+dmlydF9zdXJmYWNlc1tpXS5maWxwID09IGZpbHApCi0JCQlmcmVlX3N1cmZhY2UoZmlscCwgZGV2X3ByaXYsIGRldl9wcml2LT52aXJ0X3N1cmZhY2VzW2ldLmxvd2VyKTsKKwkJCWZyZWVfc3VyZmFjZShmaWxwLCBkZXZfcHJpdiwKKwkJCQkgICAgIGRldl9wcml2LT52aXJ0X3N1cmZhY2VzW2ldLmxvd2VyKTsKIAl9CiB9CiAKQEAgLTE5NjksMTIgKzE5OTksMTMgQEAKIAlkcm1fcmFkZW9uX3N1cmZhY2VfYWxsb2NfdCBhbGxvYzsKIAogCWlmICghZGV2X3ByaXYpIHsKLQkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KIAotCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChhbGxvYywgKGRybV9yYWRlb25fc3VyZmFjZV9hbGxvY190IF9fdXNlciAqKWRhdGEsCi0JCQkJICBzaXplb2YoYWxsb2MpKTsKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoYWxsb2MsCisJCQkJIChkcm1fcmFkZW9uX3N1cmZhY2VfYWxsb2NfdCBfX3VzZXIgKikgZGF0YSwKKwkJCQkgc2l6ZW9mKGFsbG9jKSk7CiAKIAlpZiAoYWxsb2Nfc3VyZmFjZSgmYWxsb2MsIGRldl9wcml2LCBmaWxwKSA9PSAtMSkKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKQEAgLTE5ODksMTIgKzIwMjAsMTIgQEAKIAlkcm1fcmFkZW9uX3N1cmZhY2VfZnJlZV90IG1lbWZyZWU7CiAKIAlpZiAoIWRldl9wcml2KSB7Ci0JCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9CiAKLQlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwobWVtZnJlZSwgKGRybV9yYWRlb25fbWVtX2ZyZWVfdCBfX3VzZXIgKilkYXRhLAotCQkJCSAgc2l6ZW9mKG1lbWZyZWUpICk7CisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKG1lbWZyZWUsIChkcm1fcmFkZW9uX21lbV9mcmVlX3QgX191c2VyICopIGRhdGEsCisJCQkJIHNpemVvZihtZW1mcmVlKSk7CiAKIAlpZiAoZnJlZV9zdXJmYWNlKGZpbHAsIGRldl9wcml2LCBtZW1mcmVlLmFkZHJlc3MpKQogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwpAQCAtMjAwMiw1MSArMjAzMyw1MiBAQAogCQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByYWRlb25fY3BfY2xlYXIoIERSTV9JT0NUTF9BUkdTICkKK3N0YXRpYyBpbnQgcmFkZW9uX2NwX2NsZWFyKERSTV9JT0NUTF9BUkdTKQogewogCURSTV9ERVZJQ0U7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKIAlkcm1fcmFkZW9uX2NsZWFyX3QgY2xlYXI7CiAJZHJtX3JhZGVvbl9jbGVhcl9yZWN0X3QgZGVwdGhfYm94ZXNbUkFERU9OX05SX1NBUkVBX0NMSVBSRUNUU107Ci0JRFJNX0RFQlVHKCAiXG4iICk7CisJRFJNX0RFQlVHKCJcbiIpOwogCi0JTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKIAotCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggY2xlYXIsIChkcm1fcmFkZW9uX2NsZWFyX3QgX191c2VyICopZGF0YSwKLQkJCSAgICAgc2l6ZW9mKGNsZWFyKSApOworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChjbGVhciwgKGRybV9yYWRlb25fY2xlYXJfdCBfX3VzZXIgKikgZGF0YSwKKwkJCQkgc2l6ZW9mKGNsZWFyKSk7CiAKLQlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKGRldl9wcml2KTsKIAotCWlmICggc2FyZWFfcHJpdi0+bmJveCA+IFJBREVPTl9OUl9TQVJFQV9DTElQUkVDVFMgKQorCWlmIChzYXJlYV9wcml2LT5uYm94ID4gUkFERU9OX05SX1NBUkVBX0NMSVBSRUNUUykKIAkJc2FyZWFfcHJpdi0+bmJveCA9IFJBREVPTl9OUl9TQVJFQV9DTElQUkVDVFM7CiAKLQlpZiAoIERSTV9DT1BZX0ZST01fVVNFUiggJmRlcHRoX2JveGVzLCBjbGVhci5kZXB0aF9ib3hlcywKLQkJCSAgICAgc2FyZWFfcHJpdi0+bmJveCAqIHNpemVvZihkZXB0aF9ib3hlc1swXSkgKSApCisJaWYgKERSTV9DT1BZX0ZST01fVVNFUigmZGVwdGhfYm94ZXMsIGNsZWFyLmRlcHRoX2JveGVzLAorCQkJICAgICAgIHNhcmVhX3ByaXYtPm5ib3ggKiBzaXplb2YoZGVwdGhfYm94ZXNbMF0pKSkKIAkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKIAotCXJhZGVvbl9jcF9kaXNwYXRjaF9jbGVhciggZGV2LCAmY2xlYXIsIGRlcHRoX2JveGVzICk7CisJcmFkZW9uX2NwX2Rpc3BhdGNoX2NsZWFyKGRldiwgJmNsZWFyLCBkZXB0aF9ib3hlcyk7CiAKIAlDT01NSVRfUklORygpOwogCXJldHVybiAwOwogfQogCi0KIC8qIE5vdCBzdXJlIHdoeSB0aGlzIGlzbid0IHNldCBhbGwgdGhlIHRpbWU6Ci0gKi8gCi1zdGF0aWMgaW50IHJhZGVvbl9kb19pbml0X3BhZ2VmbGlwKCBkcm1fZGV2aWNlX3QgKmRldiApCisgKi8KK3N0YXRpYyBpbnQgcmFkZW9uX2RvX2luaXRfcGFnZWZsaXAoZHJtX2RldmljZV90ICogZGV2KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJUklOR19MT0NBTFM7CiAKLQlEUk1fREVCVUcoICJcbiIgKTsKKwlEUk1fREVCVUcoIlxuIik7CiAKLQlCRUdJTl9SSU5HKCA2ICk7CisJQkVHSU5fUklORyg2KTsKIAlSQURFT05fV0FJVF9VTlRJTF8zRF9JRExFKCk7Ci0JT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9DUlRDX09GRlNFVF9DTlRMLCAwICkgKTsKLQlPVVRfUklORyggUkFERU9OX1JFQUQoIFJBREVPTl9DUlRDX09GRlNFVF9DTlRMICkgfCBSQURFT05fQ1JUQ19PRkZTRVRfRkxJUF9DTlRMICk7Ci0JT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9DUlRDMl9PRkZTRVRfQ05UTCwgMCApICk7Ci0JT1VUX1JJTkcoIFJBREVPTl9SRUFEKCBSQURFT05fQ1JUQzJfT0ZGU0VUX0NOVEwgKSB8IFJBREVPTl9DUlRDX09GRlNFVF9GTElQX0NOVEwgKTsKKwlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9DUlRDX09GRlNFVF9DTlRMLCAwKSk7CisJT1VUX1JJTkcoUkFERU9OX1JFQUQoUkFERU9OX0NSVENfT0ZGU0VUX0NOVEwpIHwKKwkJIFJBREVPTl9DUlRDX09GRlNFVF9GTElQX0NOVEwpOworCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX0NSVEMyX09GRlNFVF9DTlRMLCAwKSk7CisJT1VUX1JJTkcoUkFERU9OX1JFQUQoUkFERU9OX0NSVEMyX09GRlNFVF9DTlRMKSB8CisJCSBSQURFT05fQ1JUQ19PRkZTRVRfRkxJUF9DTlRMKTsKIAlBRFZBTkNFX1JJTkcoKTsKIAogCWRldl9wcml2LT5wYWdlX2ZsaXBwaW5nID0gMTsKQEAgLTIwNTksNjIgKzIwOTEsNjIgQEAKIC8qIENhbGxlZCB3aGVuZXZlciBhIGNsaWVudCBkaWVzLCBmcm9tIGRybV9yZWxlYXNlLgogICogTk9URTogIExvY2sgaXNuJ3QgbmVjZXNzYXJpbHkgaGVsZCB3aGVuIHRoaXMgaXMgY2FsbGVkIQogICovCi1zdGF0aWMgaW50IHJhZGVvbl9kb19jbGVhbnVwX3BhZ2VmbGlwKCBkcm1fZGV2aWNlX3QgKmRldiApCitzdGF0aWMgaW50IHJhZGVvbl9kb19jbGVhbnVwX3BhZ2VmbGlwKGRybV9kZXZpY2VfdCAqIGRldikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCURSTV9ERUJVRyggIlxuIiApOworCURSTV9ERUJVRygiXG4iKTsKIAogCWlmIChkZXZfcHJpdi0+Y3VycmVudF9wYWdlICE9IDApCi0JCXJhZGVvbl9jcF9kaXNwYXRjaF9mbGlwKCBkZXYgKTsKKwkJcmFkZW9uX2NwX2Rpc3BhdGNoX2ZsaXAoZGV2KTsKIAogCWRldl9wcml2LT5wYWdlX2ZsaXBwaW5nID0gMDsKIAlyZXR1cm4gMDsKIH0KIAogLyogU3dhcHBpbmcgYW5kIGZsaXBwaW5nIGFyZSBkaWZmZXJlbnQgb3BlcmF0aW9ucywgbmVlZCBkaWZmZXJlbnQgaW9jdGxzLgotICogVGhleSBjYW4gJiBzaG91bGQgYmUgaW50ZXJtaXhlZCB0byBzdXBwb3J0IG11bHRpcGxlIDNkIHdpbmRvd3MuICAKKyAqIFRoZXkgY2FuICYgc2hvdWxkIGJlIGludGVybWl4ZWQgdG8gc3VwcG9ydCBtdWx0aXBsZSAzZCB3aW5kb3dzLgogICovCi1zdGF0aWMgaW50IHJhZGVvbl9jcF9mbGlwKCBEUk1fSU9DVExfQVJHUyApCitzdGF0aWMgaW50IHJhZGVvbl9jcF9mbGlwKERSTV9JT0NUTF9BUkdTKQogewogCURSTV9ERVZJQ0U7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlEUk1fREVCVUcoICJcbiIgKTsKKwlEUk1fREVCVUcoIlxuIik7CiAKLQlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOwogCi0JUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTihkZXZfcHJpdik7CiAKLQlpZiAoIWRldl9wcml2LT5wYWdlX2ZsaXBwaW5nKSAKLQkJcmFkZW9uX2RvX2luaXRfcGFnZWZsaXAoIGRldiApOwotCQkKLQlyYWRlb25fY3BfZGlzcGF0Y2hfZmxpcCggZGV2ICk7CisJaWYgKCFkZXZfcHJpdi0+cGFnZV9mbGlwcGluZykKKwkJcmFkZW9uX2RvX2luaXRfcGFnZWZsaXAoZGV2KTsKKworCXJhZGVvbl9jcF9kaXNwYXRjaF9mbGlwKGRldik7CiAKIAlDT01NSVRfUklORygpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJhZGVvbl9jcF9zd2FwKCBEUk1fSU9DVExfQVJHUyApCitzdGF0aWMgaW50IHJhZGVvbl9jcF9zd2FwKERSTV9JT0NUTF9BUkdTKQogewogCURSTV9ERVZJQ0U7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKLQlEUk1fREVCVUcoICJcbiIgKTsKKwlEUk1fREVCVUcoIlxuIik7CiAKLQlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOwogCi0JUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTihkZXZfcHJpdik7CiAKLQlpZiAoIHNhcmVhX3ByaXYtPm5ib3ggPiBSQURFT05fTlJfU0FSRUFfQ0xJUFJFQ1RTICkKKwlpZiAoc2FyZWFfcHJpdi0+bmJveCA+IFJBREVPTl9OUl9TQVJFQV9DTElQUkVDVFMpCiAJCXNhcmVhX3ByaXYtPm5ib3ggPSBSQURFT05fTlJfU0FSRUFfQ0xJUFJFQ1RTOwogCi0JcmFkZW9uX2NwX2Rpc3BhdGNoX3N3YXAoIGRldiApOworCXJhZGVvbl9jcF9kaXNwYXRjaF9zd2FwKGRldik7CiAJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmN0eF9vd25lciA9IDA7CiAKIAlDT01NSVRfUklORygpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJhZGVvbl9jcF92ZXJ0ZXgoIERSTV9JT0NUTF9BUkdTICkKK3N0YXRpYyBpbnQgcmFkZW9uX2NwX3ZlcnRleChEUk1fSU9DVExfQVJHUykKIHsKIAlEUk1fREVWSUNFOwogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0yMTI1LDU1ICsyMTU3LDUzIEBACiAJZHJtX3JhZGVvbl92ZXJ0ZXhfdCB2ZXJ0ZXg7CiAJZHJtX3JhZGVvbl90Y2xfcHJpbV90IHByaW07CiAKLQlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOwogCi0JRFJNX0dFVF9QUklWX1dJVEhfUkVUVVJOKCBmaWxwX3ByaXYsIGZpbHAgKTsKKwlEUk1fR0VUX1BSSVZfV0lUSF9SRVRVUk4oZmlscF9wcml2LCBmaWxwKTsKIAotCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggdmVydGV4LCAoZHJtX3JhZGVvbl92ZXJ0ZXhfdCBfX3VzZXIgKilkYXRhLAotCQkJICAgICBzaXplb2YodmVydGV4KSApOworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCh2ZXJ0ZXgsIChkcm1fcmFkZW9uX3ZlcnRleF90IF9fdXNlciAqKSBkYXRhLAorCQkJCSBzaXplb2YodmVydGV4KSk7CiAKLQlEUk1fREVCVUcoICJwaWQ9JWQgaW5kZXg9JWQgY291bnQ9JWQgZGlzY2FyZD0lZFxuIiwKLQkJICAgRFJNX0NVUlJFTlRQSUQsCi0JCSAgIHZlcnRleC5pZHgsIHZlcnRleC5jb3VudCwgdmVydGV4LmRpc2NhcmQgKTsKKwlEUk1fREVCVUcoInBpZD0lZCBpbmRleD0lZCBjb3VudD0lZCBkaXNjYXJkPSVkXG4iLAorCQkgIERSTV9DVVJSRU5UUElELCB2ZXJ0ZXguaWR4LCB2ZXJ0ZXguY291bnQsIHZlcnRleC5kaXNjYXJkKTsKIAotCWlmICggdmVydGV4LmlkeCA8IDAgfHwgdmVydGV4LmlkeCA+PSBkbWEtPmJ1Zl9jb3VudCApIHsKLQkJRFJNX0VSUk9SKCAiYnVmZmVyIGluZGV4ICVkIChvZiAlZCBtYXgpXG4iLAotCQkJICAgdmVydGV4LmlkeCwgZG1hLT5idWZfY291bnQgLSAxICk7CisJaWYgKHZlcnRleC5pZHggPCAwIHx8IHZlcnRleC5pZHggPj0gZG1hLT5idWZfY291bnQpIHsKKwkJRFJNX0VSUk9SKCJidWZmZXIgaW5kZXggJWQgKG9mICVkIG1heClcbiIsCisJCQkgIHZlcnRleC5pZHgsIGRtYS0+YnVmX2NvdW50IC0gMSk7CiAJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJfQotCWlmICggdmVydGV4LnByaW0gPCAwIHx8Ci0JICAgICB2ZXJ0ZXgucHJpbSA+IFJBREVPTl9QUklNX1RZUEVfM1ZSVF9MSU5FX0xJU1QgKSB7Ci0JCURSTV9FUlJPUiggImJ1ZmZlciBwcmltICVkXG4iLCB2ZXJ0ZXgucHJpbSApOworCWlmICh2ZXJ0ZXgucHJpbSA8IDAgfHwgdmVydGV4LnByaW0gPiBSQURFT05fUFJJTV9UWVBFXzNWUlRfTElORV9MSVNUKSB7CisJCURSTV9FUlJPUigiYnVmZmVyIHByaW0gJWRcbiIsIHZlcnRleC5wcmltKTsKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9CiAKLQlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7Ci0JVkJfQUdFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKGRldl9wcml2KTsKKwlWQl9BR0VfVEVTVF9XSVRIX1JFVFVSTihkZXZfcHJpdik7CiAKIAlidWYgPSBkbWEtPmJ1Zmxpc3RbdmVydGV4LmlkeF07CiAKLQlpZiAoIGJ1Zi0+ZmlscCAhPSBmaWxwICkgewotCQlEUk1fRVJST1IoICJwcm9jZXNzICVkIHVzaW5nIGJ1ZmZlciBvd25lZCBieSAlcFxuIiwKLQkJCSAgIERSTV9DVVJSRU5UUElELCBidWYtPmZpbHAgKTsKKwlpZiAoYnVmLT5maWxwICE9IGZpbHApIHsKKwkJRFJNX0VSUk9SKCJwcm9jZXNzICVkIHVzaW5nIGJ1ZmZlciBvd25lZCBieSAlcFxuIiwKKwkJCSAgRFJNX0NVUlJFTlRQSUQsIGJ1Zi0+ZmlscCk7CiAJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJfQotCWlmICggYnVmLT5wZW5kaW5nICkgewotCQlEUk1fRVJST1IoICJzZW5kaW5nIHBlbmRpbmcgYnVmZmVyICVkXG4iLCB2ZXJ0ZXguaWR4ICk7CisJaWYgKGJ1Zi0+cGVuZGluZykgeworCQlEUk1fRVJST1IoInNlbmRpbmcgcGVuZGluZyBidWZmZXIgJWRcbiIsIHZlcnRleC5pZHgpOwogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KIAogCS8qIEJ1aWxkIHVwIGEgcHJpbV90IHJlY29yZDoKIAkgKi8KIAlpZiAodmVydGV4LmNvdW50KSB7Ci0JCWJ1Zi0+dXNlZCA9IHZlcnRleC5jb3VudDsgLyogbm90IHVzZWQ/ICovCisJCWJ1Zi0+dXNlZCA9IHZlcnRleC5jb3VudDsJLyogbm90IHVzZWQ/ICovCiAKLQkJaWYgKCBzYXJlYV9wcml2LT5kaXJ0eSAmIH5SQURFT05fVVBMT0FEX0NMSVBSRUNUUyApIHsKLQkJCWlmICggcmFkZW9uX2VtaXRfc3RhdGUoIGRldl9wcml2LCBmaWxwX3ByaXYsCi0JCQkJCQkmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZSwKLQkJCQkJCXNhcmVhX3ByaXYtPnRleF9zdGF0ZSwKLQkJCQkJCXNhcmVhX3ByaXYtPmRpcnR5ICkgKSB7Ci0JCQkJRFJNX0VSUk9SKCAicmFkZW9uX2VtaXRfc3RhdGUgZmFpbGVkXG4iICk7Ci0JCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCQlpZiAoc2FyZWFfcHJpdi0+ZGlydHkgJiB+UkFERU9OX1VQTE9BRF9DTElQUkVDVFMpIHsKKwkJCWlmIChyYWRlb25fZW1pdF9zdGF0ZShkZXZfcHJpdiwgZmlscF9wcml2LAorCQkJCQkgICAgICAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZSwKKwkJCQkJICAgICAgc2FyZWFfcHJpdi0+dGV4X3N0YXRlLAorCQkJCQkgICAgICBzYXJlYV9wcml2LT5kaXJ0eSkpIHsKKwkJCQlEUk1fRVJST1IoInJhZGVvbl9lbWl0X3N0YXRlIGZhaWxlZFxuIik7CisJCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAkJCX0KIAogCQkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfihSQURFT05fVVBMT0FEX1RFWDBJTUFHRVMgfApAQCAtMjE4MywyMyArMjIxMywyMyBAQAogCQl9CiAKIAkJcHJpbS5zdGFydCA9IDA7Ci0JCXByaW0uZmluaXNoID0gdmVydGV4LmNvdW50OyAvKiB1bnVzZWQgKi8KKwkJcHJpbS5maW5pc2ggPSB2ZXJ0ZXguY291bnQ7CS8qIHVudXNlZCAqLwogCQlwcmltLnByaW0gPSB2ZXJ0ZXgucHJpbTsKIAkJcHJpbS5udW12ZXJ0cyA9IHZlcnRleC5jb3VudDsKIAkJcHJpbS52Y19mb3JtYXQgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdi0+dmNfZm9ybWF0OwotCQkKLQkJcmFkZW9uX2NwX2Rpc3BhdGNoX3ZlcnRleCggZGV2LCBidWYsICZwcmltICk7CisKKwkJcmFkZW9uX2NwX2Rpc3BhdGNoX3ZlcnRleChkZXYsIGJ1ZiwgJnByaW0pOwogCX0KIAogCWlmICh2ZXJ0ZXguZGlzY2FyZCkgewotCQlyYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoIGRldiwgYnVmICk7CisJCXJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlcihkZXYsIGJ1Zik7CiAJfQogCiAJQ09NTUlUX1JJTkcoKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByYWRlb25fY3BfaW5kaWNlcyggRFJNX0lPQ1RMX0FSR1MgKQorc3RhdGljIGludCByYWRlb25fY3BfaW5kaWNlcyhEUk1fSU9DVExfQVJHUykKIHsKIAlEUk1fREVWSUNFOwogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0yMjExLDY5ICsyMjQxLDY3IEBACiAJZHJtX3JhZGVvbl90Y2xfcHJpbV90IHByaW07CiAJaW50IGNvdW50OwogCi0JTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKIAotCWlmICggIWRldl9wcml2ICkgewotCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7CisJaWYgKCFkZXZfcHJpdikgeworCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KIAotCURSTV9HRVRfUFJJVl9XSVRIX1JFVFVSTiggZmlscF9wcml2LCBmaWxwICk7CisJRFJNX0dFVF9QUklWX1dJVEhfUkVUVVJOKGZpbHBfcHJpdiwgZmlscCk7CiAKLQlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGVsdHMsIChkcm1fcmFkZW9uX2luZGljZXNfdCBfX3VzZXIgKilkYXRhLAotCQkJICAgICBzaXplb2YoZWx0cykgKTsKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoZWx0cywgKGRybV9yYWRlb25faW5kaWNlc190IF9fdXNlciAqKSBkYXRhLAorCQkJCSBzaXplb2YoZWx0cykpOwogCi0JRFJNX0RFQlVHKCAicGlkPSVkIGluZGV4PSVkIHN0YXJ0PSVkIGVuZD0lZCBkaXNjYXJkPSVkXG4iLAotCQkgICBEUk1fQ1VSUkVOVFBJRCwKLQkJICAgZWx0cy5pZHgsIGVsdHMuc3RhcnQsIGVsdHMuZW5kLCBlbHRzLmRpc2NhcmQgKTsKKwlEUk1fREVCVUcoInBpZD0lZCBpbmRleD0lZCBzdGFydD0lZCBlbmQ9JWQgZGlzY2FyZD0lZFxuIiwKKwkJICBEUk1fQ1VSUkVOVFBJRCwgZWx0cy5pZHgsIGVsdHMuc3RhcnQsIGVsdHMuZW5kLCBlbHRzLmRpc2NhcmQpOwogCi0JaWYgKCBlbHRzLmlkeCA8IDAgfHwgZWx0cy5pZHggPj0gZG1hLT5idWZfY291bnQgKSB7Ci0JCURSTV9FUlJPUiggImJ1ZmZlciBpbmRleCAlZCAob2YgJWQgbWF4KVxuIiwKLQkJCSAgIGVsdHMuaWR4LCBkbWEtPmJ1Zl9jb3VudCAtIDEgKTsKKwlpZiAoZWx0cy5pZHggPCAwIHx8IGVsdHMuaWR4ID49IGRtYS0+YnVmX2NvdW50KSB7CisJCURSTV9FUlJPUigiYnVmZmVyIGluZGV4ICVkIChvZiAlZCBtYXgpXG4iLAorCQkJICBlbHRzLmlkeCwgZG1hLT5idWZfY291bnQgLSAxKTsKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9Ci0JaWYgKCBlbHRzLnByaW0gPCAwIHx8Ci0JICAgICBlbHRzLnByaW0gPiBSQURFT05fUFJJTV9UWVBFXzNWUlRfTElORV9MSVNUICkgewotCQlEUk1fRVJST1IoICJidWZmZXIgcHJpbSAlZFxuIiwgZWx0cy5wcmltICk7CisJaWYgKGVsdHMucHJpbSA8IDAgfHwgZWx0cy5wcmltID4gUkFERU9OX1BSSU1fVFlQRV8zVlJUX0xJTkVfTElTVCkgeworCQlEUk1fRVJST1IoImJ1ZmZlciBwcmltICVkXG4iLCBlbHRzLnByaW0pOwogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KIAotCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKLQlWQl9BR0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKwlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oZGV2X3ByaXYpOworCVZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKGRldl9wcml2KTsKIAogCWJ1ZiA9IGRtYS0+YnVmbGlzdFtlbHRzLmlkeF07CiAKLQlpZiAoIGJ1Zi0+ZmlscCAhPSBmaWxwICkgewotCQlEUk1fRVJST1IoICJwcm9jZXNzICVkIHVzaW5nIGJ1ZmZlciBvd25lZCBieSAlcFxuIiwKLQkJCSAgIERSTV9DVVJSRU5UUElELCBidWYtPmZpbHAgKTsKKwlpZiAoYnVmLT5maWxwICE9IGZpbHApIHsKKwkJRFJNX0VSUk9SKCJwcm9jZXNzICVkIHVzaW5nIGJ1ZmZlciBvd25lZCBieSAlcFxuIiwKKwkJCSAgRFJNX0NVUlJFTlRQSUQsIGJ1Zi0+ZmlscCk7CiAJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJfQotCWlmICggYnVmLT5wZW5kaW5nICkgewotCQlEUk1fRVJST1IoICJzZW5kaW5nIHBlbmRpbmcgYnVmZmVyICVkXG4iLCBlbHRzLmlkeCApOworCWlmIChidWYtPnBlbmRpbmcpIHsKKwkJRFJNX0VSUk9SKCJzZW5kaW5nIHBlbmRpbmcgYnVmZmVyICVkXG4iLCBlbHRzLmlkeCk7CiAJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJfQogCiAJY291bnQgPSAoZWx0cy5lbmQgLSBlbHRzLnN0YXJ0KSAvIHNpemVvZih1MTYpOwogCWVsdHMuc3RhcnQgLT0gUkFERU9OX0lOREVYX1BSSU1fT0ZGU0VUOwogCi0JaWYgKCBlbHRzLnN0YXJ0ICYgMHg3ICkgewotCQlEUk1fRVJST1IoICJtaXNhbGlnbmVkIGJ1ZmZlciAweCV4XG4iLCBlbHRzLnN0YXJ0ICk7CisJaWYgKGVsdHMuc3RhcnQgJiAweDcpIHsKKwkJRFJNX0VSUk9SKCJtaXNhbGlnbmVkIGJ1ZmZlciAweCV4XG4iLCBlbHRzLnN0YXJ0KTsKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9Ci0JaWYgKCBlbHRzLnN0YXJ0IDwgYnVmLT51c2VkICkgewotCQlEUk1fRVJST1IoICJubyBoZWFkZXIgMHgleCAtIDB4JXhcbiIsIGVsdHMuc3RhcnQsIGJ1Zi0+dXNlZCApOworCWlmIChlbHRzLnN0YXJ0IDwgYnVmLT51c2VkKSB7CisJCURSTV9FUlJPUigibm8gaGVhZGVyIDB4JXggLSAweCV4XG4iLCBlbHRzLnN0YXJ0LCBidWYtPnVzZWQpOwogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KIAogCWJ1Zi0+dXNlZCA9IGVsdHMuZW5kOwogCi0JaWYgKCBzYXJlYV9wcml2LT5kaXJ0eSAmIH5SQURFT05fVVBMT0FEX0NMSVBSRUNUUyApIHsKLQkJaWYgKCByYWRlb25fZW1pdF9zdGF0ZSggZGV2X3ByaXYsIGZpbHBfcHJpdiwKLQkJCQkJJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGUsCi0JCQkJCXNhcmVhX3ByaXYtPnRleF9zdGF0ZSwKLQkJCQkJc2FyZWFfcHJpdi0+ZGlydHkgKSApIHsKLQkJCURSTV9FUlJPUiggInJhZGVvbl9lbWl0X3N0YXRlIGZhaWxlZFxuIiApOwotCQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCWlmIChzYXJlYV9wcml2LT5kaXJ0eSAmIH5SQURFT05fVVBMT0FEX0NMSVBSRUNUUykgeworCQlpZiAocmFkZW9uX2VtaXRfc3RhdGUoZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkgICAgICAmc2FyZWFfcHJpdi0+Y29udGV4dF9zdGF0ZSwKKwkJCQkgICAgICBzYXJlYV9wcml2LT50ZXhfc3RhdGUsCisJCQkJICAgICAgc2FyZWFfcHJpdi0+ZGlydHkpKSB7CisJCQlEUk1fRVJST1IoInJhZGVvbl9lbWl0X3N0YXRlIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCQl9CiAKIAkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfihSQURFT05fVVBMT0FEX1RFWDBJTUFHRVMgfApAQCAtMjI4MiwyNiArMjMxMCwyNSBAQAogCQkJCSAgICAgICBSQURFT05fUkVRVUlSRV9RVUlFU0NFTkNFKTsKIAl9CiAKLQogCS8qIEJ1aWxkIHVwIGEgcHJpbV90IHJlY29yZDoKIAkgKi8KIAlwcmltLnN0YXJ0ID0gZWx0cy5zdGFydDsKLQlwcmltLmZpbmlzaCA9IGVsdHMuZW5kOyAKKwlwcmltLmZpbmlzaCA9IGVsdHMuZW5kOwogCXByaW0ucHJpbSA9IGVsdHMucHJpbTsKIAlwcmltLm9mZnNldCA9IDA7CS8qIG9mZnNldCBmcm9tIHN0YXJ0IG9mIGRtYSBidWZmZXJzICovCi0JcHJpbS5udW12ZXJ0cyA9IFJBREVPTl9NQVhfVkJfVkVSVFM7IC8qIGR1aCAqLworCXByaW0ubnVtdmVydHMgPSBSQURFT05fTUFYX1ZCX1ZFUlRTOwkvKiBkdWggKi8KIAlwcmltLnZjX2Zvcm1hdCA9IGRldl9wcml2LT5zYXJlYV9wcml2LT52Y19mb3JtYXQ7Ci0JCi0JcmFkZW9uX2NwX2Rpc3BhdGNoX2luZGljZXMoIGRldiwgYnVmLCAmcHJpbSApOworCisJcmFkZW9uX2NwX2Rpc3BhdGNoX2luZGljZXMoZGV2LCBidWYsICZwcmltKTsKIAlpZiAoZWx0cy5kaXNjYXJkKSB7Ci0JCXJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlciggZGV2LCBidWYgKTsKKwkJcmFkZW9uX2NwX2Rpc2NhcmRfYnVmZmVyKGRldiwgYnVmKTsKIAl9CiAKIAlDT01NSVRfUklORygpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJhZGVvbl9jcF90ZXh0dXJlKCBEUk1fSU9DVExfQVJHUyApCitzdGF0aWMgaW50IHJhZGVvbl9jcF90ZXh0dXJlKERSTV9JT0NUTF9BUkdTKQogewogCURSTV9ERVZJQ0U7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTIzMDksNTMgKzIzMzYsNTQgQEAKIAlkcm1fcmFkZW9uX3RleF9pbWFnZV90IGltYWdlOwogCWludCByZXQ7CiAKLQlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOwogCi0JRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCB0ZXgsIChkcm1fcmFkZW9uX3RleHR1cmVfdCBfX3VzZXIgKilkYXRhLCBzaXplb2YodGV4KSApOworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCh0ZXgsIChkcm1fcmFkZW9uX3RleHR1cmVfdCBfX3VzZXIgKikgZGF0YSwKKwkJCQkgc2l6ZW9mKHRleCkpOwogCi0JaWYgKCB0ZXguaW1hZ2UgPT0gTlVMTCApIHsKLQkJRFJNX0VSUk9SKCAibnVsbCB0ZXh0dXJlIGltYWdlIVxuIiApOworCWlmICh0ZXguaW1hZ2UgPT0gTlVMTCkgeworCQlEUk1fRVJST1IoIm51bGwgdGV4dHVyZSBpbWFnZSFcbiIpOwogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KIAotCWlmICggRFJNX0NPUFlfRlJPTV9VU0VSKCAmaW1hZ2UsCi0JCQkgICAgIChkcm1fcmFkZW9uX3RleF9pbWFnZV90IF9fdXNlciAqKXRleC5pbWFnZSwKLQkJCSAgICAgc2l6ZW9mKGltYWdlKSApICkKKwlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKCZpbWFnZSwKKwkJCSAgICAgICAoZHJtX3JhZGVvbl90ZXhfaW1hZ2VfdCBfX3VzZXIgKikgdGV4LmltYWdlLAorCQkJICAgICAgIHNpemVvZihpbWFnZSkpKQogCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwogCi0JUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOwotCVZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTihkZXZfcHJpdik7CisJVkJfQUdFX1RFU1RfV0lUSF9SRVRVUk4oZGV2X3ByaXYpOwogCi0JcmV0ID0gcmFkZW9uX2NwX2Rpc3BhdGNoX3RleHR1cmUoIGZpbHAsIGRldiwgJnRleCwgJmltYWdlICk7CisJcmV0ID0gcmFkZW9uX2NwX2Rpc3BhdGNoX3RleHR1cmUoZmlscCwgZGV2LCAmdGV4LCAmaW1hZ2UpOwogCiAJQ09NTUlUX1JJTkcoKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHJhZGVvbl9jcF9zdGlwcGxlKCBEUk1fSU9DVExfQVJHUyApCitzdGF0aWMgaW50IHJhZGVvbl9jcF9zdGlwcGxlKERSTV9JT0NUTF9BUkdTKQogewogCURSTV9ERVZJQ0U7CiAJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlkcm1fcmFkZW9uX3N0aXBwbGVfdCBzdGlwcGxlOwogCXUzMiBtYXNrWzMyXTsKIAotCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CiAKLQlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIHN0aXBwbGUsIChkcm1fcmFkZW9uX3N0aXBwbGVfdCBfX3VzZXIgKilkYXRhLAotCQkJICAgICBzaXplb2Yoc3RpcHBsZSkgKTsKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoc3RpcHBsZSwgKGRybV9yYWRlb25fc3RpcHBsZV90IF9fdXNlciAqKSBkYXRhLAorCQkJCSBzaXplb2Yoc3RpcHBsZSkpOwogCi0JaWYgKCBEUk1fQ09QWV9GUk9NX1VTRVIoICZtYXNrLCBzdGlwcGxlLm1hc2ssIDMyICogc2l6ZW9mKHUzMikgKSApCisJaWYgKERSTV9DT1BZX0ZST01fVVNFUigmbWFzaywgc3RpcHBsZS5tYXNrLCAzMiAqIHNpemVvZih1MzIpKSkKIAkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKIAotCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKwlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oZGV2X3ByaXYpOwogCi0JcmFkZW9uX2NwX2Rpc3BhdGNoX3N0aXBwbGUoIGRldiwgbWFzayApOworCXJhZGVvbl9jcF9kaXNwYXRjaF9zdGlwcGxlKGRldiwgbWFzayk7CiAKIAlDT01NSVRfUklORygpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJhZGVvbl9jcF9pbmRpcmVjdCggRFJNX0lPQ1RMX0FSR1MgKQorc3RhdGljIGludCByYWRlb25fY3BfaW5kaXJlY3QoRFJNX0lPQ1RMX0FSR1MpCiB7CiAJRFJNX0RFVklDRTsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtMjM2NCw1MyArMjM5Miw1MyBAQAogCWRybV9yYWRlb25faW5kaXJlY3RfdCBpbmRpcmVjdDsKIAlSSU5HX0xPQ0FMUzsKIAotCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CiAKLQlpZiAoICFkZXZfcHJpdiApIHsKLQkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCWlmICghZGV2X3ByaXYpIHsKKwkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9CiAKLQlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIGluZGlyZWN0LCAoZHJtX3JhZGVvbl9pbmRpcmVjdF90IF9fdXNlciAqKWRhdGEsCi0JCQkgICAgIHNpemVvZihpbmRpcmVjdCkgKTsKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoaW5kaXJlY3QsCisJCQkJIChkcm1fcmFkZW9uX2luZGlyZWN0X3QgX191c2VyICopIGRhdGEsCisJCQkJIHNpemVvZihpbmRpcmVjdCkpOwogCi0JRFJNX0RFQlVHKCAiaW5kaXJlY3Q6IGlkeD0lZCBzPSVkIGU9JWQgZD0lZFxuIiwKLQkJICAgaW5kaXJlY3QuaWR4LCBpbmRpcmVjdC5zdGFydCwKLQkJICAgaW5kaXJlY3QuZW5kLCBpbmRpcmVjdC5kaXNjYXJkICk7CisJRFJNX0RFQlVHKCJpbmRpcmVjdDogaWR4PSVkIHM9JWQgZT0lZCBkPSVkXG4iLAorCQkgIGluZGlyZWN0LmlkeCwgaW5kaXJlY3Quc3RhcnQsIGluZGlyZWN0LmVuZCwgaW5kaXJlY3QuZGlzY2FyZCk7CiAKLQlpZiAoIGluZGlyZWN0LmlkeCA8IDAgfHwgaW5kaXJlY3QuaWR4ID49IGRtYS0+YnVmX2NvdW50ICkgewotCQlEUk1fRVJST1IoICJidWZmZXIgaW5kZXggJWQgKG9mICVkIG1heClcbiIsCi0JCQkgICBpbmRpcmVjdC5pZHgsIGRtYS0+YnVmX2NvdW50IC0gMSApOworCWlmIChpbmRpcmVjdC5pZHggPCAwIHx8IGluZGlyZWN0LmlkeCA+PSBkbWEtPmJ1Zl9jb3VudCkgeworCQlEUk1fRVJST1IoImJ1ZmZlciBpbmRleCAlZCAob2YgJWQgbWF4KVxuIiwKKwkJCSAgaW5kaXJlY3QuaWR4LCBkbWEtPmJ1Zl9jb3VudCAtIDEpOwogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KIAogCWJ1ZiA9IGRtYS0+YnVmbGlzdFtpbmRpcmVjdC5pZHhdOwogCi0JaWYgKCBidWYtPmZpbHAgIT0gZmlscCApIHsKLQkJRFJNX0VSUk9SKCAicHJvY2VzcyAlZCB1c2luZyBidWZmZXIgb3duZWQgYnkgJXBcbiIsCi0JCQkgICBEUk1fQ1VSUkVOVFBJRCwgYnVmLT5maWxwICk7CisJaWYgKGJ1Zi0+ZmlscCAhPSBmaWxwKSB7CisJCURSTV9FUlJPUigicHJvY2VzcyAlZCB1c2luZyBidWZmZXIgb3duZWQgYnkgJXBcbiIsCisJCQkgIERSTV9DVVJSRU5UUElELCBidWYtPmZpbHApOwogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KLQlpZiAoIGJ1Zi0+cGVuZGluZyApIHsKLQkJRFJNX0VSUk9SKCAic2VuZGluZyBwZW5kaW5nIGJ1ZmZlciAlZFxuIiwgaW5kaXJlY3QuaWR4ICk7CisJaWYgKGJ1Zi0+cGVuZGluZykgeworCQlEUk1fRVJST1IoInNlbmRpbmcgcGVuZGluZyBidWZmZXIgJWRcbiIsIGluZGlyZWN0LmlkeCk7CiAJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJfQogCi0JaWYgKCBpbmRpcmVjdC5zdGFydCA8IGJ1Zi0+dXNlZCApIHsKLQkJRFJNX0VSUk9SKCAicmV1c2luZyBpbmRpcmVjdDogc3RhcnQ9MHgleCBhY3R1YWw9MHgleFxuIiwKLQkJCSAgIGluZGlyZWN0LnN0YXJ0LCBidWYtPnVzZWQgKTsKKwlpZiAoaW5kaXJlY3Quc3RhcnQgPCBidWYtPnVzZWQpIHsKKwkJRFJNX0VSUk9SKCJyZXVzaW5nIGluZGlyZWN0OiBzdGFydD0weCV4IGFjdHVhbD0weCV4XG4iLAorCQkJICBpbmRpcmVjdC5zdGFydCwgYnVmLT51c2VkKTsKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9CiAKLQlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7Ci0JVkJfQUdFX1RFU1RfV0lUSF9SRVRVUk4oIGRldl9wcml2ICk7CisJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKGRldl9wcml2KTsKKwlWQl9BR0VfVEVTVF9XSVRIX1JFVFVSTihkZXZfcHJpdik7CiAKIAlidWYtPnVzZWQgPSBpbmRpcmVjdC5lbmQ7CiAKIAkvKiBXYWl0IGZvciB0aGUgM0Qgc3RyZWFtIHRvIGlkbGUgYmVmb3JlIHRoZSBpbmRpcmVjdCBidWZmZXIKIAkgKiBjb250YWluaW5nIDJEIGFjY2VsZXJhdGlvbiBjb21tYW5kcyBpcyBwcm9jZXNzZWQuCiAJICovCi0JQkVHSU5fUklORyggMiApOworCUJFR0lOX1JJTkcoMik7CiAKIAlSQURFT05fV0FJVF9VTlRJTF8zRF9JRExFKCk7CiAKQEAgLTI0MjAsMTcgKzI0NDgsMTYgQEAKIAkgKiBYIHNlcnZlci4gIFRoaXMgaXMgaW5zZWN1cmUgYW5kIGlzIHRodXMgb25seSBhdmFpbGFibGUgdG8KIAkgKiBwcml2aWxlZ2VkIGNsaWVudHMuCiAJICovCi0JcmFkZW9uX2NwX2Rpc3BhdGNoX2luZGlyZWN0KCBkZXYsIGJ1ZiwgaW5kaXJlY3Quc3RhcnQsIGluZGlyZWN0LmVuZCApOworCXJhZGVvbl9jcF9kaXNwYXRjaF9pbmRpcmVjdChkZXYsIGJ1ZiwgaW5kaXJlY3Quc3RhcnQsIGluZGlyZWN0LmVuZCk7CiAJaWYgKGluZGlyZWN0LmRpc2NhcmQpIHsKLQkJcmFkZW9uX2NwX2Rpc2NhcmRfYnVmZmVyKCBkZXYsIGJ1ZiApOworCQlyYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoZGV2LCBidWYpOwogCX0KIAotCiAJQ09NTUlUX1JJTkcoKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByYWRlb25fY3BfdmVydGV4MiggRFJNX0lPQ1RMX0FSR1MgKQorc3RhdGljIGludCByYWRlb25fY3BfdmVydGV4MihEUk1fSU9DVExfQVJHUykKIHsKIAlEUk1fREVWSUNFOwogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0yNDQyLDY1ICsyNDY5LDY0IEBACiAJaW50IGk7CiAJdW5zaWduZWQgY2hhciBsYXN0c3RhdGU7CiAKLQlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOwogCi0JaWYgKCAhZGV2X3ByaXYgKSB7Ci0JCURSTV9FUlJPUiggIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18gKTsKKwlpZiAoIWRldl9wcml2KSB7CisJCURSTV9FUlJPUigiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJfQogCi0JRFJNX0dFVF9QUklWX1dJVEhfUkVUVVJOKCBmaWxwX3ByaXYsIGZpbHAgKTsKKwlEUk1fR0VUX1BSSVZfV0lUSF9SRVRVUk4oZmlscF9wcml2LCBmaWxwKTsKIAotCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggdmVydGV4LCAoZHJtX3JhZGVvbl92ZXJ0ZXgyX3QgX191c2VyICopZGF0YSwKLQkJCSAgICAgc2l6ZW9mKHZlcnRleCkgKTsKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwodmVydGV4LCAoZHJtX3JhZGVvbl92ZXJ0ZXgyX3QgX191c2VyICopIGRhdGEsCisJCQkJIHNpemVvZih2ZXJ0ZXgpKTsKIAotCURSTV9ERUJVRyggInBpZD0lZCBpbmRleD0lZCBkaXNjYXJkPSVkXG4iLAotCQkgICBEUk1fQ1VSUkVOVFBJRCwKLQkJICAgdmVydGV4LmlkeCwgdmVydGV4LmRpc2NhcmQgKTsKKwlEUk1fREVCVUcoInBpZD0lZCBpbmRleD0lZCBkaXNjYXJkPSVkXG4iLAorCQkgIERSTV9DVVJSRU5UUElELCB2ZXJ0ZXguaWR4LCB2ZXJ0ZXguZGlzY2FyZCk7CiAKLQlpZiAoIHZlcnRleC5pZHggPCAwIHx8IHZlcnRleC5pZHggPj0gZG1hLT5idWZfY291bnQgKSB7Ci0JCURSTV9FUlJPUiggImJ1ZmZlciBpbmRleCAlZCAob2YgJWQgbWF4KVxuIiwKLQkJCSAgIHZlcnRleC5pZHgsIGRtYS0+YnVmX2NvdW50IC0gMSApOworCWlmICh2ZXJ0ZXguaWR4IDwgMCB8fCB2ZXJ0ZXguaWR4ID49IGRtYS0+YnVmX2NvdW50KSB7CisJCURSTV9FUlJPUigiYnVmZmVyIGluZGV4ICVkIChvZiAlZCBtYXgpXG4iLAorCQkJICB2ZXJ0ZXguaWR4LCBkbWEtPmJ1Zl9jb3VudCAtIDEpOwogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KIAotCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKLQlWQl9BR0VfVEVTVF9XSVRIX1JFVFVSTiggZGV2X3ByaXYgKTsKKwlSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oZGV2X3ByaXYpOworCVZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKGRldl9wcml2KTsKIAogCWJ1ZiA9IGRtYS0+YnVmbGlzdFt2ZXJ0ZXguaWR4XTsKIAotCWlmICggYnVmLT5maWxwICE9IGZpbHAgKSB7Ci0JCURSTV9FUlJPUiggInByb2Nlc3MgJWQgdXNpbmcgYnVmZmVyIG93bmVkIGJ5ICVwXG4iLAotCQkJICAgRFJNX0NVUlJFTlRQSUQsIGJ1Zi0+ZmlscCApOworCWlmIChidWYtPmZpbHAgIT0gZmlscCkgeworCQlEUk1fRVJST1IoInByb2Nlc3MgJWQgdXNpbmcgYnVmZmVyIG93bmVkIGJ5ICVwXG4iLAorCQkJICBEUk1fQ1VSUkVOVFBJRCwgYnVmLT5maWxwKTsKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9CiAKLQlpZiAoIGJ1Zi0+cGVuZGluZyApIHsKLQkJRFJNX0VSUk9SKCAic2VuZGluZyBwZW5kaW5nIGJ1ZmZlciAlZFxuIiwgdmVydGV4LmlkeCApOworCWlmIChidWYtPnBlbmRpbmcpIHsKKwkJRFJNX0VSUk9SKCJzZW5kaW5nIHBlbmRpbmcgYnVmZmVyICVkXG4iLCB2ZXJ0ZXguaWR4KTsKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9Ci0JCisKIAlpZiAoc2FyZWFfcHJpdi0+bmJveCA+IFJBREVPTl9OUl9TQVJFQV9DTElQUkVDVFMpCiAJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAKLQlmb3IgKGxhc3RzdGF0ZSA9IDB4ZmYsIGkgPSAwIDsgaSA8IHZlcnRleC5ucl9wcmltcyA7IGkrKykgeworCWZvciAobGFzdHN0YXRlID0gMHhmZiwgaSA9IDA7IGkgPCB2ZXJ0ZXgubnJfcHJpbXM7IGkrKykgewogCQlkcm1fcmFkZW9uX3ByaW1fdCBwcmltOwogCQlkcm1fcmFkZW9uX3RjbF9wcmltX3QgdGNscHJpbTsKLQkJCi0JCWlmICggRFJNX0NPUFlfRlJPTV9VU0VSKCAmcHJpbSwgJnZlcnRleC5wcmltW2ldLCBzaXplb2YocHJpbSkgKSApCisKKwkJaWYgKERSTV9DT1BZX0ZST01fVVNFUigmcHJpbSwgJnZlcnRleC5wcmltW2ldLCBzaXplb2YocHJpbSkpKQogCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKLQkJCi0JCWlmICggcHJpbS5zdGF0ZWlkeCAhPSBsYXN0c3RhdGUgKSB7Ci0JCQlkcm1fcmFkZW9uX3N0YXRlX3Qgc3RhdGU7CQkJICAgICAgIAotCQkJCQotCQkJaWYgKCBEUk1fQ09QWV9GUk9NX1VTRVIoICZzdGF0ZSwgCi0JCQkJCSAgICAgJnZlcnRleC5zdGF0ZVtwcmltLnN0YXRlaWR4XSwgCi0JCQkJCSAgICAgc2l6ZW9mKHN0YXRlKSApICkKKworCQlpZiAocHJpbS5zdGF0ZWlkeCAhPSBsYXN0c3RhdGUpIHsKKwkJCWRybV9yYWRlb25fc3RhdGVfdCBzdGF0ZTsKKworCQkJaWYgKERSTV9DT1BZX0ZST01fVVNFUigmc3RhdGUsCisJCQkJCSAgICAgICAmdmVydGV4LnN0YXRlW3ByaW0uc3RhdGVpZHhdLAorCQkJCQkgICAgICAgc2l6ZW9mKHN0YXRlKSkpCiAJCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKIAotCQkJaWYgKCByYWRlb25fZW1pdF9zdGF0ZTIoIGRldl9wcml2LCBmaWxwX3ByaXYsICZzdGF0ZSApICkgewotCQkJCURSTV9FUlJPUiggInJhZGVvbl9lbWl0X3N0YXRlMiBmYWlsZWRcbiIgKTsKLQkJCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJCQlpZiAocmFkZW9uX2VtaXRfc3RhdGUyKGRldl9wcml2LCBmaWxwX3ByaXYsICZzdGF0ZSkpIHsKKwkJCQlEUk1fRVJST1IoInJhZGVvbl9lbWl0X3N0YXRlMiBmYWlsZWRcbiIpOworCQkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJCQl9CiAKIAkJCWxhc3RzdGF0ZSA9IHByaW0uc3RhdGVpZHg7CkBAIC0yNTExLDQyICsyNTM3LDQwIEBACiAJCXRjbHByaW0ucHJpbSA9IHByaW0ucHJpbTsKIAkJdGNscHJpbS52Y19mb3JtYXQgPSBwcmltLnZjX2Zvcm1hdDsKIAotCQlpZiAoIHByaW0ucHJpbSAmIFJBREVPTl9QUklNX1dBTEtfSU5EICkgeworCQlpZiAocHJpbS5wcmltICYgUkFERU9OX1BSSU1fV0FMS19JTkQpIHsKIAkJCXRjbHByaW0ub2Zmc2V0ID0gcHJpbS5udW12ZXJ0cyAqIDY0OwotCQkJdGNscHJpbS5udW12ZXJ0cyA9IFJBREVPTl9NQVhfVkJfVkVSVFM7IC8qIGR1aCAqLworCQkJdGNscHJpbS5udW12ZXJ0cyA9IFJBREVPTl9NQVhfVkJfVkVSVFM7CS8qIGR1aCAqLwogCi0JCQlyYWRlb25fY3BfZGlzcGF0Y2hfaW5kaWNlcyggZGV2LCBidWYsICZ0Y2xwcmltICk7CisJCQlyYWRlb25fY3BfZGlzcGF0Y2hfaW5kaWNlcyhkZXYsIGJ1ZiwgJnRjbHByaW0pOwogCQl9IGVsc2UgewogCQkJdGNscHJpbS5udW12ZXJ0cyA9IHByaW0ubnVtdmVydHM7Ci0JCQl0Y2xwcmltLm9mZnNldCA9IDA7IC8qIG5vdCB1c2VkICovCisJCQl0Y2xwcmltLm9mZnNldCA9IDA7CS8qIG5vdCB1c2VkICovCiAKLQkJCXJhZGVvbl9jcF9kaXNwYXRjaF92ZXJ0ZXgoIGRldiwgYnVmLCAmdGNscHJpbSApOworCQkJcmFkZW9uX2NwX2Rpc3BhdGNoX3ZlcnRleChkZXYsIGJ1ZiwgJnRjbHByaW0pOwogCQl9Ci0JCQorCiAJCWlmIChzYXJlYV9wcml2LT5uYm94ID09IDEpCiAJCQlzYXJlYV9wcml2LT5uYm94ID0gMDsKIAl9CiAKLQlpZiAoIHZlcnRleC5kaXNjYXJkICkgewotCQlyYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoIGRldiwgYnVmICk7CisJaWYgKHZlcnRleC5kaXNjYXJkKSB7CisJCXJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlcihkZXYsIGJ1Zik7CiAJfQogCiAJQ09NTUlUX1JJTkcoKTsKIAlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgaW50IHJhZGVvbl9lbWl0X3BhY2tldHMoIAotCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKLQlkcm1fZmlsZV90ICpmaWxwX3ByaXYsCi0JZHJtX3JhZGVvbl9jbWRfaGVhZGVyX3QgaGVhZGVyLAotCWRybV9yYWRlb25fY21kX2J1ZmZlcl90ICpjbWRidWYgKQorc3RhdGljIGludCByYWRlb25fZW1pdF9wYWNrZXRzKGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsCisJCQkgICAgICAgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdiwKKwkJCSAgICAgICBkcm1fcmFkZW9uX2NtZF9oZWFkZXJfdCBoZWFkZXIsCisJCQkgICAgICAgZHJtX3JhZGVvbl9jbWRfYnVmZmVyX3QgKiBjbWRidWYpCiB7CiAJaW50IGlkID0gKGludCloZWFkZXIucGFja2V0LnBhY2tldF9pZDsKIAlpbnQgc3osIHJlZzsKIAlpbnQgKmRhdGEgPSAoaW50ICopY21kYnVmLT5idWY7CiAJUklOR19MT0NBTFM7Ci0gICAKKwogCWlmIChpZCA+PSBSQURFT05fTUFYX1NUQVRFX1BBQ0tFVFMpCiAJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAKQEAgLTI1NTQsMTggKzI1NzgsMTggQEAKIAlyZWcgPSBwYWNrZXRbaWRdLnN0YXJ0OwogCiAJaWYgKHN6ICogc2l6ZW9mKGludCkgPiBjbWRidWYtPmJ1ZnN6KSB7Ci0JCURSTV9FUlJPUiggIlBhY2tldCBzaXplIHByb3ZpZGVkIGxhcmdlciB0aGFuIGRhdGEgcHJvdmlkZWRcbiIgKTsKKwkJRFJNX0VSUk9SKCJQYWNrZXQgc2l6ZSBwcm92aWRlZCBsYXJnZXIgdGhhbiBkYXRhIHByb3ZpZGVkXG4iKTsKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9CiAKLQlpZiAoIHJhZGVvbl9jaGVja19hbmRfZml4dXBfcGFja2V0cyggZGV2X3ByaXYsIGZpbHBfcHJpdiwgaWQsIGRhdGEgKSApIHsKLQkJRFJNX0VSUk9SKCAiUGFja2V0IHZlcmlmaWNhdGlvbiBmYWlsZWRcbiIgKTsKLQkJcmV0dXJuIERSTV9FUlIoIEVJTlZBTCApOworCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX3BhY2tldHMoZGV2X3ByaXYsIGZpbHBfcHJpdiwgaWQsIGRhdGEpKSB7CisJCURSTV9FUlJPUigiUGFja2V0IHZlcmlmaWNhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KIAotCUJFR0lOX1JJTkcoc3orMSk7Ci0JT1VUX1JJTkcoIENQX1BBQ0tFVDAoIHJlZywgKHN6LTEpICkgKTsKLQlPVVRfUklOR19UQUJMRSggZGF0YSwgc3ogKTsKKwlCRUdJTl9SSU5HKHN6ICsgMSk7CisJT1VUX1JJTkcoQ1BfUEFDS0VUMChyZWcsIChzeiAtIDEpKSk7CisJT1VUX1JJTkdfVEFCTEUoZGF0YSwgc3opOwogCUFEVkFOQ0VfUklORygpOwogCiAJY21kYnVmLT5idWYgKz0gc3ogKiBzaXplb2YoaW50KTsKQEAgLTI1NzMsMjEgKzI1OTcsMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9lbWl0X3NjYWxhcnMoIAotCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKLQlkcm1fcmFkZW9uX2NtZF9oZWFkZXJfdCBoZWFkZXIsCi0JZHJtX3JhZGVvbl9jbWRfYnVmZmVyX3QgKmNtZGJ1ZiApCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2VtaXRfc2NhbGFycyhkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LAorCQkJCQkgIGRybV9yYWRlb25fY21kX2hlYWRlcl90IGhlYWRlciwKKwkJCQkJICBkcm1fcmFkZW9uX2NtZF9idWZmZXJfdCAqIGNtZGJ1ZikKIHsKIAlpbnQgc3ogPSBoZWFkZXIuc2NhbGFycy5jb3VudDsKIAlpbnQgc3RhcnQgPSBoZWFkZXIuc2NhbGFycy5vZmZzZXQ7CiAJaW50IHN0cmlkZSA9IGhlYWRlci5zY2FsYXJzLnN0cmlkZTsKIAlSSU5HX0xPQ0FMUzsKIAotCUJFR0lOX1JJTkcoIDMrc3ogKTsKLQlPVVRfUklORyggQ1BfUEFDS0VUMCggUkFERU9OX1NFX1RDTF9TQ0FMQVJfSU5EWF9SRUcsIDAgKSApOwotCU9VVF9SSU5HKCBzdGFydCB8IChzdHJpZGUgPDwgUkFERU9OX1NDQUxfSU5EWF9EV09SRF9TVFJJREVfU0hJRlQpKTsKLQlPVVRfUklORyggQ1BfUEFDS0VUMF9UQUJMRSggUkFERU9OX1NFX1RDTF9TQ0FMQVJfREFUQV9SRUcsIHN6LTEgKSApOwotCU9VVF9SSU5HX1RBQkxFKCBjbWRidWYtPmJ1Ziwgc3ogKTsKKwlCRUdJTl9SSU5HKDMgKyBzeik7CisJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fU0VfVENMX1NDQUxBUl9JTkRYX1JFRywgMCkpOworCU9VVF9SSU5HKHN0YXJ0IHwgKHN0cmlkZSA8PCBSQURFT05fU0NBTF9JTkRYX0RXT1JEX1NUUklERV9TSElGVCkpOworCU9VVF9SSU5HKENQX1BBQ0tFVDBfVEFCTEUoUkFERU9OX1NFX1RDTF9TQ0FMQVJfREFUQV9SRUcsIHN6IC0gMSkpOworCU9VVF9SSU5HX1RBQkxFKGNtZGJ1Zi0+YnVmLCBzeik7CiAJQURWQU5DRV9SSU5HKCk7CiAJY21kYnVmLT5idWYgKz0gc3ogKiBzaXplb2YoaW50KTsKIAljbWRidWYtPmJ1ZnN6IC09IHN6ICogc2l6ZW9mKGludCk7CkBAIC0yNTk2LDQyICsyNjE5LDQwIEBACiAKIC8qIEdvZCB0aGlzIGlzIHVnbHkKICAqLwotc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9lbWl0X3NjYWxhcnMyKCAKLQlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCi0JZHJtX3JhZGVvbl9jbWRfaGVhZGVyX3QgaGVhZGVyLAotCWRybV9yYWRlb25fY21kX2J1ZmZlcl90ICpjbWRidWYgKQorc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9lbWl0X3NjYWxhcnMyKGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsCisJCQkJCSAgIGRybV9yYWRlb25fY21kX2hlYWRlcl90IGhlYWRlciwKKwkJCQkJICAgZHJtX3JhZGVvbl9jbWRfYnVmZmVyX3QgKiBjbWRidWYpCiB7CiAJaW50IHN6ID0gaGVhZGVyLnNjYWxhcnMuY291bnQ7CiAJaW50IHN0YXJ0ID0gKCh1bnNpZ25lZCBpbnQpaGVhZGVyLnNjYWxhcnMub2Zmc2V0KSArIDB4MTAwOwogCWludCBzdHJpZGUgPSBoZWFkZXIuc2NhbGFycy5zdHJpZGU7CiAJUklOR19MT0NBTFM7CiAKLQlCRUdJTl9SSU5HKCAzK3N6ICk7Ci0JT1VUX1JJTkcoIENQX1BBQ0tFVDAoIFJBREVPTl9TRV9UQ0xfU0NBTEFSX0lORFhfUkVHLCAwICkgKTsKLQlPVVRfUklORyggc3RhcnQgfCAoc3RyaWRlIDw8IFJBREVPTl9TQ0FMX0lORFhfRFdPUkRfU1RSSURFX1NISUZUKSk7Ci0JT1VUX1JJTkcoIENQX1BBQ0tFVDBfVEFCTEUoIFJBREVPTl9TRV9UQ0xfU0NBTEFSX0RBVEFfUkVHLCBzei0xICkgKTsKLQlPVVRfUklOR19UQUJMRSggY21kYnVmLT5idWYsIHN6ICk7CisJQkVHSU5fUklORygzICsgc3opOworCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1NFX1RDTF9TQ0FMQVJfSU5EWF9SRUcsIDApKTsKKwlPVVRfUklORyhzdGFydCB8IChzdHJpZGUgPDwgUkFERU9OX1NDQUxfSU5EWF9EV09SRF9TVFJJREVfU0hJRlQpKTsKKwlPVVRfUklORyhDUF9QQUNLRVQwX1RBQkxFKFJBREVPTl9TRV9UQ0xfU0NBTEFSX0RBVEFfUkVHLCBzeiAtIDEpKTsKKwlPVVRfUklOR19UQUJMRShjbWRidWYtPmJ1Ziwgc3opOwogCUFEVkFOQ0VfUklORygpOwogCWNtZGJ1Zi0+YnVmICs9IHN6ICogc2l6ZW9mKGludCk7CiAJY21kYnVmLT5idWZzeiAtPSBzeiAqIHNpemVvZihpbnQpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2VtaXRfdmVjdG9ycyggCi0JZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2LAotCWRybV9yYWRlb25fY21kX2hlYWRlcl90IGhlYWRlciwKLQlkcm1fcmFkZW9uX2NtZF9idWZmZXJfdCAqY21kYnVmICkKK3N0YXRpYyBfX2lubGluZV9fIGludCByYWRlb25fZW1pdF92ZWN0b3JzKGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsCisJCQkJCSAgZHJtX3JhZGVvbl9jbWRfaGVhZGVyX3QgaGVhZGVyLAorCQkJCQkgIGRybV9yYWRlb25fY21kX2J1ZmZlcl90ICogY21kYnVmKQogewogCWludCBzeiA9IGhlYWRlci52ZWN0b3JzLmNvdW50OwogCWludCBzdGFydCA9IGhlYWRlci52ZWN0b3JzLm9mZnNldDsKIAlpbnQgc3RyaWRlID0gaGVhZGVyLnZlY3RvcnMuc3RyaWRlOwogCVJJTkdfTE9DQUxTOwogCi0JQkVHSU5fUklORyggMytzeiApOwotCU9VVF9SSU5HKCBDUF9QQUNLRVQwKCBSQURFT05fU0VfVENMX1ZFQ1RPUl9JTkRYX1JFRywgMCApICk7Ci0JT1VUX1JJTkcoIHN0YXJ0IHwgKHN0cmlkZSA8PCBSQURFT05fVkVDX0lORFhfT0NUV09SRF9TVFJJREVfU0hJRlQpKTsKLQlPVVRfUklORyggQ1BfUEFDS0VUMF9UQUJMRSggUkFERU9OX1NFX1RDTF9WRUNUT1JfREFUQV9SRUcsIChzei0xKSApICk7Ci0JT1VUX1JJTkdfVEFCTEUoIGNtZGJ1Zi0+YnVmLCBzeiApOworCUJFR0lOX1JJTkcoMyArIHN6KTsKKwlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9TRV9UQ0xfVkVDVE9SX0lORFhfUkVHLCAwKSk7CisJT1VUX1JJTkcoc3RhcnQgfCAoc3RyaWRlIDw8IFJBREVPTl9WRUNfSU5EWF9PQ1RXT1JEX1NUUklERV9TSElGVCkpOworCU9VVF9SSU5HKENQX1BBQ0tFVDBfVEFCTEUoUkFERU9OX1NFX1RDTF9WRUNUT1JfREFUQV9SRUcsIChzeiAtIDEpKSk7CisJT1VUX1JJTkdfVEFCTEUoY21kYnVmLT5idWYsIHN6KTsKIAlBRFZBTkNFX1JJTkcoKTsKIAogCWNtZGJ1Zi0+YnVmICs9IHN6ICogc2l6ZW9mKGludCk7CkBAIC0yNjM5LDEwICsyNjYwLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgaW50IHJhZGVvbl9lbWl0X3BhY2tldDMoIGRybV9kZXZpY2VfdCAqZGV2LAotCQkJCWRybV9maWxlX3QgKmZpbHBfcHJpdiwKLQkJCQlkcm1fcmFkZW9uX2NtZF9idWZmZXJfdCAqY21kYnVmICkKK3N0YXRpYyBpbnQgcmFkZW9uX2VtaXRfcGFja2V0Myhkcm1fZGV2aWNlX3QgKiBkZXYsCisJCQkgICAgICAgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdiwKKwkJCSAgICAgICBkcm1fcmFkZW9uX2NtZF9idWZmZXJfdCAqIGNtZGJ1ZikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXVuc2lnbmVkIGludCBjbWRzejsKQEAgLTI2NTEsMTQgKzI2NzEsMTQgQEAKIAogCURSTV9ERUJVRygiXG4iKTsKIAotCWlmICggKCByZXQgPSByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX3BhY2tldDMoIGRldl9wcml2LCBmaWxwX3ByaXYsCi0JCQkJCQkgICAgIGNtZGJ1ZiwgJmNtZHN6ICkgKSApIHsKLQkJRFJNX0VSUk9SKCAiUGFja2V0IHZlcmlmaWNhdGlvbiBmYWlsZWRcbiIgKTsKKwlpZiAoKHJldCA9IHJhZGVvbl9jaGVja19hbmRfZml4dXBfcGFja2V0MyhkZXZfcHJpdiwgZmlscF9wcml2LAorCQkJCQkJICBjbWRidWYsICZjbWRzeikpKSB7CisJCURSTV9FUlJPUigiUGFja2V0IHZlcmlmaWNhdGlvbiBmYWlsZWRcbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCUJFR0lOX1JJTkcoIGNtZHN6ICk7Ci0JT1VUX1JJTkdfVEFCTEUoIGNtZGJ1Zi0+YnVmLCBjbWRzeiApOworCUJFR0lOX1JJTkcoY21kc3opOworCU9VVF9SSU5HX1RBQkxFKGNtZGJ1Zi0+YnVmLCBjbWRzeik7CiAJQURWQU5DRV9SSU5HKCk7CiAKIAljbWRidWYtPmJ1ZiArPSBjbWRzeiAqIDQ7CkBAIC0yNjY2LDExICsyNjg2LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIGludCByYWRlb25fZW1pdF9wYWNrZXQzX2NsaXByZWN0KCBkcm1fZGV2aWNlX3QgKmRldiwKLQkJCQkJIGRybV9maWxlX3QgKmZpbHBfcHJpdiwKLQkJCQkJIGRybV9yYWRlb25fY21kX2J1ZmZlcl90ICpjbWRidWYsCi0JCQkJCSBpbnQgb3JpZ19uYm94ICkKK3N0YXRpYyBpbnQgcmFkZW9uX2VtaXRfcGFja2V0M19jbGlwcmVjdChkcm1fZGV2aWNlX3QgKiBkZXYsCisJCQkJCWRybV9maWxlX3QgKiBmaWxwX3ByaXYsCisJCQkJCWRybV9yYWRlb25fY21kX2J1ZmZlcl90ICogY21kYnVmLAorCQkJCQlpbnQgb3JpZ19uYm94KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJZHJtX2NsaXBfcmVjdF90IGJveDsKQEAgLTI2ODIsOSArMjcwMSw5IEBACiAKIAlEUk1fREVCVUcoIlxuIik7CiAKLQlpZiAoICggcmV0ID0gcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9wYWNrZXQzKCBkZXZfcHJpdiwgZmlscF9wcml2LAotCQkJCQkJICAgICBjbWRidWYsICZjbWRzeiApICkgKSB7Ci0JCURSTV9FUlJPUiggIlBhY2tldCB2ZXJpZmljYXRpb24gZmFpbGVkXG4iICk7CisJaWYgKChyZXQgPSByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX3BhY2tldDMoZGV2X3ByaXYsIGZpbHBfcHJpdiwKKwkJCQkJCSAgY21kYnVmLCAmY21kc3opKSkgeworCQlEUk1fRVJST1IoIlBhY2tldCB2ZXJpZmljYXRpb24gZmFpbGVkXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTI2OTIsOCArMjcxMSw4IEBACiAJCWdvdG8gb3V0OwogCiAJZG8gewotCQlpZiAoIGkgPCBjbWRidWYtPm5ib3ggKSB7Ci0JCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKCAmYm94LCAmYm94ZXNbaV0sIHNpemVvZihib3gpICkpCisJCWlmIChpIDwgY21kYnVmLT5uYm94KSB7CisJCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKCZib3gsICZib3hlc1tpXSwgc2l6ZW9mKGJveCkpKQogCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CiAJCQkvKiBGSVhNRSBUaGUgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IHRpbWVzIHJvdW5kCiAJCQkgKiB0aGlzIGxvb3AsIHNlbmQgYSBXQUlUX1VOVElMXzNEX0lETEUgYmVmb3JlCkBAIC0yNzA3LDMwICsyNzI2LDI5IEBACiAJCQkgKiB0aGUgY29ycmVjdCBwbGFjZSB0byBmaXggaXQgYnV0IHRoaXMgd29ya3MKIAkJCSAqIGFyb3VuZCBpdCB1bnRpbCBJIGNhbiBmaWd1cmUgdGhhdCBvdXQgLSBUaW0KIAkJCSAqIFNtaXRoICovCi0JCQlpZiAoIGkgKSB7Ci0JCQkJQkVHSU5fUklORyggMiApOworCQkJaWYgKGkpIHsKKwkJCQlCRUdJTl9SSU5HKDIpOwogCQkJCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsKIAkJCQlBRFZBTkNFX1JJTkcoKTsKIAkJCX0KLQkJCXJhZGVvbl9lbWl0X2NsaXBfcmVjdCggZGV2X3ByaXYsICZib3ggKTsKKwkJCXJhZGVvbl9lbWl0X2NsaXBfcmVjdChkZXZfcHJpdiwgJmJveCk7CiAJCX0KLQkJCi0JCUJFR0lOX1JJTkcoIGNtZHN6ICk7Ci0JCU9VVF9SSU5HX1RBQkxFKCBjbWRidWYtPmJ1ZiwgY21kc3ogKTsKKworCQlCRUdJTl9SSU5HKGNtZHN6KTsKKwkJT1VUX1JJTkdfVEFCTEUoY21kYnVmLT5idWYsIGNtZHN6KTsKIAkJQURWQU5DRV9SSU5HKCk7CiAKLQl9IHdoaWxlICggKytpIDwgY21kYnVmLT5uYm94ICk7Ci0gCWlmIChjbWRidWYtPm5ib3ggPT0gMSkKKwl9IHdoaWxlICgrK2kgPCBjbWRidWYtPm5ib3gpOworCWlmIChjbWRidWYtPm5ib3ggPT0gMSkKIAkJY21kYnVmLT5uYm94ID0gMDsKIAotIG91dDoKKyAgICAgIG91dDoKIAljbWRidWYtPmJ1ZiArPSBjbWRzeiAqIDQ7CiAJY21kYnVmLT5idWZzeiAtPSBjbWRzeiAqIDQ7CiAJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIGludCByYWRlb25fZW1pdF93YWl0KCBkcm1fZGV2aWNlX3QgKmRldiwgaW50IGZsYWdzICkKK3N0YXRpYyBpbnQgcmFkZW9uX2VtaXRfd2FpdChkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBmbGFncykKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCVJJTkdfTE9DQUxTOwpAQCAtMjczOCwxOCArMjc1NiwxOCBAQAogCURSTV9ERUJVRygiJXM6ICV4XG4iLCBfX0ZVTkNUSU9OX18sIGZsYWdzKTsKIAlzd2l0Y2ggKGZsYWdzKSB7CiAJY2FzZSBSQURFT05fV0FJVF8yRDoKLQkJQkVHSU5fUklORyggMiApOwotCQlSQURFT05fV0FJVF9VTlRJTF8yRF9JRExFKCk7IAorCQlCRUdJTl9SSU5HKDIpOworCQlSQURFT05fV0FJVF9VTlRJTF8yRF9JRExFKCk7CiAJCUFEVkFOQ0VfUklORygpOwogCQlicmVhazsKIAljYXNlIFJBREVPTl9XQUlUXzNEOgotCQlCRUdJTl9SSU5HKCAyICk7Ci0JCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsgCisJCUJFR0lOX1JJTkcoMik7CisJCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsKIAkJQURWQU5DRV9SSU5HKCk7CiAJCWJyZWFrOwotCWNhc2UgUkFERU9OX1dBSVRfMkR8UkFERU9OX1dBSVRfM0Q6Ci0JCUJFR0lOX1JJTkcoIDIgKTsKLQkJUkFERU9OX1dBSVRfVU5USUxfSURMRSgpOyAKKwljYXNlIFJBREVPTl9XQUlUXzJEIHwgUkFERU9OX1dBSVRfM0Q6CisJCUJFR0lOX1JJTkcoMik7CisJCVJBREVPTl9XQUlUX1VOVElMX0lETEUoKTsKIAkJQURWQU5DRV9SSU5HKCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0yNzU5LDcgKzI3NzcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJhZGVvbl9jcF9jbWRidWYoIERSTV9JT0NUTF9BUkdTICkKK3N0YXRpYyBpbnQgcmFkZW9uX2NwX2NtZGJ1ZihEUk1fSU9DVExfQVJHUykKIHsKIAlEUk1fREVWSUNFOwogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0yNzcwLDI0ICsyNzg4LDI1IEBACiAJZHJtX3JhZGVvbl9jbWRfYnVmZmVyX3QgY21kYnVmOwogCWRybV9yYWRlb25fY21kX2hlYWRlcl90IGhlYWRlcjsKIAlpbnQgb3JpZ19uYm94LCBvcmlnX2J1ZnN6OwotCWNoYXIgKmtidWY9TlVMTDsKKwljaGFyICprYnVmID0gTlVMTDsKIAotCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTiggZGV2LCBmaWxwICk7CisJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CiAKLQlpZiAoICFkZXZfcHJpdiApIHsKLQkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCWlmICghZGV2X3ByaXYpIHsKKwkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9CiAKLQlEUk1fR0VUX1BSSVZfV0lUSF9SRVRVUk4oIGZpbHBfcHJpdiwgZmlscCApOworCURSTV9HRVRfUFJJVl9XSVRIX1JFVFVSTihmaWxwX3ByaXYsIGZpbHApOwogCi0JRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKCBjbWRidWYsIChkcm1fcmFkZW9uX2NtZF9idWZmZXJfdCBfX3VzZXIgKilkYXRhLAotCQkJICAgICBzaXplb2YoY21kYnVmKSApOworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChjbWRidWYsCisJCQkJIChkcm1fcmFkZW9uX2NtZF9idWZmZXJfdCBfX3VzZXIgKikgZGF0YSwKKwkJCQkgc2l6ZW9mKGNtZGJ1ZikpOwogCi0JUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOwotCVZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKCBkZXZfcHJpdiApOworCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTihkZXZfcHJpdik7CisJVkJfQUdFX1RFU1RfV0lUSF9SRVRVUk4oZGV2X3ByaXYpOwogCi0JaWYgKGNtZGJ1Zi5idWZzeiA+IDY0KjEwMjQgfHwgY21kYnVmLmJ1ZnN6PDApIHsKKwlpZiAoY21kYnVmLmJ1ZnN6ID4gNjQgKiAxMDI0IHx8IGNtZGJ1Zi5idWZzeiA8IDApIHsKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9CiAKQEAgLTI4MDksMjcgKzI4MjgsMjggQEAKIAogCW9yaWdfbmJveCA9IGNtZGJ1Zi5uYm94OwogCi0JaWYoZGV2X3ByaXYtPm1pY3JvY29kZV92ZXJzaW9uID09IFVDT0RFX1IzMDApIHsKKwlpZiAoZGV2X3ByaXYtPm1pY3JvY29kZV92ZXJzaW9uID09IFVDT0RFX1IzMDApIHsKIAkJaW50IHRlbXA7Ci0JCXRlbXA9cjMwMF9kb19jcF9jbWRidWYoZGV2LCBmaWxwLCBmaWxwX3ByaXYsICZjbWRidWYpOwotCQorCQl0ZW1wID0gcjMwMF9kb19jcF9jbWRidWYoZGV2LCBmaWxwLCBmaWxwX3ByaXYsICZjbWRidWYpOworCiAJCWlmIChvcmlnX2J1ZnN6ICE9IDApCiAJCQlkcm1fZnJlZShrYnVmLCBvcmlnX2J1ZnN6LCBEUk1fTUVNX0RSSVZFUik7Ci0JCisKIAkJcmV0dXJuIHRlbXA7CiAJfQogCiAJLyogbWljcm9jb2RlX3ZlcnNpb24gIT0gcjMwMCAqLwotCXdoaWxlICggY21kYnVmLmJ1ZnN6ID49IHNpemVvZihoZWFkZXIpICkgeworCXdoaWxlIChjbWRidWYuYnVmc3ogPj0gc2l6ZW9mKGhlYWRlcikpIHsKIAogCQloZWFkZXIuaSA9ICooaW50ICopY21kYnVmLmJ1ZjsKIAkJY21kYnVmLmJ1ZiArPSBzaXplb2YoaGVhZGVyKTsKIAkJY21kYnVmLmJ1ZnN6IC09IHNpemVvZihoZWFkZXIpOwogCiAJCXN3aXRjaCAoaGVhZGVyLmhlYWRlci5jbWRfdHlwZSkgewotCQljYXNlIFJBREVPTl9DTURfUEFDS0VUOiAKKwkJY2FzZSBSQURFT05fQ01EX1BBQ0tFVDoKIAkJCURSTV9ERUJVRygiUkFERU9OX0NNRF9QQUNLRVRcbiIpOwotCQkJaWYgKHJhZGVvbl9lbWl0X3BhY2tldHMoIGRldl9wcml2LCBmaWxwX3ByaXYsIGhlYWRlciwgJmNtZGJ1ZiApKSB7CisJCQlpZiAocmFkZW9uX2VtaXRfcGFja2V0cworCQkJICAgIChkZXZfcHJpdiwgZmlscF9wcml2LCBoZWFkZXIsICZjbWRidWYpKSB7CiAJCQkJRFJNX0VSUk9SKCJyYWRlb25fZW1pdF9wYWNrZXRzIGZhaWxlZFxuIik7CiAJCQkJZ290byBlcnI7CiAJCQl9CkBAIC0yODM3LDcgKzI4NTcsNyBAQAogCiAJCWNhc2UgUkFERU9OX0NNRF9TQ0FMQVJTOgogCQkJRFJNX0RFQlVHKCJSQURFT05fQ01EX1NDQUxBUlNcbiIpOwotCQkJaWYgKHJhZGVvbl9lbWl0X3NjYWxhcnMoIGRldl9wcml2LCBoZWFkZXIsICZjbWRidWYgKSkgeworCQkJaWYgKHJhZGVvbl9lbWl0X3NjYWxhcnMoZGV2X3ByaXYsIGhlYWRlciwgJmNtZGJ1ZikpIHsKIAkJCQlEUk1fRVJST1IoInJhZGVvbl9lbWl0X3NjYWxhcnMgZmFpbGVkXG4iKTsKIAkJCQlnb3RvIGVycjsKIAkJCX0KQEAgLTI4NDUsNyArMjg2NSw3IEBACiAKIAkJY2FzZSBSQURFT05fQ01EX1ZFQ1RPUlM6CiAJCQlEUk1fREVCVUcoIlJBREVPTl9DTURfVkVDVE9SU1xuIik7Ci0JCQlpZiAocmFkZW9uX2VtaXRfdmVjdG9ycyggZGV2X3ByaXYsIGhlYWRlciwgJmNtZGJ1ZiApKSB7CisJCQlpZiAocmFkZW9uX2VtaXRfdmVjdG9ycyhkZXZfcHJpdiwgaGVhZGVyLCAmY21kYnVmKSkgewogCQkJCURSTV9FUlJPUigicmFkZW9uX2VtaXRfdmVjdG9ycyBmYWlsZWRcbiIpOwogCQkJCWdvdG8gZXJyOwogCQkJfQpAQCAtMjg1NCwyNSArMjg3NCwyNSBAQAogCQljYXNlIFJBREVPTl9DTURfRE1BX0RJU0NBUkQ6CiAJCQlEUk1fREVCVUcoIlJBREVPTl9DTURfRE1BX0RJU0NBUkRcbiIpOwogCQkJaWR4ID0gaGVhZGVyLmRtYS5idWZfaWR4OwotCQkJaWYgKCBpZHggPCAwIHx8IGlkeCA+PSBkbWEtPmJ1Zl9jb3VudCApIHsKLQkJCQlEUk1fRVJST1IoICJidWZmZXIgaW5kZXggJWQgKG9mICVkIG1heClcbiIsCi0JCQkJCSAgIGlkeCwgZG1hLT5idWZfY291bnQgLSAxICk7CisJCQlpZiAoaWR4IDwgMCB8fCBpZHggPj0gZG1hLT5idWZfY291bnQpIHsKKwkJCQlEUk1fRVJST1IoImJ1ZmZlciBpbmRleCAlZCAob2YgJWQgbWF4KVxuIiwKKwkJCQkJICBpZHgsIGRtYS0+YnVmX2NvdW50IC0gMSk7CiAJCQkJZ290byBlcnI7CiAJCQl9CiAKIAkJCWJ1ZiA9IGRtYS0+YnVmbGlzdFtpZHhdOwotCQkJaWYgKCBidWYtPmZpbHAgIT0gZmlscCB8fCBidWYtPnBlbmRpbmcgKSB7Ci0JCQkJRFJNX0VSUk9SKCAiYmFkIGJ1ZmZlciAlcCAlcCAlZFxuIiwKLQkJCQkJICAgYnVmLT5maWxwLCBmaWxwLCBidWYtPnBlbmRpbmcpOworCQkJaWYgKGJ1Zi0+ZmlscCAhPSBmaWxwIHx8IGJ1Zi0+cGVuZGluZykgeworCQkJCURSTV9FUlJPUigiYmFkIGJ1ZmZlciAlcCAlcCAlZFxuIiwKKwkJCQkJICBidWYtPmZpbHAsIGZpbHAsIGJ1Zi0+cGVuZGluZyk7CiAJCQkJZ290byBlcnI7CiAJCQl9CiAKLQkJCXJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlciggZGV2LCBidWYgKTsKKwkJCXJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlcihkZXYsIGJ1Zik7CiAJCQlicmVhazsKIAogCQljYXNlIFJBREVPTl9DTURfUEFDS0VUMzoKIAkJCURSTV9ERUJVRygiUkFERU9OX0NNRF9QQUNLRVQzXG4iKTsKLQkJCWlmIChyYWRlb25fZW1pdF9wYWNrZXQzKCBkZXYsIGZpbHBfcHJpdiwgJmNtZGJ1ZiApKSB7CisJCQlpZiAocmFkZW9uX2VtaXRfcGFja2V0MyhkZXYsIGZpbHBfcHJpdiwgJmNtZGJ1ZikpIHsKIAkJCQlEUk1fRVJST1IoInJhZGVvbl9lbWl0X3BhY2tldDMgZmFpbGVkXG4iKTsKIAkJCQlnb3RvIGVycjsKIAkJCX0KQEAgLTI4ODAsNyArMjkwMCw4IEBACiAKIAkJY2FzZSBSQURFT05fQ01EX1BBQ0tFVDNfQ0xJUDoKIAkJCURSTV9ERUJVRygiUkFERU9OX0NNRF9QQUNLRVQzX0NMSVBcbiIpOwotCQkJaWYgKHJhZGVvbl9lbWl0X3BhY2tldDNfY2xpcHJlY3QoIGRldiwgZmlscF9wcml2LCAmY21kYnVmLCBvcmlnX25ib3ggKSkgeworCQkJaWYgKHJhZGVvbl9lbWl0X3BhY2tldDNfY2xpcHJlY3QKKwkJCSAgICAoZGV2LCBmaWxwX3ByaXYsICZjbWRidWYsIG9yaWdfbmJveCkpIHsKIAkJCQlEUk1fRVJST1IoInJhZGVvbl9lbWl0X3BhY2tldDNfY2xpcCBmYWlsZWRcbiIpOwogCQkJCWdvdG8gZXJyOwogCQkJfQpAQCAtMjg4OCw3ICsyOTA5LDcgQEAKIAogCQljYXNlIFJBREVPTl9DTURfU0NBTEFSUzI6CiAJCQlEUk1fREVCVUcoIlJBREVPTl9DTURfU0NBTEFSUzJcbiIpOwotCQkJaWYgKHJhZGVvbl9lbWl0X3NjYWxhcnMyKCBkZXZfcHJpdiwgaGVhZGVyLCAmY21kYnVmICkpIHsKKwkJCWlmIChyYWRlb25fZW1pdF9zY2FsYXJzMihkZXZfcHJpdiwgaGVhZGVyLCAmY21kYnVmKSkgewogCQkJCURSTV9FUlJPUigicmFkZW9uX2VtaXRfc2NhbGFyczIgZmFpbGVkXG4iKTsKIAkJCQlnb3RvIGVycjsKIAkJCX0KQEAgLTI4OTYsMTMgKzI5MTcsMTMgQEAKIAogCQljYXNlIFJBREVPTl9DTURfV0FJVDoKIAkJCURSTV9ERUJVRygiUkFERU9OX0NNRF9XQUlUXG4iKTsKLQkJCWlmIChyYWRlb25fZW1pdF93YWl0KCBkZXYsIGhlYWRlci53YWl0LmZsYWdzICkpIHsKKwkJCWlmIChyYWRlb25fZW1pdF93YWl0KGRldiwgaGVhZGVyLndhaXQuZmxhZ3MpKSB7CiAJCQkJRFJNX0VSUk9SKCJyYWRlb25fZW1pdF93YWl0IGZhaWxlZFxuIik7CiAJCQkJZ290byBlcnI7CiAJCQl9CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCURSTV9FUlJPUigiYmFkIGNtZF90eXBlICVkIGF0ICVwXG4iLCAKKwkJCURSTV9FUlJPUigiYmFkIGNtZF90eXBlICVkIGF0ICVwXG4iLAogCQkJCSAgaGVhZGVyLmhlYWRlci5jbWRfdHlwZSwKIAkJCQkgIGNtZGJ1Zi5idWYgLSBzaXplb2YoaGVhZGVyKSk7CiAJCQlnb3RvIGVycjsKQEAgLTI5MTYsNDUgKzI5MzcsNDMgQEAKIAlDT01NSVRfUklORygpOwogCXJldHVybiAwOwogCi1lcnI6CisgICAgICBlcnI6CiAJaWYgKG9yaWdfYnVmc3ogIT0gMCkKIAkJZHJtX2ZyZWUoa2J1Ziwgb3JpZ19idWZzeiwgRFJNX01FTV9EUklWRVIpOwogCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiB9CiAKLQotCi1zdGF0aWMgaW50IHJhZGVvbl9jcF9nZXRwYXJhbSggRFJNX0lPQ1RMX0FSR1MgKQorc3RhdGljIGludCByYWRlb25fY3BfZ2V0cGFyYW0oRFJNX0lPQ1RMX0FSR1MpCiB7CiAJRFJNX0RFVklDRTsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9yYWRlb25fZ2V0cGFyYW1fdCBwYXJhbTsKIAlpbnQgdmFsdWU7CiAKLQlpZiAoICFkZXZfcHJpdiApIHsKLQkJRFJNX0VSUk9SKCAiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyApOworCWlmICghZGV2X3ByaXYpIHsKKwkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9CiAKLQlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoIHBhcmFtLCAoZHJtX3JhZGVvbl9nZXRwYXJhbV90IF9fdXNlciAqKWRhdGEsCi0JCQkgICAgIHNpemVvZihwYXJhbSkgKTsKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwocGFyYW0sIChkcm1fcmFkZW9uX2dldHBhcmFtX3QgX191c2VyICopIGRhdGEsCisJCQkJIHNpemVvZihwYXJhbSkpOwogCi0JRFJNX0RFQlVHKCAicGlkPSVkXG4iLCBEUk1fQ1VSUkVOVFBJRCApOworCURSTV9ERUJVRygicGlkPSVkXG4iLCBEUk1fQ1VSUkVOVFBJRCk7CiAKLQlzd2l0Y2goIHBhcmFtLnBhcmFtICkgeworCXN3aXRjaCAocGFyYW0ucGFyYW0pIHsKIAljYXNlIFJBREVPTl9QQVJBTV9HQVJUX0JVRkZFUl9PRkZTRVQ6CiAJCXZhbHVlID0gZGV2X3ByaXYtPmdhcnRfYnVmZmVyc19vZmZzZXQ7CiAJCWJyZWFrOwogCWNhc2UgUkFERU9OX1BBUkFNX0xBU1RfRlJBTUU6CiAJCWRldl9wcml2LT5zdGF0cy5sYXN0X2ZyYW1lX3JlYWRzKys7Ci0JCXZhbHVlID0gR0VUX1NDUkFUQ0goIDAgKTsKKwkJdmFsdWUgPSBHRVRfU0NSQVRDSCgwKTsKIAkJYnJlYWs7CiAJY2FzZSBSQURFT05fUEFSQU1fTEFTVF9ESVNQQVRDSDoKLQkJdmFsdWUgPSBHRVRfU0NSQVRDSCggMSApOworCQl2YWx1ZSA9IEdFVF9TQ1JBVENIKDEpOwogCQlicmVhazsKIAljYXNlIFJBREVPTl9QQVJBTV9MQVNUX0NMRUFSOgogCQlkZXZfcHJpdi0+c3RhdHMubGFzdF9jbGVhcl9yZWFkcysrOwotCQl2YWx1ZSA9IEdFVF9TQ1JBVENIKCAyICk7CisJCXZhbHVlID0gR0VUX1NDUkFUQ0goMik7CiAJCWJyZWFrOwogCWNhc2UgUkFERU9OX1BBUkFNX0lSUV9OUjoKIAkJdmFsdWUgPSBkZXYtPmlycTsKQEAgLTI5NjksMTUgKzI5ODgsMTUgQEAKIAkJdmFsdWUgPSBkZXZfcHJpdi0+cmluZ19ycHRyX29mZnNldDsKIAkJYnJlYWs7CiAjaWYgQklUU19QRVJfTE9ORyA9PSAzMgotCS8qCi0JICogVGhpcyBpb2N0bCgpIGRvZXNuJ3Qgd29yayBvbiA2NC1iaXQgcGxhdGZvcm1zIGJlY2F1c2UgaHdfbG9jayBpcyBhCi0JICogcG9pbnRlciB3aGljaCBjYW4ndCBmaXQgaW50byBhbiBpbnQtc2l6ZWQgdmFyaWFibGUuICBBY2NvcmRpbmcgdG8KLQkgKiBNaWNoZWwgRORuemVyLCB0aGUgaW9jdGwoKSBpcyBvbmx5IHVzZWQgb24gZW1iZWRkZWQgcGxhdGZvcm1zLCBzbwotCSAqIG5vdCBzdXBwb3J0aW5nIGl0IHNob3VsZG4ndCBiZSBhIHByb2JsZW0uICBJZiB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5Ci0JICogaXMgbmVlZGVkIG9uIDY0LWJpdCBwbGF0Zm9ybXMsIGEgbmV3IGlvY3RsKCkgd291bGQgaGF2ZSB0byBiZSBhZGRlZCwKLQkgKiBzbyBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBmb3IgdGhlIGVtYmVkZGVkIHBsYXRmb3JtcyBjYW4gYmUKLQkgKiBtYWludGFpbmVkLiAgLS1kYXZpZG0gNC1GZWItMjAwNC4KLQkgKi8KKwkJLyoKKwkJICogVGhpcyBpb2N0bCgpIGRvZXNuJ3Qgd29yayBvbiA2NC1iaXQgcGxhdGZvcm1zIGJlY2F1c2UgaHdfbG9jayBpcyBhCisJCSAqIHBvaW50ZXIgd2hpY2ggY2FuJ3QgZml0IGludG8gYW4gaW50LXNpemVkIHZhcmlhYmxlLiAgQWNjb3JkaW5nIHRvCisJCSAqIE1pY2hlbCBE5G56ZXIsIHRoZSBpb2N0bCgpIGlzIG9ubHkgdXNlZCBvbiBlbWJlZGRlZCBwbGF0Zm9ybXMsIHNvCisJCSAqIG5vdCBzdXBwb3J0aW5nIGl0IHNob3VsZG4ndCBiZSBhIHByb2JsZW0uICBJZiB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5CisJCSAqIGlzIG5lZWRlZCBvbiA2NC1iaXQgcGxhdGZvcm1zLCBhIG5ldyBpb2N0bCgpIHdvdWxkIGhhdmUgdG8gYmUgYWRkZWQsCisJCSAqIHNvIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IGZvciB0aGUgZW1iZWRkZWQgcGxhdGZvcm1zIGNhbiBiZQorCQkgKiBtYWludGFpbmVkLiAgLS1kYXZpZG0gNC1GZWItMjAwNC4KKwkJICovCiAJY2FzZSBSQURFT05fUEFSQU1fU0FSRUFfSEFORExFOgogCQkvKiBUaGUgbG9jayBpcyB0aGUgZmlyc3QgZHdvcmQgaW4gdGhlIHNhcmVhLiAqLwogCQl2YWx1ZSA9IChsb25nKWRldi0+bG9jay5od19sb2NrOwpAQCAtMjk5MCw1NiArMzAwOSw1NiBAQAogCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwogCX0KIAotCWlmICggRFJNX0NPUFlfVE9fVVNFUiggcGFyYW0udmFsdWUsICZ2YWx1ZSwgc2l6ZW9mKGludCkgKSApIHsKLQkJRFJNX0VSUk9SKCAiY29weV90b191c2VyXG4iICk7CisJaWYgKERSTV9DT1BZX1RPX1VTRVIocGFyYW0udmFsdWUsICZ2YWx1ZSwgc2l6ZW9mKGludCkpKSB7CisJCURSTV9FUlJPUigiY29weV90b191c2VyXG4iKTsKIAkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKIAl9Ci0JCisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByYWRlb25fY3Bfc2V0cGFyYW0oIERSTV9JT0NUTF9BUkdTICkgeworc3RhdGljIGludCByYWRlb25fY3Bfc2V0cGFyYW0oRFJNX0lPQ1RMX0FSR1MpCit7CiAJRFJNX0RFVklDRTsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCWRybV9maWxlX3QgKmZpbHBfcHJpdjsKIAlkcm1fcmFkZW9uX3NldHBhcmFtX3Qgc3A7CiAJc3RydWN0IGRybV9yYWRlb25fZHJpdmVyX2ZpbGVfZmllbGRzICpyYWRlb25fcHJpdjsKIAotCWlmICggIWRldl9wcml2ICkgewotCQlEUk1fRVJST1IoICIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fICk7Ci0JCXJldHVybiBEUk1fRVJSKCBFSU5WQUwgKTsKKwlpZiAoIWRldl9wcml2KSB7CisJCURSTV9FUlJPUigiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CiAJfQogCi0JRFJNX0dFVF9QUklWX1dJVEhfUkVUVVJOKCBmaWxwX3ByaXYsIGZpbHAgKTsKKwlEUk1fR0VUX1BSSVZfV0lUSF9SRVRVUk4oZmlscF9wcml2LCBmaWxwKTsKIAotCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCggc3AsICggZHJtX3JhZGVvbl9zZXRwYXJhbV90IF9fdXNlciAqIClkYXRhLAotCQkJCSAgc2l6ZW9mKCBzcCApICk7CisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKHNwLCAoZHJtX3JhZGVvbl9zZXRwYXJhbV90IF9fdXNlciAqKSBkYXRhLAorCQkJCSBzaXplb2Yoc3ApKTsKIAotCXN3aXRjaCggc3AucGFyYW0gKSB7CisJc3dpdGNoIChzcC5wYXJhbSkgewogCWNhc2UgUkFERU9OX1NFVFBBUkFNX0ZCX0xPQ0FUSU9OOgogCQlyYWRlb25fcHJpdiA9IGZpbHBfcHJpdi0+ZHJpdmVyX3ByaXY7CiAJCXJhZGVvbl9wcml2LT5yYWRlb25fZmJfZGVsdGEgPSBkZXZfcHJpdi0+ZmJfbG9jYXRpb24gLSBzcC52YWx1ZTsKIAkJYnJlYWs7CiAJY2FzZSBSQURFT05fU0VUUEFSQU1fU1dJVENIX1RJTElORzoKIAkJaWYgKHNwLnZhbHVlID09IDApIHsKLQkJCURSTV9ERUJVRyggImNvbG9yIHRpbGluZyBkaXNhYmxlZFxuIiApOworCQkJRFJNX0RFQlVHKCJjb2xvciB0aWxpbmcgZGlzYWJsZWRcbiIpOwogCQkJZGV2X3ByaXYtPmZyb250X3BpdGNoX29mZnNldCAmPSB+UkFERU9OX0RTVF9USUxFX01BQ1JPOwogCQkJZGV2X3ByaXYtPmJhY2tfcGl0Y2hfb2Zmc2V0ICY9IH5SQURFT05fRFNUX1RJTEVfTUFDUk87CiAJCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+dGlsaW5nX2VuYWJsZWQgPSAwOwotCQl9Ci0JCWVsc2UgaWYgKHNwLnZhbHVlID09IDEpIHsKLQkJCURSTV9ERUJVRyggImNvbG9yIHRpbGluZyBlbmFibGVkXG4iICk7CisJCX0gZWxzZSBpZiAoc3AudmFsdWUgPT0gMSkgeworCQkJRFJNX0RFQlVHKCJjb2xvciB0aWxpbmcgZW5hYmxlZFxuIik7CiAJCQlkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0IHw9IFJBREVPTl9EU1RfVElMRV9NQUNSTzsKIAkJCWRldl9wcml2LT5iYWNrX3BpdGNoX29mZnNldCB8PSBSQURFT05fRFNUX1RJTEVfTUFDUk87CiAJCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+dGlsaW5nX2VuYWJsZWQgPSAxOwogCQl9Ci0JCWJyZWFrOwkKKwkJYnJlYWs7CiAJY2FzZSBSQURFT05fU0VUUEFSQU1fUENJR0FSVF9MT0NBVElPTjoKIAkJZGV2X3ByaXYtPnBjaWdhcnRfb2Zmc2V0ID0gc3AudmFsdWU7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCURSTV9ERUJVRyggIkludmFsaWQgcGFyYW1ldGVyICVkXG4iLCBzcC5wYXJhbSApOwotCQlyZXR1cm4gRFJNX0VSUiggRUlOVkFMICk7CisJCURSTV9ERUJVRygiSW52YWxpZCBwYXJhbWV0ZXIgJWRcbiIsIHNwLnBhcmFtKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTMwNTEsNzggKzMwNzAsMTA2IEBACiAgKgogICogRFJNIGluZnJhc3RydWN0dXJlIHRha2VzIGNhcmUgb2YgcmVjbGFpbWluZyBkbWEgYnVmZmVycy4KICAqLwotdm9pZCByYWRlb25fZHJpdmVyX3ByZXJlbGVhc2UoZHJtX2RldmljZV90ICpkZXYsIERSTUZJTEUgZmlscCkKK3ZvaWQgcmFkZW9uX2RyaXZlcl9wcmVyZWxlYXNlKGRybV9kZXZpY2VfdCAqIGRldiwgRFJNRklMRSBmaWxwKQogewotCWlmICggZGV2LT5kZXZfcHJpdmF0ZSApIHsJCQkJCi0JCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7IAotCQlpZiAoIGRldl9wcml2LT5wYWdlX2ZsaXBwaW5nICkgewkJCi0JCQlyYWRlb25fZG9fY2xlYW51cF9wYWdlZmxpcCggZGV2ICk7CQotCQl9CQkJCQkJCi0JCXJhZGVvbl9tZW1fcmVsZWFzZSggZmlscCwgZGV2X3ByaXYtPmdhcnRfaGVhcCApOyAKLQkJcmFkZW9uX21lbV9yZWxlYXNlKCBmaWxwLCBkZXZfcHJpdi0+ZmJfaGVhcCApOwkKKwlpZiAoZGV2LT5kZXZfcHJpdmF0ZSkgeworCQlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCQlpZiAoZGV2X3ByaXYtPnBhZ2VfZmxpcHBpbmcpIHsKKwkJCXJhZGVvbl9kb19jbGVhbnVwX3BhZ2VmbGlwKGRldik7CisJCX0KKwkJcmFkZW9uX21lbV9yZWxlYXNlKGZpbHAsIGRldl9wcml2LT5nYXJ0X2hlYXApOworCQlyYWRlb25fbWVtX3JlbGVhc2UoZmlscCwgZGV2X3ByaXYtPmZiX2hlYXApOwogCQlyYWRlb25fc3VyZmFjZXNfcmVsZWFzZShmaWxwLCBkZXZfcHJpdik7Ci0JfQkJCQkKKwl9CiB9CiAKLXZvaWQgcmFkZW9uX2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKmRldikKK3ZvaWQgcmFkZW9uX2RyaXZlcl9wcmV0YWtlZG93bihkcm1fZGV2aWNlX3QgKiBkZXYpCiB7CiAJcmFkZW9uX2RvX3JlbGVhc2UoZGV2KTsKIH0KIAotaW50IHJhZGVvbl9kcml2ZXJfb3Blbl9oZWxwZXIoZHJtX2RldmljZV90ICpkZXYsIGRybV9maWxlX3QgKmZpbHBfcHJpdikKK2ludCByYWRlb25fZHJpdmVyX29wZW5faGVscGVyKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdikKIHsKIAlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1fcmFkZW9uX2RyaXZlcl9maWxlX2ZpZWxkcyAqcmFkZW9uX3ByaXY7Ci0JCi0JcmFkZW9uX3ByaXYgPSAoc3RydWN0IGRybV9yYWRlb25fZHJpdmVyX2ZpbGVfZmllbGRzICopZHJtX2FsbG9jKHNpemVvZigqcmFkZW9uX3ByaXYpLCBEUk1fTUVNX0ZJTEVTKTsKLQkKKworCXJhZGVvbl9wcml2ID0KKwkgICAgKHN0cnVjdCBkcm1fcmFkZW9uX2RyaXZlcl9maWxlX2ZpZWxkcyAqKQorCSAgICBkcm1fYWxsb2Moc2l6ZW9mKCpyYWRlb25fcHJpdiksIERSTV9NRU1fRklMRVMpOworCiAJaWYgKCFyYWRlb25fcHJpdikKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlmaWxwX3ByaXYtPmRyaXZlcl9wcml2ID0gcmFkZW9uX3ByaXY7Ci0JaWYgKCBkZXZfcHJpdiApCisJaWYgKGRldl9wcml2KQogCQlyYWRlb25fcHJpdi0+cmFkZW9uX2ZiX2RlbHRhID0gZGV2X3ByaXYtPmZiX2xvY2F0aW9uOwogCWVsc2UKIAkJcmFkZW9uX3ByaXYtPnJhZGVvbl9mYl9kZWx0YSA9IDA7CiAJcmV0dXJuIDA7CiB9CiAKLQotdm9pZCByYWRlb25fZHJpdmVyX2ZyZWVfZmlscF9wcml2KGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fZmlsZV90ICpmaWxwX3ByaXYpCit2b2lkIHJhZGVvbl9kcml2ZXJfZnJlZV9maWxwX3ByaXYoZHJtX2RldmljZV90ICogZGV2LCBkcm1fZmlsZV90ICogZmlscF9wcml2KQogewotCSBzdHJ1Y3QgZHJtX3JhZGVvbl9kcml2ZXJfZmlsZV9maWVsZHMgKnJhZGVvbl9wcml2ID0gZmlscF9wcml2LT5kcml2ZXJfcHJpdjsKLQkgCi0JIGRybV9mcmVlKHJhZGVvbl9wcml2LCBzaXplb2YoKnJhZGVvbl9wcml2KSwgRFJNX01FTV9GSUxFUyk7CisJc3RydWN0IGRybV9yYWRlb25fZHJpdmVyX2ZpbGVfZmllbGRzICpyYWRlb25fcHJpdiA9CisJICAgIGZpbHBfcHJpdi0+ZHJpdmVyX3ByaXY7CisKKwlkcm1fZnJlZShyYWRlb25fcHJpdiwgc2l6ZW9mKCpyYWRlb25fcHJpdiksIERSTV9NRU1fRklMRVMpOwogfQogCiBkcm1faW9jdGxfZGVzY190IHJhZGVvbl9pb2N0bHNbXSA9IHsKLQlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ1BfSU5JVCldICAgID0geyByYWRlb25fY3BfaW5pdCwgICAgICAxLCAxIH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NQX1NUQVJUKV0gICA9IHsgcmFkZW9uX2NwX3N0YXJ0LCAgICAgMSwgMSB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DUF9TVE9QKV0gICAgPSB7IHJhZGVvbl9jcF9zdG9wLCAgICAgIDEsIDEgfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ1BfUkVTRVQpXSAgID0geyByYWRlb25fY3BfcmVzZXQsICAgICAxLCAxIH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NQX0lETEUpXSAgICA9IHsgcmFkZW9uX2NwX2lkbGUsICAgICAgMSwgMCB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DUF9SRVNVTUUpXSAgPSB7IHJhZGVvbl9jcF9yZXN1bWUsICAgIDEsIDAgfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fUkVTRVQpXSAgICAgID0geyByYWRlb25fZW5naW5lX3Jlc2V0LCAxLCAwIH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0ZVTExTQ1JFRU4pXSA9IHsgcmFkZW9uX2Z1bGxzY3JlZW4sICAgMSwgMCB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9TV0FQKV0gICAgICAgPSB7IHJhZGVvbl9jcF9zd2FwLCAgICAgIDEsIDAgfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ0xFQVIpXSAgICAgID0geyByYWRlb25fY3BfY2xlYXIsICAgICAxLCAwIH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1ZFUlRFWCldICAgICA9IHsgcmFkZW9uX2NwX3ZlcnRleCwgICAgMSwgMCB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9JTkRJQ0VTKV0gICAgPSB7IHJhZGVvbl9jcF9pbmRpY2VzLCAgIDEsIDAgfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fVEVYVFVSRSldICAgID0geyByYWRlb25fY3BfdGV4dHVyZSwgICAxLCAwIH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1NUSVBQTEUpXSAgICA9IHsgcmFkZW9uX2NwX3N0aXBwbGUsICAgMSwgMCB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9JTkRJUkVDVCldICAgPSB7IHJhZGVvbl9jcF9pbmRpcmVjdCwgIDEsIDEgfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fVkVSVEVYMildICAgID0geyByYWRlb25fY3BfdmVydGV4MiwgICAxLCAwIH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NNREJVRildICAgICA9IHsgcmFkZW9uX2NwX2NtZGJ1ZiwgICAgMSwgMCB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9HRVRQQVJBTSldICAgPSB7IHJhZGVvbl9jcF9nZXRwYXJhbSwgIDEsIDAgfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fRkxJUCldICAgICAgID0geyByYWRlb25fY3BfZmxpcCwgICAgICAxLCAwIH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0FMTE9DKV0gICAgICA9IHsgcmFkZW9uX21lbV9hbGxvYywgICAgMSwgMCB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9GUkVFKV0gICAgICAgPSB7IHJhZGVvbl9tZW1fZnJlZSwgICAgIDEsIDAgfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fSU5JVF9IRUFQKV0gID0geyByYWRlb25fbWVtX2luaXRfaGVhcCwxLCAxIH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0lSUV9FTUlUKV0gICA9IHsgcmFkZW9uX2lycV9lbWl0LCAgICAgMSwgMCB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9JUlFfV0FJVCldICAgPSB7IHJhZGVvbl9pcnFfd2FpdCwgICAgIDEsIDAgfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fU0VUUEFSQU0pXSAgID0geyByYWRlb25fY3Bfc2V0cGFyYW0sICAxLCAwIH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1NVUkZfQUxMT0MpXSA9IHsgcmFkZW9uX3N1cmZhY2VfYWxsb2MsMSwgMCB9LAotCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9TVVJGX0ZSRUUpXSAgPSB7IHJhZGVvbl9zdXJmYWNlX2ZyZWUsIDEsIDAgfQorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DUF9JTklUKV0gPSB7cmFkZW9uX2NwX2luaXQsIDEsIDF9CisJLAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DUF9TVEFSVCldID0ge3JhZGVvbl9jcF9zdGFydCwgMSwgMX0KKwksCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NQX1NUT1ApXSA9IHtyYWRlb25fY3Bfc3RvcCwgMSwgMX0KKwksCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NQX1JFU0VUKV0gPSB7cmFkZW9uX2NwX3Jlc2V0LCAxLCAxfQorCSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ1BfSURMRSldID0ge3JhZGVvbl9jcF9pZGxlLCAxLCAwfQorCSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ1BfUkVTVU1FKV0gPSB7cmFkZW9uX2NwX3Jlc3VtZSwgMSwgMH0KKwksCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1JFU0VUKV0gPSB7cmFkZW9uX2VuZ2luZV9yZXNldCwgMSwgMH0KKwksCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0ZVTExTQ1JFRU4pXSA9IHtyYWRlb25fZnVsbHNjcmVlbiwgMSwgMH0KKwksCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1NXQVApXSA9IHtyYWRlb25fY3Bfc3dhcCwgMSwgMH0KKwksCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NMRUFSKV0gPSB7cmFkZW9uX2NwX2NsZWFyLCAxLCAwfQorCSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fVkVSVEVYKV0gPSB7cmFkZW9uX2NwX3ZlcnRleCwgMSwgMH0KKwksCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0lORElDRVMpXSA9IHtyYWRlb25fY3BfaW5kaWNlcywgMSwgMH0KKwksCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1RFWFRVUkUpXSA9IHtyYWRlb25fY3BfdGV4dHVyZSwgMSwgMH0KKwksCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1NUSVBQTEUpXSA9IHtyYWRlb25fY3Bfc3RpcHBsZSwgMSwgMH0KKwksCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0lORElSRUNUKV0gPSB7cmFkZW9uX2NwX2luZGlyZWN0LCAxLCAxfQorCSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fVkVSVEVYMildID0ge3JhZGVvbl9jcF92ZXJ0ZXgyLCAxLCAwfQorCSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ01EQlVGKV0gPSB7cmFkZW9uX2NwX2NtZGJ1ZiwgMSwgMH0KKwksCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0dFVFBBUkFNKV0gPSB7cmFkZW9uX2NwX2dldHBhcmFtLCAxLCAwfQorCSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fRkxJUCldID0ge3JhZGVvbl9jcF9mbGlwLCAxLCAwfQorCSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQUxMT0MpXSA9IHtyYWRlb25fbWVtX2FsbG9jLCAxLCAwfQorCSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fRlJFRSldID0ge3JhZGVvbl9tZW1fZnJlZSwgMSwgMH0KKwksCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0lOSVRfSEVBUCldID0ge3JhZGVvbl9tZW1faW5pdF9oZWFwLCAxLCAxfQorCSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fSVJRX0VNSVQpXSA9IHtyYWRlb25faXJxX2VtaXQsIDEsIDB9CisJLAorCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9JUlFfV0FJVCldID0ge3JhZGVvbl9pcnFfd2FpdCwgMSwgMH0KKwksCisJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1NFVFBBUkFNKV0gPSB7cmFkZW9uX2NwX3NldHBhcmFtLCAxLCAwfQorCSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fU1VSRl9BTExPQyldID0ge3JhZGVvbl9zdXJmYWNlX2FsbG9jLCAxLCAwfQorCSwKKwlbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fU1VSRl9GUkVFKV0gPSB7cmFkZW9uX3N1cmZhY2VfZnJlZSwgMSwgMH0KIH07CiAKIGludCByYWRlb25fbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUocmFkZW9uX2lvY3Rscyk7Cg==