ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kLmMgYi9zcmMvYmFja2VuZC5jCmluZGV4IGU3ZWUzZTQuLmQ4ZDdlMmUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kLmMKKysrIGIvc3JjL2JhY2tlbmQuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBCYWNrZW5kIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zLgogICoKLSAqIENvcHlyaWdodCAyMDAwLTIwMDggV2lsbHkgVGFycmVhdSA8d0Axd3QuZXU+CisgKiBDb3B5cmlnaHQgMjAwMC0yMDA5IFdpbGx5IFRhcnJlYXUgPHdAMXd0LmV1PgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8Y29tbW9uL2NvbXBhdC5oPgogI2luY2x1ZGUgPGNvbW1vbi9jb25maWcuaD4KICNpbmNsdWRlIDxjb21tb24vZGVidWcuaD4KLSNpbmNsdWRlIDxjb21tb24vZWIzMnRyZWUuaD4KICNpbmNsdWRlIDxjb21tb24vdGlja3MuaD4KICNpbmNsdWRlIDxjb21tb24vdGltZS5oPgogCkBAIC0zMSw2ICszMCw5IEBACiAjaW5jbHVkZSA8cHJvdG8vYWNsLmg+CiAjaW5jbHVkZSA8cHJvdG8vYmFja2VuZC5oPgogI2luY2x1ZGUgPHByb3RvL2NsaWVudC5oPgorI2luY2x1ZGUgPHByb3RvL2xiX2Z3bGMuaD4KKyNpbmNsdWRlIDxwcm90by9sYl9md3JyLmg+CisjaW5jbHVkZSA8cHJvdG8vbGJfbWFwLmg+CiAjaW5jbHVkZSA8cHJvdG8vcHJvdG9faHR0cC5oPgogI2luY2x1ZGUgPHByb3RvL3Byb3RvX3RjcC5oPgogI2luY2x1ZGUgPHByb3RvL3F1ZXVlLmg+CkBAIC0zOCwxMiArNDAsNiBAQAogI2luY2x1ZGUgPHByb3RvL3Nlc3Npb24uaD4KICNpbmNsdWRlIDxwcm90by90YXNrLmg+CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBmd3JyX3JlbW92ZV9mcm9tX3RyZWUoc3RydWN0IHNlcnZlciAqcyk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgZndycl9xdWV1ZV9ieV93ZWlnaHQoc3RydWN0IGViX3Jvb3QgKnJvb3QsIHN0cnVjdCBzZXJ2ZXIgKnMpOwotc3RhdGljIGlubGluZSB2b2lkIGZ3cnJfZGVxdWV1ZV9zcnYoc3RydWN0IHNlcnZlciAqcyk7Ci1zdGF0aWMgdm9pZCBmd3JyX2dldF9zcnYoc3RydWN0IHNlcnZlciAqcyk7Ci1zdGF0aWMgdm9pZCBmd3JyX3F1ZXVlX3NydihzdHJ1Y3Qgc2VydmVyICpzKTsKLQogLyoKICAqIFRoaXMgZnVuY3Rpb24gcmVjb3VudHMgdGhlIG51bWJlciBvZiB1c2FibGUgYWN0aXZlIGFuZCBiYWNrdXAgc2VydmVycyBmb3IKICAqIHByb3h5IDxwPi4gVGhlc2UgbnVtYmVycyBhcmUgcmV0dXJuZWQgaW50byB0aGUgcC0+c3J2X2FjdCBhbmQgcC0+c3J2X2Jjay4KQEAgLTk0LDEwMTcgKzkwLDggQEAKIAkJcHgtPmxicHJtLnRvdF93ZWlnaHQgPSBweC0+bGJwcm0udG90X3diY2s7CiAJCXB4LT5sYnBybS50b3RfdXNlZCAgID0gcHgtPnNydl9iY2s7CiAJfQotfQotCi0vKiB0aGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIG1hcCBhY2NvcmRpbmcgdG8gc2VydmVyIDxzcnY+J3MgbmV3IHN0YXRlICovCi1zdGF0aWMgdm9pZCBtYXBfc2V0X3NlcnZlcl9zdGF0dXNfZG93bihzdHJ1Y3Qgc2VydmVyICpzcnYpCi17Ci0Jc3RydWN0IHByb3h5ICpwID0gc3J2LT5wcm94eTsKLQotCWlmIChzcnYtPnN0YXRlID09IHNydi0+cHJldl9zdGF0ZSAmJgotCSAgICBzcnYtPmV3ZWlnaHQgPT0gc3J2LT5wcmV2X2V3ZWlnaHQpCi0JCXJldHVybjsKLQotCWlmIChzcnZfaXNfdXNhYmxlKHNydi0+c3RhdGUsIHNydi0+ZXdlaWdodCkpCi0JCWdvdG8gb3V0X3VwZGF0ZV9zdGF0ZTsKLQotCS8qIEZJWE1FOiBjb3VsZCBiZSBvcHRpbWl6ZWQgc2luY2Ugd2Uga25vdyB3aGF0IGNoYW5nZWQgKi8KLQlyZWNvdW50X3NlcnZlcnMocCk7Ci0JdXBkYXRlX2JhY2tlbmRfd2VpZ2h0KHApOwotCXAtPmxicHJtLm1hcC5zdGF0ZSB8PSBQUl9NQVBfUkVDQUxDOwotIG91dF91cGRhdGVfc3RhdGU6Ci0Jc3J2LT5wcmV2X3N0YXRlID0gc3J2LT5zdGF0ZTsKLQlzcnYtPnByZXZfZXdlaWdodCA9IHNydi0+ZXdlaWdodDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBtYXAgYWNjb3JkaW5nIHRvIHNlcnZlciA8c3J2PidzIG5ldyBzdGF0ZSAqLwotc3RhdGljIHZvaWQgbWFwX3NldF9zZXJ2ZXJfc3RhdHVzX3VwKHN0cnVjdCBzZXJ2ZXIgKnNydikKLXsKLQlzdHJ1Y3QgcHJveHkgKnAgPSBzcnYtPnByb3h5OwotCi0JaWYgKHNydi0+c3RhdGUgPT0gc3J2LT5wcmV2X3N0YXRlICYmCi0JICAgIHNydi0+ZXdlaWdodCA9PSBzcnYtPnByZXZfZXdlaWdodCkKLQkJcmV0dXJuOwotCi0JaWYgKCFzcnZfaXNfdXNhYmxlKHNydi0+c3RhdGUsIHNydi0+ZXdlaWdodCkpCi0JCWdvdG8gb3V0X3VwZGF0ZV9zdGF0ZTsKLQotCS8qIEZJWE1FOiBjb3VsZCBiZSBvcHRpbWl6ZWQgc2luY2Ugd2Uga25vdyB3aGF0IGNoYW5nZWQgKi8KLQlyZWNvdW50X3NlcnZlcnMocCk7Ci0JdXBkYXRlX2JhY2tlbmRfd2VpZ2h0KHApOwotCXAtPmxicHJtLm1hcC5zdGF0ZSB8PSBQUl9NQVBfUkVDQUxDOwotIG91dF91cGRhdGVfc3RhdGU6Ci0Jc3J2LT5wcmV2X3N0YXRlID0gc3J2LT5zdGF0ZTsKLQlzcnYtPnByZXZfZXdlaWdodCA9IHNydi0+ZXdlaWdodDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiByZWNvbXB1dGVzIHRoZSBzZXJ2ZXIgbWFwIGZvciBwcm94eSBweC4gSXQgcmVsaWVzIG9uCi0gKiBweC0+bGJwcm0udG90X3dhY3QsIHRvdF93YmNrLCB0b3RfdXNlZCwgdG90X3dlaWdodCwgc28gaXQgbXVzdCBiZQotICogY2FsbGVkIGFmdGVyIHJlY291bnRfc2VydmVycygpLiBJdCBhbHNvIGV4cGVjdHMgcHgtPmxicHJtLm1hcC5zcnYKLSAqIHRvIGJlIGFsbG9jYXRlZCB3aXRoIHRoZSBsYXJnZXN0IHNpemUgbmVlZGVkLiBJdCB1cGRhdGVzIHRvdF93ZWlnaHQuCi0gKi8KLXZvaWQgcmVjYWxjX3NlcnZlcl9tYXAoc3RydWN0IHByb3h5ICpweCkKLXsKLQlpbnQgbywgdG90LCBmbGFnOwotCXN0cnVjdCBzZXJ2ZXIgKmN1ciwgKmJlc3Q7Ci0KLQlzd2l0Y2ggKHB4LT5sYnBybS50b3RfdXNlZCkgewotCWNhc2UgMDoJLyogbm8gc2VydmVyICovCi0JCXB4LT5sYnBybS5tYXAuc3RhdGUgJj0gflBSX01BUF9SRUNBTEM7Ci0JCXJldHVybjsKLQljYXNlIDE6IC8qIG9ubHkgb25lIHNlcnZlciwganVzdCBmaWxsIGZpcnN0IGVudHJ5ICovCi0JCXRvdCA9IDE7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXRvdCA9IHB4LT5sYnBybS50b3Rfd2VpZ2h0OwotCQlicmVhazsKLQl9Ci0KLQkvKiBoZXJlIHdlICprbm93KiB0aGF0IHdlIGhhdmUgc29tZSBzZXJ2ZXJzICovCi0JaWYgKHB4LT5zcnZfYWN0KQotCQlmbGFnID0gU1JWX1JVTk5JTkc7Ci0JZWxzZQotCQlmbGFnID0gU1JWX1JVTk5JTkcgfCBTUlZfQkFDS1VQOwotCi0JLyogdGhpcyBhbGdvcml0aG0gZ2l2ZXMgcHJpb3JpdHkgdG8gdGhlIGZpcnN0IHNlcnZlciwgd2hpY2ggbWVhbnMgdGhhdAotCSAqIGl0IHdpbGwgcmVzcGVjdCB0aGUgZGVjbGFyYXRpb24gb3JkZXIgZm9yIGVxdWl2YWxlbnQgd2VpZ2h0cywgYW5kCi0JICogdGhhdCB3aGF0ZXZlciB0aGUgd2VpZ2h0cywgdGhlIGZpcnN0IHNlcnZlciBjYWxsZWQgd2lsbCBhbHdheXMgYmUKLQkgKiB0aGUgZmlyc3QgZGVjbGFyZWQuIFRoaXMgaXMgYW4gaW1wb3J0YW50IGFzdW1wdGlvbiBmb3IgdGhlIGJhY2t1cAotCSAqIGNhc2UsIHdoZXJlIHdlIHdhbnQgdGhlIGZpcnN0IHNlcnZlciBvbmx5LgotCSAqLwotCWZvciAoY3VyID0gcHgtPnNydjsgY3VyOyBjdXIgPSBjdXItPm5leHQpCi0JCWN1ci0+d3Njb3JlID0gMDsKLQotCWZvciAobyA9IDA7IG8gPCB0b3Q7IG8rKykgewotCQlpbnQgbWF4ID0gMDsKLQkJYmVzdCA9IE5VTEw7Ci0JCWZvciAoY3VyID0gcHgtPnNydjsgY3VyOyBjdXIgPSBjdXItPm5leHQpIHsKLQkJCWlmIChjdXItPmV3ZWlnaHQgJiYKLQkJCSAgICBmbGFnID09IChjdXItPnN0YXRlICYKLQkJCQkgICAgIChTUlZfUlVOTklORyB8IFNSVl9HT0lOR0RPV04gfCBTUlZfQkFDS1VQKSkpIHsKLQkJCQlpbnQgdjsKLQotCQkJCS8qIElmIHdlIGFyZSBmb3JjZWQgdG8gcmV0dXJuIG9ubHkgb25lIHNlcnZlciwgd2UgZG9uJ3Qgd2FudCB0bwotCQkJCSAqIGdvIGZ1cnRoZXIsIGJlY2F1c2Ugd2Ugd291bGQgcmV0dXJuIHRoZSB3cm9uZyBvbmUgZHVlIHRvCi0JCQkJICogZGl2aWRlIG92ZXJmbG93LgotCQkJCSAqLwotCQkJCWlmICh0b3QgPT0gMSkgewotCQkJCQliZXN0ID0gY3VyOwotCQkJCQkvKiBub3RlIHRoYXQgYmVzdC0+d3Njb3JlIHdpbGwgYmUgd3JvbmcgYnV0IHdlIGRvbid0IGNhcmUgKi8KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJY3VyLT53c2NvcmUgKz0gY3VyLT5ld2VpZ2h0OwotCQkJCXYgPSAoY3VyLT53c2NvcmUgKyB0b3QpIC8gdG90OyAvKiByZXN1bHQgYmV0d2VlbiAwIGFuZCAzICovCi0JCQkJaWYgKGJlc3QgPT0gTlVMTCB8fCB2ID4gbWF4KSB7Ci0JCQkJCW1heCA9IHY7Ci0JCQkJCWJlc3QgPSBjdXI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXB4LT5sYnBybS5tYXAuc3J2W29dID0gYmVzdDsKLQkJYmVzdC0+d3Njb3JlIC09IHRvdDsKLQl9Ci0JcHgtPmxicHJtLm1hcC5zdGF0ZSAmPSB+UFJfTUFQX1JFQ0FMQzsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBvZiBidWlsZGluZyB0aGUgc2VydmVyIE1BUCBmb3IgbWFwLWJhc2VkIExCCi0gKiBhbGdvcml0aG1zLCBhbGxvY2F0aW5nIHRoZSBtYXAsIGFuZCBzZXR0aW5nIHAtPmxicHJtLndtdWx0IHRvIHRoZSBHQ0Qgb2YgdGhlCi0gKiB3ZWlnaHRzIGlmIGFwcGxpY2FibGUuIEl0IHNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlIHBlciBwcm94eSwgYXQgY29uZmlnCi0gKiB0aW1lLgotICovCi12b2lkIGluaXRfc2VydmVyX21hcChzdHJ1Y3QgcHJveHkgKnApCi17Ci0Jc3RydWN0IHNlcnZlciAqc3J2OwotCWludCBwZ2NkOwotCWludCBhY3QsIGJjazsKLQotCXAtPmxicHJtLnNldF9zZXJ2ZXJfc3RhdHVzX3VwICAgPSBtYXBfc2V0X3NlcnZlcl9zdGF0dXNfdXA7Ci0JcC0+bGJwcm0uc2V0X3NlcnZlcl9zdGF0dXNfZG93biA9IG1hcF9zZXRfc2VydmVyX3N0YXR1c19kb3duOwotCXAtPmxicHJtLnVwZGF0ZV9zZXJ2ZXJfZXdlaWdodCA9IE5VTEw7Ci0gCi0JaWYgKCFwLT5zcnYpCi0JCXJldHVybjsKLQotCS8qIFdlIHdpbGwgZmFjdG9yIHRoZSB3ZWlnaHRzIHRvIHJlZHVjZSB0aGUgdGFibGUsCi0JICogdXNpbmcgRXVjbGlkZSdzIGxhcmdlc3QgY29tbW9uIGRpdmlzb3IgYWxnb3JpdGhtLgotCSAqIFNpbmNlIHdlIG1heSBoYXZlIHplcm8gd2VpZ2h0cywgd2UgaGF2ZSB0byBmaXJzdAotCSAqIGZpbmQgYSBub24temVybyB3ZWlnaHQgc2VydmVyLgotCSAqLwotCXBnY2QgPSAxOwotCXNydiA9IHAtPnNydjsKLQl3aGlsZSAoc3J2ICYmICFzcnYtPnV3ZWlnaHQpCi0JCXNydiA9IHNydi0+bmV4dDsKLQotCWlmIChzcnYpIHsKLQkJcGdjZCA9IHNydi0+dXdlaWdodDsgLyogbm90ZTogY2Fubm90IGJlIHplcm8gKi8KLQkJd2hpbGUgKHBnY2QgPiAxICYmIChzcnYgPSBzcnYtPm5leHQpKSB7Ci0JCQlpbnQgdyA9IHNydi0+dXdlaWdodDsKLQkJCXdoaWxlICh3KSB7Ci0JCQkJaW50IHQgPSBwZ2NkICUgdzsKLQkJCQlwZ2NkID0gdzsKLQkJCQl3ID0gdDsKLQkJCX0KLQkJfQotCX0KLQotCS8qIEl0IGlzIHNvbWV0aW1lcyB1c2VmdWwgdG8ga25vdyB3aGF0IGZhY3RvciB0byBhcHBseQotCSAqIHRvIHRoZSBiYWNrZW5kJ3MgZWZmZWN0aXZlIHdlaWdodCB0byBrbm93IGl0cyByZWFsCi0JICogd2VpZ2h0LgotCSAqLwotCXAtPmxicHJtLndtdWx0ID0gcGdjZDsKLQotCWFjdCA9IGJjayA9IDA7Ci0JZm9yIChzcnYgPSBwLT5zcnY7IHNydjsgc3J2ID0gc3J2LT5uZXh0KSB7Ci0JCXNydi0+ZXdlaWdodCA9IHNydi0+dXdlaWdodCAvIHBnY2Q7Ci0JCXNydi0+cHJldl9ld2VpZ2h0ID0gc3J2LT5ld2VpZ2h0OwotCQlzcnYtPnByZXZfc3RhdGUgPSBzcnYtPnN0YXRlOwotCQlpZiAoc3J2LT5zdGF0ZSAmIFNSVl9CQUNLVVApCi0JCQliY2sgKz0gc3J2LT5ld2VpZ2h0OwotCQllbHNlCi0JCQlhY3QgKz0gc3J2LT5ld2VpZ2h0OwotCX0KLQotCS8qIHRoaXMgaXMgdGhlIGxhcmdlc3QgbWFwIHdlIHdpbGwgZXZlciBuZWVkIGZvciB0aGlzIHNlcnZlcnMgbGlzdCAqLwotCWlmIChhY3QgPCBiY2spCi0JCWFjdCA9IGJjazsKLQotCWlmICghYWN0KQotCQlhY3QgPSAxOwotCi0JcC0+bGJwcm0ubWFwLnNydiA9IChzdHJ1Y3Qgc2VydmVyICoqKWNhbGxvYyhhY3QsIHNpemVvZihzdHJ1Y3Qgc2VydmVyICopKTsKLQkvKiByZWNvdW50cyBzZXJ2ZXJzIGFuZCB0aGVpciB3ZWlnaHRzICovCi0JcC0+bGJwcm0ubWFwLnN0YXRlID0gUFJfTUFQX1JFQ0FMQzsKLQlyZWNvdW50X3NlcnZlcnMocCk7Ci0JdXBkYXRlX2JhY2tlbmRfd2VpZ2h0KHApOwotCXJlY2FsY19zZXJ2ZXJfbWFwKHApOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIHNlcnZlciB0cmVlcyBhY2NvcmRpbmcgdG8gc2VydmVyIDxzcnY+J3MgbmV3Ci0gKiBzdGF0ZS4gSXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHNlcnZlciA8c3J2PidzIHN0YXR1cyBjaGFuZ2VzIHRvIGRvd24uCi0gKiBJdCBpcyBub3QgaW1wb3J0YW50IHdoZXRoZXIgdGhlIHNlcnZlciB3YXMgYWxyZWFkeSBkb3duIG9yIG5vdC4gSXQgaXMgbm90Ci0gKiBpbXBvcnRhbnQgZWl0aGVyIHRoYXQgdGhlIG5ldyBzdGF0ZSBpcyBjb21wbGV0ZWx5IGRvd24gKHRoZSBjYWxsZXIgbWF5IG5vdAotICoga25vdyBhbGwgdGhlIHZhcmlhYmxlcyBvZiBhIHNlcnZlcidzIHN0YXRlKS4KLSAqLwotc3RhdGljIHZvaWQgZndycl9zZXRfc2VydmVyX3N0YXR1c19kb3duKHN0cnVjdCBzZXJ2ZXIgKnNydikKLXsKLQlzdHJ1Y3QgcHJveHkgKnAgPSBzcnYtPnByb3h5OwotCXN0cnVjdCBmd3JyX2dyb3VwICpncnA7Ci0KLQlpZiAoc3J2LT5zdGF0ZSA9PSBzcnYtPnByZXZfc3RhdGUgJiYKLQkgICAgc3J2LT5ld2VpZ2h0ID09IHNydi0+cHJldl9ld2VpZ2h0KQotCQlyZXR1cm47Ci0KLQlpZiAoc3J2X2lzX3VzYWJsZShzcnYtPnN0YXRlLCBzcnYtPmV3ZWlnaHQpKQotCQlnb3RvIG91dF91cGRhdGVfc3RhdGU7Ci0KLQlpZiAoIXNydl9pc191c2FibGUoc3J2LT5wcmV2X3N0YXRlLCBzcnYtPnByZXZfZXdlaWdodCkpCi0JCS8qIHNlcnZlciB3YXMgYWxyZWFkeSBkb3duICovCi0JCWdvdG8gb3V0X3VwZGF0ZV9iYWNrZW5kOwotCi0JZ3JwID0gKHNydi0+c3RhdGUgJiBTUlZfQkFDS1VQKSA/ICZwLT5sYnBybS5md3JyLmJjayA6ICZwLT5sYnBybS5md3JyLmFjdDsKLQlncnAtPm5leHRfd2VpZ2h0IC09IHNydi0+cHJldl9ld2VpZ2h0OwotCi0JaWYgKHNydi0+c3RhdGUgJiBTUlZfQkFDS1VQKSB7Ci0JCXAtPmxicHJtLnRvdF93YmNrID0gcC0+bGJwcm0uZndyci5iY2submV4dF93ZWlnaHQ7Ci0JCXAtPnNydl9iY2stLTsKLQotCQlpZiAoc3J2ID09IHAtPmxicHJtLmZiY2spIHsKLQkJCS8qIHdlIGxvc3QgdGhlIGZpcnN0IGJhY2t1cCBzZXJ2ZXIgaW4gYSBzaW5nbGUtYmFja3VwCi0JCQkgKiBjb25maWd1cmF0aW9uLCB3ZSBtdXN0IHNlYXJjaCBhbm90aGVyIG9uZS4KLQkJCSAqLwotCQkJc3RydWN0IHNlcnZlciAqc3J2MiA9IHAtPmxicHJtLmZiY2s7Ci0JCQlkbyB7Ci0JCQkJc3J2MiA9IHNydjItPm5leHQ7Ci0JCQl9IHdoaWxlIChzcnYyICYmCi0JCQkJICEoKHNydjItPnN0YXRlICYgU1JWX0JBQ0tVUCkgJiYKLQkJCQkgICBzcnZfaXNfdXNhYmxlKHNydjItPnN0YXRlLCBzcnYyLT5ld2VpZ2h0KSkpOwotCQkJcC0+bGJwcm0uZmJjayA9IHNydjI7Ci0JCX0KLQl9IGVsc2UgewotCQlwLT5sYnBybS50b3Rfd2FjdCA9IHAtPmxicHJtLmZ3cnIuYWN0Lm5leHRfd2VpZ2h0OwotCQlwLT5zcnZfYWN0LS07Ci0JfQotCi0JZndycl9kZXF1ZXVlX3NydihzcnYpOwotCWZ3cnJfcmVtb3ZlX2Zyb21fdHJlZShzcnYpOwotCi1vdXRfdXBkYXRlX2JhY2tlbmQ6Ci0JLyogY2hlY2svdXBkYXRlIHRvdF91c2VkLCB0b3Rfd2VpZ2h0ICovCi0JdXBkYXRlX2JhY2tlbmRfd2VpZ2h0KHApOwotIG91dF91cGRhdGVfc3RhdGU6Ci0Jc3J2LT5wcmV2X3N0YXRlID0gc3J2LT5zdGF0ZTsKLQlzcnYtPnByZXZfZXdlaWdodCA9IHNydi0+ZXdlaWdodDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBzZXJ2ZXIgdHJlZXMgYWNjb3JkaW5nIHRvIHNlcnZlciA8c3J2PidzIG5ldwotICogc3RhdGUuIEl0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiBzZXJ2ZXIgPHNydj4ncyBzdGF0dXMgY2hhbmdlcyB0byB1cC4KLSAqIEl0IGlzIG5vdCBpbXBvcnRhbnQgd2hldGhlciB0aGUgc2VydmVyIHdhcyBhbHJlYWR5IGRvd24gb3Igbm90LiBJdCBpcyBub3QKLSAqIGltcG9ydGFudCBlaXRoZXIgdGhhdCB0aGUgbmV3IHN0YXRlIGlzIGNvbXBsZXRlbHkgVVAgKHRoZSBjYWxsZXIgbWF5IG5vdAotICoga25vdyBhbGwgdGhlIHZhcmlhYmxlcyBvZiBhIHNlcnZlcidzIHN0YXRlKS4gVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBjaGFuZ2UKLSAqIHRoZSB3ZWlnaHQgb2YgYSBzZXJ2ZXIgd2hpY2ggd2FzIGFscmVhZHkgdXAuCi0gKi8KLXN0YXRpYyB2b2lkIGZ3cnJfc2V0X3NlcnZlcl9zdGF0dXNfdXAoc3RydWN0IHNlcnZlciAqc3J2KQotewotCXN0cnVjdCBwcm94eSAqcCA9IHNydi0+cHJveHk7Ci0Jc3RydWN0IGZ3cnJfZ3JvdXAgKmdycDsKLQotCWlmIChzcnYtPnN0YXRlID09IHNydi0+cHJldl9zdGF0ZSAmJgotCSAgICBzcnYtPmV3ZWlnaHQgPT0gc3J2LT5wcmV2X2V3ZWlnaHQpCi0JCXJldHVybjsKLQotCWlmICghc3J2X2lzX3VzYWJsZShzcnYtPnN0YXRlLCBzcnYtPmV3ZWlnaHQpKQotCQlnb3RvIG91dF91cGRhdGVfc3RhdGU7Ci0KLQlpZiAoc3J2X2lzX3VzYWJsZShzcnYtPnByZXZfc3RhdGUsIHNydi0+cHJldl9ld2VpZ2h0KSkKLQkJLyogc2VydmVyIHdhcyBhbHJlYWR5IHVwICovCi0JCWdvdG8gb3V0X3VwZGF0ZV9iYWNrZW5kOwotCi0JZ3JwID0gKHNydi0+c3RhdGUgJiBTUlZfQkFDS1VQKSA/ICZwLT5sYnBybS5md3JyLmJjayA6ICZwLT5sYnBybS5md3JyLmFjdDsKLQlncnAtPm5leHRfd2VpZ2h0ICs9IHNydi0+ZXdlaWdodDsKLQotCWlmIChzcnYtPnN0YXRlICYgU1JWX0JBQ0tVUCkgewotCQlwLT5sYnBybS50b3Rfd2JjayA9IHAtPmxicHJtLmZ3cnIuYmNrLm5leHRfd2VpZ2h0OwotCQlwLT5zcnZfYmNrKys7Ci0KLQkJaWYgKCEocC0+b3B0aW9ucyAmIFBSX09fVVNFX0FMTF9CSykpIHsKLQkJCWlmICghcC0+bGJwcm0uZmJjaykgewotCQkJCS8qIHRoZXJlIHdhcyBubyBiYWNrdXAgc2VydmVyIGFueW1vcmUgKi8KLQkJCQlwLT5sYnBybS5mYmNrID0gc3J2OwotCQkJfSBlbHNlIHsKLQkJCQkvKiB3ZSBtYXkgaGF2ZSByZXN0b3JlZCBhIGJhY2t1cCBzZXJ2ZXIgcHJpb3IgdG8gZmJjaywKLQkJCQkgKiBpbiB3aGljaCBjYXNlIGl0IHNob3VsZCByZXBsYWNlIGl0LgotCQkJCSAqLwotCQkJCXN0cnVjdCBzZXJ2ZXIgKnNydjIgPSBzcnY7Ci0JCQkJZG8gewotCQkJCQlzcnYyID0gc3J2Mi0+bmV4dDsKLQkJCQl9IHdoaWxlIChzcnYyICYmIChzcnYyICE9IHAtPmxicHJtLmZiY2spKTsKLQkJCQlpZiAoc3J2MikKLQkJCQkJcC0+bGJwcm0uZmJjayA9IHNydjsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCXAtPmxicHJtLnRvdF93YWN0ID0gcC0+bGJwcm0uZndyci5hY3QubmV4dF93ZWlnaHQ7Ci0JCXAtPnNydl9hY3QrKzsKLQl9Ci0KLQkvKiBub3RlIHRoYXQgZXdlaWdodCBjYW5ub3QgYmUgMCBoZXJlICovCi0JZndycl9nZXRfc3J2KHNydik7Ci0Jc3J2LT5ucG9zID0gZ3JwLT5jdXJyX3BvcyArIChncnAtPm5leHRfd2VpZ2h0ICsgZ3JwLT5jdXJyX3dlaWdodCAtIGdycC0+Y3Vycl9wb3MpIC8gc3J2LT5ld2VpZ2h0OwotCWZ3cnJfcXVldWVfc3J2KHNydik7Ci0KLW91dF91cGRhdGVfYmFja2VuZDoKLQkvKiBjaGVjay91cGRhdGUgdG90X3VzZWQsIHRvdF93ZWlnaHQgKi8KLQl1cGRhdGVfYmFja2VuZF93ZWlnaHQocCk7Ci0gb3V0X3VwZGF0ZV9zdGF0ZToKLQlzcnYtPnByZXZfc3RhdGUgPSBzcnYtPnN0YXRlOwotCXNydi0+cHJldl9ld2VpZ2h0ID0gc3J2LT5ld2VpZ2h0OwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIGFuIHVwZGF0ZSB0byBzZXJ2ZXIgPHNydj4ncyBlZmZlY3RpdmUKLSAqIHdlaWdodC4gSXQgbWF5IGJlIGNhbGxlZCBhZnRlciBhIHN0YXRlIGNoYW5nZSB0b28uCi0gKi8KLXN0YXRpYyB2b2lkIGZ3cnJfdXBkYXRlX3NlcnZlcl93ZWlnaHQoc3RydWN0IHNlcnZlciAqc3J2KQotewotCWludCBvbGRfc3RhdGUsIG5ld19zdGF0ZTsKLQlzdHJ1Y3QgcHJveHkgKnAgPSBzcnYtPnByb3h5OwotCXN0cnVjdCBmd3JyX2dyb3VwICpncnA7Ci0KLQlpZiAoc3J2LT5zdGF0ZSA9PSBzcnYtPnByZXZfc3RhdGUgJiYKLQkgICAgc3J2LT5ld2VpZ2h0ID09IHNydi0+cHJldl9ld2VpZ2h0KQotCQlyZXR1cm47Ci0KLQkvKiBJZiBjaGFuZ2luZyB0aGUgc2VydmVyJ3Mgd2VpZ2h0IGNoYW5nZXMgaXRzIHN0YXRlLCB3ZSBzaW1wbHkgYXBwbHkKLQkgKiB0aGUgcHJvY2VkdXJlcyB3ZSBhbHJlYWR5IGhhdmUgZm9yIHN0YXR1cyBjaGFuZ2UuIElmIHRoZSBzdGF0ZQotCSAqIHJlbWFpbnMgZG93biwgdGhlIHNlcnZlciBpcyBub3QgaW4gYW55IHRyZWUsIHNvIGl0J3MgYXMgZWFzeSBhcwotCSAqIHVwZGF0aW5nIGl0cyB2YWx1ZXMuIElmIHRoZSBzdGF0ZSByZW1haW5zIHVwIHdpdGggZGlmZmVyZW50IHdlaWdodHMsCi0JICogdGhlcmUgYXJlIHNvbWUgY29tcHV0YXRpb25zIHRvIHBlcmZvcm0gdG8gZmluZCBhIG5ldyBwbGFjZSBhbmQKLQkgKiBwb3NzaWJseSBhIG5ldyB0cmVlIGZvciB0aGlzIHNlcnZlci4KLQkgKi8KLQkgCi0Jb2xkX3N0YXRlID0gc3J2X2lzX3VzYWJsZShzcnYtPnByZXZfc3RhdGUsIHNydi0+cHJldl9ld2VpZ2h0KTsKLQluZXdfc3RhdGUgPSBzcnZfaXNfdXNhYmxlKHNydi0+c3RhdGUsIHNydi0+ZXdlaWdodCk7Ci0KLQlpZiAoIW9sZF9zdGF0ZSAmJiAhbmV3X3N0YXRlKSB7Ci0JCXNydi0+cHJldl9zdGF0ZSA9IHNydi0+c3RhdGU7Ci0JCXNydi0+cHJldl9ld2VpZ2h0ID0gc3J2LT5ld2VpZ2h0OwotCQlyZXR1cm47Ci0JfQotCWVsc2UgaWYgKCFvbGRfc3RhdGUgJiYgbmV3X3N0YXRlKSB7Ci0JCWZ3cnJfc2V0X3NlcnZlcl9zdGF0dXNfdXAoc3J2KTsKLQkJcmV0dXJuOwotCX0KLQllbHNlIGlmIChvbGRfc3RhdGUgJiYgIW5ld19zdGF0ZSkgewotCQlmd3JyX3NldF9zZXJ2ZXJfc3RhdHVzX2Rvd24oc3J2KTsKLQkJcmV0dXJuOwotCX0KLQotCWdycCA9IChzcnYtPnN0YXRlICYgU1JWX0JBQ0tVUCkgPyAmcC0+bGJwcm0uZndyci5iY2sgOiAmcC0+bGJwcm0uZndyci5hY3Q7Ci0JZ3JwLT5uZXh0X3dlaWdodCA9IGdycC0+bmV4dF93ZWlnaHQgLSBzcnYtPnByZXZfZXdlaWdodCArIHNydi0+ZXdlaWdodDsKLQotCXAtPmxicHJtLnRvdF93YWN0ID0gcC0+bGJwcm0uZndyci5hY3QubmV4dF93ZWlnaHQ7Ci0JcC0+bGJwcm0udG90X3diY2sgPSBwLT5sYnBybS5md3JyLmJjay5uZXh0X3dlaWdodDsKLQotCWlmIChzcnYtPmxiX3RyZWUgPT0gZ3JwLT5pbml0KSB7Ci0JCWZ3cnJfZGVxdWV1ZV9zcnYoc3J2KTsKLQkJZndycl9xdWV1ZV9ieV93ZWlnaHQoZ3JwLT5pbml0LCBzcnYpOwotCX0KLQllbHNlIGlmICghc3J2LT5sYl90cmVlKSB7Ci0JCS8qIEZJWE1FOiBzZXJ2ZXIgd2FzIGRvd24uIFRoaXMgaXMgbm90IHBvc3NpYmxlIHJpZ2h0IG5vdyBidXQKLQkJICogbWF5IGJlIG5lZWRlZCBzb29uIGZvciBzbG93c3RhcnQgb3IgZ3JhY2VmdWwgc2h1dGRvd24uCi0JCSAqLwotCQlmd3JyX2RlcXVldWVfc3J2KHNydik7Ci0JCWZ3cnJfZ2V0X3NydihzcnYpOwotCQlzcnYtPm5wb3MgPSBncnAtPmN1cnJfcG9zICsgKGdycC0+bmV4dF93ZWlnaHQgKyBncnAtPmN1cnJfd2VpZ2h0IC0gZ3JwLT5jdXJyX3BvcykgLyBzcnYtPmV3ZWlnaHQ7Ci0JCWZ3cnJfcXVldWVfc3J2KHNydik7Ci0JfSBlbHNlIHsKLQkJLyogVGhlIHNlcnZlciBpcyBlaXRoZXIgYWN0aXZlIG9yIGluIHRoZSBuZXh0IHF1ZXVlLiBJZiBpdCdzCi0JCSAqIHN0aWxsIGluIHRoZSBhY3RpdmUgcXVldWUgYW5kIGl0IGhhcyBub3QgY29uc3VtZWQgYWxsIG9mIGl0cwotCQkgKiBwbGFjZXMsIGxldCdzIGFkanVzdCBpdHMgbmV4dCBwb3NpdGlvbi4KLQkJICovCi0JCWZ3cnJfZ2V0X3NydihzcnYpOwotCi0JCWlmIChzcnYtPmV3ZWlnaHQgPiAwKSB7Ci0JCQlpbnQgcHJldl9uZXh0ID0gc3J2LT5ucG9zOwotCQkJaW50IHN0ZXAgPSBncnAtPm5leHRfd2VpZ2h0IC8gc3J2LT5ld2VpZ2h0OwotCi0JCQlzcnYtPm5wb3MgPSBzcnYtPmxwb3MgKyBzdGVwOwotCQkJc3J2LT5yd2VpZ2h0ID0gMDsKLQotCQkJaWYgKHNydi0+bnBvcyA+IHByZXZfbmV4dCkKLQkJCQlzcnYtPm5wb3MgPSBwcmV2X25leHQ7Ci0JCQlpZiAoc3J2LT5ucG9zIDwgZ3JwLT5jdXJyX3BvcyArIDIpCi0JCQkJc3J2LT5ucG9zID0gZ3JwLT5jdXJyX3BvcyArIHN0ZXA7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBwdXNoIGl0IGludG8gdGhlIG5leHQgdHJlZSAqLwotCQkJc3J2LT5ucG9zID0gZ3JwLT5jdXJyX3BvcyArIGdycC0+Y3Vycl93ZWlnaHQ7Ci0JCX0KLQotCQlmd3JyX2RlcXVldWVfc3J2KHNydik7Ci0JCWZ3cnJfcXVldWVfc3J2KHNydik7Ci0JfQotCi0JdXBkYXRlX2JhY2tlbmRfd2VpZ2h0KHApOwotCXNydi0+cHJldl9zdGF0ZSA9IHNydi0+c3RhdGU7Ci0Jc3J2LT5wcmV2X2V3ZWlnaHQgPSBzcnYtPmV3ZWlnaHQ7Ci19Ci0KLS8qIFJlbW92ZSBhIHNlcnZlciBmcm9tIGEgdHJlZS4gSXQgbXVzdCBoYXZlIHByZXZpb3VzbHkgYmVlbiBkZXF1ZXVlZC4gVGhpcwotICogZnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgY2FsbGVkIHdoZW4gYSBzZXJ2ZXIgaXMgZ29pbmcgZG93biBvciBoYXMgaXRzCi0gKiB3ZWlnaHQgZGlzYWJsZWQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBmd3JyX3JlbW92ZV9mcm9tX3RyZWUoc3RydWN0IHNlcnZlciAqcykKLXsKLQlzLT5sYl90cmVlID0gTlVMTDsKLX0KLQotLyogUXVldWUgYSBzZXJ2ZXIgaW4gdGhlIHdlaWdodCB0cmVlIDxyb290PiwgYXNzdW1pbmcgdGhlIHdlaWdodCBpcyA+MC4KLSAqIFdlIHdhbnQgdG8gc29ydCB0aGVtIGJ5IGludmVydGVkIHdlaWdodHMsIGJlY2F1c2Ugd2UgbmVlZCB0byBwbGFjZQotICogaGVhdnkgc2VydmVycyBmaXJzdCBpbiBvcmRlciB0byBnZXQgYSBzbW9vdGggZGlzdHJpYnV0aW9uLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZndycl9xdWV1ZV9ieV93ZWlnaHQoc3RydWN0IGViX3Jvb3QgKnJvb3QsIHN0cnVjdCBzZXJ2ZXIgKnMpCi17Ci0Jcy0+bGJfbm9kZS5rZXkgPSBTUlZfRVdHSFRfTUFYIC0gcy0+ZXdlaWdodDsKLQllYjMyX2luc2VydChyb290LCAmcy0+bGJfbm9kZSk7Ci0Jcy0+bGJfdHJlZSA9IHJvb3Q7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGJ1aWxkaW5nIHRoZSB3ZWlnaHQgdHJlZXMgaW4gY2FzZSBvZiBmYXN0Ci0gKiB3ZWlnaHRlZCByb3VuZC1yb2Jpbi4gSXQgYWxzbyBzZXRzIHAtPmxicHJtLndkaXYgdG8gdGhlIGV3ZWlnaHQgdG8gdXdlaWdodAotICogcmF0aW8uIEJvdGggYWN0aXZlIGFuZCBiYWNrdXAgZ3JvdXBzIGFyZSBpbml0aWFsaXplZC4KLSAqLwotdm9pZCBmd3JyX2luaXRfc2VydmVyX2dyb3VwcyhzdHJ1Y3QgcHJveHkgKnApCi17Ci0Jc3RydWN0IHNlcnZlciAqc3J2OwotCXN0cnVjdCBlYl9yb290IGluaXRfaGVhZCA9IEVCX1JPT1Q7Ci0KLQlwLT5sYnBybS5zZXRfc2VydmVyX3N0YXR1c191cCAgID0gZndycl9zZXRfc2VydmVyX3N0YXR1c191cDsKLQlwLT5sYnBybS5zZXRfc2VydmVyX3N0YXR1c19kb3duID0gZndycl9zZXRfc2VydmVyX3N0YXR1c19kb3duOwotCXAtPmxicHJtLnVwZGF0ZV9zZXJ2ZXJfZXdlaWdodCAgPSBmd3JyX3VwZGF0ZV9zZXJ2ZXJfd2VpZ2h0OwotCi0JcC0+bGJwcm0ud2RpdiA9IEJFX1dFSUdIVF9TQ0FMRTsKLQlmb3IgKHNydiA9IHAtPnNydjsgc3J2OyBzcnYgPSBzcnYtPm5leHQpIHsKLQkJc3J2LT5wcmV2X2V3ZWlnaHQgPSBzcnYtPmV3ZWlnaHQgPSBzcnYtPnV3ZWlnaHQgKiBCRV9XRUlHSFRfU0NBTEU7Ci0JCXNydi0+cHJldl9zdGF0ZSA9IHNydi0+c3RhdGU7Ci0JfQotCi0JcmVjb3VudF9zZXJ2ZXJzKHApOwotCXVwZGF0ZV9iYWNrZW5kX3dlaWdodChwKTsKLQotCS8qIHByZXBhcmUgdGhlIGFjdGl2ZSBzZXJ2ZXJzIGdyb3VwICovCi0JcC0+bGJwcm0uZndyci5hY3QuY3Vycl9wb3MgPSBwLT5sYnBybS5md3JyLmFjdC5jdXJyX3dlaWdodCA9Ci0JCXAtPmxicHJtLmZ3cnIuYWN0Lm5leHRfd2VpZ2h0ID0gcC0+bGJwcm0udG90X3dhY3Q7Ci0JcC0+bGJwcm0uZndyci5hY3QuY3VyciA9IHAtPmxicHJtLmZ3cnIuYWN0LnQwID0KLQkJcC0+bGJwcm0uZndyci5hY3QudDEgPSBpbml0X2hlYWQ7Ci0JcC0+bGJwcm0uZndyci5hY3QuaW5pdCA9ICZwLT5sYnBybS5md3JyLmFjdC50MDsKLQlwLT5sYnBybS5md3JyLmFjdC5uZXh0ID0gJnAtPmxicHJtLmZ3cnIuYWN0LnQxOwotCi0JLyogcHJlcGFyZSB0aGUgYmFja3VwIHNlcnZlcnMgZ3JvdXAgKi8KLQlwLT5sYnBybS5md3JyLmJjay5jdXJyX3BvcyA9IHAtPmxicHJtLmZ3cnIuYmNrLmN1cnJfd2VpZ2h0ID0KLQkJcC0+bGJwcm0uZndyci5iY2submV4dF93ZWlnaHQgPSBwLT5sYnBybS50b3Rfd2JjazsKLQlwLT5sYnBybS5md3JyLmJjay5jdXJyID0gcC0+bGJwcm0uZndyci5iY2sudDAgPQotCQlwLT5sYnBybS5md3JyLmJjay50MSA9IGluaXRfaGVhZDsKLQlwLT5sYnBybS5md3JyLmJjay5pbml0ID0gJnAtPmxicHJtLmZ3cnIuYmNrLnQwOwotCXAtPmxicHJtLmZ3cnIuYmNrLm5leHQgPSAmcC0+bGJwcm0uZndyci5iY2sudDE7Ci0KLQkvKiBxdWV1ZSBhY3RpdmUgYW5kIGJhY2t1cCBzZXJ2ZXJzIGluIHR3byBkaXN0aW5jdCBncm91cHMgKi8KLQlmb3IgKHNydiA9IHAtPnNydjsgc3J2OyBzcnYgPSBzcnYtPm5leHQpIHsKLQkJaWYgKCFzcnZfaXNfdXNhYmxlKHNydi0+c3RhdGUsIHNydi0+ZXdlaWdodCkpCi0JCQljb250aW51ZTsKLQkJZndycl9xdWV1ZV9ieV93ZWlnaHQoKHNydi0+c3RhdGUgJiBTUlZfQkFDS1VQKSA/Ci0JCQkJcC0+bGJwcm0uZndyci5iY2suaW5pdCA6Ci0JCQkJcC0+bGJwcm0uZndyci5hY3QuaW5pdCwKLQkJCQlzcnYpOwotCX0KLX0KLQotLyogc2ltcGx5IHJlbW92ZXMgYSBzZXJ2ZXIgZnJvbSBhIHdlaWdodCB0cmVlICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZndycl9kZXF1ZXVlX3NydihzdHJ1Y3Qgc2VydmVyICpzKQotewotCWViMzJfZGVsZXRlKCZzLT5sYl9ub2RlKTsKLX0KLQotLyogcXVldWVzIGEgc2VydmVyIGludG8gdGhlIGFwcHJvcHJpYXRlIGdyb3VwIGFuZCB0cmVlIGRlcGVuZGluZyBvbiBpdHMKLSAqIGJhY2t1cCBzdGF0dXMsIGFuZCAtPm5wb3MuIElmIHRoZSBzZXJ2ZXIgaXMgZGlzYWJsZWQsIHNpbXBseSBhc3NpZ24KLSAqIGl0IHRvIHRoZSBOVUxMIHRyZWUuCi0gKi8KLXN0YXRpYyB2b2lkIGZ3cnJfcXVldWVfc3J2KHN0cnVjdCBzZXJ2ZXIgKnMpCi17Ci0Jc3RydWN0IHByb3h5ICpwID0gcy0+cHJveHk7Ci0Jc3RydWN0IGZ3cnJfZ3JvdXAgKmdycDsKLQotCWdycCA9IChzLT5zdGF0ZSAmIFNSVl9CQUNLVVApID8gJnAtPmxicHJtLmZ3cnIuYmNrIDogJnAtPmxicHJtLmZ3cnIuYWN0OwotCQotCS8qIERlbGF5IGV2ZXJ5dGhpbmcgd2hpY2ggZG9lcyBub3QgZml0IGludG8gdGhlIHdpbmRvdyBhbmQgZXZlcnl0aGluZwotCSAqIHdoaWNoIGRvZXMgbm90IGZpdCBpbnRvIHRoZSB0aGVvcmljYWwgbmV3IHdpbmRvdy4KLQkgKi8KLQlpZiAoIXNydl9pc191c2FibGUocy0+c3RhdGUsIHMtPmV3ZWlnaHQpKSB7Ci0JCWZ3cnJfcmVtb3ZlX2Zyb21fdHJlZShzKTsKLQl9Ci0JZWxzZSBpZiAocy0+ZXdlaWdodCA8PSAwIHx8Ci0JCSBzLT5ucG9zID49IDIgKiBncnAtPmN1cnJfd2VpZ2h0IHx8Ci0JCSBzLT5ucG9zID49IGdycC0+Y3Vycl93ZWlnaHQgKyBncnAtPm5leHRfd2VpZ2h0KSB7Ci0JCS8qIHB1dCBpbnRvIG5leHQgdHJlZSwgYW5kIHJlYWRqdXN0IG5wb3MgaW4gY2FzZSB3ZSBjb3VsZAotCQkgKiBmaW5hbGx5IHRha2UgdGhpcyBiYWNrIHRvIGN1cnJlbnQuICovCi0JCXMtPm5wb3MgLT0gZ3JwLT5jdXJyX3dlaWdodDsKLQkJZndycl9xdWV1ZV9ieV93ZWlnaHQoZ3JwLT5uZXh0LCBzKTsKLQl9Ci0JZWxzZSB7Ci0JCS8qIFRoZSBzb3J0aW5nIGtleSBpcyBzdG9yZWQgaW4gdW5pdHMgb2Ygcy0+bnBvcyAqIHVzZXJfd2VpZ2h0Ci0JCSAqIGluIG9yZGVyIHRvIGF2b2lkIG92ZXJmbG93cy4gQXMgc3RhdGVkIGluIGJhY2tlbmQuaCwgdGhlCi0JCSAqIGxvd2VyIHRoZSBzY2FsZSwgdGhlIHJvdWdoZXIgdGhlIHdlaWdodHMgbW9kdWxhdGlvbiwgYW5kIHRoZQotCQkgKiBoaWdoZXIgdGhlIHNjYWxlLCB0aGUgbG93ZXIgdGhlIG51bWJlciBvZiBzZXJ2ZXJzIHdpdGhvdXQKLQkJICogb3ZlcmZsb3cuIFdpdGggdGhpcyBmb3JtdWxhLCB0aGUgcmVzdWx0IGlzIGFsd2F5cyBwb3NpdGl2ZSwKLQkJICogc28gd2UgY2FuIHVzZSBlYjPpX2luc2VydCgpLgotCQkgKi8KLQkJcy0+bGJfbm9kZS5rZXkgPSBTUlZfVVdHSFRfUkFOR0UgKiBzLT5ucG9zICsKLQkJCSh1bnNpZ25lZCkoU1JWX0VXR0hUX01BWCArIHMtPnJ3ZWlnaHQgLSBzLT5ld2VpZ2h0KSAvIEJFX1dFSUdIVF9TQ0FMRTsKLQotCQllYjMyX2luc2VydCgmZ3JwLT5jdXJyLCAmcy0+bGJfbm9kZSk7Ci0JCXMtPmxiX3RyZWUgPSAmZ3JwLT5jdXJyOwotCX0KLX0KLQotLyogcHJlcGFyZXMgYSBzZXJ2ZXIgd2hlbiBleHRyYWN0aW5nIGl0IGZyb20gdGhlICJpbml0IiB0cmVlICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZndycl9nZXRfc3J2X2luaXQoc3RydWN0IHNlcnZlciAqcykKLXsKLQlzLT5ucG9zID0gcy0+cndlaWdodCA9IDA7Ci19Ci0KLS8qIHByZXBhcmVzIGEgc2VydmVyIHdoZW4gZXh0cmFjdGluZyBpdCBmcm9tIHRoZSAibmV4dCIgdHJlZSAqLwotc3RhdGljIGlubGluZSB2b2lkIGZ3cnJfZ2V0X3Nydl9uZXh0KHN0cnVjdCBzZXJ2ZXIgKnMpCi17Ci0Jc3RydWN0IGZ3cnJfZ3JvdXAgKmdycCA9IChzLT5zdGF0ZSAmIFNSVl9CQUNLVVApID8KLQkJJnMtPnByb3h5LT5sYnBybS5md3JyLmJjayA6Ci0JCSZzLT5wcm94eS0+bGJwcm0uZndyci5hY3Q7Ci0KLQlzLT5ucG9zICs9IGdycC0+Y3Vycl93ZWlnaHQ7Ci19Ci0KLS8qIHByZXBhcmVzIGEgc2VydmVyIHdoZW4gaXQgd2FzIG1hcmtlZCBkb3duICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZndycl9nZXRfc3J2X2Rvd24oc3RydWN0IHNlcnZlciAqcykKLXsKLQlzdHJ1Y3QgZndycl9ncm91cCAqZ3JwID0gKHMtPnN0YXRlICYgU1JWX0JBQ0tVUCkgPwotCQkmcy0+cHJveHktPmxicHJtLmZ3cnIuYmNrIDoKLQkJJnMtPnByb3h5LT5sYnBybS5md3JyLmFjdDsKLQotCXMtPm5wb3MgPSBncnAtPmN1cnJfcG9zOwotfQotCi0vKiBwcmVwYXJlcyBhIHNlcnZlciB3aGVuIGV4dHJhY3RpbmcgaXQgZnJvbSBpdHMgdHJlZSAqLwotc3RhdGljIHZvaWQgZndycl9nZXRfc3J2KHN0cnVjdCBzZXJ2ZXIgKnMpCi17Ci0Jc3RydWN0IHByb3h5ICpwID0gcy0+cHJveHk7Ci0Jc3RydWN0IGZ3cnJfZ3JvdXAgKmdycCA9IChzLT5zdGF0ZSAmIFNSVl9CQUNLVVApID8KLQkJJnAtPmxicHJtLmZ3cnIuYmNrIDoKLQkJJnAtPmxicHJtLmZ3cnIuYWN0OwotCi0JaWYgKHMtPmxiX3RyZWUgPT0gZ3JwLT5pbml0KSB7Ci0JCWZ3cnJfZ2V0X3Nydl9pbml0KHMpOwotCX0KLQllbHNlIGlmIChzLT5sYl90cmVlID09IGdycC0+bmV4dCkgewotCQlmd3JyX2dldF9zcnZfbmV4dChzKTsKLQl9Ci0JZWxzZSBpZiAocy0+bGJfdHJlZSA9PSBOVUxMKSB7Ci0JCWZ3cnJfZ2V0X3Nydl9kb3duKHMpOwotCX0KLX0KLQotLyogc3dpdGNoZXMgdHJlZXMgImluaXQiIGFuZCAibmV4dCIgZm9yIEZXUlIgZ3JvdXAgPGdycD4uICJpbml0IiBzaG91bGQgYmUgZW1wdHkKLSAqIHdoZW4gdGhpcyBoYXBwZW5zLCBhbmQgIm5leHQiIGZpbGxlZCB3aXRoIHNlcnZlcnMgc29ydGVkIGJ5IHdlaWdodHMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBmd3JyX3N3aXRjaF90cmVlcyhzdHJ1Y3QgZndycl9ncm91cCAqZ3JwKQotewotCXN0cnVjdCBlYl9yb290ICpzd2FwOwotCXN3YXAgPSBncnAtPmluaXQ7Ci0JZ3JwLT5pbml0ID0gZ3JwLT5uZXh0OwotCWdycC0+bmV4dCA9IHN3YXA7Ci0JZ3JwLT5jdXJyX3dlaWdodCA9IGdycC0+bmV4dF93ZWlnaHQ7Ci0JZ3JwLT5jdXJyX3BvcyA9IGdycC0+Y3Vycl93ZWlnaHQ7Ci19Ci0KLS8qIHJldHVybiBuZXh0IHNlcnZlciBmcm9tIHRoZSBjdXJyZW50IHRyZWUgaW4gRldSUiBncm91cCA8Z3JwPiwgb3IgYSBzZXJ2ZXIKLSAqIGZyb20gdGhlICJpbml0IiB0cmVlIGlmIGFwcHJvcHJpYXRlLiBJZiBib3RoIHRyZWVzIGFyZSBlbXB0eSwgcmV0dXJuIE5VTEwuCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgc2VydmVyICpmd3JyX2dldF9zZXJ2ZXJfZnJvbV9ncm91cChzdHJ1Y3QgZndycl9ncm91cCAqZ3JwKQotewotCXN0cnVjdCBlYjMyX25vZGUgKm5vZGU7Ci0Jc3RydWN0IHNlcnZlciAqczsKLQotCW5vZGUgPSBlYjMyX2ZpcnN0KCZncnAtPmN1cnIpOwotCXMgPSBlYjMyX2VudHJ5KG5vZGUsIHN0cnVjdCBzZXJ2ZXIsIGxiX25vZGUpOwotCQotCWlmICghbm9kZSB8fCBzLT5ucG9zID4gZ3JwLT5jdXJyX3BvcykgewotCQkvKiBlaXRoZXIgd2UgaGF2ZSBubyBzZXJ2ZXIgbGVmdCwgb3Igd2UgaGF2ZSBhIGhvbGUgKi8KLQkJc3RydWN0IGViMzJfbm9kZSAqbm9kZTI7Ci0JCW5vZGUyID0gZWIzMl9maXJzdChncnAtPmluaXQpOwotCQlpZiAobm9kZTIpIHsKLQkJCW5vZGUgPSBub2RlMjsKLQkJCXMgPSBlYjMyX2VudHJ5KG5vZGUsIHN0cnVjdCBzZXJ2ZXIsIGxiX25vZGUpOwotCQkJZndycl9nZXRfc3J2X2luaXQocyk7Ci0JCQlpZiAocy0+ZXdlaWdodCA9PSAwKSAvKiBGSVhNRTogaXMgaXQgcG9zc2libGUgYXQgYWxsID8gKi8KLQkJCQlub2RlID0gTlVMTDsKLQkJfQotCX0KLQlpZiAobm9kZSkKLQkJcmV0dXJuIHM7Ci0JZWxzZQotCQlyZXR1cm4gTlVMTDsKLX0KLQotLyogQ29tcHV0ZXMgbmV4dCBwb3NpdGlvbiBvZiBzZXJ2ZXIgPHM+IGluIHRoZSBncm91cC4gSXQgaXMgbWFuZGF0b3J5IGZvciA8cz4KLSAqIHRvIGhhdmUgYSBub24temVybywgcG9zaXRpdmUgZXdlaWdodC4KLSovCi1zdGF0aWMgaW5saW5lIHZvaWQgZndycl91cGRhdGVfcG9zaXRpb24oc3RydWN0IGZ3cnJfZ3JvdXAgKmdycCwgc3RydWN0IHNlcnZlciAqcykKLXsKLQlpZiAoIXMtPm5wb3MpIHsKLQkJLyogZmlyc3QgdGltZSBldmVyIGZvciB0aGlzIHNlcnZlciAqLwotCQlzLT5scG9zID0gZ3JwLT5jdXJyX3BvczsKLQkJcy0+bnBvcyA9IGdycC0+Y3Vycl9wb3MgKyBncnAtPm5leHRfd2VpZ2h0IC8gcy0+ZXdlaWdodDsKLQkJcy0+cndlaWdodCArPSBncnAtPm5leHRfd2VpZ2h0ICUgcy0+ZXdlaWdodDsKLQotCQlpZiAocy0+cndlaWdodCA+PSBzLT5ld2VpZ2h0KSB7Ci0JCQlzLT5yd2VpZ2h0IC09IHMtPmV3ZWlnaHQ7Ci0JCQlzLT5ucG9zKys7Ci0JCX0KLQl9IGVsc2UgewotCQlzLT5scG9zID0gcy0+bnBvczsKLQkJcy0+bnBvcyArPSBncnAtPm5leHRfd2VpZ2h0IC8gcy0+ZXdlaWdodDsKLQkJcy0+cndlaWdodCArPSBncnAtPm5leHRfd2VpZ2h0ICUgcy0+ZXdlaWdodDsKLQotCQlpZiAocy0+cndlaWdodCA+PSBzLT5ld2VpZ2h0KSB7Ci0JCQlzLT5yd2VpZ2h0IC09IHMtPmV3ZWlnaHQ7Ci0JCQlzLT5ucG9zKys7Ci0JCX0KLQl9Ci19Ci0KLS8qIFJldHVybiBuZXh0IHNlcnZlciBmcm9tIHRoZSBjdXJyZW50IHRyZWUgaW4gYmFja2VuZCA8cD4sIG9yIGEgc2VydmVyIGZyb20KLSAqIHRoZSBpbml0IHRyZWUgaWYgYXBwcm9wcmlhdGUuIElmIGJvdGggdHJlZXMgYXJlIGVtcHR5LCByZXR1cm4gTlVMTC4KLSAqIFNhdHVyYXRlZCBzZXJ2ZXJzIGFyZSBza2lwcGVkIGFuZCByZXF1ZXVlZC4KLSAqLwotc3RhdGljIHN0cnVjdCBzZXJ2ZXIgKmZ3cnJfZ2V0X25leHRfc2VydmVyKHN0cnVjdCBwcm94eSAqcCwgc3RydWN0IHNlcnZlciAqc3J2dG9hdm9pZCkKLXsKLQlzdHJ1Y3Qgc2VydmVyICpzcnYsICpmdWxsLCAqYXZvaWRlZDsKLQlzdHJ1Y3QgZndycl9ncm91cCAqZ3JwOwotCWludCBzd2l0Y2hlZDsKLQotCWlmIChwLT5zcnZfYWN0KQotCQlncnAgPSAmcC0+bGJwcm0uZndyci5hY3Q7Ci0JZWxzZSBpZiAocC0+bGJwcm0uZmJjaykKLQkJcmV0dXJuIHAtPmxicHJtLmZiY2s7Ci0JZWxzZSBpZiAocC0+c3J2X2JjaykKLQkJZ3JwID0gJnAtPmxicHJtLmZ3cnIuYmNrOwotCWVsc2UKLQkJcmV0dXJuIE5VTEw7Ci0KLQlzd2l0Y2hlZCA9IDA7Ci0JYXZvaWRlZCA9IE5VTEw7Ci0JZnVsbCA9IE5VTEw7IC8qIE5VTEwtdGVybWluYXRlZCBsaXN0IG9mIHNhdHVyYXRlZCBzZXJ2ZXJzICovCi0Jd2hpbGUgKDEpIHsKLQkJLyogaWYgd2Ugc2VlIGFuIGVtcHR5IGdyb3VwLCBsZXQncyBmaXJzdCB0cnkgdG8gY29sbGVjdCB3ZWlnaHRzCi0JCSAqIHdoaWNoIG1pZ2h0IGhhdmUgcmVjZW50bHkgY2hhbmdlZC4KLQkJICovCi0JCWlmICghZ3JwLT5jdXJyX3dlaWdodCkKLQkJCWdycC0+Y3Vycl9wb3MgPSBncnAtPmN1cnJfd2VpZ2h0ID0gZ3JwLT5uZXh0X3dlaWdodDsKLQotCQkvKiBnZXQgZmlyc3Qgc2VydmVyIGZyb20gdGhlICJjdXJyZW50IiB0cmVlLiBXaGVuIHRoZSBlbmQgb2YKLQkJICogdGhlIHRyZWUgaXMgcmVhY2hlZCwgd2UgbWF5IGhhdmUgdG8gc3dpdGNoLCBidXQgb25seSBvbmNlLgotCQkgKi8KLQkJd2hpbGUgKDEpIHsKLQkJCXNydiA9IGZ3cnJfZ2V0X3NlcnZlcl9mcm9tX2dyb3VwKGdycCk7Ci0JCQlpZiAoc3J2KQotCQkJCWJyZWFrOwotCQkJaWYgKHN3aXRjaGVkKSB7Ci0JCQkJaWYgKGF2b2lkZWQpIHsKLQkJCQkJc3J2ID0gYXZvaWRlZDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWdvdG8gcmVxdWV1ZV9zZXJ2ZXJzOwotCQkJfQotCQkJc3dpdGNoZWQgPSAxOwotCQkJZndycl9zd2l0Y2hfdHJlZXMoZ3JwKTsKLQotCQl9Ci0KLQkJLyogT0ssIHdlIGhhdmUgYSBzZXJ2ZXIuIEhvd2V2ZXIsIGl0IG1heSBiZSBzYXR1cmF0ZWQsIGluIHdoaWNoCi0JCSAqIGNhc2Ugd2UgZG9uJ3Qgd2FudCB0byByZWNvbnNpZGVyIGl0IGZvciBub3cuIFdlJ2xsIHVwZGF0ZQotCQkgKiBpdHMgcG9zaXRpb24gYW5kIGRlcXVldWUgaXQgYW55d2F5LCBzbyB0aGF0IHdlIGNhbiBtb3ZlIGl0Ci0JCSAqIHRvIGEgYmV0dGVyIHBsYWNlIGFmdGVyd2FyZHMuCi0JCSAqLwotCQlmd3JyX3VwZGF0ZV9wb3NpdGlvbihncnAsIHNydik7Ci0JCWZ3cnJfZGVxdWV1ZV9zcnYoc3J2KTsKLQkJZ3JwLT5jdXJyX3BvcysrOwotCQlpZiAoIXNydi0+bWF4Y29ubiB8fCAoIXNydi0+bmJwZW5kICYmIHNydi0+c2VydmVkIDwgc3J2X2R5bmFtaWNfbWF4Y29ubihzcnYpKSkgewotCQkJLyogbWFrZSBzdXJlIGl0IGlzIG5vdCB0aGUgc2VydmVyIHdlIGFyZSB0cnlpbmcgdG8gZXhjbHVkZS4uLiAqLwotCQkJaWYgKHNydiAhPSBzcnZ0b2F2b2lkIHx8IGF2b2lkZWQpCi0JCQkJYnJlYWs7Ci0KLQkJCWF2b2lkZWQgPSBzcnY7IC8qIC4uLmJ1dCByZW1lbWJlciB0aGF0IGlzIHdhcyBzZWxlY3RlZCB5ZXQgYXZvaWRlZCAqLwotCQl9Ci0KLQkJLyogdGhlIHNlcnZlciBpcyBzYXR1cmF0ZWQgb3IgYXZvaWRlZCwgbGV0J3MgY2hhaW4gaXQgZm9yIGxhdGVyIHJlaW5zZXJ0aW9uICovCi0JCXNydi0+bmV4dF9mdWxsID0gZnVsbDsKLQkJZnVsbCA9IHNydjsKLQl9Ci0KLQkvKiBPSywgd2UgZ290IHRoZSBiZXN0IHNlcnZlciwgbGV0J3MgdXBkYXRlIGl0ICovCi0JZndycl9xdWV1ZV9zcnYoc3J2KTsKLQotIHJlcXVldWVfc2VydmVyczoKLQkvKiBSZXF1ZXVlIGFsbCBleHRyYWN0ZWQgc2VydmVycy4gSWYgZnVsbD09c3J2IHRoZW4gaXQgd2FzCi0JICogYXZvaWRlZCAodW5zdWNlc3NmdWxseSkgYW5kIGNoYWluZWQsIG9taXQgaXQgbm93LgotCSAqLwotCWlmICh1bmxpa2VseShmdWxsICE9IE5VTEwpKSB7Ci0JCWlmIChzd2l0Y2hlZCkgewotCQkJLyogdGhlIHRyZWUgaGFzIHN3aXRjaGVkLCByZXF1ZXVlIGFsbCBleHRyYWN0ZWQgc2VydmVycwotCQkJICogaW50byAiaW5pdCIsIGJlY2F1c2UgdGhlaXIgcGxhY2Ugd2FzIGxvc3QsIGFuZCBvbmx5Ci0JCQkgKiB0aGVpciB3ZWlnaHQgbWF0dGVycy4KLQkJCSAqLwotCQkJZG8gewotCQkJCWlmIChsaWtlbHkoZnVsbCAhPSBzcnYpKQotCQkJCQlmd3JyX3F1ZXVlX2J5X3dlaWdodChncnAtPmluaXQsIGZ1bGwpOwotCQkJCWZ1bGwgPSBmdWxsLT5uZXh0X2Z1bGw7Ci0JCQl9IHdoaWxlIChmdWxsKTsKLQkJfSBlbHNlIHsKLQkJCS8qIHJlcXVldWUgYWxsIGV4dHJhY3RlZCBzZXJ2ZXJzIGp1c3QgYXMgaWYgdGhleSB3ZXJlIGNvbnN1bWVkCi0JCQkgKiBzbyB0aGF0IHRoZXkgcmVnYWluIHRoZWlyIGV4cGVjdGVkIHBsYWNlLgotCQkJICovCi0JCQlkbyB7Ci0JCQkJaWYgKGxpa2VseShmdWxsICE9IHNydikpCi0JCQkJCWZ3cnJfcXVldWVfc3J2KGZ1bGwpOwotCQkJCWZ1bGwgPSBmdWxsLT5uZXh0X2Z1bGw7Ci0JCQl9IHdoaWxlIChmdWxsKTsKLQkJfQotCX0KLQlyZXR1cm4gc3J2OwogfQogCi0vKiBSZW1vdmUgYSBzZXJ2ZXIgZnJvbSBhIHRyZWUuIEl0IG11c3QgaGF2ZSBwcmV2aW91c2x5IGJlZW4gZGVxdWV1ZWQuIFRoaXMKLSAqIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGJlIGNhbGxlZCB3aGVuIGEgc2VydmVyIGlzIGdvaW5nIGRvd24gb3IgaGFzIGl0cwotICogd2VpZ2h0IGRpc2FibGVkLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZndsY19yZW1vdmVfZnJvbV90cmVlKHN0cnVjdCBzZXJ2ZXIgKnMpCi17Ci0Jcy0+bGJfdHJlZSA9IE5VTEw7Ci19Ci0KLS8qIHNpbXBseSByZW1vdmVzIGEgc2VydmVyIGZyb20gYSB0cmVlICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZndsY19kZXF1ZXVlX3NydihzdHJ1Y3Qgc2VydmVyICpzKQotewotCWViMzJfZGVsZXRlKCZzLT5sYl9ub2RlKTsKLX0KLQotLyogUXVldWUgYSBzZXJ2ZXIgaW4gaXRzIGFzc29jaWF0ZWQgdHJlZSwgYXNzdW1pbmcgdGhlIHdlaWdodCBpcyA+MC4KLSAqIFNlcnZlcnMgYXJlIHNvcnRlZCBieSAjY29ubnMvd2VpZ2h0LiBUbyBlbnN1cmUgbWF4aW11bSBhY2N1cmFjeSwKLSAqIHdlIHVzZSAjY29ubnMqU1JWX0VXR0hUX01BWC9ld2VpZ2h0IGFzIHRoZSBzb3J0aW5nIGtleS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGZ3bGNfcXVldWVfc3J2KHN0cnVjdCBzZXJ2ZXIgKnMpCi17Ci0Jcy0+bGJfbm9kZS5rZXkgPSBzLT5zZXJ2ZWQgKiBTUlZfRVdHSFRfTUFYIC8gcy0+ZXdlaWdodDsKLQllYjMyX2luc2VydChzLT5sYl90cmVlLCAmcy0+bGJfbm9kZSk7Ci19Ci0KLS8qIFJlLXBvc2l0aW9uIHRoZSBzZXJ2ZXIgaW4gdGhlIEZXTEMgdHJlZSBhZnRlciBpdCBoYXMgYmVlbiBhc3NpZ25lZCBvbmUKLSAqIGNvbm5lY3Rpb24gb3IgYWZ0ZXIgaXQgaGFzIHJlbGVhc2VkIG9uZS4gTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIHRoYXQKLSAqIHRoZSBzZXJ2ZXIgaGFzIGJlZW4gbW92ZWQgb3V0IG9mIHRoZSB0cmVlIGR1ZSB0byBmYWlsZWQgaGVhbHRoLWNoZWNrcy4KLSAqLwotc3RhdGljIHZvaWQgZndsY19zcnZfcmVwb3NpdGlvbihzdHJ1Y3Qgc2VydmVyICpzKQotewotCWlmICghcy0+bGJfdHJlZSkKLQkJcmV0dXJuOwotCWZ3bGNfZGVxdWV1ZV9zcnYocyk7Ci0JZndsY19xdWV1ZV9zcnYocyk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgc2VydmVyIHRyZWVzIGFjY29yZGluZyB0byBzZXJ2ZXIgPHNydj4ncyBuZXcKLSAqIHN0YXRlLiBJdCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gc2VydmVyIDxzcnY+J3Mgc3RhdHVzIGNoYW5nZXMgdG8gZG93bi4KLSAqIEl0IGlzIG5vdCBpbXBvcnRhbnQgd2hldGhlciB0aGUgc2VydmVyIHdhcyBhbHJlYWR5IGRvd24gb3Igbm90LiBJdCBpcyBub3QKLSAqIGltcG9ydGFudCBlaXRoZXIgdGhhdCB0aGUgbmV3IHN0YXRlIGlzIGNvbXBsZXRlbHkgZG93biAodGhlIGNhbGxlciBtYXkgbm90Ci0gKiBrbm93IGFsbCB0aGUgdmFyaWFibGVzIG9mIGEgc2VydmVyJ3Mgc3RhdGUpLgotICovCi1zdGF0aWMgdm9pZCBmd2xjX3NldF9zZXJ2ZXJfc3RhdHVzX2Rvd24oc3RydWN0IHNlcnZlciAqc3J2KQotewotCXN0cnVjdCBwcm94eSAqcCA9IHNydi0+cHJveHk7Ci0KLQlpZiAoc3J2LT5zdGF0ZSA9PSBzcnYtPnByZXZfc3RhdGUgJiYKLQkgICAgc3J2LT5ld2VpZ2h0ID09IHNydi0+cHJldl9ld2VpZ2h0KQotCQlyZXR1cm47Ci0KLQlpZiAoc3J2X2lzX3VzYWJsZShzcnYtPnN0YXRlLCBzcnYtPmV3ZWlnaHQpKQotCQlnb3RvIG91dF91cGRhdGVfc3RhdGU7Ci0KLQlpZiAoIXNydl9pc191c2FibGUoc3J2LT5wcmV2X3N0YXRlLCBzcnYtPnByZXZfZXdlaWdodCkpCi0JCS8qIHNlcnZlciB3YXMgYWxyZWFkeSBkb3duICovCi0JCWdvdG8gb3V0X3VwZGF0ZV9iYWNrZW5kOwotCi0JaWYgKHNydi0+c3RhdGUgJiBTUlZfQkFDS1VQKSB7Ci0JCXAtPmxicHJtLnRvdF93YmNrIC09IHNydi0+cHJldl9ld2VpZ2h0OwotCQlwLT5zcnZfYmNrLS07Ci0KLQkJaWYgKHNydiA9PSBwLT5sYnBybS5mYmNrKSB7Ci0JCQkvKiB3ZSBsb3N0IHRoZSBmaXJzdCBiYWNrdXAgc2VydmVyIGluIGEgc2luZ2xlLWJhY2t1cAotCQkJICogY29uZmlndXJhdGlvbiwgd2UgbXVzdCBzZWFyY2ggYW5vdGhlciBvbmUuCi0JCQkgKi8KLQkJCXN0cnVjdCBzZXJ2ZXIgKnNydjIgPSBwLT5sYnBybS5mYmNrOwotCQkJZG8gewotCQkJCXNydjIgPSBzcnYyLT5uZXh0OwotCQkJfSB3aGlsZSAoc3J2MiAmJgotCQkJCSAhKChzcnYyLT5zdGF0ZSAmIFNSVl9CQUNLVVApICYmCi0JCQkJICAgc3J2X2lzX3VzYWJsZShzcnYyLT5zdGF0ZSwgc3J2Mi0+ZXdlaWdodCkpKTsKLQkJCXAtPmxicHJtLmZiY2sgPSBzcnYyOwotCQl9Ci0JfSBlbHNlIHsKLQkJcC0+bGJwcm0udG90X3dhY3QgLT0gc3J2LT5wcmV2X2V3ZWlnaHQ7Ci0JCXAtPnNydl9hY3QtLTsKLQl9Ci0KLQlmd2xjX2RlcXVldWVfc3J2KHNydik7Ci0JZndsY19yZW1vdmVfZnJvbV90cmVlKHNydik7Ci0KLW91dF91cGRhdGVfYmFja2VuZDoKLQkvKiBjaGVjay91cGRhdGUgdG90X3VzZWQsIHRvdF93ZWlnaHQgKi8KLQl1cGRhdGVfYmFja2VuZF93ZWlnaHQocCk7Ci0gb3V0X3VwZGF0ZV9zdGF0ZToKLQlzcnYtPnByZXZfc3RhdGUgPSBzcnYtPnN0YXRlOwotCXNydi0+cHJldl9ld2VpZ2h0ID0gc3J2LT5ld2VpZ2h0OwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIHNlcnZlciB0cmVlcyBhY2NvcmRpbmcgdG8gc2VydmVyIDxzcnY+J3MgbmV3Ci0gKiBzdGF0ZS4gSXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHNlcnZlciA8c3J2PidzIHN0YXR1cyBjaGFuZ2VzIHRvIHVwLgotICogSXQgaXMgbm90IGltcG9ydGFudCB3aGV0aGVyIHRoZSBzZXJ2ZXIgd2FzIGFscmVhZHkgZG93biBvciBub3QuIEl0IGlzIG5vdAotICogaW1wb3J0YW50IGVpdGhlciB0aGF0IHRoZSBuZXcgc3RhdGUgaXMgY29tcGxldGVseSBVUCAodGhlIGNhbGxlciBtYXkgbm90Ci0gKiBrbm93IGFsbCB0aGUgdmFyaWFibGVzIG9mIGEgc2VydmVyJ3Mgc3RhdGUpLiBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IGNoYW5nZQotICogdGhlIHdlaWdodCBvZiBhIHNlcnZlciB3aGljaCB3YXMgYWxyZWFkeSB1cC4KLSAqLwotc3RhdGljIHZvaWQgZndsY19zZXRfc2VydmVyX3N0YXR1c191cChzdHJ1Y3Qgc2VydmVyICpzcnYpCi17Ci0Jc3RydWN0IHByb3h5ICpwID0gc3J2LT5wcm94eTsKLQotCWlmIChzcnYtPnN0YXRlID09IHNydi0+cHJldl9zdGF0ZSAmJgotCSAgICBzcnYtPmV3ZWlnaHQgPT0gc3J2LT5wcmV2X2V3ZWlnaHQpCi0JCXJldHVybjsKLQotCWlmICghc3J2X2lzX3VzYWJsZShzcnYtPnN0YXRlLCBzcnYtPmV3ZWlnaHQpKQotCQlnb3RvIG91dF91cGRhdGVfc3RhdGU7Ci0KLQlpZiAoc3J2X2lzX3VzYWJsZShzcnYtPnByZXZfc3RhdGUsIHNydi0+cHJldl9ld2VpZ2h0KSkKLQkJLyogc2VydmVyIHdhcyBhbHJlYWR5IHVwICovCi0JCWdvdG8gb3V0X3VwZGF0ZV9iYWNrZW5kOwotCi0JaWYgKHNydi0+c3RhdGUgJiBTUlZfQkFDS1VQKSB7Ci0JCXNydi0+bGJfdHJlZSA9ICZwLT5sYnBybS5md2xjLmJjazsKLQkJcC0+bGJwcm0udG90X3diY2sgKz0gc3J2LT5ld2VpZ2h0OwotCQlwLT5zcnZfYmNrKys7Ci0KLQkJaWYgKCEocC0+b3B0aW9ucyAmIFBSX09fVVNFX0FMTF9CSykpIHsKLQkJCWlmICghcC0+bGJwcm0uZmJjaykgewotCQkJCS8qIHRoZXJlIHdhcyBubyBiYWNrdXAgc2VydmVyIGFueW1vcmUgKi8KLQkJCQlwLT5sYnBybS5mYmNrID0gc3J2OwotCQkJfSBlbHNlIHsKLQkJCQkvKiB3ZSBtYXkgaGF2ZSByZXN0b3JlZCBhIGJhY2t1cCBzZXJ2ZXIgcHJpb3IgdG8gZmJjaywKLQkJCQkgKiBpbiB3aGljaCBjYXNlIGl0IHNob3VsZCByZXBsYWNlIGl0LgotCQkJCSAqLwotCQkJCXN0cnVjdCBzZXJ2ZXIgKnNydjIgPSBzcnY7Ci0JCQkJZG8gewotCQkJCQlzcnYyID0gc3J2Mi0+bmV4dDsKLQkJCQl9IHdoaWxlIChzcnYyICYmIChzcnYyICE9IHAtPmxicHJtLmZiY2spKTsKLQkJCQlpZiAoc3J2MikKLQkJCQkJcC0+bGJwcm0uZmJjayA9IHNydjsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCXNydi0+bGJfdHJlZSA9ICZwLT5sYnBybS5md2xjLmFjdDsKLQkJcC0+bGJwcm0udG90X3dhY3QgKz0gc3J2LT5ld2VpZ2h0OwotCQlwLT5zcnZfYWN0Kys7Ci0JfQotCi0JLyogbm90ZSB0aGF0IGV3ZWlnaHQgY2Fubm90IGJlIDAgaGVyZSAqLwotCWZ3bGNfcXVldWVfc3J2KHNydik7Ci0KLSBvdXRfdXBkYXRlX2JhY2tlbmQ6Ci0JLyogY2hlY2svdXBkYXRlIHRvdF91c2VkLCB0b3Rfd2VpZ2h0ICovCi0JdXBkYXRlX2JhY2tlbmRfd2VpZ2h0KHApOwotIG91dF91cGRhdGVfc3RhdGU6Ci0Jc3J2LT5wcmV2X3N0YXRlID0gc3J2LT5zdGF0ZTsKLQlzcnYtPnByZXZfZXdlaWdodCA9IHNydi0+ZXdlaWdodDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZnRlciBhbiB1cGRhdGUgdG8gc2VydmVyIDxzcnY+J3MgZWZmZWN0aXZlCi0gKiB3ZWlnaHQuIEl0IG1heSBiZSBjYWxsZWQgYWZ0ZXIgYSBzdGF0ZSBjaGFuZ2UgdG9vLgotICovCi1zdGF0aWMgdm9pZCBmd2xjX3VwZGF0ZV9zZXJ2ZXJfd2VpZ2h0KHN0cnVjdCBzZXJ2ZXIgKnNydikKLXsKLQlpbnQgb2xkX3N0YXRlLCBuZXdfc3RhdGU7Ci0Jc3RydWN0IHByb3h5ICpwID0gc3J2LT5wcm94eTsKLQotCWlmIChzcnYtPnN0YXRlID09IHNydi0+cHJldl9zdGF0ZSAmJgotCSAgICBzcnYtPmV3ZWlnaHQgPT0gc3J2LT5wcmV2X2V3ZWlnaHQpCi0JCXJldHVybjsKLQotCS8qIElmIGNoYW5naW5nIHRoZSBzZXJ2ZXIncyB3ZWlnaHQgY2hhbmdlcyBpdHMgc3RhdGUsIHdlIHNpbXBseSBhcHBseQotCSAqIHRoZSBwcm9jZWR1cmVzIHdlIGFscmVhZHkgaGF2ZSBmb3Igc3RhdHVzIGNoYW5nZS4gSWYgdGhlIHN0YXRlCi0JICogcmVtYWlucyBkb3duLCB0aGUgc2VydmVyIGlzIG5vdCBpbiBhbnkgdHJlZSwgc28gaXQncyBhcyBlYXN5IGFzCi0JICogdXBkYXRpbmcgaXRzIHZhbHVlcy4gSWYgdGhlIHN0YXRlIHJlbWFpbnMgdXAgd2l0aCBkaWZmZXJlbnQgd2VpZ2h0cywKLQkgKiB0aGVyZSBhcmUgc29tZSBjb21wdXRhdGlvbnMgdG8gcGVyZm9ybSB0byBmaW5kIGEgbmV3IHBsYWNlIGFuZAotCSAqIHBvc3NpYmx5IGEgbmV3IHRyZWUgZm9yIHRoaXMgc2VydmVyLgotCSAqLwotCSAKLQlvbGRfc3RhdGUgPSBzcnZfaXNfdXNhYmxlKHNydi0+cHJldl9zdGF0ZSwgc3J2LT5wcmV2X2V3ZWlnaHQpOwotCW5ld19zdGF0ZSA9IHNydl9pc191c2FibGUoc3J2LT5zdGF0ZSwgc3J2LT5ld2VpZ2h0KTsKLQotCWlmICghb2xkX3N0YXRlICYmICFuZXdfc3RhdGUpIHsKLQkJc3J2LT5wcmV2X3N0YXRlID0gc3J2LT5zdGF0ZTsKLQkJc3J2LT5wcmV2X2V3ZWlnaHQgPSBzcnYtPmV3ZWlnaHQ7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZSBpZiAoIW9sZF9zdGF0ZSAmJiBuZXdfc3RhdGUpIHsKLQkJZndsY19zZXRfc2VydmVyX3N0YXR1c191cChzcnYpOwotCQlyZXR1cm47Ci0JfQotCWVsc2UgaWYgKG9sZF9zdGF0ZSAmJiAhbmV3X3N0YXRlKSB7Ci0JCWZ3bGNfc2V0X3NlcnZlcl9zdGF0dXNfZG93bihzcnYpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHNydi0+bGJfdHJlZSkKLQkJZndsY19kZXF1ZXVlX3NydihzcnYpOwotCi0JaWYgKHNydi0+c3RhdGUgJiBTUlZfQkFDS1VQKSB7Ci0JCXAtPmxicHJtLnRvdF93YmNrICs9IHNydi0+ZXdlaWdodCAtIHNydi0+cHJldl9ld2VpZ2h0OwotCQlzcnYtPmxiX3RyZWUgPSAmcC0+bGJwcm0uZndsYy5iY2s7Ci0JfSBlbHNlIHsKLQkJcC0+bGJwcm0udG90X3dhY3QgKz0gc3J2LT5ld2VpZ2h0IC0gc3J2LT5wcmV2X2V3ZWlnaHQ7Ci0JCXNydi0+bGJfdHJlZSA9ICZwLT5sYnBybS5md2xjLmFjdDsKLQl9Ci0KLQlmd2xjX3F1ZXVlX3NydihzcnYpOwotCi0JdXBkYXRlX2JhY2tlbmRfd2VpZ2h0KHApOwotCXNydi0+cHJldl9zdGF0ZSA9IHNydi0+c3RhdGU7Ci0Jc3J2LT5wcmV2X2V3ZWlnaHQgPSBzcnYtPmV3ZWlnaHQ7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGJ1aWxkaW5nIHRoZSB0cmVlcyBpbiBjYXNlIG9mIGZhc3QKLSAqIHdlaWdodGVkIGxlYXN0LWNvbm5zLiBJdCBhbHNvIHNldHMgcC0+bGJwcm0ud2RpdiB0byB0aGUgZXdlaWdodCB0bwotICogdXdlaWdodCByYXRpby4gQm90aCBhY3RpdmUgYW5kIGJhY2t1cCBncm91cHMgYXJlIGluaXRpYWxpemVkLgotICovCi12b2lkIGZ3bGNfaW5pdF9zZXJ2ZXJfdHJlZShzdHJ1Y3QgcHJveHkgKnApCi17Ci0Jc3RydWN0IHNlcnZlciAqc3J2OwotCXN0cnVjdCBlYl9yb290IGluaXRfaGVhZCA9IEVCX1JPT1Q7Ci0KLQlwLT5sYnBybS5zZXRfc2VydmVyX3N0YXR1c191cCAgID0gZndsY19zZXRfc2VydmVyX3N0YXR1c191cDsKLQlwLT5sYnBybS5zZXRfc2VydmVyX3N0YXR1c19kb3duID0gZndsY19zZXRfc2VydmVyX3N0YXR1c19kb3duOwotCXAtPmxicHJtLnVwZGF0ZV9zZXJ2ZXJfZXdlaWdodCAgPSBmd2xjX3VwZGF0ZV9zZXJ2ZXJfd2VpZ2h0OwotCXAtPmxicHJtLnNlcnZlcl90YWtlX2Nvbm4gPSBmd2xjX3Nydl9yZXBvc2l0aW9uOwotCXAtPmxicHJtLnNlcnZlcl9kcm9wX2Nvbm4gPSBmd2xjX3Nydl9yZXBvc2l0aW9uOwotCi0JcC0+bGJwcm0ud2RpdiA9IEJFX1dFSUdIVF9TQ0FMRTsKLQlmb3IgKHNydiA9IHAtPnNydjsgc3J2OyBzcnYgPSBzcnYtPm5leHQpIHsKLQkJc3J2LT5wcmV2X2V3ZWlnaHQgPSBzcnYtPmV3ZWlnaHQgPSBzcnYtPnV3ZWlnaHQgKiBCRV9XRUlHSFRfU0NBTEU7Ci0JCXNydi0+cHJldl9zdGF0ZSA9IHNydi0+c3RhdGU7Ci0JfQotCi0JcmVjb3VudF9zZXJ2ZXJzKHApOwotCXVwZGF0ZV9iYWNrZW5kX3dlaWdodChwKTsKLQotCXAtPmxicHJtLmZ3bGMuYWN0ID0gaW5pdF9oZWFkOwotCXAtPmxicHJtLmZ3bGMuYmNrID0gaW5pdF9oZWFkOwotCi0JLyogcXVldWUgYWN0aXZlIGFuZCBiYWNrdXAgc2VydmVycyBpbiB0d28gZGlzdGluY3QgZ3JvdXBzICovCi0JZm9yIChzcnYgPSBwLT5zcnY7IHNydjsgc3J2ID0gc3J2LT5uZXh0KSB7Ci0JCWlmICghc3J2X2lzX3VzYWJsZShzcnYtPnN0YXRlLCBzcnYtPmV3ZWlnaHQpKQotCQkJY29udGludWU7Ci0JCXNydi0+bGJfdHJlZSA9IChzcnYtPnN0YXRlICYgU1JWX0JBQ0tVUCkgPyAmcC0+bGJwcm0uZndsYy5iY2sgOiAmcC0+bGJwcm0uZndsYy5hY3Q7Ci0JCWZ3bGNfcXVldWVfc3J2KHNydik7Ci0JfQotfQotCi0vKiBSZXR1cm4gbmV4dCBzZXJ2ZXIgZnJvbSB0aGUgRldMQyB0cmVlIGluIGJhY2tlbmQgPHA+LiBJZiB0aGUgdHJlZSBpcyBlbXB0eSwKLSAqIHJldHVybiBOVUxMLiBTYXR1cmF0ZWQgc2VydmVycyBhcmUgc2tpcHBlZC4KLSAqLwotc3RhdGljIHN0cnVjdCBzZXJ2ZXIgKmZ3bGNfZ2V0X25leHRfc2VydmVyKHN0cnVjdCBwcm94eSAqcCwgc3RydWN0IHNlcnZlciAqc3J2dG9hdm9pZCkKLXsKLQlzdHJ1Y3Qgc2VydmVyICpzcnYsICphdm9pZGVkOwotCXN0cnVjdCBlYjMyX25vZGUgKm5vZGU7Ci0KLQlzcnYgPSBhdm9pZGVkID0gTlVMTDsKLQotCWlmIChwLT5zcnZfYWN0KQotCQlub2RlID0gZWIzMl9maXJzdCgmcC0+bGJwcm0uZndsYy5hY3QpOwotCWVsc2UgaWYgKHAtPmxicHJtLmZiY2spCi0JCXJldHVybiBwLT5sYnBybS5mYmNrOwotCWVsc2UgaWYgKHAtPnNydl9iY2spCi0JCW5vZGUgPSBlYjMyX2ZpcnN0KCZwLT5sYnBybS5md2xjLmJjayk7Ci0JZWxzZQotCQlyZXR1cm4gTlVMTDsKLQotCXdoaWxlIChub2RlKSB7Ci0JCS8qIE9LLCB3ZSBoYXZlIGEgc2VydmVyLiBIb3dldmVyLCBpdCBtYXkgYmUgc2F0dXJhdGVkLCBpbiB3aGljaAotCQkgKiBjYXNlIHdlIGRvbid0IHdhbnQgdG8gcmVjb25zaWRlciBpdCBmb3Igbm93LCBzbyB3ZSdsbCBzaW1wbHkKLQkJICogc2tpcCBpdC4gU2FtZSBpZiBpdCdzIHRoZSBzZXJ2ZXIgd2UgdHJ5IHRvIGF2b2lkLCBpbiB3aGljaAotCQkgKiBjYXNlIHdlIHNpbXBseSByZW1lbWJlciBpdCBmb3IgbGF0ZXIgdXNlIGlmIG5lZWRlZC4KLQkJICovCi0JCXN0cnVjdCBzZXJ2ZXIgKnM7Ci0KLQkJcyA9IGViMzJfZW50cnkobm9kZSwgc3RydWN0IHNlcnZlciwgbGJfbm9kZSk7Ci0JCWlmICghcy0+bWF4Y29ubiB8fCAoIXMtPm5icGVuZCAmJiBzLT5zZXJ2ZWQgPCBzcnZfZHluYW1pY19tYXhjb25uKHMpKSkgewotCQkJaWYgKHMgIT0gc3J2dG9hdm9pZCkgewotCQkJCXNydiA9IHM7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlhdm9pZGVkID0gczsKLQkJfQotCQlub2RlID0gZWIzMl9uZXh0KG5vZGUpOwotCX0KLQotCWlmICghc3J2KQotCQlzcnYgPSBhdm9pZGVkOwotCi0JcmV0dXJuIHNydjsKLX0KLQogLyogCiAgKiBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIGZpbmQgYSBydW5uaW5nIHNlcnZlciBmb3IgdGhlIHByb3h5IDxweD4gZm9sbG93aW5nCiAgKiB0aGUgVVJMIHBhcmFtZXRlciBoYXNoIG1ldGhvZC4gSXQgbG9va3MgZm9yIGEgc3BlY2lmaWMgcGFyYW1ldGVyIGluIHRoZQpAQCAtMTQ5NSw3ICs0ODIsNyBAQAogCiAJCQlpZiAoIXMtPnNydikgewogCQkJCS8qIHBhcmFtZXRlciBub3QgZm91bmQsIGZhbGwgYmFjayB0byByb3VuZCByb2JpbiBvbiB0aGUgbWFwICovCi0JCQkJcy0+c3J2ID0gZ2V0X3NlcnZlcl9ycl93aXRoX2Nvbm5zKHMtPmJlLCBzLT5wcmV2X3Nydik7CisJCQkJcy0+c3J2ID0gbWFwX2dldF9zZXJ2ZXJfcnIocy0+YmUsIHMtPnByZXZfc3J2KTsKIAkJCQlpZiAoIXMtPnNydikgewogCQkJCQllcnIgPSBTUlZfU1RBVFVTX0ZVTEw7CiAJCQkJCWdvdG8gb3V0OwpAQCAtMTUwOCw3ICs0OTUsNyBAQAogCiAJCQlpZiAoIXMtPnNydikgewogCQkJCS8qIHBhcmFtZXRlciBub3QgZm91bmQsIGZhbGwgYmFjayB0byByb3VuZCByb2JpbiBvbiB0aGUgbWFwICovCi0JCQkJcy0+c3J2ID0gZ2V0X3NlcnZlcl9ycl93aXRoX2Nvbm5zKHMtPmJlLCBzLT5wcmV2X3Nydik7CisJCQkJcy0+c3J2ID0gbWFwX2dldF9zZXJ2ZXJfcnIocy0+YmUsIHMtPnByZXZfc3J2KTsKIAkJCQlpZiAoIXMtPnNydikgewogCQkJCQllcnIgPSBTUlZfU1RBVFVTX0ZVTEw7CiAJCQkJCWdvdG8gb3V0OwpAQCAtMTUyMSw3ICs1MDgsNyBAQAogCiAJCQlpZiAoIXMtPnNydikgewogCQkJCS8qIHBhcmFtZXRlciBub3QgZm91bmQsIGZhbGwgYmFjayB0byByb3VuZCByb2JpbiBvbiB0aGUgbWFwICovCi0JCQkJcy0+c3J2ID0gZ2V0X3NlcnZlcl9ycl93aXRoX2Nvbm5zKHMtPmJlLCBzLT5wcmV2X3Nydik7CisJCQkJcy0+c3J2ID0gbWFwX2dldF9zZXJ2ZXJfcnIocy0+YmUsIHMtPnByZXZfc3J2KTsKIAkJCQlpZiAoIXMtPnNydikgewogCQkJCQllcnIgPSBTUlZfU1RBVFVTX0ZVTEw7CiAJCQkJCWdvdG8gb3V0OwpAQCAtMjE2Niw1MyArMTE1Myw2IEBACiB9CiAKIC8qCi0gKiBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIGZpbmQgYSBydW5uaW5nIHNlcnZlciB3aXRoIGZyZWUgY29ubmVjdGlvbiBzbG90cyBmb3IKLSAqIHRoZSBwcm94eSA8cHg+IGZvbGxvd2luZyB0aGUgcm91bmQtcm9iaW4gbWV0aG9kLgotICogSWYgYW55IHNlcnZlciBpcyBmb3VuZCwgaXQgd2lsbCBiZSByZXR1cm5lZCBhbmQgcHgtPmxicHJtLm1hcC5ycl9pZHggd2lsbCBiZSB1cGRhdGVkCi0gKiB0byBwb2ludCB0byB0aGUgbmV4dCBzZXJ2ZXIuIElmIG5vIHZhbGlkIHNlcnZlciBpcyBmb3VuZCwgTlVMTCBpcyByZXR1cm5lZC4KLSAqLwotc3RydWN0IHNlcnZlciAqZ2V0X3NlcnZlcl9ycl93aXRoX2Nvbm5zKHN0cnVjdCBwcm94eSAqcHgsIHN0cnVjdCBzZXJ2ZXIgKnNydnRvYXZvaWQpCi17Ci0JaW50IG5ld2lkeCwgYXZvaWRpZHg7Ci0Jc3RydWN0IHNlcnZlciAqc3J2LCAqYXZvaWRlZDsKLQotCWlmIChweC0+bGJwcm0udG90X3dlaWdodCA9PSAwKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChweC0+bGJwcm0ubWFwLnN0YXRlICYgUFJfTUFQX1JFQ0FMQykKLQkJcmVjYWxjX3NlcnZlcl9tYXAocHgpOwotCi0JaWYgKHB4LT5sYnBybS5tYXAucnJfaWR4IDwgMCB8fCBweC0+bGJwcm0ubWFwLnJyX2lkeCA+PSBweC0+bGJwcm0udG90X3dlaWdodCkKLQkJcHgtPmxicHJtLm1hcC5ycl9pZHggPSAwOwotCW5ld2lkeCA9IHB4LT5sYnBybS5tYXAucnJfaWR4OwotCi0JYXZvaWRlZCA9IE5VTEw7Ci0JYXZvaWRpZHggPSAwOyAvKiBzaHV0IGEgZ2NjIHdhcm5pbmcgKi8KLQlkbyB7Ci0JCXNydiA9IHB4LT5sYnBybS5tYXAuc3J2W25ld2lkeCsrXTsKLQkJaWYgKCFzcnYtPm1heGNvbm4gfHwgc3J2LT5jdXJfc2VzcyA8IHNydl9keW5hbWljX21heGNvbm4oc3J2KSkgewotCQkJLyogbWFrZSBzdXJlIGl0IGlzIG5vdCB0aGUgc2VydmVyIHdlIGFyZSB0cnkgdG8gZXhjbHVkZS4uLiAqLwotCQkJaWYgKHNydiAhPSBzcnZ0b2F2b2lkKSB7Ci0JCQkJcHgtPmxicHJtLm1hcC5ycl9pZHggPSBuZXdpZHg7Ci0JCQkJcmV0dXJuIHNydjsKLQkJCX0KLQotCQkJYXZvaWRlZCA9IHNydjsJLyogLi4uYnV0IHJlbWVtYmVyIHRoYXQgaXMgd2FzIHNlbGVjdGVkIHlldCBhdm9pZGVkICovCi0JCQlhdm9pZGlkeCA9IG5ld2lkeDsKLQkJfQotCQlpZiAobmV3aWR4ID09IHB4LT5sYnBybS50b3Rfd2VpZ2h0KQotCQkJbmV3aWR4ID0gMDsKLQl9IHdoaWxlIChuZXdpZHggIT0gcHgtPmxicHJtLm1hcC5ycl9pZHgpOwotCi0JaWYgKGF2b2lkZWQpCi0JCXB4LT5sYnBybS5tYXAucnJfaWR4ID0gYXZvaWRpZHg7Ci0KLQkvKiByZXR1cm4gTlVMTCBvciBzcnZ0b2F2b2lkIGlmIGZvdW5kICovCi0JcmV0dXJuIGF2b2lkZWQ7Ci19Ci0KLQotLyoKICAqIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gZmluZCBhIHJ1bm5pbmcgc2VydmVyIGZvciB0aGUgcHJveHkgPHB4PiBmb2xsb3dpbmcKICAqIHRoZSBzb3VyY2UgaGFzaCBtZXRob2QuIERlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIGFjdGl2ZS9iYWNrdXAgc2VydmVycywKICAqIGl0IHdpbGwgZWl0aGVyIGxvb2sgZm9yIGFjdGl2ZSBzZXJ2ZXJzLCBvciBmb3IgYmFja3VwIHNlcnZlcnMuCg==