ZGlmZiAtLWdpdCBhL01vZHVsZXMvU2V0dXAuZGlzdCBiL01vZHVsZXMvU2V0dXAuZGlzdAppbmRleCA0OWM4NDI1Li4xYjI1MDJkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL1NldHVwLmRpc3QKKysrIGIvTW9kdWxlcy9TZXR1cC5kaXN0CkBAIC0xNjcsNyArMTY3LDcgQEAKICNhcnJheSBhcnJheW1vZHVsZS5jCSMgYXJyYXkgb2JqZWN0cwogI2NtYXRoIGNtYXRobW9kdWxlLmMgIyAtbG0gIyBjb21wbGV4IG1hdGggbGlicmFyeSBmdW5jdGlvbnMKICNtYXRoIG1hdGhtb2R1bGUuYyAjIC1sbSAjIG1hdGggbGlicmFyeSBmdW5jdGlvbnMsIGUuZy4gc2luKCkKLSNzdHJ1Y3Qgc3RydWN0bW9kdWxlLmMJIyBiaW5hcnkgc3RydWN0dXJlIHBhY2tpbmcvdW5wYWNraW5nCisjX3N0cnVjdCBfc3RydWN0LmMJIyBiaW5hcnkgc3RydWN0dXJlIHBhY2tpbmcvdW5wYWNraW5nCiAjdGltZSB0aW1lbW9kdWxlLmMgIyAtbG0gIyB0aW1lIG9wZXJhdGlvbnMgYW5kIHZhcmlhYmxlcwogI29wZXJhdG9yIG9wZXJhdG9yLmMJIyBvcGVyYXRvci5hZGQoKSBhbmQgc2ltaWxhciBnb29kaWVzCiAjX3dlYWtyZWYgX3dlYWtyZWYuYwkjIGJhc2ljIHdlYWsgcmVmZXJlbmNlIHN1cHBvcnQKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2NvZGVjc21vZHVsZS5jIGIvTW9kdWxlcy9fY29kZWNzbW9kdWxlLmMKaW5kZXggMzliNDQzYi4uZDhkMjNjNCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY29kZWNzbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fY29kZWNzbW9kdWxlLmMKQEAgLTE2OSw3ICsxNjksNyBAQAogCiBzdGF0aWMKIFB5T2JqZWN0ICpjb2RlY190dXBsZShQeU9iamVjdCAqdW5pY29kZSwKLQkJICAgICAgaW50IGxlbikKKwkJICAgICAgUHlfc3NpemVfdCBsZW4pCiB7CiAgICAgUHlPYmplY3QgKnYsKnc7CiAKQEAgLTE4MSw3ICsxODEsNyBAQAogCXJldHVybiBOVUxMOwogICAgIH0KICAgICBQeVR1cGxlX1NFVF9JVEVNKHYsMCx1bmljb2RlKTsKLSAgICB3ID0gUHlJbnRfRnJvbUxvbmcobGVuKTsKKyAgICB3ID0gUHlJbnRfRnJvbVNzaXplX3QobGVuKTsKICAgICBpZiAodyA9PSBOVUxMKSB7CiAJUHlfREVDUkVGKHYpOwogCXJldHVybiBOVUxMOwpAQCAtMjEzLDcgKzIxMyw3IEBACiAJUHlPYmplY3QgKnN0cjsKIAljb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCWNoYXIgKmJ1ZjsKLQlpbnQgbGVuOworCVB5X3NzaXplX3QgbGVuOwogCiAJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIXx6OmVzY2FwZV9lbmNvZGUiLAogCQkJICAgICAgJlB5U3RyaW5nX1R5cGUsICZzdHIsICZlcnJvcnMpKQpAQCAtMzE5LDEyICszMTksMTEgQEAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInQjfHppOnV0Zl8xNl9kZWNvZGUiLAogCQkJICAmZGF0YSwgJnNpemUsICZlcnJvcnMsICZmaW5hbCkpCiAJcmV0dXJuIE5VTEw7Ci0gICAgLyogWFhYIFdoeSBpcyBjb25zdW1lZCBpbml0aWFsaXplZCB0byBzaXplPyBtdmwgKi8KICAgICBpZiAoc2l6ZSA8IDApIHsKIAkgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJuZWdhdGl2ZSBhcmd1bWVudCIpOwogCSAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgY29uc3VtZWQgPSBzaXplOworICAgIGNvbnN1bWVkID0gc2l6ZTsgLyogVGhpcyBpcyBvdmVyd3JpdHRlbiB1bmxlc3MgZmluYWwgaXMgdHJ1ZS4gKi8KICAgICBkZWNvZGVkID0gUHlVbmljb2RlX0RlY29kZVVURjE2U3RhdGVmdWwoZGF0YSwgc2l6ZSwgZXJyb3JzLCAmYnl0ZW9yZGVyLAogCQkJCQkgICAgZmluYWwgPyBOVUxMIDogJmNvbnN1bWVkKTsKICAgICBpZiAoZGVjb2RlZCA9PSBOVUxMKQpAQCAtMzQ4LDEyICszNDcsMTEgQEAKIAkJCSAgJmRhdGEsICZzaXplLCAmZXJyb3JzLCAmZmluYWwpKQogCXJldHVybiBOVUxMOwogCi0gICAgLyogWFhYIFdoeSBpcyBjb25zdW1lZCBpbml0aWFsaXplZCB0byBzaXplPyBtdmwgKi8KICAgICBpZiAoc2l6ZSA8IDApIHsKICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5lZ2F0aXZlIGFyZ3VtZW50Iik7CiAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIGNvbnN1bWVkID0gc2l6ZTsKKyAgICBjb25zdW1lZCA9IHNpemU7IC8qIFRoaXMgaXMgb3ZlcndyaXR0ZW4gdW5sZXNzIGZpbmFsIGlzIHRydWUuICovCiAgICAgZGVjb2RlZCA9IFB5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsKGRhdGEsIHNpemUsIGVycm9ycywKIAkmYnl0ZW9yZGVyLCBmaW5hbCA/IE5VTEwgOiAmY29uc3VtZWQpOwogICAgIGlmIChkZWNvZGVkID09IE5VTEwpCkBAIC0zNzcsMTIgKzM3NSwxMSBAQAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCN8emk6dXRmXzE2X2JlX2RlY29kZSIsCiAJCQkgICZkYXRhLCAmc2l6ZSwgJmVycm9ycywgJmZpbmFsKSkKIAlyZXR1cm4gTlVMTDsKLSAgICAvKiBYWFggV2h5IGlzIGNvbnN1bWVkIGluaXRpYWxpemVkIHRvIHNpemU/IG12bCAqLwogICAgIGlmIChzaXplIDwgMCkgewogICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibmVnYXRpdmUgYXJndW1lbnQiKTsKICAgICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgY29uc3VtZWQgPSBzaXplOworICAgIGNvbnN1bWVkID0gc2l6ZTsgLyogVGhpcyBpcyBvdmVyd3JpdHRlbiB1bmxlc3MgZmluYWwgaXMgdHJ1ZS4gKi8KICAgICBkZWNvZGVkID0gUHlVbmljb2RlX0RlY29kZVVURjE2U3RhdGVmdWwoZGF0YSwgc2l6ZSwgZXJyb3JzLAogCSZieXRlb3JkZXIsIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7CiAgICAgaWYgKGRlY29kZWQgPT0gTlVMTCkKQEAgLTQxMywxMiArNDEwLDExIEBACiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0I3x6aWk6dXRmXzE2X2V4X2RlY29kZSIsCiAJCQkgICZkYXRhLCAmc2l6ZSwgJmVycm9ycywgJmJ5dGVvcmRlciwgJmZpbmFsKSkKIAlyZXR1cm4gTlVMTDsKLSAgICAvKiBYWFggV2h5IGlzIGNvbnN1bWVkIGluaXRpYWxpemVkIHRvIHNpemU/IG12bCAqLwogICAgIGlmIChzaXplIDwgMCkgewogCSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5lZ2F0aXZlIGFyZ3VtZW50Iik7CiAJICAgIHJldHVybiAwOwogICAgIH0KLSAgICBjb25zdW1lZCA9IHNpemU7CisgICAgY29uc3VtZWQgPSBzaXplOyAvKiBUaGlzIGlzIG92ZXJ3cml0dGVuIHVubGVzcyBmaW5hbCBpcyB0cnVlLiAqLwogICAgIHVuaWNvZGUgPSBQeVVuaWNvZGVfRGVjb2RlVVRGMTZTdGF0ZWZ1bChkYXRhLCBzaXplLCBlcnJvcnMsICZieXRlb3JkZXIsCiAJCQkJCSAgICBmaW5hbCA/IE5VTEwgOiAmY29uc3VtZWQpOwogICAgIGlmICh1bmljb2RlID09IE5VTEwpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jc3YuYyBiL01vZHVsZXMvX2Nzdi5jCmluZGV4IDQ3MDRjMTYuLmEzNDFlYjQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2Nzdi5jCisrKyBiL01vZHVsZXMvX2Nzdi5jCkBAIC0xMTA0LDYgKzExMDQsOCBAQAogCWNoYXIgKnRlcm1pbmF0b3I7CiAKIAl0ZXJtaW5hdG9yX2xlbiA9IFB5U3RyaW5nX1NpemUoc2VsZi0+ZGlhbGVjdC0+bGluZXRlcm1pbmF0b3IpOworCWlmICh0ZXJtaW5hdG9yX2xlbiA9PSAtMSkKKwkJcmV0dXJuIDA7CiAKIAkvKiBncm93IHJlY29yZCBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCiAJaWYgKCFqb2luX2NoZWNrX3JlY19zaXplKHNlbGYsIHNlbGYtPnJlY19sZW4gKyB0ZXJtaW5hdG9yX2xlbikpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlcy5jIGIvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXMuYwppbmRleCBlNmQ2YWE0Li5lYWEzY2VkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlcy5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzLmMKQEAgLTEyMjMsNiArMTIyMywxOSBAQAogCQkJcmV0dXJuIHZhbHVlOwogCQl9CiAJfQorLyogZnVuY3Rpb24gcG9pbnRlciAqLworCWlmIChDRnVuY1B0ck9iamVjdF9DaGVjayh2YWx1ZSkpIHsKKwkJUHlDQXJnT2JqZWN0ICpwYXJnOworCQlDRnVuY1B0ck9iamVjdCAqZnVuYzsKKwkJZnVuYyA9IChDRnVuY1B0ck9iamVjdCAqKXZhbHVlOworCQlwYXJnID0gbmV3X0NBcmdPYmplY3QoKTsKKwkJcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisJCXBhcmctPnRhZyA9ICdQJzsKKwkJUHlfSU5DUkVGKHZhbHVlKTsKKwkJcGFyZy0+dmFsdWUucCA9ICoodm9pZCAqKilmdW5jLT5iX3B0cjsKKwkJcGFyZy0+b2JqID0gdmFsdWU7CisJCXJldHVybiAoUHlPYmplY3QgKilwYXJnOworCX0KIC8qIGNfY2hhcl9wLCBjX3djaGFyX3AgKi8KIAlzdGdkID0gUHlPYmplY3Rfc3RnZGljdCh2YWx1ZSk7CiAJaWYgKHN0Z2QgJiYgQ0RhdGFPYmplY3RfQ2hlY2sodmFsdWUpICYmIHN0Z2QtPnByb3RvICYmIFB5U3RyaW5nX0NoZWNrKHN0Z2QtPnByb3RvKSkgewpAQCAtMjE3Miw3ICsyMTg1LDcgQEAKIAkJICBvbmx5IGl0J3Mgb2JqZWN0IGxpc3QuICBTbyB3ZSBjcmVhdGUgYSB0dXBsZSwgY29udGFpbmluZwogCQkgIGJfb2JqZWN0cyBsaXN0IFBMVVMgdGhlIGFycmF5IGl0c2VsZiwgYW5kIHJldHVybiB0aGF0IQogCQkqLwotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKE9PKSIsIGtlZXAsIHZhbHVlKTsKKwkJcmV0dXJuIFB5VHVwbGVfUGFjaygyLCBrZWVwLCB2YWx1ZSk7CiAJfQogCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCiAJCSAgICAgImluY29tcGF0aWJsZSB0eXBlcywgJXMgaW5zdGFuY2UgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCkBAIC00NDA1LDYgKzQ0MTgsOCBAQAogCiAJaWYgKFBvaW50ZXJUeXBlT2JqZWN0X0NoZWNrKGFyZykpCiAJCXJldHVybiAxOworCWlmIChDRnVuY1B0clR5cGVPYmplY3RfQ2hlY2soYXJnKSkKKwkJcmV0dXJuIDE7CiAJZGljdCA9IFB5VHlwZV9zdGdkaWN0KGFyZyk7CiAJaWYgKGRpY3QpIHsKIAkJaWYgKFB5U3RyaW5nX0NoZWNrKGRpY3QtPnByb3RvKQpAQCAtNDU2NCw3ICs0NTc5LDcgQEAKICNlbmRpZgogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlVOQ0ZMQUdfQ0RFQ0wiLCBQeUludF9Gcm9tTG9uZyhGVU5DRkxBR19DREVDTCkpOwogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlVOQ0ZMQUdfUFlUSE9OQVBJIiwgUHlJbnRfRnJvbUxvbmcoRlVOQ0ZMQUdfUFlUSE9OQVBJKSk7Ci0JUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobSwgIl9fdmVyc2lvbl9fIiwgIjAuOS45LjQiKTsKKwlQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudChtLCAiX192ZXJzaW9uX18iLCAiMC45LjkuNiIpOwogCiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfbWVtbW92ZV9hZGRyIiwgUHlMb25nX0Zyb21Wb2lkUHRyKG1lbW1vdmUpKTsKIAlQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9tZW1zZXRfYWRkciIsIFB5TG9uZ19Gcm9tVm9pZFB0cihtZW1zZXQpKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzX3Rlc3QuYyBiL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzX3Rlc3QuYwppbmRleCBhZDNiMDQ3Li5iMTBkNmZlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlc190ZXN0LmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXNfdGVzdC5jCkBAIC05Niw2ICs5NiwxMSBAQAogCXJldHVybiBkc3Q7CiB9CiAKK0VYUE9SVCh2b2lkKW15X2ZyZWUodm9pZCAqcHRyKQoreworCWZyZWUocHRyKTsKK30KKwogI2lmZGVmIEhBVkVfV0NIQVJfSAogRVhQT1JUKHdjaGFyX3QgKikgbXlfd2NzZHVwKHdjaGFyX3QgKnNyYykKIHsKQEAgLTE5OSwxMSArMjA0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotRVhQT1JUKHZvaWQpIG15X2ZyZWUodm9pZCAqcCkKLXsKLQlwcmludGYoIm15X2ZyZWUgZ290ICVwXG4iLCBwKTsKLX0KLQogdHlwZWRlZiBzdHJ1Y3QgewogCWNoYXIgKm5hbWU7CiAJY2hhciAqdmFsdWU7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2NvbmZpZ3VyZSBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvY29uZmlndXJlCmluZGV4IGMxZTVjZDQuLjlmZGQ2NTQgMTAwNzU1Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvY29uZmlndXJlCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvY29uZmlndXJlCkBAIC0zMTAsNyArMzEwLDcgQEAKICMgaW5jbHVkZSA8dW5pc3RkLmg+CiAjZW5kaWYiCiAKLWFjX3N1YnN0X3ZhcnM9J1NIRUxMIFBBVEhfU0VQQVJBVE9SIFBBQ0tBR0VfTkFNRSBQQUNLQUdFX1RBUk5BTUUgUEFDS0FHRV9WRVJTSU9OIFBBQ0tBR0VfU1RSSU5HIFBBQ0tBR0VfQlVHUkVQT1JUIGV4ZWNfcHJlZml4IHByZWZpeCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIGJpbmRpciBzYmluZGlyIGxpYmV4ZWNkaXIgZGF0YWRpciBzeXNjb25mZGlyIHNoYXJlZHN0YXRlZGlyIGxvY2Fsc3RhdGVkaXIgbGliZGlyIGluY2x1ZGVkaXIgb2xkaW5jbHVkZWRpciBpbmZvZGlyIG1hbmRpciBidWlsZF9hbGlhcyBob3N0X2FsaWFzIHRhcmdldF9hbGlhcyBERUZTIEVDSE9fQyBFQ0hPX04gRUNIT19UIExJQlMgYnVpbGQgYnVpbGRfY3B1IGJ1aWxkX3ZlbmRvciBidWlsZF9vcyBob3N0IGhvc3RfY3B1IGhvc3RfdmVuZG9yIGhvc3Rfb3MgdGFyZ2V0IHRhcmdldF9jcHUgdGFyZ2V0X3ZlbmRvciB0YXJnZXRfb3MgQ0MgYWNfY3RfQ0MgRVhFRVhUIE9CSkVYVCBDRkxBR1MgQ1BQIENQUEZMQUdTIEVHUkVQIEFMTE9DQSBIQVZFX0xPTkdfRE9VQkxFIFRBUkdFVCBUQVJHRVRESVIgTElCT0JKUyBMVExJQk9CSlMnCithY19zdWJzdF92YXJzPSdTSEVMTCBQQVRIX1NFUEFSQVRPUiBQQUNLQUdFX05BTUUgUEFDS0FHRV9UQVJOQU1FIFBBQ0tBR0VfVkVSU0lPTiBQQUNLQUdFX1NUUklORyBQQUNLQUdFX0JVR1JFUE9SVCBleGVjX3ByZWZpeCBwcmVmaXggcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSBiaW5kaXIgc2JpbmRpciBsaWJleGVjZGlyIGRhdGFkaXIgc3lzY29uZmRpciBzaGFyZWRzdGF0ZWRpciBsb2NhbHN0YXRlZGlyIGxpYmRpciBpbmNsdWRlZGlyIG9sZGluY2x1ZGVkaXIgaW5mb2RpciBtYW5kaXIgYnVpbGRfYWxpYXMgaG9zdF9hbGlhcyB0YXJnZXRfYWxpYXMgREVGUyBFQ0hPX0MgRUNIT19OIEVDSE9fVCBMSUJTIGJ1aWxkIGJ1aWxkX2NwdSBidWlsZF92ZW5kb3IgYnVpbGRfb3MgaG9zdCBob3N0X2NwdSBob3N0X3ZlbmRvciBob3N0X29zIHRhcmdldCB0YXJnZXRfY3B1IHRhcmdldF92ZW5kb3IgdGFyZ2V0X29zIENDIGFjX2N0X0NDIEVYRUVYVCBPQkpFWFQgQ0ZMQUdTIENQUCBDUFBGTEFHUyBFR1JFUCBBTExPQ0EgSEFWRV9MT05HX0RPVUJMRSBUQVJHRVQgVEFSR0VURElSIE1LVEFSR0VUIExJQk9CSlMgTFRMSUJPQkpTJwogYWNfc3Vic3RfZmlsZXM9JycKIAogIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgpAQCAtMzQ4Myw2ICszNDgzLDcgQEAKIAogVEFSR0VURElSPSJ1bmtub3duIgogY2FzZSAiJGhvc3QiIGluCitpKjg2LSotZGFyd2luKikgVEFSR0VUPVg4Nl9EQVJXSU47IFRBUkdFVERJUj14ODY7OwogaSo4Ni0qLWxpbnV4KikgVEFSR0VUPVg4NjsgVEFSR0VURElSPXg4Njs7CiBpKjg2LSotZ251KikgVEFSR0VUPVg4NjsgVEFSR0VURElSPXg4Njs7CiBpKjg2LSotc29sYXJpczIuMVswLTldKikgVEFSR0VUPVg4Nl82NDsgVEFSR0VURElSPXg4Njs7CkBAIC0zNTM0LDYgKzM1MzUsOCBAQAogICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CiBmaQogCitNS1RBUkdFVD0kVEFSR0VUCisKIGNhc2UgeCRUQVJHRVQgaW4KICAgeE1JUFMqKSBUQVJHRVQ9TUlQUyA7OwogICAqKSA7OwpAQCAtNTI0MSw2ICs1MjQ0LDkgQEAKIGVzYWMKIAogCisKKworCiBpZiB0ZXN0IHgkVEFSR0VUID0geFNQQVJDOyB0aGVuCiAgICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGFzc2VtYmxlciBhbmQgbGlua2VyIHN1cHBvcnQgdW5hbGlnbmVkIHBjIHJlbGF0ZWQgcmVsb2NzIiA+JjUKIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgYXNzZW1ibGVyIGFuZCBsaW5rZXIgc3VwcG9ydCB1bmFsaWduZWQgcGMgcmVsYXRlZCByZWxvY3MuLi4gJEVDSE9fQyIgPiY2CkBAIC01NDU3LDYgKzU0NjMsNyBAQAogCiAKIAorCiBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgogI2RlZmluZSBGRklfTk9fUkFXX0FQSSAxCiBfQUNFT0YKQEAgLTU0NjcsNyArNTQ3NCwxNSBAQAogICAgICAgICAgIGFjX2NvbmZpZ19jb21tYW5kcz0iJGFjX2NvbmZpZ19jb21tYW5kcyBzcmMiCiAKIAotICAgICAgICAgIGFjX2NvbmZpZ19saW5rcz0iJGFjX2NvbmZpZ19saW5rcyBpbmNsdWRlL2ZmaXRhcmdldC5oOnNyYy8kVEFSR0VURElSL2ZmaXRhcmdldC5oIgorVEFSR0VUSU5DRElSPSRUQVJHRVRESVIKK2Nhc2UgJGhvc3QgaW4KKyotKi1kYXJ3aW4qKQorICAgVEFSR0VUSU5DRElSPSJkYXJ3aW4iCisgICA7OworZXNhYworCisKKyAgICAgICAgICBhY19jb25maWdfbGlua3M9IiRhY19jb25maWdfbGlua3MgaW5jbHVkZS9mZml0YXJnZXQuaDpzcmMvJFRBUkdFVElOQ0RJUi9mZml0YXJnZXQuaCIKIAogICAgICAgICAgIGFjX2NvbmZpZ19saW5rcz0iJGFjX2NvbmZpZ19saW5rcyBpbmNsdWRlL2ZmaV9jb21tb24uaDppbmNsdWRlL2ZmaV9jb21tb24uaCIKIApAQCAtNjAxNCw3ICs2MDI5LDcgQEAKICAgIyBIYW5kbGluZyBvZiBhcmd1bWVudHMuCiAgICJpbmNsdWRlL2ZmaS5oIiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBpbmNsdWRlL2ZmaS5oIiA7OwogICAiZmZpY29uZmlnLnB5IiApIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBmZmljb25maWcucHkiIDs7Ci0gICJpbmNsdWRlL2ZmaXRhcmdldC5oIiApIENPTkZJR19MSU5LUz0iJENPTkZJR19MSU5LUyBpbmNsdWRlL2ZmaXRhcmdldC5oOnNyYy8kVEFSR0VURElSL2ZmaXRhcmdldC5oIiA7OworICAiaW5jbHVkZS9mZml0YXJnZXQuaCIgKSBDT05GSUdfTElOS1M9IiRDT05GSUdfTElOS1MgaW5jbHVkZS9mZml0YXJnZXQuaDpzcmMvJFRBUkdFVElOQ0RJUi9mZml0YXJnZXQuaCIgOzsKICAgImluY2x1ZGUvZmZpX2NvbW1vbi5oIiApIENPTkZJR19MSU5LUz0iJENPTkZJR19MSU5LUyBpbmNsdWRlL2ZmaV9jb21tb24uaDppbmNsdWRlL2ZmaV9jb21tb24uaCIgOzsKICAgImluY2x1ZGUiICkgQ09ORklHX0NPTU1BTkRTPSIkQ09ORklHX0NPTU1BTkRTIGluY2x1ZGUiIDs7CiAgICJzcmMiICkgQ09ORklHX0NPTU1BTkRTPSIkQ09ORklHX0NPTU1BTkRTIHNyYyIgOzsKQEAgLTYxMjksNiArNjE0NCw3IEBACiBzLEBIQVZFX0xPTkdfRE9VQkxFQCwkSEFWRV9MT05HX0RPVUJMRSw7dCB0CiBzLEBUQVJHRVRALCRUQVJHRVQsO3QgdAogcyxAVEFSR0VURElSQCwkVEFSR0VURElSLDt0IHQKK3MsQE1LVEFSR0VUQCwkTUtUQVJHRVQsO3QgdAogcyxATElCT0JKU0AsJExJQk9CSlMsO3QgdAogcyxATFRMSUJPQkpTQCwkTFRMSUJPQkpTLDt0IHQKIENFT0YKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvY29uZmlndXJlLmFjIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb25maWd1cmUuYWMKaW5kZXggYzdmMDVkNi4uYTBkNzUxMyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb25maWd1cmUuYWMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb25maWd1cmUuYWMKQEAgLTIxLDYgKzIxLDcgQEAKIAogVEFSR0VURElSPSJ1bmtub3duIgogY2FzZSAiJGhvc3QiIGluCitpKjg2LSotZGFyd2luKikgVEFSR0VUPVg4Nl9EQVJXSU47IFRBUkdFVERJUj14ODY7OwogaSo4Ni0qLWxpbnV4KikgVEFSR0VUPVg4NjsgVEFSR0VURElSPXg4Njs7CiBpKjg2LSotZ251KikgVEFSR0VUPVg4NjsgVEFSR0VURElSPXg4Njs7CiBpKjg2LSotc29sYXJpczIuMVtbMC05XV0qKSBUQVJHRVQ9WDg2XzY0OyBUQVJHRVRESVI9eDg2OzsKQEAgLTcwLDYgKzcxLDEyIEBACiAgIEFDX01TR19FUlJPUihbImxpYmZmaSBoYXMgbm90IGJlZW4gcG9ydGVkIHRvICRob3N0LiJdKQogZmkKIAorZG5sICBsaWJmZmkgY2hhbmdlcyBUQVJHRVQgZm9yIE1JUFMgdG8gZGVmaW5lIGEgc3VjaCBtYWNybyBpbiB0aGUgaGVhZGVyCitkbmwgIHdoaWxlIE1JUFNfSVJJWCBvciBNSVBTX0xJTlVYIGlzIHNlcGFyYXRlZGx5IHVzZWQgdG8gZGVjaWRlIHdoaWNoCitkbmwgIGZpbGVzIHdpbGwgYmUgY29tcGlsZWQuICBTbywgd2UgbmVlZCB0byBrZWVwIHRoZSBvcmlnaW5hbCBkZWNpc2lvbgorZG5sICBvZiBUQVJHRVQgdG8gdXNlIGluIGZmaWNvbmZpZy5weS5pbi4KK01LVEFSR0VUPSRUQVJHRVQKKwogY2FzZSB4JFRBUkdFVCBpbgogICB4TUlQUyopIFRBUkdFVD1NSVBTIDs7CiAgICopIDs7CkBAIC05Myw2ICsxMDAsMjQgQEAKIEFDX1NVQlNUKEhBVkVfTE9OR19ET1VCTEUpCiAKIEFDX0NfQklHRU5ESUFOCitBSF9WRVJCQVRJTShbV09SRFNfQklHRU5ESUFOXSwKK1sKKy8qIERlZmluZSB0byAxIGlmIHlvdXIgcHJvY2Vzc29yIHN0b3JlcyB3b3JkcyB3aXRoIHRoZSBtb3N0IHNpZ25pZmljYW50IGJ5dGUKKyAgIGZpcnN0IChsaWtlIE1vdG9yb2xhIGFuZCBTUEFSQywgdW5saWtlIEludGVsIGFuZCBWQVgpLiAKKworICAgVGhlIGJsb2NrIGJlbG93IGRvZXMgY29tcGlsZS10aW1lIGNoZWNraW5nIGZvciBlbmRpYW5uZXNzIG9uIHBsYXRmb3JtcworICAgdGhhdCB1c2UgR0NDIGFuZCB0aGVyZWZvcmUgYWxsb3dzIGNvbXBpbGluZyBmYXQgYmluYXJpZXMgb24gT1NYIGJ5IHVzaW5nCisgICAnLWFyY2ggcHBjIC1hcmNoIGkzODYnIGFzIHRoZSBjb21waWxlIGZsYWdzLiBUaGUgcGhyYXNpbmcgd2FzIGNob29zZW4KKyAgIHN1Y2ggdGhhdCB0aGUgY29uZmlndXJlLXJlc3VsdCBpcyB1c2VkIG9uIHN5c3RlbXMgdGhhdCBkb24ndCB1c2UgR0NDLgorKi8KKyNpZmRlZiBfX0JJR19FTkRJQU5fXworI2RlZmluZSBXT1JEU19CSUdFTkRJQU4gMQorI2Vsc2UKKyNpZm5kZWYgX19MSVRUTEVfRU5ESUFOX18KKyN1bmRlZiBXT1JEU19CSUdFTkRJQU4KKyNlbmRpZgorI2VuZGlmXSkKKwogCiBpZiB0ZXN0IHgkVEFSR0VUID0geFNQQVJDOyB0aGVuCiAgICAgQUNfQ0FDSEVfQ0hFQ0soW2Fzc2VtYmxlciBhbmQgbGlua2VyIHN1cHBvcnQgdW5hbGlnbmVkIHBjIHJlbGF0ZWQgcmVsb2NzXSwKQEAgLTE4Myw2ICsyMDgsNyBAQAogCiBBQ19TVUJTVChUQVJHRVQpCiBBQ19TVUJTVChUQVJHRVRESVIpCitBQ19TVUJTVChNS1RBUkdFVCkKIAogQUNfU1VCU1QoU0hFTEwpCiAKQEAgLTE5NCw3ICsyMjAsMTUgQEAKIHRlc3QgLWQgc3JjLyRUQVJHRVRESVIgfHwgbWtkaXIgc3JjLyRUQVJHRVRESVIKIF0sIFtUQVJHRVRESVI9IiRUQVJHRVRESVIiXSkKIAotQUNfQ09ORklHX0xJTktTKGluY2x1ZGUvZmZpdGFyZ2V0Lmg6c3JjLyRUQVJHRVRESVIvZmZpdGFyZ2V0LmgpCitUQVJHRVRJTkNESVI9JFRBUkdFVERJUgorY2FzZSAkaG9zdCBpbgorKi0qLWRhcndpbiopCisgICBUQVJHRVRJTkNESVI9ImRhcndpbiIKKyAgIDs7Citlc2FjCisKKworQUNfQ09ORklHX0xJTktTKGluY2x1ZGUvZmZpdGFyZ2V0Lmg6c3JjLyRUQVJHRVRJTkNESVIvZmZpdGFyZ2V0LmgpCiBBQ19DT05GSUdfTElOS1MoaW5jbHVkZS9mZmlfY29tbW9uLmg6aW5jbHVkZS9mZmlfY29tbW9uLmgpCiAKIEFDX0NPTkZJR19GSUxFUyhpbmNsdWRlL2ZmaS5oIGZmaWNvbmZpZy5weSkKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvZmZpY29uZmlnLmguaW4gYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2ZmaWNvbmZpZy5oLmluCmluZGV4IDBmZDJkYjUuLmJjYzVhNTggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvZmZpY29uZmlnLmguaW4KKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9mZmljb25maWcuaC5pbgpAQCAtMTE0LDkgKzExNCwyMiBAQAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICovCiAjdW5kZWYgU1REQ19IRUFERVJTCiAKKwogLyogRGVmaW5lIHRvIDEgaWYgeW91ciBwcm9jZXNzb3Igc3RvcmVzIHdvcmRzIHdpdGggdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZQotICAgZmlyc3QgKGxpa2UgTW90b3JvbGEgYW5kIFNQQVJDLCB1bmxpa2UgSW50ZWwgYW5kIFZBWCkuICovCisgICBmaXJzdCAobGlrZSBNb3Rvcm9sYSBhbmQgU1BBUkMsIHVubGlrZSBJbnRlbCBhbmQgVkFYKS4gCisKKyAgIFRoZSBibG9jayBiZWxvdyBkb2VzIGNvbXBpbGUtdGltZSBjaGVja2luZyBmb3IgZW5kaWFubmVzcyBvbiBwbGF0Zm9ybXMKKyAgIHRoYXQgdXNlIEdDQyBhbmQgdGhlcmVmb3JlIGFsbG93cyBjb21waWxpbmcgZmF0IGJpbmFyaWVzIG9uIE9TWCBieSB1c2luZworICAgJy1hcmNoIHBwYyAtYXJjaCBpMzg2JyBhcyB0aGUgY29tcGlsZSBmbGFncy4gVGhlIHBocmFzaW5nIHdhcyBjaG9vc2VuCisgICBzdWNoIHRoYXQgdGhlIGNvbmZpZ3VyZS1yZXN1bHQgaXMgdXNlZCBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3QgdXNlIEdDQy4KKyovCisjaWZkZWYgX19CSUdfRU5ESUFOX18KKyNkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEKKyNlbHNlCisjaWZuZGVmIF9fTElUVExFX0VORElBTl9fCiAjdW5kZWYgV09SRFNfQklHRU5ESUFOCisjZW5kaWYKKyNlbmRpZgogCiAKICNpZmRlZiBIQVZFX0hJRERFTl9WSVNJQklMSVRZX0FUVFJJQlVURQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9mZmljb25maWcucHkuaW4gYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2ZmaWNvbmZpZy5weS5pbgppbmRleCAyZWQyMzQ3Li4zMzY0MDQ5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2ZmaWNvbmZpZy5weS5pbgorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2ZmaWNvbmZpZy5weS5pbgpAQCAtNiw2ICs2LDcgQEAKICAgICAnTUlQU19JUklYJzogWydzcmMvbWlwcy9mZmkuYycsICdzcmMvbWlwcy9vMzIuUycsICdzcmMvbWlwcy9uMzIuUyddLAogICAgICdNSVBTX0xJTlVYJzogWydzcmMvbWlwcy9mZmkuYycsICdzcmMvbWlwcy9vMzIuUyddLAogICAgICdYODYnOiBbJ3NyYy94ODYvZmZpLmMnLCAnc3JjL3g4Ni9zeXN2LlMnXSwKKyAgICAnWDg2X0RBUldJTic6IFsnc3JjL3g4Ni9mZmlfZGFyd2luLmMnLCAnc3JjL3g4Ni9kYXJ3aW4uUyddLAogICAgICdYODZfV0lOMzInOiBbJ3NyYy94ODYvZmZpLmMnLCAnc3JjL3g4Ni93aW4zMi5TJ10sCiAgICAgJ1NQQVJDJzogWydzcmMvc3BhcmMvZmZpLmMnLCAnc3JjL3NwYXJjL3Y4LlMnLCAnc3JjL3NwYXJjL3Y5LlMnXSwKICAgICAnQUxQSEEnOiBbJ3NyYy9hbHBoYS9mZmkuYycsICdzcmMvYWxwaGEvb3NmLlMnXSwKQEAgLTI2LDEwICsyNywyMiBAQAogICAgICdQQSc6IFsnc3JjL3BhL2xpbnV4LlMnLCAnc3JjL3BhL2ZmaS5jJ10sCiB9CiAKKyMgQnVpbGQgYWxsIGRhcndpbiByZWxhdGVkIGZpbGVzIG9uIGFsbCBzdXBwb3J0ZWQgZGFyd2luIGFyY2hpdGVjdHVyZXMsIHRoaXMKKyMgbWFrZXMgaXQgZWFzaWVyIHRvIGJ1aWxkIHVuaXZlcnNhbCBiaW5hcmllcy4KK2lmIDE6CisgICAgYWxsX2RhcndpbiA9ICgnWDg2X0RBUldJTicsICdQT1dFUlBDX0RBUldJTicpCisgICAgYWxsX2Rhcndpbl9maWxlcyA9IFtdCisgICAgZm9yIHBuIGluIGFsbF9kYXJ3aW46CisgICAgICAgIGFsbF9kYXJ3aW5fZmlsZXMuZXh0ZW5kKGZmaV9wbGF0Zm9ybXNbcG5dKQorICAgIGZvciBwbiBpbiBhbGxfZGFyd2luOgorICAgICAgICBmZmlfcGxhdGZvcm1zW3BuXSA9IGFsbF9kYXJ3aW5fZmlsZXMKKyAgICBkZWwgYWxsX2RhcndpbiwgYWxsX2Rhcndpbl9maWxlcywgcG4KKwogZmZpX3NyY2RpciA9ICdAc3JjZGlyQCcKLWZmaV9zb3VyY2VzICs9IGZmaV9wbGF0Zm9ybXNbJ0BUQVJHRVRAJ10KK2ZmaV9zb3VyY2VzICs9IGZmaV9wbGF0Zm9ybXNbJ0BNS1RBUkdFVEAnXQogZmZpX3NvdXJjZXMgPSBbb3MucGF0aC5qb2luKCdAc3JjZGlyQCcsIGYpIGZvciBmIGluIGZmaV9zb3VyY2VzXQogCiBmZmlfY2ZsYWdzID0gJ0BDRkxBR1NAJworIyBJIHRoaW5rIHRoaXMgbWF5IG5vIGxvbmdlciBiZSBuZWVkZWQ6CiBpZiBzeXMucGxhdGZvcm0gPT0gIm9wZW5ic2QzIjoKICAgICBmZmlfY2ZsYWdzICs9ICIgLWZuby1zdGFjay1wcm90ZWN0b3IiCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9kYXJ3aW4vZmZpdGFyZ2V0LmggYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9kYXJ3aW4vZmZpdGFyZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjMzA4YQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL2Rhcndpbi9mZml0YXJnZXQuaApAQCAtMCwwICsxLDI1IEBACisvKgorICogVGhpcyBmaWxlIGlzIGZvciBNYWNPU1ggb25seS4gRGlzcGF0Y2ggdG8gdGhlIHJpZ2h0IGFyY2hpdGVjdHVyZSBpbmNsdWRlCisgKiBmaWxlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGFyY2hpY3RlY3R1cmUgKGluc3RlYWQgb2YgcmVseWluZyBvbiBhIHN5bWxpbmsKKyAqIGNyZWF0ZWQgYnkgY29uZmlndXJlKS4gVGhpcyBtYWtlcyBpcyBwb3NzaWJsZSB0byBidWlsZCBhIHVuaXZlcmFsIGJpbmFyeQorICogb2YgY3R5cGVzIGluIG9uZSBnby4KKyAqLworI2lmIGRlZmluZWQoX19pMzg2X18pCisKKyNpZm5kZWYgWDg2X0RBUldJTgorI2RlZmluZSBYODZfREFSV0lOCisjZW5kaWYKKyN1bmRlZiBQT1dFUlBDX0RBUldJTgorCisjaW5jbHVkZSAiLi4vc3JjL3g4Ni9mZml0YXJnZXQuaCIKKworI2VsaWYgZGVmaW5lZChfX3BwY19fKQorCisjaWZuZGVmIFBPV0VSUENfREFSV0lOCisjZGVmaW5lIFBPV0VSUENfREFSV0lOCisjZW5kaWYKKyN1bmRlZiBYODZfREFSV0lOCisKKyNpbmNsdWRlICIuLi9zcmMvcG93ZXJwYy9mZml0YXJnZXQuaCIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2Rhcndpbi5TIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcG93ZXJwYy9kYXJ3aW4uUwppbmRleCBkOGExZGY1Li45MTdkYzkzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2Rhcndpbi5TCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvZGFyd2luLlMKQEAgLTEsMyArMSw0IEBACisjaWZkZWYgX19wcGNfXwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGRhcndpbi5TIC0gQ29weXJpZ2h0IChjKSAyMDAwIEpvaG4gSG9ybmt2aXN0CiAJICAgICAgQ29weXJpZ2h0IChjKSAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgpAQCAtMjQzLDMgKzI0NCw0IEBACiAJLmFsaWduIExPRzJfR1BSX0JZVEVTCiBMTEZCMCRub25fbGF6eV9wdHI6CiAJLmdfbG9uZyBMRkIwCisjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvZGFyd2luX2Nsb3N1cmUuUyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvZGFyd2luX2Nsb3N1cmUuUwppbmRleCA2ZDlhMzY0Li43MTA1NGY1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2Rhcndpbl9jbG9zdXJlLlMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcG93ZXJwYy9kYXJ3aW5fY2xvc3VyZS5TCkBAIC0xLDMgKzEsNCBAQAorI2lmZGVmIF9fcHBjX18KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBkYXJ3aW5fY2xvc3VyZS5TIC0gQ29weXJpZ2h0IChjKSAyMDAyLCAyMDAzLCAyMDA0LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCiAgICBJbmMuIGJhc2VkIG9uIHBwY19jbG9zdXJlLlMKQEAgLTMxNSwzICszMTYsNCBAQAogCS5hbGlnbiBMT0cyX0dQUl9CWVRFUwogTExGQjEkbm9uX2xhenlfcHRyOgogCS5nX2xvbmcgTEZCMQorI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wb3dlcnBjL2ZmaV9kYXJ3aW4uYyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvZmZpX2Rhcndpbi5jCmluZGV4IGQ3NThmOGYuLjE1OTViMDAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvZmZpX2Rhcndpbi5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3Bvd2VycGMvZmZpX2Rhcndpbi5jCkBAIC0xLDMgKzEsNCBAQAorI2lmZGVmIF9fcHBjX18KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmZmkuYyAtIENvcHlyaWdodCAoYykgMTk5OCBHZW9mZnJleSBLZWF0aW5nCiAKQEAgLTM4MCwxOCArMzgxLDE4IEBACiBleHRlcm4gdm9pZCBmZmlfY2FsbF9BSVgoLypAb3V0QCovIGV4dGVuZGVkX2NpZiAqLAogCQkJIHVuc2lnbmVkLCB1bnNpZ25lZCwKIAkJCSAvKkBvdXRAKi8gdW5zaWduZWQgKiwKLQkJCSB2b2lkICgqZm4pKCksCi0JCQkgdm9pZCAoKmZuMikoKSk7CisJCQkgdm9pZCAoKmZuKSh2b2lkKSwKKwkJCSB2b2lkICgqZm4yKShleHRlbmRlZF9jaWYgKiwgdW5zaWduZWQgKmNvbnN0KSk7CiBleHRlcm4gdm9pZCBmZmlfY2FsbF9EQVJXSU4oLypAb3V0QCovIGV4dGVuZGVkX2NpZiAqLAogCQkJICAgIHVuc2lnbmVkLCB1bnNpZ25lZCwKIAkJCSAgICAvKkBvdXRAKi8gdW5zaWduZWQgKiwKLQkJCSAgICB2b2lkICgqZm4pKCksCi0JCQkgICAgdm9pZCAoKmZuMikoKSk7CisJCQkgICAgdm9pZCAoKmZuKSh2b2lkKSwKKwkJCSAgICB2b2lkICgqZm4yKShleHRlbmRlZF9jaWYgKiwgdW5zaWduZWQgKmNvbnN0KSk7CiAvKkA9ZGVjbHVuZGVmQCovCiAvKkA9ZXhwb3J0aGVhZGVyQCovCiAKIHZvaWQgZmZpX2NhbGwoLypAZGVwZW5kZW50QCovIGZmaV9jaWYgKmNpZiwKLQkgICAgICB2b2lkICgqZm4pKCksCisJICAgICAgdm9pZCAoKmZuKSh2b2lkKSwKIAkgICAgICAvKkBvdXRAKi8gdm9pZCAqcnZhbHVlLAogCSAgICAgIC8qQGRlcGVuZGVudEAqLyB2b2lkICoqYXZhbHVlKQogewpAQCAtNzY3LDMgKzc2OCw0IEBACiAgIC8qIFRlbGwgZmZpX2Nsb3N1cmVfQVNNIHRvIHBlcmZvcm0gcmV0dXJuIHR5cGUgcHJvbW90aW9ucy4gICovCiAgIHJldHVybiBjaWYtPnJ0eXBlLT50eXBlOwogfQorI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wcmVwX2NpZi5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMvcHJlcF9jaWYuYwppbmRleCAwZmFhNWRkLi4yZGI2NWNlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy9wcmVwX2NpZi5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3ByZXBfY2lmLmMKQEAgLTU1LDExICs1NSwyOSBAQAogICAgICAgLyogUGVyZm9ybSBhIHNhbml0eSBjaGVjayBvbiB0aGUgYXJndW1lbnQgdHlwZSAqLwogICAgICAgRkZJX0FTU0VSVF9WQUxJRF9UWVBFKCpwdHIpOwogCisjaWZkZWYgUE9XRVJQQ19EQVJXSU4KKyAgICAgIHsKKwkgICAgICBpbnQgY3VyYWxpZ247CisKKwkgICAgICBjdXJhbGlnbiA9ICgqcHRyKS0+YWxpZ25tZW50OworCSAgICAgIGlmIChwdHIgIT0gJihhcmctPmVsZW1lbnRzWzBdKSkgeworCQkgICAgICBpZiAoY3VyYWxpZ24gPiA0ICYmIGN1cmFsaWduICE9IDE2KSB7CisJCQkgICAgICBjdXJhbGlnbiA9IDQ7CisJCSAgICAgIH0KKwkgICAgICB9CisgICAgICBhcmctPnNpemUgPSBBTElHTihhcmctPnNpemUsIGN1cmFsaWduKTsKKyAgICAgIGFyZy0+c2l6ZSArPSAoKnB0ciktPnNpemU7CisKKyAgICAgIGFyZy0+YWxpZ25tZW50ID0gKGFyZy0+YWxpZ25tZW50ID4gY3VyYWxpZ24pID8gCisJICAgICAgYXJnLT5hbGlnbm1lbnQgOiBjdXJhbGlnbjsKKyAgICAgIH0KKyNlbHNlCiAgICAgICBhcmctPnNpemUgPSBBTElHTihhcmctPnNpemUsICgqcHRyKS0+YWxpZ25tZW50KTsKICAgICAgIGFyZy0+c2l6ZSArPSAoKnB0ciktPnNpemU7CiAKICAgICAgIGFyZy0+YWxpZ25tZW50ID0gKGFyZy0+YWxpZ25tZW50ID4gKCpwdHIpLT5hbGlnbm1lbnQpID8gCiAJYXJnLT5hbGlnbm1lbnQgOiAoKnB0ciktPmFsaWdubWVudDsKKyNlbmRpZgogCiAgICAgICBwdHIrKzsKICAgICB9CkBAIC04OSw2ICsxMDcsMTkgQEAKIC8qIFBlcmZvcm0gbWFjaGluZSBpbmRlcGVuZGVudCBmZmlfY2lmIHByZXBhcmF0aW9uLCB0aGVuIGNhbGwKICAgIG1hY2hpbmUgZGVwZW5kZW50IHJvdXRpbmUuICovCiAKKyNpZmRlZiBYODZfREFSV0lOCitzdGF0aWMgaW5saW5lIGludCBzdHJ1Y3Rfb25fc3RhY2soaW50IHNpemUpCit7CisJaWYgKHNpemUgPiA4KSByZXR1cm4gMTsKKwkvKiBUaGlzIGlzIG5vdCB3aGF0IHRoZSBBQkkgc2F5cywgYnV0IGlzIHdoYXQgaXMgcmVhbGx5IGltcGxlbWVudGVkICovCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSAxOiBjYXNlIDI6IGNhc2UgNDogY2FzZSA4OiByZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworCiBmZmlfc3RhdHVzIGZmaV9wcmVwX2NpZigvKkBvdXRAKi8gLypAcGFydGlhbEAqLyBmZmlfY2lmICpjaWYsIAogCQkJZmZpX2FiaSBhYmksIHVuc2lnbmVkIGludCBuYXJncywgCiAJCQkvKkBkZXBlbmRlbnRAKi8gLypAb3V0QCovIC8qQHBhcnRpYWxAKi8gZmZpX3R5cGUgKnJ0eXBlLCAKQEAgLTEyNCw2ICsxNTUsMTAgQEAKICNpZmRlZiBTUEFSQwogICAgICAgJiYgKGNpZi0+YWJpICE9IEZGSV9WOSB8fCBjaWYtPnJ0eXBlLT5zaXplID4gMzIpCiAjZW5kaWYKKyNpZmRlZiBYODZfREFSV0lOCisKKyAgICAgICYmIChzdHJ1Y3Rfb25fc3RhY2soY2lmLT5ydHlwZS0+c2l6ZSkpCisjZW5kaWYKICAgICAgICkKICAgICBieXRlcyA9IFNUQUNLX0FSR19TSVpFKHNpemVvZih2b2lkKikpOwogI2VuZGlmCkBAIC0xMzksNyArMTc0LDE2IEBACiAJIGNoZWNrIGFmdGVyIHRoZSBpbml0aWFsaXphdGlvbi4gICovCiAgICAgICBGRklfQVNTRVJUX1ZBTElEX1RZUEUoKnB0cik7CiAKLSNpZiAhZGVmaW5lZCBfX3g4Nl82NF9fICYmICFkZWZpbmVkIFMzOTAgJiYgIWRlZmluZWQgUEEKKyNpZiBkZWZpbmVkKFg4Nl9EQVJXSU4pCisgICAgICB7CisJICAgICAgaW50IGFsaWduID0gKCpwdHIpLT5hbGlnbm1lbnQ7CisJICAgICAgaWYgKGFsaWduID4gNCkgYWxpZ24gPSA0OworCSAgICAgIGlmICgoYWxpZ24gLSAxKSAmIGJ5dGVzKQorCQkgYnl0ZXMgPSBBTElHTihieXRlcywgYWxpZ24pOworCSAgICAgIGJ5dGVzICs9IFNUQUNLX0FSR19TSVpFKCgqcHRyKS0+c2l6ZSk7CisgICAgICB9CisKKyNlbGlmICFkZWZpbmVkIF9feDg2XzY0X18gJiYgIWRlZmluZWQgUzM5MCAmJiAhZGVmaW5lZCBQQQogI2lmZGVmIFNQQVJDCiAgICAgICBpZiAoKCgqcHRyKS0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QKIAkgICAmJiAoKCpwdHIpLT5zaXplID4gMTYgfHwgY2lmLT5hYmkgIT0gRkZJX1Y5KSkKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3g4Ni9kYXJ3aW4uUyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3g4Ni9kYXJ3aW4uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWU1NWI1Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMveDg2L2Rhcndpbi5TCkBAIC0wLDAgKzEsMTk1IEBACisjaWZkZWYgX19pMzg2X18KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBkYXJ3aW4uUyAtIENvcHlyaWdodCAoYykgMTk5NiwgMTk5OCwgMjAwMSwgMjAwMiwgMjAwMyAgUmVkIEhhdCwgSW5jLgorICAgCisgICBYODYgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UgCisKKyAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICAgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgICBgYFNvZnR3YXJlJycpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAgIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAgIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICAgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICAgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICAgSU4gTk8gRVZFTlQgU0hBTEwgQ1lHTlVTIFNPTFVUSU9OUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICAgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgICBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgIAorLyoKKyAqIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiBzeXN2LlMgYW5kIHRoZW4gaGFja2VkIHVwIGJ5IFJvbmFsZCB3aG8gaGFzbid0IGRvbmUKKyAqIGFzc2VtYmx5IHByb2dyYW1taW5nIGluIDggeWVhcnMuCisgKi8KKworI2lmbmRlZiBfX3g4Nl82NF9fCisKKyNkZWZpbmUgTElCRkZJX0FTTQkKKyNpbmNsdWRlIDxmZmljb25maWcuaD4KKyNpbmNsdWRlIDxmZmkuaD4KKworLnRleHQKKworLmdsb2JsIF9mZmlfcHJlcF9hcmdzCisKKy5hbGlnbiA0CisuZ2xvYmwgX2ZmaV9jYWxsX1NZU1YKKworX2ZmaV9jYWxsX1NZU1Y6CisuTEZCMToKKyAgICAgICAgcHVzaGwgJWVicAorLkxDRkkwOgorICAgICAgICBtb3ZsICAlZXNwLCVlYnAKKy5MQ0ZJMToKKwkvKiBNYWtlIHJvb20gZm9yIGFsbCBvZiB0aGUgbmV3IGFyZ3MuICAqLworCW1vdmwgIDE2KCVlYnApLCVlY3gKKwlzdWJsICAlZWN4LCVlc3AKKworCW1vdmwgICVlc3AsJWVheAorCisJLyogUGxhY2UgYWxsIG9mIHRoZSBmZmlfcHJlcF9hcmdzIGluIHBvc2l0aW9uICAqLworCXB1c2hsIDEyKCVlYnApCisJcHVzaGwgJWVheAorCWNhbGwgICo4KCVlYnApCisKKwkvKiBSZXR1cm4gc3RhY2sgdG8gcHJldmlvdXMgc3RhdGUgYW5kIGNhbGwgdGhlIGZ1bmN0aW9uICAqLworCWFkZGwgICQ4LCVlc3AJCisKKwljYWxsICAqMjgoJWVicCkKKworCS8qIFJlbW92ZSB0aGUgc3BhY2Ugd2UgcHVzaGVkIGZvciB0aGUgYXJncyAgKi8KKwltb3ZsICAxNiglZWJwKSwlZWN4CisJYWRkbCAgJWVjeCwlZXNwCisKKwkvKiBMb2FkICVlY3ggd2l0aCB0aGUgcmV0dXJuIHR5cGUgY29kZSAgKi8KKwltb3ZsICAyMCglZWJwKSwlZWN4CQorCisJLyogSWYgdGhlIHJldHVybiB2YWx1ZSBwb2ludGVyIGlzIE5VTEwsIGFzc3VtZSBubyByZXR1cm4gdmFsdWUuICAqLworCWNtcGwgICQwLDI0KCVlYnApCisJam5lICAgcmV0aW50CisKKwkvKiBFdmVuIGlmIHRoZXJlIGlzIG5vIHNwYWNlIGZvciB0aGUgcmV0dXJuIHZhbHVlLCB3ZSBhcmUgCisJICAgb2JsaWdlZCB0byBoYW5kbGUgZmxvYXRpbmctcG9pbnQgdmFsdWVzLiAgKi8KKwljbXBsICAkRkZJX1RZUEVfRkxPQVQsJWVjeAorCWpuZSAgIG5vcmV0dmFsCisJZnN0cCAgJXN0KDApCisKKyAgICAgICAgam1wICAgZXBpbG9ndWUKKworcmV0aW50OgorCWNtcGwgICRGRklfVFlQRV9JTlQsJWVjeAorCWpuZSAgIHJldGZsb2F0CisJLyogTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZSAgKi8KKwltb3ZsICAyNCglZWJwKSwlZWN4CQorCW1vdmwgICVlYXgsMCglZWN4KQorCWptcCAgIGVwaWxvZ3VlCisKK3JldGZsb2F0OgorCWNtcGwgICRGRklfVFlQRV9GTE9BVCwlZWN4CisJam5lICAgcmV0ZG91YmxlCisJLyogTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZSAgKi8KKwltb3ZsICAyNCglZWJwKSwlZWN4CQorCWZzdHBzICglZWN4KQorCWptcCAgIGVwaWxvZ3VlCisKK3JldGRvdWJsZToKKwljbXBsICAkRkZJX1RZUEVfRE9VQkxFLCVlY3gKKwlqbmUgICByZXRsb25nZG91YmxlCisJLyogTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZSAgKi8KKwltb3ZsICAyNCglZWJwKSwlZWN4CQorCWZzdHBsICglZWN4KQorCWptcCAgIGVwaWxvZ3VlCisKK3JldGxvbmdkb3VibGU6CisJY21wbCAgJEZGSV9UWVBFX0xPTkdET1VCTEUsJWVjeAorCWpuZSAgIHJldGludDY0CisJLyogTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZSAgKi8KKwltb3ZsICAyNCglZWJwKSwlZWN4CQorCWZzdHB0ICglZWN4KQorCWptcCAgIGVwaWxvZ3VlCisJCityZXRpbnQ2NDoJCisJY21wbCAgJEZGSV9UWVBFX1NJTlQ2NCwlZWN4CisgICAgICAgIGpuZSAgIHJldHN0cnVjdAorCS8qIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUgICovCisJbW92bCAgMjQoJWVicCksJWVjeAkKKwltb3ZsICAlZWF4LDAoJWVjeCkKKwltb3ZsICAlZWR4LDQoJWVjeCkKKwkKK3JldHN0cnVjdDoKKwkvKiBOb3RoaW5nIHRvIGRvISAgKi8KKworbm9yZXR2YWw6CitlcGlsb2d1ZToKKyAgICAgICAgbW92bCAlZWJwLCVlc3AKKyAgICAgICAgcG9wbCAlZWJwCisgICAgICAgIHJldAorLkxGRTE6CisuZmZpX2NhbGxfU1lTVl9lbmQ6CisjaWYgMAorICAgICAgICAuc2l6ZSAgICBmZmlfY2FsbF9TWVNWLC5mZmlfY2FsbF9TWVNWX2VuZC1mZmlfY2FsbF9TWVNWCisjZW5kaWYKKworI2lmIDAKKwkuc2VjdGlvbgkuZWhfZnJhbWUsRUhfRlJBTUVfRkxBR1MsQHByb2diaXRzCisuTGZyYW1lMToKKwkubG9uZwkuTEVDSUUxLS5MU0NJRTEJLyogTGVuZ3RoIG9mIENvbW1vbiBJbmZvcm1hdGlvbiBFbnRyeSAqLworLkxTQ0lFMToKKwkubG9uZwkweDAJLyogQ0lFIElkZW50aWZpZXIgVGFnICovCisJLmJ5dGUJMHgxCS8qIENJRSBWZXJzaW9uICovCisjaWZkZWYgX19QSUNfXworCS5hc2NpaSAielJcMCIJLyogQ0lFIEF1Z21lbnRhdGlvbiAqLworI2Vsc2UKKwkuYXNjaWkgIlwwIgkvKiBDSUUgQXVnbWVudGF0aW9uICovCisjZW5kaWYKKwkuYnl0ZQkweDEJLyogLnVsZWIxMjggMHgxOyBDSUUgQ29kZSBBbGlnbm1lbnQgRmFjdG9yICovCisJLmJ5dGUJMHg3YwkvKiAuc2xlYjEyOCAtNDsgQ0lFIERhdGEgQWxpZ25tZW50IEZhY3RvciAqLworCS5ieXRlCTB4OAkvKiBDSUUgUkEgQ29sdW1uICovCisjaWZkZWYgX19QSUNfXworCS5ieXRlCTB4MQkvKiAudWxlYjEyOCAweDE7IEF1Z21lbnRhdGlvbiBzaXplICovCisJLmJ5dGUJMHgxYgkvKiBGREUgRW5jb2RpbmcgKHBjcmVsIHNkYXRhNCkgKi8KKyNlbmRpZgorCS5ieXRlCTB4YwkvKiBEV19DRkFfZGVmX2NmYSAqLworCS5ieXRlCTB4NAkvKiAudWxlYjEyOCAweDQgKi8KKwkuYnl0ZQkweDQJLyogLnVsZWIxMjggMHg0ICovCisJLmJ5dGUJMHg4OAkvKiBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHg4ICovCisJLmJ5dGUJMHgxCS8qIC51bGViMTI4IDB4MSAqLworCS5hbGlnbiA0CisuTEVDSUUxOgorLkxTRkRFMToKKwkubG9uZwkuTEVGREUxLS5MQVNGREUxCS8qIEZERSBMZW5ndGggKi8KKy5MQVNGREUxOgorCS5sb25nCS5MQVNGREUxLS5MZnJhbWUxCS8qIEZERSBDSUUgb2Zmc2V0ICovCisjaWZkZWYgX19QSUNfXworCS5sb25nCS5MRkIxLS4JLyogRkRFIGluaXRpYWwgbG9jYXRpb24gKi8KKyNlbHNlCisJLmxvbmcJLkxGQjEJLyogRkRFIGluaXRpYWwgbG9jYXRpb24gKi8KKyNlbmRpZgorCS5sb25nCS5MRkUxLS5MRkIxCS8qIEZERSBhZGRyZXNzIHJhbmdlICovCisjaWZkZWYgX19QSUNfXworCS5ieXRlCTB4MAkvKiAudWxlYjEyOCAweDA7IEF1Z21lbnRhdGlvbiBzaXplICovCisjZW5kaWYKKwkuYnl0ZQkweDQJLyogRFdfQ0ZBX2FkdmFuY2VfbG9jNCAqLworCS5sb25nCS5MQ0ZJMC0uTEZCMQorCS5ieXRlCTB4ZQkvKiBEV19DRkFfZGVmX2NmYV9vZmZzZXQgKi8KKwkuYnl0ZQkweDgJLyogLnVsZWIxMjggMHg4ICovCisJLmJ5dGUJMHg4NQkvKiBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHg1ICovCisJLmJ5dGUJMHgyCS8qIC51bGViMTI4IDB4MiAqLworCS5ieXRlCTB4NAkvKiBEV19DRkFfYWR2YW5jZV9sb2M0ICovCisJLmxvbmcJLkxDRkkxLS5MQ0ZJMAorCS5ieXRlCTB4ZAkvKiBEV19DRkFfZGVmX2NmYV9yZWdpc3RlciAqLworCS5ieXRlCTB4NQkvKiAudWxlYjEyOCAweDUgKi8KKwkuYWxpZ24gNAorLkxFRkRFMToKKyNlbmRpZgorCisjZW5kaWYgLyogaWZuZGVmIF9feDg2XzY0X18gKi8KKworI2VuZGlmIC8qIGRlZmluZWQgX19pMzg2X18gKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3g4Ni9mZmlfZGFyd2luLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvZmZpX2Rhcndpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmODJiM2EKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvZmZpX2Rhcndpbi5jCkBAIC0wLDAgKzEsNjEwIEBACisjIGlmZGVmIF9faTM4Nl9fCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgZmZpLmMgLSBDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTgsIDE5OTksIDIwMDEgIFJlZCBIYXQsIEluYy4KKyAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDAyICBSYW5qaXQgTWF0aGV3CisgICAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMiAgQm8gVGhvcnNlbgorICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDIgIFJvZ2VyIFNheWxlCisgICAKKyAgIHg4NiBGb3JlaWduIEZ1bmN0aW9uIEludGVyZmFjZSAKKworICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgICBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBDWUdOVVMgU09MVVRJT05TIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgICBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAgIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBfX3g4Nl82NF9fCisKKyNpbmNsdWRlIDxmZmkuaD4KKyNpbmNsdWRlIDxmZmlfY29tbW9uLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyogZmZpX3ByZXBfYXJncyBpcyBjYWxsZWQgYnkgdGhlIGFzc2VtYmx5IHJvdXRpbmUgb25jZSBzdGFjayBzcGFjZQorICAgaGFzIGJlZW4gYWxsb2NhdGVkIGZvciB0aGUgZnVuY3Rpb24ncyBhcmd1bWVudHMgKi8KKworLypALWV4cG9ydGhlYWRlckAqLwordm9pZCBmZmlfcHJlcF9hcmdzKGNoYXIgKnN0YWNrLCBleHRlbmRlZF9jaWYgKmVjaWYpOworCitzdGF0aWMgaW5saW5lIGludCByZXR2YWxfb25fc3RhY2soZmZpX3R5cGUqIHRwKQoreworCWlmICh0cC0+dHlwZSA9PSBGRklfVFlQRV9TVFJVQ1QpIHsKKwkJaW50IHN6ID0gdHAtPnNpemU7CisJCWlmIChzeiA+IDgpIHsKKwkJCXJldHVybiAxOworCQl9CisJCXN3aXRjaCAoc3opIHsKKwkJY2FzZSAxOiBjYXNlIDI6IGNhc2UgNDogY2FzZSA4OiByZXR1cm4gMDsKKwkJZGVmYXVsdDogcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBmZmlfcHJlcF9hcmdzKGNoYXIgKnN0YWNrLCBleHRlbmRlZF9jaWYgKmVjaWYpCisvKkA9ZXhwb3J0aGVhZGVyQCovCit7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOworICByZWdpc3RlciB2b2lkICoqcF9hcmd2OworICByZWdpc3RlciBjaGFyICphcmdwOworICByZWdpc3RlciBmZmlfdHlwZSAqKnBfYXJnOworCisgIGFyZ3AgPSBzdGFjazsKKworICBpZiAocmV0dmFsX29uX3N0YWNrKGVjaWYtPmNpZi0+cnR5cGUpKSB7CisgICAgICAqKHZvaWQgKiopIGFyZ3AgPSBlY2lmLT5ydmFsdWU7CisgICAgICBhcmdwICs9IDQ7CisgIH0KKworCisgIHBfYXJndiA9IGVjaWYtPmF2YWx1ZTsKKworICBmb3IgKGkgPSBlY2lmLT5jaWYtPm5hcmdzLCBwX2FyZyA9IGVjaWYtPmNpZi0+YXJnX3R5cGVzOworICAgICAgIGkgIT0gMDsKKyAgICAgICBpLS0sIHBfYXJnKyspCisgICAgeworICAgICAgc2l6ZV90IHo7CisKKyAgICAgIC8qIEFsaWduIGlmIG5lY2Vzc2FyeSAqLworICAgICAgaWYgKChzaXplb2YoaW50KSAtIDEpICYgKHVuc2lnbmVkKSBhcmdwKQorCSAgICAgIGFyZ3AgPSAoY2hhciAqKSBBTElHTihhcmdwLCBzaXplb2YoaW50KSk7CisKKyAgICAgIHogPSAoKnBfYXJnKS0+c2l6ZTsKKyAgICAgIGlmICh6IDwgc2l6ZW9mKGludCkpCisJeworCSAgeiA9IHNpemVvZihpbnQpOworCSAgc3dpdGNoICgoKnBfYXJnKS0+dHlwZSkKKwkgICAgeworCSAgICBjYXNlIEZGSV9UWVBFX1NJTlQ4OgorCSAgICAgICooc2lnbmVkIGludCAqKSBhcmdwID0gKHNpZ25lZCBpbnQpKihTSU5UOCAqKSgqIHBfYXJndik7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBGRklfVFlQRV9VSU5UODoKKwkgICAgICAqKHVuc2lnbmVkIGludCAqKSBhcmdwID0gKHVuc2lnbmVkIGludCkqKFVJTlQ4ICopKCogcF9hcmd2KTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIEZGSV9UWVBFX1NJTlQxNjoKKwkgICAgICAqKHNpZ25lZCBpbnQgKikgYXJncCA9IChzaWduZWQgaW50KSooU0lOVDE2ICopKCogcF9hcmd2KTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlIEZGSV9UWVBFX1VJTlQxNjoKKwkgICAgICAqKHVuc2lnbmVkIGludCAqKSBhcmdwID0gKHVuc2lnbmVkIGludCkqKFVJTlQxNiAqKSgqIHBfYXJndik7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBGRklfVFlQRV9TSU5UMzI6CisJICAgICAgKihzaWduZWQgaW50ICopIGFyZ3AgPSAoc2lnbmVkIGludCkqKFNJTlQzMiAqKSgqIHBfYXJndik7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBGRklfVFlQRV9VSU5UMzI6CisJICAgICAgKih1bnNpZ25lZCBpbnQgKikgYXJncCA9ICh1bnNpZ25lZCBpbnQpKihVSU5UMzIgKikoKiBwX2FyZ3YpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgorCSAgICAgICoodW5zaWduZWQgaW50ICopIGFyZ3AgPSAodW5zaWduZWQgaW50KSooVUlOVDMyICopKCogcF9hcmd2KTsKKwkgICAgICBicmVhazsKKworCSAgICBkZWZhdWx0OgorCSAgICAgIEZGSV9BU1NFUlQoMCk7CisJICAgIH0KKwl9CisgICAgICBlbHNlCisJeworCSAgbWVtY3B5KGFyZ3AsICpwX2FyZ3YsIHopOworCX0KKyAgICAgIHBfYXJndisrOworICAgICAgYXJncCArPSB6OworICAgIH0KKyAgCisgIHJldHVybjsKK30KKworLyogUGVyZm9ybSBtYWNoaW5lIGRlcGVuZGVudCBjaWYgcHJvY2Vzc2luZyAqLworZmZpX3N0YXR1cyBmZmlfcHJlcF9jaWZfbWFjaGRlcChmZmlfY2lmICpjaWYpCit7CisgIC8qIFNldCB0aGUgcmV0dXJuIHR5cGUgZmxhZyAqLworICBzd2l0Y2ggKGNpZi0+cnR5cGUtPnR5cGUpCisgICAgeworICAgIGNhc2UgRkZJX1RZUEVfVk9JRDoKKyNpZiAhZGVmaW5lZChYODZfV0lOMzIpIAorICAgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgorI2VuZGlmCisgICAgY2FzZSBGRklfVFlQRV9TSU5UNjQ6CisgICAgY2FzZSBGRklfVFlQRV9GTE9BVDoKKyAgICBjYXNlIEZGSV9UWVBFX0RPVUJMRToKKyAgICBjYXNlIEZGSV9UWVBFX0xPTkdET1VCTEU6CisgICAgICBjaWYtPmZsYWdzID0gKHVuc2lnbmVkKSBjaWYtPnJ0eXBlLT50eXBlOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZGSV9UWVBFX1VJTlQ2NDoKKyAgICAgIGNpZi0+ZmxhZ3MgPSBGRklfVFlQRV9TSU5UNjQ7CisgICAgICBicmVhazsKKworI2lmIGRlZmluZWQgWDg2X1dJTjMyICAKKworICAgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgorICAgICAgaWYgKGNpZi0+cnR5cGUtPnNpemUgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgIGNpZi0+ZmxhZ3MgPSBGRklfVFlQRV9TSU5UODsgLyogc2FtZSBhcyBjaGFyIHNpemUgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoY2lmLT5ydHlwZS0+c2l6ZSA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgY2lmLT5mbGFncyA9IEZGSV9UWVBFX1NJTlQxNjsgLyogc2FtZSBhcyBzaG9ydCBzaXplICovCisgICAgICAgIH0KKyAgICAgIGVsc2UgaWYgKGNpZi0+cnR5cGUtPnNpemUgPT0gNCkKKyAgICAgICAgeworICAgICAgICAgIGNpZi0+ZmxhZ3MgPSBGRklfVFlQRV9JTlQ7IC8qIHNhbWUgYXMgaW50IHR5cGUgKi8KKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoY2lmLT5ydHlwZS0+c2l6ZSA9PSA4KQorICAgICAgICB7CisgICAgICAgICAgY2lmLT5mbGFncyA9IEZGSV9UWVBFX1NJTlQ2NDsgLyogc2FtZSBhcyBpbnQ2NCB0eXBlICovCisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGNpZi0+ZmxhZ3MgPSBGRklfVFlQRV9TVFJVQ1Q7CisgICAgICAgIH0KKyAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICBkZWZhdWx0OgorICAgICAgY2lmLT5mbGFncyA9IEZGSV9UWVBFX0lOVDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAvKiBEYXJ3aW46IFRoZSBzdGFjayBuZWVkcyB0byBiZSBhbGlnbmVkIHRvIGEgbXVsdGlwbGUgb2YgMTYgYnl0ZXMgKi8KKyNpZiAwCisgIGNpZi0+Ynl0ZXMgPSAoY2lmLT5ieXRlcyArIDE1KSAmIH4weEY7CisjZW5kaWYKKworICByZXR1cm4gRkZJX09LOworfQorCisvKkAtZGVjbHVuZGVmQCovCisvKkAtZXhwb3J0aGVhZGVyQCovCitleHRlcm4gdm9pZCBmZmlfY2FsbF9TWVNWKHZvaWQgKCopKGNoYXIgKiwgZXh0ZW5kZWRfY2lmICopLCAKKwkJCSAgLypAb3V0QCovIGV4dGVuZGVkX2NpZiAqLCAKKwkJCSAgdW5zaWduZWQsIHVuc2lnbmVkLCAKKwkJCSAgLypAb3V0QCovIHVuc2lnbmVkICosIAorCQkJICB2b2lkICgqZm4pKHZvaWQpKTsKKy8qQD1kZWNsdW5kZWZAKi8KKy8qQD1leHBvcnRoZWFkZXJAKi8KKworI2lmZGVmIFg4Nl9XSU4zMgorLypALWRlY2x1bmRlZkAqLworLypALWV4cG9ydGhlYWRlckAqLworZXh0ZXJuIHZvaWQgZmZpX2NhbGxfU1REQ0FMTCh2b2lkICgqKShjaGFyICosIGV4dGVuZGVkX2NpZiAqKSwKKwkJCSAgLypAb3V0QCovIGV4dGVuZGVkX2NpZiAqLAorCQkJICB1bnNpZ25lZCwgdW5zaWduZWQsCisJCQkgIC8qQG91dEAqLyB1bnNpZ25lZCAqLAorCQkJICB2b2lkICgqZm4pKHZvaWQpKTsKKy8qQD1kZWNsdW5kZWZAKi8KKy8qQD1leHBvcnRoZWFkZXJAKi8KKyNlbmRpZiAvKiBYODZfV0lOMzIgKi8KKwordm9pZCBmZmlfY2FsbCgvKkBkZXBlbmRlbnRAKi8gZmZpX2NpZiAqY2lmLCAKKwkgICAgICB2b2lkICgqZm4pKCksIAorCSAgICAgIC8qQG91dEAqLyB2b2lkICpydmFsdWUsIAorCSAgICAgIC8qQGRlcGVuZGVudEAqLyB2b2lkICoqYXZhbHVlKQoreworICBleHRlbmRlZF9jaWYgZWNpZjsKKyAgaW50IGZsYWdzOworCisgIGVjaWYuY2lmID0gY2lmOworICBlY2lmLmF2YWx1ZSA9IGF2YWx1ZTsKKyAgCisgIC8qIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYSBzdHJ1Y3QgYW5kIHdlIGRvbid0IGhhdmUgYSByZXR1cm4JKi8KKyAgLyogdmFsdWUgYWRkcmVzcyB0aGVuIHdlIG5lZWQgdG8gbWFrZSBvbmUJCSAgICAgICAgKi8KKworICBpZiAoKHJ2YWx1ZSA9PSBOVUxMKSAmJiByZXR2YWxfb25fc3RhY2soY2lmLT5ydHlwZSkpCisgICAgeworICAgICAgLypALXN5c3VucmVjb2dAKi8KKyAgICAgIGVjaWYucnZhbHVlID0gYWxsb2NhKGNpZi0+cnR5cGUtPnNpemUpOworICAgICAgLypAPXN5c3VucmVjb2dAKi8KKyAgICB9CisgIGVsc2UKKyAgICBlY2lmLnJ2YWx1ZSA9IHJ2YWx1ZTsKKworICBmbGFncyA9IGNpZi0+ZmxhZ3M7CisgIGlmIChmbGFncyA9PSBGRklfVFlQRV9TVFJVQ1QpIHsKKyAgICBpZiAoY2lmLT5ydHlwZS0+c2l6ZSA9PSA4KSB7CisJZmxhZ3MgPSBGRklfVFlQRV9TSU5UNjQ7CisgICAgfSBlbHNlIGlmIChjaWYtPnJ0eXBlLT5zaXplID09IDQpIHsKKyAgICAgICAgZmxhZ3MgPSBGRklfVFlQRV9JTlQ7CisgICAgfSBlbHNlIGlmIChjaWYtPnJ0eXBlLT5zaXplID09IDIpIHsKKyAgICAgICAgZmxhZ3MgPSBGRklfVFlQRV9JTlQ7CisgICAgfSBlbHNlIGlmIChjaWYtPnJ0eXBlLT5zaXplID09IDEpIHsKKyAgICAgICAgZmxhZ3MgPSBGRklfVFlQRV9JTlQ7CisgICAgfQorICB9CisKKyAgCisgIHN3aXRjaCAoY2lmLT5hYmkpIAorICAgIHsKKyAgICBjYXNlIEZGSV9TWVNWOgorICAgICAgLypALXVzZWRlZkAqLworICAgICAgLyogVG8gYXZvaWQgY2hhbmdpbmcgdGhlIGFzc2VtYmx5IGNvZGUgbWFrZSBzdXJlIHRoZSBzaXplIG9mIHRoZSBhcmd1bWVudCAKKyAgICAgICAqIGJsb2NrIGlzIGEgbXVsdGlwbGUgb2YgMTYuIFRoZW4gYWRkIDggdG8gY29tcGVuc2F0ZSBmb3IgbG9jYWwgdmFyaWFibGVzCisgICAgICAgKiBpbiBmZmlfY2FsbF9TWVNWLgorICAgICAgICovCisgICAgICBmZmlfY2FsbF9TWVNWKGZmaV9wcmVwX2FyZ3MsICZlY2lmLCBBTElHTihjaWYtPmJ5dGVzLCAxNikgKzgsIAorCQkgICAgZmxhZ3MsIGVjaWYucnZhbHVlLCBmbik7CisgICAgICAvKkA9dXNlZGVmQCovCisgICAgICBicmVhazsKKyNpZmRlZiBYODZfV0lOMzIKKyAgICBjYXNlIEZGSV9TVERDQUxMOgorICAgICAgLypALXVzZWRlZkAqLworICAgICAgZmZpX2NhbGxfU1REQ0FMTChmZmlfcHJlcF9hcmdzLCAmZWNpZiwgY2lmLT5ieXRlcywKKwkJICAgIGNpZi0+ZmxhZ3MsIGVjaWYucnZhbHVlLCBmbik7CisgICAgICAvKkA9dXNlZGVmQCovCisgICAgICBicmVhazsKKyNlbmRpZiAvKiBYODZfV0lOMzIgKi8KKyAgICBkZWZhdWx0OgorICAgICAgRkZJX0FTU0VSVCgwKTsKKyAgICAgIGJyZWFrOworICAgIH0KK30KKworCisvKiogcHJpdmF0ZSBtZW1iZXJzICoqLworCitzdGF0aWMgdm9pZCBmZmlfcHJlcF9pbmNvbWluZ19hcmdzX1NZU1YgKGNoYXIgKnN0YWNrLCB2b2lkICoqcmV0LAorCQkJCQkgdm9pZCoqIGFyZ3MsIGZmaV9jaWYqIGNpZik7CitzdGF0aWMgdm9pZCBmZmlfY2xvc3VyZV9TWVNWIChmZmlfY2xvc3VyZSAqKQorICAgICBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgxKSkpOworI2lmICFGRklfTk9fUkFXX0FQSQorc3RhdGljIHZvaWQgZmZpX2Nsb3N1cmVfcmF3X1NZU1YgKGZmaV9yYXdfY2xvc3VyZSAqKQorICAgICBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgxKSkpOworI2VuZGlmCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMganVtcGVkIHRvIGJ5IHRoZSB0cmFtcG9saW5lICovCisKK3N0YXRpYyB2b2lkCitmZmlfY2xvc3VyZV9TWVNWIChjbG9zdXJlKQorICAgICBmZmlfY2xvc3VyZSAqY2xvc3VyZTsKK3sKKyAgLy8gdGhpcyBpcyBvdXIgcmV0dXJuIHZhbHVlIHN0b3JhZ2UKKyAgbG9uZyBkb3VibGUgIHJlczsKKworICAvLyBvdXIgdmFyaW91cyB0aGluZ3MuLi4KKyAgZmZpX2NpZiAgICAgICAqY2lmOworICB2b2lkICAgICAgICAgKiphcmdfYXJlYTsKKyAgdW5zaWduZWQgc2hvcnQgcnR5cGU7CisgIHZvaWQgICAgICAgICAgKnJlc3AgPSAodm9pZCopJnJlczsKKyAgdm9pZCAqYXJncyA9IF9fYnVpbHRpbl9kd2FyZl9jZmEgKCk7CisKKyAgY2lmICAgICAgICAgPSBjbG9zdXJlLT5jaWY7CisgIGFyZ19hcmVhICAgID0gKHZvaWQqKikgYWxsb2NhIChjaWYtPm5hcmdzICogc2l6ZW9mICh2b2lkKikpOyAgCisKKyAgLyogdGhpcyBjYWxsIHdpbGwgaW5pdGlhbGl6ZSBBUkdfQVJFQSwgc3VjaCB0aGF0IGVhY2gKKyAgICogZWxlbWVudCBpbiB0aGF0IGFycmF5IHBvaW50cyB0byB0aGUgY29ycmVzcG9uZGluZyAKKyAgICogdmFsdWUgb24gdGhlIHN0YWNrOyBhbmQgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMKKyAgICogYSBzdHJ1Y3R1cmUsIGl0IHdpbGwgcmUtc2V0IFJFU1AgdG8gcG9pbnQgdG8gdGhlCisgICAqIHN0cnVjdHVyZSByZXR1cm4gYWRkcmVzcy4gICovCisKKyAgZmZpX3ByZXBfaW5jb21pbmdfYXJnc19TWVNWKGFyZ3MsICh2b2lkKiopJnJlc3AsIGFyZ19hcmVhLCBjaWYpOworICAKKyAgKGNsb3N1cmUtPmZ1bikgKGNpZiwgcmVzcCwgYXJnX2FyZWEsIGNsb3N1cmUtPnVzZXJfZGF0YSk7CisKKyAgcnR5cGUgPSBjaWYtPmZsYWdzOworCisgIGlmICghcmV0dmFsX29uX3N0YWNrKGNpZi0+cnR5cGUpICYmIGNpZi0+ZmxhZ3MgPT0gRkZJX1RZUEVfU1RSVUNUKSB7CisgICAgICBpZiAoY2lmLT5ydHlwZS0+c2l6ZSA9PSA4KSB7CisgICAgICAgICBydHlwZSA9IEZGSV9UWVBFX1NJTlQ2NDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBydHlwZSA9IEZGSV9UWVBFX0lOVDsKKyAgICAgIH0KKyAgfQorCisgIC8qIG5vdywgZG8gYSBnZW5lcmljIHJldHVybiBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgcnR5cGUgKi8KKyAgaWYgKHJ0eXBlID09IEZGSV9UWVBFX0lOVCkKKyAgICB7CisgICAgICBhc20gKCJtb3ZsICglMCksJSVlYXgiIDogOiAiciIgKHJlc3ApIDogImVheCIpOworICAgIH0KKyAgZWxzZSBpZiAocnR5cGUgPT0gRkZJX1RZUEVfRkxPQVQpCisgICAgeworICAgICAgYXNtICgiZmxkcyAoJTApIiA6IDogInIiIChyZXNwKSA6ICJzdCIgKTsKKyAgICB9CisgIGVsc2UgaWYgKHJ0eXBlID09IEZGSV9UWVBFX0RPVUJMRSkKKyAgICB7CisgICAgICBhc20gKCJmbGRsICglMCkiIDogOiAiciIgKHJlc3ApIDogInN0IiwgInN0KDEpIiApOworICAgIH0KKyAgZWxzZSBpZiAocnR5cGUgPT0gRkZJX1RZUEVfTE9OR0RPVUJMRSkKKyAgICB7CisgICAgICBhc20gKCJmbGR0ICglMCkiIDogOiAiciIgKHJlc3ApIDogInN0IiwgInN0KDEpIiApOworICAgIH0KKyAgZWxzZSBpZiAocnR5cGUgPT0gRkZJX1RZUEVfU0lOVDY0KQorICAgIHsKKyAgICAgIGFzbSAoIm1vdmwgMCglMCksJSVlYXg7IgorCSAgICJtb3ZsIDQoJTApLCUlZWR4IiAKKwkgICA6IDogInIiKHJlc3ApCisJICAgOiAiZWF4IiwgImVkeCIpOworICAgIH0KKyNpZmRlZiBYODZfV0lOMzIKKyAgZWxzZSBpZiAocnR5cGUgPT0gRkZJX1RZUEVfU0lOVDgpIC8qIDEtYnl0ZSBzdHJ1Y3QgICovCisgICAgeworICAgICAgYXNtICgibW92c2JsICglMCksJSVlYXgiIDogOiAiciIgKHJlc3ApIDogImVheCIpOworICAgIH0KKyAgZWxzZSBpZiAocnR5cGUgPT0gRkZJX1RZUEVfU0lOVDE2KSAvKiAyLWJ5dGVzIHN0cnVjdCAqLworICAgIHsKKyAgICAgIGFzbSAoIm1vdnN3bCAoJTApLCUlZWF4IiA6IDogInIiIChyZXNwKSA6ICJlYXgiKTsKKyAgICB9CisjZW5kaWYKK30KKworLypALWV4cG9ydGhlYWRlckAqLworc3RhdGljIHZvaWQgCitmZmlfcHJlcF9pbmNvbWluZ19hcmdzX1NZU1YoY2hhciAqc3RhY2ssIHZvaWQgKipydmFsdWUsCisJCQkgICAgdm9pZCAqKmF2YWx1ZSwgZmZpX2NpZiAqY2lmKQorLypAPWV4cG9ydGhlYWRlckAqLworeworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKKyAgcmVnaXN0ZXIgdm9pZCAqKnBfYXJndjsKKyAgcmVnaXN0ZXIgY2hhciAqYXJncDsKKyAgcmVnaXN0ZXIgZmZpX3R5cGUgKipwX2FyZzsKKworICBhcmdwID0gc3RhY2s7CisKKyAgaWYgKHJldHZhbF9vbl9zdGFjayhjaWYtPnJ0eXBlKSkgeworICAgICpydmFsdWUgPSAqKHZvaWQgKiopIGFyZ3A7CisgICAgYXJncCArPSA0OworICB9CisKKyAgcF9hcmd2ID0gYXZhbHVlOworCisgIGZvciAoaSA9IGNpZi0+bmFyZ3MsIHBfYXJnID0gY2lmLT5hcmdfdHlwZXM7IChpICE9IDApOyBpLS0sIHBfYXJnKyspCisgICAgeworICAgICAgc2l6ZV90IHo7CisKKyAgICAgIC8qIEFsaWduIGlmIG5lY2Vzc2FyeSAqLworICAgICAgaWYgKChzaXplb2YoaW50KSAtIDEpICYgKHVuc2lnbmVkKSBhcmdwKSB7CisJYXJncCA9IChjaGFyICopIEFMSUdOKGFyZ3AsIHNpemVvZihpbnQpKTsKKyAgICAgIH0KKworICAgICAgeiA9ICgqcF9hcmcpLT5zaXplOworCisgICAgICAvKiBiZWNhdXNlIHdlJ3JlIGxpdHRsZSBlbmRpYW4sIHRoaXMgaXMgd2hhdCBpdCB0dXJucyBpbnRvLiAgICovCisKKyAgICAgICpwX2FyZ3YgPSAodm9pZCopIGFyZ3A7CisKKyAgICAgIHBfYXJndisrOworICAgICAgYXJncCArPSB6OworICAgIH0KKyAgCisgIHJldHVybjsKK30KKworLyogSG93IHRvIG1ha2UgYSB0cmFtcG9saW5lLiAgRGVyaXZlZCBmcm9tIGdjYy9jb25maWcvaTM4Ni9pMzg2LmMuICovCisKKyNkZWZpbmUgRkZJX0lOSVRfVFJBTVBPTElORShUUkFNUCxGVU4sQ1RYKSBcCisoeyB1bnNpZ25lZCBjaGFyICpfX3RyYW1wID0gKHVuc2lnbmVkIGNoYXIqKShUUkFNUCk7IFwKKyAgIHVuc2lnbmVkIGludCAgX19mdW4gPSAodW5zaWduZWQgaW50KShGVU4pOyBcCisgICB1bnNpZ25lZCBpbnQgIF9fY3R4ID0gKHVuc2lnbmVkIGludCkoQ1RYKTsgXAorICAgdW5zaWduZWQgaW50ICBfX2RpcyA9IF9fZnVuIC0gKCh1bnNpZ25lZCBpbnQpIF9fdHJhbXAgKyBGRklfVFJBTVBPTElORV9TSVpFKTsgXAorICAgKih1bnNpZ25lZCBjaGFyKikgJl9fdHJhbXBbMF0gPSAweGI4OyBcCisgICAqKHVuc2lnbmVkIGludCopICAmX190cmFtcFsxXSA9IF9fY3R4OyAvKiBtb3ZsIF9fY3R4LCAlZWF4ICovIFwKKyAgICoodW5zaWduZWQgY2hhciAqKSAgJl9fdHJhbXBbNV0gPSAweGU5OyBcCisgICAqKHVuc2lnbmVkIGludCopICAmX190cmFtcFs2XSA9IF9fZGlzOyAvKiBqbXAgX19mdW4gICovIFwKKyB9KQorCisKKy8qIHRoZSBjaWYgbXVzdCBhbHJlYWR5IGJlIHByZXAnZWQgKi8KKworZmZpX3N0YXR1cworZmZpX3ByZXBfY2xvc3VyZSAoZmZpX2Nsb3N1cmUqIGNsb3N1cmUsCisJCSAgZmZpX2NpZiogY2lmLAorCQkgIHZvaWQgKCpmdW4pKGZmaV9jaWYqLHZvaWQqLHZvaWQqKix2b2lkKiksCisJCSAgdm9pZCAqdXNlcl9kYXRhKQoreworICBGRklfQVNTRVJUIChjaWYtPmFiaSA9PSBGRklfU1lTVik7CisKKyAgRkZJX0lOSVRfVFJBTVBPTElORSAoJmNsb3N1cmUtPnRyYW1wWzBdLCBcCisJCSAgICAgICAmZmZpX2Nsb3N1cmVfU1lTViwgIFwKKwkJICAgICAgICh2b2lkKiljbG9zdXJlKTsKKyAgICAKKyAgY2xvc3VyZS0+Y2lmICA9IGNpZjsKKyAgY2xvc3VyZS0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOworICBjbG9zdXJlLT5mdW4gID0gZnVuOworCisgIHJldHVybiBGRklfT0s7Cit9CisKKy8qIC0tLS0tLS0gTmF0aXZlIHJhdyBBUEkgc3VwcG9ydCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgIUZGSV9OT19SQVdfQVBJCisKK3N0YXRpYyB2b2lkCitmZmlfY2xvc3VyZV9yYXdfU1lTViAoY2xvc3VyZSkKKyAgICAgZmZpX3Jhd19jbG9zdXJlICpjbG9zdXJlOworeworICAvLyB0aGlzIGlzIG91ciByZXR1cm4gdmFsdWUgc3RvcmFnZQorICBsb25nIGRvdWJsZSAgICByZXM7CisKKyAgLy8gb3VyIHZhcmlvdXMgdGhpbmdzLi4uCisgIGZmaV9yYXcgICAgICAgICAqcmF3X2FyZ3M7CisgIGZmaV9jaWYgICAgICAgICAqY2lmOworICB1bnNpZ25lZCBzaG9ydCAgIHJ0eXBlOworICB2b2lkICAgICAgICAgICAgKnJlc3AgPSAodm9pZCopJnJlczsKKworICAvKiBnZXQgdGhlIGNpZiAqLworICBjaWYgPSBjbG9zdXJlLT5jaWY7CisKKyAgLyogdGhlIFNZU1YvWDg2IGFiaSBtYXRjaGVzIHRoZSBSQVcgQVBJIGV4YWN0bHksIHdlbGwuLiBhbG1vc3QgKi8KKyAgcmF3X2FyZ3MgPSAoZmZpX3JhdyopIF9fYnVpbHRpbl9kd2FyZl9jZmEgKCk7CisKKyAgKGNsb3N1cmUtPmZ1bikgKGNpZiwgcmVzcCwgcmF3X2FyZ3MsIGNsb3N1cmUtPnVzZXJfZGF0YSk7CisKKyAgcnR5cGUgPSBjaWYtPmZsYWdzOworCisgIC8qIG5vdywgZG8gYSBnZW5lcmljIHJldHVybiBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgcnR5cGUgKi8KKyAgaWYgKHJ0eXBlID09IEZGSV9UWVBFX0lOVCkKKyAgICB7CisgICAgICBhc20gKCJtb3ZsICglMCksJSVlYXgiIDogOiAiciIgKHJlc3ApIDogImVheCIpOworICAgIH0KKyAgZWxzZSBpZiAocnR5cGUgPT0gRkZJX1RZUEVfRkxPQVQpCisgICAgeworICAgICAgYXNtICgiZmxkcyAoJTApIiA6IDogInIiIChyZXNwKSA6ICJzdCIgKTsKKyAgICB9CisgIGVsc2UgaWYgKHJ0eXBlID09IEZGSV9UWVBFX0RPVUJMRSkKKyAgICB7CisgICAgICBhc20gKCJmbGRsICglMCkiIDogOiAiciIgKHJlc3ApIDogInN0IiwgInN0KDEpIiApOworICAgIH0KKyAgZWxzZSBpZiAocnR5cGUgPT0gRkZJX1RZUEVfTE9OR0RPVUJMRSkKKyAgICB7CisgICAgICBhc20gKCJmbGR0ICglMCkiIDogOiAiciIgKHJlc3ApIDogInN0IiwgInN0KDEpIiApOworICAgIH0KKyAgZWxzZSBpZiAocnR5cGUgPT0gRkZJX1RZUEVfU0lOVDY0KQorICAgIHsKKyAgICAgIGFzbSAoIm1vdmwgMCglMCksJSVlYXg7IG1vdmwgNCglMCksJSVlZHgiIAorCSAgIDogOiAiciIocmVzcCkKKwkgICA6ICJlYXgiLCAiZWR4Iik7CisgICAgfQorfQorCisgCisKKworZmZpX3N0YXR1cworZmZpX3ByZXBfcmF3X2Nsb3N1cmUgKGZmaV9yYXdfY2xvc3VyZSogY2xvc3VyZSwKKwkJICAgICAgZmZpX2NpZiogY2lmLAorCQkgICAgICB2b2lkICgqZnVuKShmZmlfY2lmKix2b2lkKixmZmlfcmF3Kix2b2lkKiksCisJCSAgICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgaW50IGk7CisKKyAgRkZJX0FTU0VSVCAoY2lmLT5hYmkgPT0gRkZJX1NZU1YpOworCisgIC8vIHdlIGN1cnJlbnRseSBkb24ndCBzdXBwb3J0IGNlcnRhaW4ga2luZHMgb2YgYXJndW1lbnRzIGZvciByYXcKKyAgLy8gY2xvc3VyZXMuICBUaGlzIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBhIHNlcGFyYXRlIGFzc2VtYmx5IGxhbmd1YWdlCisgIC8vIHJvdXRpbmUsIHNpbmNlIGl0IHdvdWxkIHJlcXVpcmUgYXJndW1lbnQgcHJvY2Vzc2luZywgc29tZXRoaW5nIHdlCisgIC8vIGRvbid0IGRvIG5vdyBmb3IgcGVyZm9ybWFuY2UuCisKKyAgZm9yIChpID0gY2lmLT5uYXJncy0xOyBpID49IDA7IGktLSkKKyAgICB7CisgICAgICBGRklfQVNTRVJUIChjaWYtPmFyZ190eXBlc1tpXS0+dHlwZSAhPSBGRklfVFlQRV9TVFJVQ1QpOworICAgICAgRkZJX0FTU0VSVCAoY2lmLT5hcmdfdHlwZXNbaV0tPnR5cGUgIT0gRkZJX1RZUEVfTE9OR0RPVUJMRSk7CisgICAgfQorICAKKworICBGRklfSU5JVF9UUkFNUE9MSU5FICgmY2xvc3VyZS0+dHJhbXBbMF0sICZmZmlfY2xvc3VyZV9yYXdfU1lTViwKKwkJICAgICAgICh2b2lkKiljbG9zdXJlKTsKKyAgICAKKyAgY2xvc3VyZS0+Y2lmICA9IGNpZjsKKyAgY2xvc3VyZS0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOworICBjbG9zdXJlLT5mdW4gID0gZnVuOworCisgIHJldHVybiBGRklfT0s7Cit9CisKK3N0YXRpYyB2b2lkIAorZmZpX3ByZXBfYXJnc19yYXcoY2hhciAqc3RhY2ssIGV4dGVuZGVkX2NpZiAqZWNpZikKK3sKKyAgbWVtY3B5IChzdGFjaywgZWNpZi0+YXZhbHVlLCBlY2lmLT5jaWYtPmJ5dGVzKTsKK30KKworLyogd2UgYm9ycm93IHRoaXMgcm91dGluZSBmcm9tIGxpYmZmaSAoaXQgbXVzdCBiZSBjaGFuZ2VkLCB0aG91Z2gsIHRvCisgKiBhY3R1YWxseSBjYWxsIHRoZSBmdW5jdGlvbiBwYXNzZWQgaW4gdGhlIGZpcnN0IGFyZ3VtZW50LiAgYXMgb2YKKyAqIGxpYmZmaS0xLjIwLCB0aGlzIGlzIG5vdCB0aGUgY2FzZS4pCisgKi8KKworZXh0ZXJuIHZvaWQgCitmZmlfY2FsbF9TWVNWKHZvaWQgKCopKGNoYXIgKiwgZXh0ZW5kZWRfY2lmICopLCAKKwkgICAgICAvKkBvdXRAKi8gZXh0ZW5kZWRfY2lmICosIAorCSAgICAgIHVuc2lnbmVkLCB1bnNpZ25lZCwgCisJICAgICAgLypAb3V0QCovIHVuc2lnbmVkICosIAorCSAgICAgIHZvaWQgKCpmbikoKSk7CisKKyNpZmRlZiBYODZfV0lOMzIKK2V4dGVybiB2b2lkCitmZmlfY2FsbF9TVERDQUxMKHZvaWQgKCopKGNoYXIgKiwgZXh0ZW5kZWRfY2lmICopLAorCSAgICAgIC8qQG91dEAqLyBleHRlbmRlZF9jaWYgKiwKKwkgICAgICB1bnNpZ25lZCwgdW5zaWduZWQsCisJICAgICAgLypAb3V0QCovIHVuc2lnbmVkICosCisJICAgICAgdm9pZCAoKmZuKSgpKTsKKyNlbmRpZiAvKiBYODZfV0lOMzIgKi8KKwordm9pZAorZmZpX3Jhd19jYWxsKC8qQGRlcGVuZGVudEAqLyBmZmlfY2lmICpjaWYsIAorCSAgICAgdm9pZCAoKmZuKSgpLCAKKwkgICAgIC8qQG91dEAqLyB2b2lkICpydmFsdWUsIAorCSAgICAgLypAZGVwZW5kZW50QCovIGZmaV9yYXcgKmZha2VfYXZhbHVlKQoreworICBleHRlbmRlZF9jaWYgZWNpZjsKKyAgdm9pZCAqKmF2YWx1ZSA9ICh2b2lkICoqKWZha2VfYXZhbHVlOworCisgIGVjaWYuY2lmID0gY2lmOworICBlY2lmLmF2YWx1ZSA9IGF2YWx1ZTsKKyAgCisgIC8qIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYSBzdHJ1Y3QgYW5kIHdlIGRvbid0IGhhdmUgYSByZXR1cm4JKi8KKyAgLyogdmFsdWUgYWRkcmVzcyB0aGVuIHdlIG5lZWQgdG8gbWFrZSBvbmUJCSAgICAgICAgKi8KKworICBpZiAoKHJ2YWx1ZSA9PSBOVUxMKSAmJiByZXR2YWxfb25fc3RhY2soY2lmLT5ydHlwZSkpIAorICAgIHsKKyAgICAgIC8qQC1zeXN1bnJlY29nQCovCisgICAgICBlY2lmLnJ2YWx1ZSA9IGFsbG9jYShjaWYtPnJ0eXBlLT5zaXplKTsKKyAgICAgIC8qQD1zeXN1bnJlY29nQCovCisgICAgfQorICBlbHNlCisgICAgZWNpZi5ydmFsdWUgPSBydmFsdWU7CisgICAgCisgIAorICBzd2l0Y2ggKGNpZi0+YWJpKSAKKyAgICB7CisgICAgY2FzZSBGRklfU1lTVjoKKyAgICAgIC8qQC11c2VkZWZAKi8KKyAgICAgIGZmaV9jYWxsX1NZU1YoZmZpX3ByZXBfYXJnc19yYXcsICZlY2lmLCBjaWYtPmJ5dGVzLCAKKwkJICAgIGNpZi0+ZmxhZ3MsIGVjaWYucnZhbHVlLCBmbik7CisgICAgICAvKkA9dXNlZGVmQCovCisgICAgICBicmVhazsKKyNpZmRlZiBYODZfV0lOMzIKKyAgICBjYXNlIEZGSV9TVERDQUxMOgorICAgICAgLypALXVzZWRlZkAqLworICAgICAgZmZpX2NhbGxfU1REQ0FMTChmZmlfcHJlcF9hcmdzX3JhdywgJmVjaWYsIGNpZi0+Ynl0ZXMsCisJCSAgICBjaWYtPmZsYWdzLCBlY2lmLnJ2YWx1ZSwgZm4pOworICAgICAgLypAPXVzZWRlZkAqLworICAgICAgYnJlYWs7CisjZW5kaWYgLyogWDg2X1dJTjMyICovCisgICAgZGVmYXVsdDoKKyAgICAgIEZGSV9BU1NFUlQoMCk7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKKyNlbmRpZgorCisjZW5kaWYgLyogX194ODZfNjRfXyAgKi8KKworI2VuZGlmIC8qIF9faTM4Nl9fICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvZmZpdGFyZ2V0LmggYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvZmZpdGFyZ2V0LmgKaW5kZXggOTUwMGY0MC4uOGIyMGQzYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMveDg2L2ZmaXRhcmdldC5oCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3g4Ni9mZml0YXJnZXQuaApAQCAtNTEsNyArNTEsNyBAQAogI2VuZGlmCiAKICAgLyogLS0tLSBJbnRlbCB4ODYgYW5kIEFNRCB4ODYtNjQgLSAqLwotI2lmICFkZWZpbmVkKFg4Nl9XSU4zMikgJiYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykpCisjaWYgIWRlZmluZWQoWDg2X1dJTjMyKSAmJiAoZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSkgCiAgIEZGSV9TWVNWLAogICBGRklfVU5JWDY0LCAgIC8qIFVuaXggdmFyaWFudHMgYWxsIHVzZSB0aGUgc2FtZSBBQkkgZm9yIHg4Ni02NCAgKi8KICNpZmRlZiBfX2kzODZfXwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL2ZmaS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL2ZmaS5jCmluZGV4IDVjNDliMzkuLmU1NjAwYjIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfbXN2Yy9mZmkuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX21zdmMvZmZpLmMKQEAgLTI2LDggKzI2LDYgQEAKICAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNpZm5kZWYgX194ODZfNjRfXwotCiAjaW5jbHVkZSA8ZmZpLmg+CiAjaW5jbHVkZSA8ZmZpX2NvbW1vbi5oPgogCkBAIC0xNDMsMTEgKzE0MSw3IEBACiAKIC8qQC1kZWNsdW5kZWZAKi8KIC8qQC1leHBvcnRoZWFkZXJAKi8KLSNpZmRlZiBfTVNDX1ZFUgogZXh0ZXJuIGludAotI2Vsc2UKLWV4dGVybiB2b2lkCi0jZW5kaWYKIGZmaV9jYWxsX1NZU1Yodm9pZCAoKikoY2hhciAqLCBleHRlbmRlZF9jaWYgKiksIAogCSAgICAgIC8qQG91dEAqLyBleHRlbmRlZF9jaWYgKiwgCiAJICAgICAgdW5zaWduZWQsIHVuc2lnbmVkLCAKQEAgLTE1NiwxNCArMTUwLDkgQEAKIC8qQD1kZWNsdW5kZWZAKi8KIC8qQD1leHBvcnRoZWFkZXJAKi8KIAotI2lmIGRlZmluZWQoWDg2X1dJTjMyKSB8fCBkZWZpbmVkKF9NU0NfVkVSKQogLypALWRlY2x1bmRlZkAqLwogLypALWV4cG9ydGhlYWRlckAqLwotI2lmZGVmIF9NU0NfVkVSCiBleHRlcm4gaW50Ci0jZWxzZQotZXh0ZXJuIHZvaWQKLSNlbmRpZgogZmZpX2NhbGxfU1REQ0FMTCh2b2lkICgqKShjaGFyICosIGV4dGVuZGVkX2NpZiAqKSwKIAkJIC8qQG91dEAqLyBleHRlbmRlZF9jaWYgKiwKIAkJIHVuc2lnbmVkLCB1bnNpZ25lZCwKQEAgLTE3MSwxMyArMTYwLDggQEAKIAkJIHZvaWQgKCpmbikoKSk7CiAvKkA9ZGVjbHVuZGVmQCovCiAvKkA9ZXhwb3J0aGVhZGVyQCovCi0jZW5kaWYgLyogWDg2X1dJTjMyIHx8IF9NU0NfVkVSKi8KIAotI2lmZGVmIF9NU0NfVkVSCiBpbnQKLSNlbHNlCi12b2lkCi0jZW5kaWYKIGZmaV9jYWxsKC8qQGRlcGVuZGVudEAqLyBmZmlfY2lmICpjaWYsIAogCSB2b2lkICgqZm4pKCksIAogCSAvKkBvdXRAKi8gdm9pZCAqcnZhbHVlLCAKQEAgLTIwNiwyNCArMTkwLDE4IEBACiAgICAgewogICAgIGNhc2UgRkZJX1NZU1Y6CiAgICAgICAvKkAtdXNlZGVmQCovCi0jaWZkZWYgX01TQ19WRVIKLSAgICAgIHJldHVybgotI2VuZGlmCi0JICAgICAgZmZpX2NhbGxfU1lTVihmZmlfcHJlcF9hcmdzLCAmZWNpZiwgY2lmLT5ieXRlcywgCi0JCQkgICAgY2lmLT5mbGFncywgZWNpZi5ydmFsdWUsIGZuKTsKKyAgICAgIHJldHVybiBmZmlfY2FsbF9TWVNWKGZmaV9wcmVwX2FyZ3MsICZlY2lmLCBjaWYtPmJ5dGVzLCAKKwkJCSAgIGNpZi0+ZmxhZ3MsIGVjaWYucnZhbHVlLCBmbik7CiAgICAgICAvKkA9dXNlZGVmQCovCiAgICAgICBicmVhazsKLSNpZiBkZWZpbmVkKFg4Nl9XSU4zMikgfHwgZGVmaW5lZChfTVNDX1ZFUikKKwogICAgIGNhc2UgRkZJX1NURENBTEw6CiAgICAgICAvKkAtdXNlZGVmQCovCi0jaWZkZWYgX01TQ19WRVIKLSAgICAgIHJldHVybgotI2VuZGlmCi0JICAgICAgZmZpX2NhbGxfU1REQ0FMTChmZmlfcHJlcF9hcmdzLCAmZWNpZiwgY2lmLT5ieXRlcywKLQkJCSAgICAgICBjaWYtPmZsYWdzLCBlY2lmLnJ2YWx1ZSwgZm4pOworICAgICAgcmV0dXJuIGZmaV9jYWxsX1NURENBTEwoZmZpX3ByZXBfYXJncywgJmVjaWYsIGNpZi0+Ynl0ZXMsCisJCQkgICAgICBjaWYtPmZsYWdzLCBlY2lmLnJ2YWx1ZSwgZm4pOwogICAgICAgLypAPXVzZWRlZkAqLwogICAgICAgYnJlYWs7Ci0jZW5kaWYgLyogWDg2X1dJTjMyICovCisKICAgICBkZWZhdWx0OgogICAgICAgRkZJX0FTU0VSVCgwKTsKICAgICAgIGJyZWFrOwpAQCAtMjM2LDIzICsyMTQsMTAgQEAKIAogc3RhdGljIHZvaWQgZmZpX3ByZXBfaW5jb21pbmdfYXJnc19TWVNWIChjaGFyICpzdGFjaywgdm9pZCAqKnJldCwKIAkJCQkJIHZvaWQqKiBhcmdzLCBmZmlfY2lmKiBjaWYpOwotI2lmbmRlZiBfTVNDX1ZFUgotc3RhdGljIHZvaWQgZmZpX2Nsb3N1cmVfU1lTViAoZmZpX2Nsb3N1cmUgKikKLSAgICAgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMSkpKTsKLXN0YXRpYyB2b2lkIGZmaV9jbG9zdXJlX3Jhd19TWVNWIChmZmlfcmF3X2Nsb3N1cmUgKikKLSAgICAgX19hdHRyaWJ1dGVfXyAoKHJlZ3Bhcm0oMSkpKTsKLSNlbmRpZgotCiAvKiBUaGlzIGZ1bmN0aW9uIGlzIGp1bXBlZCB0byBieSB0aGUgdHJhbXBvbGluZSAqLwogCi0jaWZkZWYgX01TQ19WRVIKIHN0YXRpYyB2b2lkIF9fZmFzdGNhbGwKIGZmaV9jbG9zdXJlX1NZU1YgKGZmaV9jbG9zdXJlICpjbG9zdXJlLCBpbnQgKmFyZ3ApCi0jZWxzZQotc3RhdGljIHZvaWQKLWZmaV9jbG9zdXJlX1NZU1YgKGNsb3N1cmUpCi0gICAgIGZmaV9jbG9zdXJlICpjbG9zdXJlOwotI2VuZGlmCiB7CiAgIC8vIHRoaXMgaXMgb3VyIHJldHVybiB2YWx1ZSBzdG9yYWdlCiAgIGxvbmcgZG91YmxlICAgIHJlczsKQEAgLTI2MiwxMSArMjI3LDExIEBACiAgIHZvaWQgICAgICAgICAqKmFyZ19hcmVhOwogICB1bnNpZ25lZCBzaG9ydCBydHlwZTsKICAgdm9pZCAgICAgICAgICAqcmVzcCA9ICh2b2lkKikmcmVzOwotI2lmZGVmIF9NU0NfVkVSCisvLyNpZmRlZiBfTVNDX1ZFUgogICB2b2lkICphcmdzID0gJmFyZ3BbMV07Ci0jZWxzZQotICB2b2lkICphcmdzID0gX19idWlsdGluX2R3YXJmX2NmYSAoKTsKLSNlbmRpZgorLy8jZWxzZQorLy8gIHZvaWQgKmFyZ3MgPSBfX2J1aWx0aW5fZHdhcmZfY2ZhICgpOworLy8jZW5kaWYKIAogICBjaWYgICAgICAgICA9IGNsb3N1cmUtPmNpZjsKICAgYXJnX2FyZWEgICAgPSAodm9pZCoqKSBhbGxvY2EgKGNpZi0+bmFyZ3MgKiBzaXplb2YgKHZvaWQqKSk7ICAKQEAgLTM5MCw3ICszNTUsNyBAQAogCiAvKiBNT1YgRURYLCBFU1AgaXMgMHg4YiAweGQ0ICovCiAKLSNpZmRlZiBfTVNDX1ZFUgorLy8jaWZkZWYgX01TQ19WRVIKIAogI2RlZmluZSBGRklfSU5JVF9UUkFNUE9MSU5FKFRSQU1QLEZVTixDVFgsQllURVMpIFwKIHsgdW5zaWduZWQgY2hhciAqX190cmFtcCA9ICh1bnNpZ25lZCBjaGFyKikoVFJBTVApOyBcCkBAIC00MDcsMTggKzM3MiwxOCBAQAogICAgKih1bnNpZ25lZCBzaG9ydCopICZfX3RyYW1wWzEzXSA9IEJZVEVTOyBcCiAgfQogCi0jZWxzZQotI2RlZmluZSBGRklfSU5JVF9UUkFNUE9MSU5FKFRSQU1QLEZVTixDVFgsQllURVMpIFwKLSh7IHVuc2lnbmVkIGNoYXIgKl9fdHJhbXAgPSAodW5zaWduZWQgY2hhciopKFRSQU1QKTsgXAotICAgdW5zaWduZWQgaW50ICBfX2Z1biA9ICh1bnNpZ25lZCBpbnQpKEZVTik7IFwKLSAgIHVuc2lnbmVkIGludCAgX19jdHggPSAodW5zaWduZWQgaW50KShDVFgpOyBcCi0gICB1bnNpZ25lZCBpbnQgIF9fZGlzID0gX19mdW4gLSAoKHVuc2lnbmVkIGludCkgX190cmFtcCArIEZGSV9UUkFNUE9MSU5FX1NJWkUpOyBcCi0gICAqKHVuc2lnbmVkIGNoYXIqKSAmX190cmFtcFswXSA9IDB4Yjg7IFwKLSAgICoodW5zaWduZWQgaW50KikgICZfX3RyYW1wWzFdID0gX19jdHg7IC8qIG1vdmwgX19jdHgsICVlYXggKi8gXAotICAgKih1bnNpZ25lZCBjaGFyICopICAmX190cmFtcFs1XSA9IDB4ZTk7IFwKLSAgICoodW5zaWduZWQgaW50KikgICZfX3RyYW1wWzZdID0gX19kaXM7IC8qIGptcCBfX2Z1biAgKi8gXAotIH0pCi0jZW5kaWYKKy8vI2Vsc2UKKy8vI2RlZmluZSBGRklfSU5JVF9UUkFNUE9MSU5FKFRSQU1QLEZVTixDVFgsQllURVMpIFwKKy8vKHsgdW5zaWduZWQgY2hhciAqX190cmFtcCA9ICh1bnNpZ25lZCBjaGFyKikoVFJBTVApOyBcCisvLyAgIHVuc2lnbmVkIGludCAgX19mdW4gPSAodW5zaWduZWQgaW50KShGVU4pOyBcCisvLyAgIHVuc2lnbmVkIGludCAgX19jdHggPSAodW5zaWduZWQgaW50KShDVFgpOyBcCisvLyAgIHVuc2lnbmVkIGludCAgX19kaXMgPSBfX2Z1biAtICgodW5zaWduZWQgaW50KSBfX3RyYW1wICsgRkZJX1RSQU1QT0xJTkVfU0laRSk7IFwKKy8vICAgKih1bnNpZ25lZCBjaGFyKikgJl9fdHJhbXBbMF0gPSAweGI4OyBcCisvLyAgICoodW5zaWduZWQgaW50KikgICZfX3RyYW1wWzFdID0gX19jdHg7IC8qIG1vdmwgX19jdHgsICVlYXggKi8gXAorLy8gICAqKHVuc2lnbmVkIGNoYXIgKikgICZfX3RyYW1wWzVdID0gMHhlOTsgXAorLy8gICAqKHVuc2lnbmVkIGludCopICAmX190cmFtcFs2XSA9IF9fZGlzOyAvKiBqbXAgX19mdW4gICovIFwKKy8vIH0pCisvLyNlbmRpZgogCiAvKiB0aGUgY2lmIG11c3QgYWxyZWFkeSBiZSBwcmVwJ2VkICovCiAKQEAgLTQzMywxMCArMzk4LDggQEAKICAgCiAgIGlmIChjaWYtPmFiaSA9PSBGRklfU1lTVikKICAgICBieXRlcyA9IDA7Ci0jaWZkZWYgX01TQ19WRVIKICAgZWxzZSBpZiAoY2lmLT5hYmkgPT0gRkZJX1NURENBTEwpCiAgICAgYnl0ZXMgPSBjaWYtPmJ5dGVzOwotI2VuZGlmCiAgIGVsc2UKICAgICByZXR1cm4gRkZJX0JBRF9BQkk7CiAKQEAgLTQ1MCw1ICs0MTMsMyBAQAogCiAgIHJldHVybiBGRklfT0s7CiB9Ci0KLSNlbmRpZiAvKiBfX3g4Nl82NF9fICAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL2ZmaS5oIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL2ZmaS5oCmluZGV4IGI5ZDMxZmQuLjIwMzE0MmQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfbXN2Yy9mZmkuaAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX21zdmMvZmZpLmgKQEAgLTI3MiwxMSArMjcyLDcgQEAKIAkJCS8qQGRlcGVuZGVudEAqLyAvKkBvdXRAKi8gLypAcGFydGlhbEAqLyBmZmlfdHlwZSAqcnR5cGUsIAogCQkJLypAZGVwZW5kZW50QCovIGZmaV90eXBlICoqYXR5cGVzKTsKIAotI2lmZGVmIF9NU0NfVkVSCiBpbnQKLSNlbHNlCi12b2lkCi0jZW5kaWYKIGZmaV9jYWxsKC8qQGRlcGVuZGVudEAqLyBmZmlfY2lmICpjaWYsIAogCSB2b2lkICgqZm4pKCksIAogCSAvKkBvdXRAKi8gdm9pZCAqcnZhbHVlLCAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfbXN2Yy9mZmlfY29tbW9uLmggYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX21zdmMvZmZpX2NvbW1vbi5oCmluZGV4IDFiOTQ4ZDUuLjQzZmI4M2IgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfbXN2Yy9mZmlfY29tbW9uLmgKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL2ZmaV9jb21tb24uaApAQCAtMTMsMjQgKzEzLDcgQEAKICNlbmRpZgogCiAjaW5jbHVkZSA8ZmZpY29uZmlnLmg+Ci0KLS8qIERvIG5vdCBtb3ZlIHRoaXMuIFNvbWUgdmVyc2lvbnMgb2YgQUlYIGFyZSB2ZXJ5IHBpY2t5IGFib3V0IHdoZXJlCi0gICB0aGlzIGlzIHBvc2l0aW9uZWQuICovCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZiBIQVZFX0FMTE9DQV9ICi0jICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgZWxzZQotIyAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICBlbHNlCi0jICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgorI2luY2x1ZGUgPG1hbGxvYy5oPgogCiAvKiBDaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBtZW1jcHkuICovCiAjaWYgU1REQ19IRUFERVJTCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX21zdmMvZmZpdGFyZ2V0LmggYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX21zdmMvZmZpdGFyZ2V0LmgKaW5kZXggYzlkOTViYy4uNTdkMjc1YiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL2ZmaXRhcmdldC5oCisrKyBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfbXN2Yy9mZml0YXJnZXQuaApAQCAtNDMsMjMgKzQzLDIxIEBACiAgIEZGSV9GSVJTVF9BQkkgPSAwLAogCiAgIC8qIC0tLS0gSW50ZWwgeDg2IFdpbjMyIC0tLS0tLS0tLS0gKi8KLSNpZiBkZWZpbmVkKFg4Nl9XSU4zMikgfHwgZGVmaW5lZChfTVNDX1ZFUikKICAgRkZJX1NZU1YsCiAgIEZGSV9TVERDQUxMLAogICAvKiBUT0RPOiBBZGQgZmFzdGNhbGwgc3VwcG9ydCBmb3IgdGhlIHNha2Ugb2YgY29tcGxldGVuZXNzICovCiAgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9TWVNWLAotI2VuZGlmCiAKICAgLyogLS0tLSBJbnRlbCB4ODYgYW5kIEFNRCB4ODYtNjQgLSAqLwotI2lmICFkZWZpbmVkKFg4Nl9XSU4zMikgJiYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykpCi0gIEZGSV9TWVNWLAotICBGRklfVU5JWDY0LCAgIC8qIFVuaXggdmFyaWFudHMgYWxsIHVzZSB0aGUgc2FtZSBBQkkgZm9yIHg4Ni02NCAgKi8KLSNpZmRlZiBfX2kzODZfXwotICBGRklfREVGQVVMVF9BQkkgPSBGRklfU1lTViwKLSNlbHNlCi0gIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9VTklYNjQsCi0jZW5kaWYKLSNlbmRpZgorLyogI2lmICFkZWZpbmVkKFg4Nl9XSU4zMikgJiYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykpICovCisvKiAgIEZGSV9TWVNWLCAqLworLyogICBGRklfVU5JWDY0LCovICAgLyogVW5peCB2YXJpYW50cyBhbGwgdXNlIHRoZSBzYW1lIEFCSSBmb3IgeDg2LTY0ICAqLworLyogI2lmZGVmIF9faTM4Nl9fICovCisvKiAgIEZGSV9ERUZBVUxUX0FCSSA9IEZGSV9TWVNWLCAqLworLyogI2Vsc2UgKi8KKy8qICAgRkZJX0RFRkFVTFRfQUJJID0gRkZJX1VOSVg2NCwgKi8KKy8qICNlbmRpZiAqLworLyogI2VuZGlmICovCiAKICAgRkZJX0xBU1RfQUJJID0gRkZJX0RFRkFVTFRfQUJJICsgMQogfSBmZmlfYWJpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL21pbmd3aW4zMi5TIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL21pbmd3aW4zMi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MWYyYjIKLS0tIC9kZXYvbnVsbAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX21zdmMvbWluZ3dpbjMyLlMKQEAgLTAsMCArMSwyMjggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICB3aW4zMi5TIC0gQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk4LCAyMDAxLCAyMDAyICBSZWQgSGF0LCBJbmMuCisJICAgICBDb3B5cmlnaHQgKGMpIDIwMDEgIEpvaG4gQmVuaXRvbgorCSAgICAgQ29weXJpZ2h0IChjKSAyMDAyICBSYW5qaXQgTWF0aGV3CisJCQkKKyAKKyAgIFg4NiBGb3JlaWduIEZ1bmN0aW9uIEludGVyZmFjZQorIAorICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAKKyAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAKKyAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAgIElOIE5PIEVWRU5UIFNIQUxMIENZR05VUyBTT0xVVElPTlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAgIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICAgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworIAorI2RlZmluZSBMSUJGRklfQVNNCisjaW5jbHVkZSA8ZmZpY29uZmlnLmg+CisjaW5jbHVkZSA8ZmZpLmg+CisgCisudGV4dAorIAorLmdsb2JsIGZmaV9wcmVwX2FyZ3MKKyAKKyAgICAgICAgIyBUaGlzIGFzc3VtZXMgd2UgYXJlIHVzaW5nIGdhcy4KKyAgICAgICAgLmJhbGlnbiAxNgorLmdsb2JsIF9mZmlfY2FsbF9TWVNWCisgCitfZmZpX2NhbGxfU1lTVjoKKyAgICAgICAgcHVzaGwgJWVicAorICAgICAgICBtb3ZsICAlZXNwLCVlYnAKKyAKKyAgICAgICAgIyBNYWtlIHJvb20gZm9yIGFsbCBvZiB0aGUgbmV3IGFyZ3MuCisgICAgICAgIG1vdmwgIDE2KCVlYnApLCVlY3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBzdWJsICAlZWN4LCVlc3AKKyAKKyAgICAgICAgbW92bCAgJWVzcCwlZWF4CisgCisgICAgICAgICMgUGxhY2UgYWxsIG9mIHRoZSBmZmlfcHJlcF9hcmdzIGluIHBvc2l0aW9uCisgICAgICAgIHB1c2hsIDEyKCVlYnApCisgICAgICAgIHB1c2hsICVlYXgKKyAgICAgICAgY2FsbCAgKjgoJWVicCkKKyAKKyAgICAgICAgIyBSZXR1cm4gc3RhY2sgdG8gcHJldmlvdXMgc3RhdGUgYW5kIGNhbGwgdGhlIGZ1bmN0aW9uCisgICAgICAgIGFkZGwgICQ4LCVlc3AKKyAKKyAgICAgICAgIyBGSVhNRTogQWxpZ24gdGhlIHN0YWNrIHRvIGEgMTI4LWJpdCBib3VuZGFyeSB0byBhdm9pZAorICAgICAgICAjIHBvdGVudGlhbCBwZXJmb3JtYW5jZSBoaXRzLgorCisJY2FsbCAgKjI4KCVlYnApCisgCisgICAgICAgICMgUmVtb3ZlIHRoZSBzcGFjZSB3ZSBwdXNoZWQgZm9yIHRoZSBhcmdzCisgICAgICAgIG1vdmwgIDE2KCVlYnApLCVlY3gKKyAgICAgICAgYWRkbCAgJWVjeCwlZXNwCisgCisgICAgICAgICMgTG9hZCAlZWN4IHdpdGggdGhlIHJldHVybiB0eXBlIGNvZGUKKyAgICAgICAgbW92bCAgMjAoJWVicCksJWVjeAorIAorICAgICAgICAjIElmIHRoZSByZXR1cm4gdmFsdWUgcG9pbnRlciBpcyBOVUxMLCBhc3N1bWUgbm8gcmV0dXJuIHZhbHVlLgorICAgICAgICBjbXBsICAkMCwyNCglZWJwKQorICAgICAgICBqbmUgICByZXRpbnQKKyAKKyAgICAgICAgIyBFdmVuIGlmIHRoZXJlIGlzIG5vIHNwYWNlIGZvciB0aGUgcmV0dXJuIHZhbHVlLCB3ZSBhcmUKKyAgICAgICAgIyBvYmxpZ2VkIHRvIGhhbmRsZSBmbG9hdGluZy1wb2ludCB2YWx1ZXMuCisgICAgICAgIGNtcGwgICQyLCVlY3ggICMgRmxvYXRfdHlwZQorICAgICAgICBqbmUgICBub3JldHZhbAorICAgICAgICBmc3RwICAlc3QoMCkKKyAKKyAgICAgICAgam1wICAgZXBpbG9ndWUKKyAKK3JldGludDoKKyAgICAgICAgY21wbCAgJDEsJWVjeCAgICAjIEludF90eXBlCisgICAgICAgIGpuZSAgIHJldGZsb2F0CisgICAgICAgICMgTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZQorICAgICAgICBtb3ZsICAyNCglZWJwKSwlZWN4CisgICAgICAgIG1vdmwgICVlYXgsMCglZWN4KQorICAgICAgICBqbXAgICBlcGlsb2d1ZQorIAorcmV0ZmxvYXQ6CisgICAgICAgIGNtcGwgICQyLCVlY3ggICAjIEZsb2F0X3R5cGUKKyAgICAgICAgam5lICAgcmV0ZG91YmxlICAgCisgICAgICAgICAjIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgICAgbW92bCAgMjQoJWVicCksJWVjeAorICAgICAgICBmc3RwcyAoJWVjeCkKKyAgICAgICAgam1wICAgZXBpbG9ndWUKKyAKK3JldGRvdWJsZToKKyAgICAgICAgY21wbCAgJDMsJWVjeCAgICAgIyBEb3VibGVfdHlwZQorICAgICAgICBqbmUgICByZXRsb25nZG91YmxlCisgICAgICAgICMgTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZQorICAgICAgICBtb3ZsICAyNCglZWJwKSwlZWN4CisgICAgICAgIGZzdHBsICglZWN4KQorICAgICAgICBqbXAgICBlcGlsb2d1ZQorIAorcmV0bG9uZ2RvdWJsZToKKyAgICAgICAgY21wbCAgJDQsJWVjeCAgICAgIyBMb25nZG91YmxlX3R5cGUKKyAgICAgICAgam5lICAgcmV0aW50NjQKKyAgICAgICAgIyBMb2FkICVlY3ggd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlCisgICAgICAgIG1vdmwgIDI0KCVlYnApLCVlY3gKKyAgICAgICAgZnN0cHQgKCVlY3gpCisgICAgICAgIGptcCAgIGVwaWxvZ3VlCisgCityZXRpbnQ2NDoKKyAgICAgICAgY21wbCAgJDEyLCVlY3ggICAgICAjIFNJTlQ2NF90eXBlCisgICAgICAgIGpuZSAgIHJldHN0cnVjdAorICAgICAgICAjIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgICAgbW92bCAgMjQoJWVicCksJWVjeAorICAgICAgICBtb3ZsICAlZWF4LDAoJWVjeCkKKyAgICAgICAgbW92bCAgJWVkeCw0KCVlY3gpCisgCityZXRzdHJ1Y3Q6CisgICAgICAgICMgTm90aGluZyB0byBkbyEKKyAKK25vcmV0dmFsOgorZXBpbG9ndWU6CisgICAgICAgIG1vdmwgJWVicCwlZXNwCisgICAgICAgIHBvcGwgJWVicAorICAgICAgICByZXQKKyAKKy5mZmlfY2FsbF9TWVNWX2VuZDoKKworICAgICAgICAjIFRoaXMgYXNzdW1lcyB3ZSBhcmUgdXNpbmcgZ2FzLgorICAgICAgICAuYmFsaWduIDE2CisuZ2xvYmwgX2ZmaV9jYWxsX1NURENBTEwKKworX2ZmaV9jYWxsX1NURENBTEw6CisgICAgICAgIHB1c2hsICVlYnAKKyAgICAgICAgbW92bCAgJWVzcCwlZWJwCisKKyAgICAgICAgIyBNYWtlIHJvb20gZm9yIGFsbCBvZiB0aGUgbmV3IGFyZ3MuCisgICAgICAgIG1vdmwgIDE2KCVlYnApLCVlY3ggCisgICAgICAgIHN1YmwgICVlY3gsJWVzcAorCisgICAgICAgIG1vdmwgICVlc3AsJWVheAorCisgICAgICAgICMgUGxhY2UgYWxsIG9mIHRoZSBmZmlfcHJlcF9hcmdzIGluIHBvc2l0aW9uCisgICAgICAgIHB1c2hsIDEyKCVlYnApCisgICAgICAgIHB1c2hsICVlYXgKKyAgICAgICAgY2FsbCAgKjgoJWVicCkKKworICAgICAgICAjIFJldHVybiBzdGFjayB0byBwcmV2aW91cyBzdGF0ZSBhbmQgY2FsbCB0aGUgZnVuY3Rpb24KKyAgICAgICAgYWRkbCAgJDgsJWVzcAorCisgICAgICAgICMgRklYTUU6IEFsaWduIHRoZSBzdGFjayB0byBhIDEyOC1iaXQgYm91bmRhcnkgdG8gYXZvaWQKKyAgICAgICAgIyBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgaGl0cy4KKworICAgICAgICBjYWxsICAqMjgoJWVicCkKKworICAgICAgICAjIHN0ZGNhbGwgZnVuY3Rpb25zIHBvcCBhcmd1bWVudHMgb2ZmIHRoZSBzdGFjayB0aGVtc2VsdmVzCisKKyAgICAgICAgIyBMb2FkICVlY3ggd2l0aCB0aGUgcmV0dXJuIHR5cGUgY29kZQorICAgICAgICBtb3ZsICAyMCglZWJwKSwlZWN4CisKKyAgICAgICAgIyBJZiB0aGUgcmV0dXJuIHZhbHVlIHBvaW50ZXIgaXMgTlVMTCwgYXNzdW1lIG5vIHJldHVybiB2YWx1ZS4KKyAgICAgICAgY21wbCAgJDAsMjQoJWVicCkKKyAgICAgICAgam5lICAgc2NfcmV0aW50CisKKyAgICAgICAgIyBFdmVuIGlmIHRoZXJlIGlzIG5vIHNwYWNlIGZvciB0aGUgcmV0dXJuIHZhbHVlLCB3ZSBhcmUKKyAgICAgICAgIyBvYmxpZ2VkIHRvIGhhbmRsZSBmbG9hdGluZy1wb2ludCB2YWx1ZXMuCisgICAgICAgIGNtcGwgICQyLCVlY3ggICAgICAjIEZsb2F0X3R5cGUKKyAgICAgICAgam5lICAgc2Nfbm9yZXR2YWwKKyAgICAgICAgZnN0cCAgJXN0KDApCisKKyAgICAgICAgam1wICAgc2NfZXBpbG9ndWUKKworc2NfcmV0aW50OgorICAgICAgICBjbXBsICAkMSwlZWN4ICAgICAgICMgSW50X3R5cGUKKyAgICAgICAgam5lICAgc2NfcmV0ZmxvYXQKKyAgICAgICAgIyBMb2FkICVlY3ggd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlCisgICAgICAgIG1vdmwgIDI0KCVlYnApLCVlY3gKKyAgICAgICAgbW92bCAgJWVheCwwKCVlY3gpCisgICAgICAgIGptcCAgIHNjX2VwaWxvZ3VlCisKK3NjX3JldGZsb2F0OgorICAgICAgICBjbXBsICAkMiwlZWN4ICAgICAgICMgRmxvYXRfdHlwZQorICAgICAgICBqbmUgICBzY19yZXRkb3VibGUKKyAgICAgICAgICMgTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZQorICAgICAgICBtb3ZsICAyNCglZWJwKSwlZWN4CisgICAgICAgIGZzdHBzICglZWN4KQorICAgICAgICBqbXAgICBzY19lcGlsb2d1ZQorCitzY19yZXRkb3VibGU6CisgICAgICAgIGNtcGwgICQyLCVlY3ggICAgICAgIyBEb3VibGVfdHlwZQorICAgICAgICBqbmUgICBzY19yZXRsb25nZG91YmxlCisgICAgICAgICMgTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZQorICAgICAgICBtb3ZsICAyNCglZWJwKSwlZWN4CisgICAgICAgIGZzdHBsICglZWN4KQorICAgICAgICBqbXAgICBzY19lcGlsb2d1ZQorCitzY19yZXRsb25nZG91YmxlOgorICAgICAgICBjbXBsICAkNCwlZWN4ICAgICAgIyBMb25nZG91YmxlX3R5cGUgCisgICAgICAgIGpuZSAgIHNjX3JldGludDY0CisgICAgICAgICMgTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZQorICAgICAgICBtb3ZsICAyNCglZWJwKSwlZWN4CisgICAgICAgIGZzdHB0ICglZWN4KQorICAgICAgICBqbXAgICBzY19lcGlsb2d1ZQorCitzY19yZXRpbnQ2NDoKKyAgICAgICAgY21wbCAgJDEyLCVlY3ggICAgICAjIFNJTlQ2NF9UeXBlCisgICAgICAgIGpuZSAgIHNjX3JldHN0cnVjdAorICAgICAgICAjIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgICAgbW92bCAgMjQoJWVicCksJWVjeAorICAgICAgICBtb3ZsICAlZWF4LDAoJWVjeCkKKyAgICAgICAgbW92bCAgJWVkeCw0KCVlY3gpCisKK3NjX3JldHN0cnVjdDoKKyAgICAgICAgIyBOb3RoaW5nIHRvIGRvIQorCitzY19ub3JldHZhbDoKK3NjX2VwaWxvZ3VlOgorICAgICAgICBtb3ZsICVlYnAsJWVzcAorICAgICAgICBwb3BsICVlYnAKKyAgICAgICAgcmV0CisKKy5mZmlfY2FsbF9TVERDQUxMX2VuZDoKKwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL3ByZXBfY2lmLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX21zdmMvcHJlcF9jaWYuYwppbmRleCA5ZWRjZTJmLi4yNjUwZmEwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX21zdmMvcHJlcF9jaWYuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX21zdmMvcHJlcF9jaWYuYwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAgICAgICBlbHNlCiAjZW5kaWYKIAl7Ci0jaWZuZGVmIF9NU0NfVkVSCisjaWYgIWRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9fTUlOR1czMl9fKQogCQkvKiBEb24ndCBrbm93IGlmIHRoaXMgaXMgYSBsaWJmZmkgYnVnIG9yIG5vdC4gIEF0IGxlYXN0IG9uCiAJCSAgIFdpbmRvd3Mgd2l0aCBNU1ZDLCBmdW5jdGlvbiBjYWxsIHBhcmFtZXRlcnMgYXJlICpub3QqCiAJCSAgIGFsaWduZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHN0cnVjdHVyZSBmaWVsZHMgYXJlLCB0aGV5IGFyZQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL3dpbjMyLlMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX21zdmMvd2luMzIuUwppbmRleCA0MDc0M2FmLi5jYzgyYWI5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX21zdmMvd2luMzIuUworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX21zdmMvd2luMzIuUwpAQCAtNDEsNyArNDEsMTEgQEAKIF9mZmlfY2FsbF9TWVNWOgogICAgICAgICBwdXNobCAlZWJwCiAgICAgICAgIG1vdmwgICVlc3AsJWVicAotIAorCisJI1RIZTogc2F2ZSBwcmV2aW91cyAlZXNpLCBhbmQgc3RvcmUgdGhlIGN1cnJlbnQgc3RhY2sgcG9pbnRlciBpbiAlZXNpCisJcHVzaGwgJWVzaQorCW1vdmwgJWVzcCwlZXNpCisKICAgICAgICAgIyBNYWtlIHJvb20gZm9yIGFsbCBvZiB0aGUgbmV3IGFyZ3MuCiAgICAgICAgIG1vdmwgIDE2KCVlYnApLCVlY3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICBzdWJsICAlZWN4LCVlc3AKQEAgLTY0LDcgKzY4LDkgQEAKICAgICAgICAgIyBSZW1vdmUgdGhlIHNwYWNlIHdlIHB1c2hlZCBmb3IgdGhlIGFyZ3MKICAgICAgICAgbW92bCAgMTYoJWVicCksJWVjeAogICAgICAgICBhZGRsICAlZWN4LCVlc3AKLSAKKworCXN1YiAlZXNwLCVlc2kgIyBjYWxjdWxhdGUgc3RhY2sgcG9pbnRlciBkaWZmZXJlbmNlCisKICAgICAgICAgIyBMb2FkICVlY3ggd2l0aCB0aGUgcmV0dXJuIHR5cGUgY29kZQogICAgICAgICBtb3ZsICAyMCglZWJwKSwlZWN4CiAgCkBAIC0xMjUsNiArMTMxLDggQEAKICAKIG5vcmV0dmFsOgogZXBpbG9ndWU6CisJbW92bCAlZXNpLCVlYXggIyByZXR1cm4gdGhlIHN0YWNrIHBvaW50ZXIgZGV0bHRhIGluICVlYXgKKwlwb3BsICVlc2kgIyByZXN0b3JlIHByZXZpb3VzICVlc2kKICAgICAgICAgbW92bCAlZWJwLCVlc3AKICAgICAgICAgcG9wbCAlZWJwCiAgICAgICAgIHJldApAQCAtMTM5LDYgKzE0NywxMCBAQAogICAgICAgICBwdXNobCAlZWJwCiAgICAgICAgIG1vdmwgICVlc3AsJWVicAogCisJI1RIZTogc2F2ZSBwcmV2aW91cyAlZXNpLCBhbmQgc3RvcmUgdGhlIGN1cnJlbnQgc3RhY2sgcG9pbnRlciBpbiAlZXNpCisJcHVzaGwgJWVzaQorCW1vdmwgJWVzcCwlZXNpCisJCiAgICAgICAgICMgTWFrZSByb29tIGZvciBhbGwgb2YgdGhlIG5ldyBhcmdzLgogICAgICAgICBtb3ZsICAxNiglZWJwKSwlZWN4IAogICAgICAgICBzdWJsICAlZWN4LCVlc3AKQEAgLTE1OCw2ICsxNzAsOCBAQAogCiAgICAgICAgIGNhbGwgICoyOCglZWJwKQogCisJc3ViICVlc3AsJWVzaSAjIGRpZmZlcmVuY2UgaW4gc3RhY2sKKwogICAgICAgICAjIHN0ZGNhbGwgZnVuY3Rpb25zIHBvcCBhcmd1bWVudHMgb2ZmIHRoZSBzdGFjayB0aGVtc2VsdmVzCiAKICAgICAgICAgIyBMb2FkICVlY3ggd2l0aCB0aGUgcmV0dXJuIHR5cGUgY29kZQpAQCAtMjIwLDYgKzIzNCw4IEBACiAKIHNjX25vcmV0dmFsOgogc2NfZXBpbG9ndWU6CisgICAgICAgIG1vdmwgJWVzaSwlZWF4ICMgcmV0dXJuIHRoZSBzdGFjayBkaWZmZXJlbmNlCisJcG9wbCAlZXNpICMgcmVzdG9yZSBwcmV2aW91cyAlZXNpIHZhbHVlCiAgICAgICAgIG1vdmwgJWVicCwlZXNwCiAgICAgICAgIHBvcGwgJWVicAogICAgICAgICByZXQKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2VsZW1lbnR0cmVlLmMgYi9Nb2R1bGVzL19lbGVtZW50dHJlZS5jCmluZGV4IDdlMzZlYTMuLjg3MWFhMTggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2VsZW1lbnR0cmVlLmMKKysrIGIvTW9kdWxlcy9fZWxlbWVudHRyZWUuYwpAQCAtMzI3LDggKzMyNywxMCBAQAogCiAgICAgaWYgKGF0dHJpYiAhPSBQeV9Ob25lKSB7CiAKLSAgICAgICAgaWYgKGVsZW1lbnRfbmV3X2V4dHJhKHNlbGYsIGF0dHJpYikgPCAwKQorICAgICAgICBpZiAoZWxlbWVudF9uZXdfZXh0cmEoc2VsZiwgYXR0cmliKSA8IDApIHsKKyAgICAgICAgICAgIFB5T2JqZWN0X0RlbChzZWxmKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOworCX0KIAogICAgICAgICBzZWxmLT5leHRyYS0+bGVuZ3RoID0gMDsKICAgICAgICAgc2VsZi0+ZXh0cmEtPmFsbG9jYXRlZCA9IFNUQVRJQ19DSElMRFJFTjsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2hvdHNob3QuYyBiL01vZHVsZXMvX2hvdHNob3QuYwppbmRleCAyZWU0ZWI5Li4zYWQwYTllIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19ob3RzaG90LmMKKysrIGIvTW9kdWxlcy9faG90c2hvdC5jCkBAIC0xNDIwLDcgKzE0MjAsNyBAQAogICAgIGNoYXIgKmJ1ZmZlcjsKICAgICBjaGFyIGN3ZGJ1ZmZlcltQQVRIX01BWF07CiAgICAgUHlPYmplY3QgKnRlbXA7Ci0gICAgaW50IGksIGxlbjsKKyAgICBQeV9zc2l6ZV90IGksIGxlbjsKIAogICAgIGJ1ZmZlciA9IGdldF92ZXJzaW9uX3N0cmluZygpOwogICAgIGlmIChidWZmZXIgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fbG9jYWxlbW9kdWxlLmMgYi9Nb2R1bGVzL19sb2NhbGVtb2R1bGUuYwppbmRleCBlM2QxZTdmLi41OGJlYjVjIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19sb2NhbGVtb2R1bGUuYworKysgYi9Nb2R1bGVzL19sb2NhbGVtb2R1bGUuYwpAQCAtMTIsMTEgKzEyLDE0IEBACiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAKICNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8bG9jYWxlLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8Y3R5cGUuaD4KIAorI2lmbmRlZiBET05UX0hBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKwogI2lmZGVmIEhBVkVfTEFOR0lORk9fSAogI2luY2x1ZGUgPGxhbmdpbmZvLmg+CiAjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9hZGFwdGVycy5jIGIvTW9kdWxlcy9fc3FsaXRlL2FkYXB0ZXJzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZmRlMDMuLjAwMDAwMDAKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL2FkYXB0ZXJzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKiBhZGFwdGVycy5jIC0gZGVmYXVsdCBhZGFwdGVycwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+Ci0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKLSAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0gKgotICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0gKgotICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKLSAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCi0gKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KLSAqLwotCi0jaW5jbHVkZSAidXRpbC5oIgotI2luY2x1ZGUgIm1vZHVsZS5oIgotI2luY2x1ZGUgImFkYXB0ZXJzLmgiCi0KLS8qIGR1bW15LCB3aWxsIGJlIGltcGxlbWVudGVkIGluIGEgbGF0ZXIgdmVyc2lvbiAqLwotCi1QeU9iamVjdCogYWRhcHRfZGF0ZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCi17Ci0gICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgIHJldHVybiBQeV9Ob25lOwotfQotCi1QeU9iamVjdCogYWRhcHRfZGF0ZXRpbWUoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQotewotICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICByZXR1cm4gUHlfTm9uZTsKLX0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9hZGFwdGVycy5oIGIvTW9kdWxlcy9fc3FsaXRlL2FkYXB0ZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZTg0NzkuLjAwMDAwMDAKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL2FkYXB0ZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKiBhZGFwdGVycy5oIC0gZGVmYXVsdCBhZGFwdGVycwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+Ci0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKLSAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0gKgotICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0gKgotICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKLSAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCi0gKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KLSAqLwotCi0jaWZuZGVmIFBZU1FMSVRFX0FEQVBURVJTX0gKLSNkZWZpbmUgUFlTUUxJVEVfQURBUFRFUlNfSAotI2luY2x1ZGUgIlB5dGhvbi5oIgotI2luY2x1ZGUgInB5dGhyZWFkLmgiCi0jaW5jbHVkZSAic3FsaXRlMy5oIgotCi1QeU9iamVjdCogYWRhcHRfZGF0ZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpOwotUHlPYmplY3QqIGFkYXB0X2RhdGV0aW1lKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncyk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL2NhY2hlLmMgYi9Nb2R1bGVzL19zcWxpdGUvY2FjaGUuYwppbmRleCBkMTAyZTk3Li42OTYyNjk1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvY2FjaGUuYworKysgYi9Nb2R1bGVzL19zcWxpdGUvY2FjaGUuYwpAQCAtMjIsNiArMjIsNyBAQAogICovCiAKICNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgPGxpbWl0cy5oPgogCiAvKiBvbmx5IHVzZWQgaW50ZXJuYWxseSAqLwogTm9kZSogbmV3X25vZGUoUHlPYmplY3QqIGtleSwgUHlPYmplY3QqIGRhdGEpCkBAIC02MCwxMSArNjEsMTEgQEAKIAogICAgIHNlbGYtPmZhY3RvcnkgPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfGkiLCAmZmFjdG9yeSwgJnNpemUpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIC0xOyAKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98aSIsICZmYWN0b3J5LCAmc2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAorICAgIC8qIG1pbmltdW0gY2FjaGUgc2l6ZSBpcyA1IGVudHJpZXMgKi8KICAgICBpZiAoc2l6ZSA8IDUpIHsKICAgICAgICAgc2l6ZSA9IDU7CiAgICAgfQpAQCAtOTUsNiArOTYsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgLyogaXRlcmF0ZSBvdmVyIGFsbCBub2RlcyBhbmQgZGVhbGxvY2F0ZSB0aGVtICovCiAgICAgbm9kZSA9IHNlbGYtPmZpcnN0OwogICAgIHdoaWxlIChub2RlKSB7CiAgICAgICAgIGRlbGV0ZV9ub2RlID0gbm9kZTsKQEAgLTExOSw3ICsxMjEsMTQgQEAKIAogICAgIG5vZGUgPSAoTm9kZSopUHlEaWN0X0dldEl0ZW0oc2VsZi0+bWFwcGluZywga2V5KTsKICAgICBpZiAobm9kZSkgewotICAgICAgICBub2RlLT5jb3VudCsrOworICAgICAgICAvKiBhbiBlbnRyeSBmb3IgdGhpcyBrZXkgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGNhY2hlICovCisKKyAgICAgICAgLyogaW5jcmVhc2UgdXNhZ2UgY291bnRlciBvZiB0aGUgbm9kZSBmb3VuZCAqLworICAgICAgICBpZiAobm9kZS0+Y291bnQgPCBMT05HX01BWCkgeworICAgICAgICAgICAgbm9kZS0+Y291bnQrKzsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGlmIG5lY2Vzc2FyeSwgcmVvcmRlciBlbnRyaWVzIGluIHRoZSBjYWNoZSBieSBzd2FwcGluZyBwb3NpdGlvbnMgKi8KICAgICAgICAgaWYgKG5vZGUtPnByZXYgJiYgbm9kZS0+Y291bnQgPiBub2RlLT5wcmV2LT5jb3VudCkgewogICAgICAgICAgICAgcHRyID0gbm9kZS0+cHJldjsKIApAQCAtMTQ5LDYgKzE1OCwxMCBAQAogICAgICAgICAgICAgcHRyLT5wcmV2ID0gbm9kZTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFRoZXJlIGlzIG5vIGVudHJ5IGZvciB0aGlzIGtleSBpbiB0aGUgY2FjaGUsIHlldC4gV2UnbGwgaW5zZXJ0IGEgbmV3CisgICAgICAgICAqIGVudHJ5IGluIHRoZSBjYWNoZSwgYW5kIG1ha2Ugc3BhY2UgaWYgbmVjZXNzYXJ5IGJ5IHRocm93aW5nIHRoZQorICAgICAgICAgKiBsZWFzdCB1c2VkIGl0ZW0gb3V0IG9mIHRoZSBjYWNoZS4gKi8KKwogICAgICAgICBpZiAoUHlEaWN0X1NpemUoc2VsZi0+bWFwcGluZykgPT0gc2VsZi0+c2l6ZSkgewogICAgICAgICAgICAgaWYgKHNlbGYtPmxhc3QpIHsKICAgICAgICAgICAgICAgICBub2RlID0gc2VsZi0+bGFzdDsKQEAgLTI1Myw3ICsyNjYsNyBAQAogCiBzdGF0aWMgUHlNZXRob2REZWYgY2FjaGVfbWV0aG9kc1tdID0gewogICAgIHsiZ2V0IiwgKFB5Q0Z1bmN0aW9uKWNhY2hlX2dldCwgTUVUSF9PLAotICAgICAgICBQeURvY19TVFIoIkdldHMgYW4gZW50cnkgZnJvbSB0aGUgY2FjaGUuIil9LAorICAgICAgICBQeURvY19TVFIoIkdldHMgYW4gZW50cnkgZnJvbSB0aGUgY2FjaGUgb3IgY2FsbHMgdGhlIGZhY3RvcnkgZnVuY3Rpb24gdG8gcHJvZHVjZSBvbmUuIil9LAogICAgIHsiZGlzcGxheSIsIChQeUNGdW5jdGlvbiljYWNoZV9kaXNwbGF5LCBNRVRIX05PQVJHUywKICAgICAgICAgUHlEb2NfU1RSKCJGb3IgZGVidWdnaW5nIG9ubHkuIil9LAogICAgIHtOVUxMLCBOVUxMfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL2NhY2hlLmggYi9Nb2R1bGVzL19zcWxpdGUvY2FjaGUuaAppbmRleCA1Y2MxNmYzLi4xZjEzOTA3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvY2FjaGUuaAorKysgYi9Nb2R1bGVzL19zcWxpdGUvY2FjaGUuaApAQCAtMSw2ICsxLDYgQEAKIC8qIGNhY2hlLmggLSBkZWZpbml0aW9ucyBmb3IgdGhlIExSVSBjYWNoZQogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KICAqCkBAIC0yNSw2ICsyNSwxMCBAQAogI2RlZmluZSBQWVNRTElURV9DQUNIRV9ICiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAKKy8qIFRoZSBMUlUgY2FjaGUgaXMgaW1wbGVtZW50ZWQgYXMgYSBjb21iaW5hdGlvbiBvZiBhIGRvdWJseS1saW5rZWQgd2l0aCBhCisgKiBkaWN0aW9uYXJ5LiBUaGUgbGlzdCBpdGVtcyBhcmUgb2YgdHlwZSAnTm9kZScgYW5kIHRoZSBkaWN0aW9uYXJ5IGhhcyB0aGUKKyAqIG5vZGVzIGFzIHZhbHVlcy4gKi8KKwogdHlwZWRlZiBzdHJ1Y3QgX05vZGUKIHsKICAgICBQeU9iamVjdF9IRUFECkBAIC0zOSwxMCArNDMsMTggQEAKIHsKICAgICBQeU9iamVjdF9IRUFECiAgICAgaW50IHNpemU7CisKKyAgICAvKiBhIGRpY3Rpb25hcnkgbWFwcGluZyBrZXlzIHRvIE5vZGUgZW50cmllcyAqLwogICAgIFB5T2JqZWN0KiBtYXBwaW5nOworCisgICAgLyogdGhlIGZhY3RvcnkgY2FsbGFibGUgKi8KICAgICBQeU9iamVjdCogZmFjdG9yeTsKKwogICAgIE5vZGUqIGZpcnN0OwogICAgIE5vZGUqIGxhc3Q7CisKKyAgICAvKiBpZiBzZXQsIGRlY3JlbWVudCB0aGUgZmFjdG9yeSBmdW5jdGlvbiB3aGVuIHRoZSBDYWNoZSBpcyBkZWFsbG9jYXRlZC4KKyAgICAgKiB0aGlzIGlzIGFsbW9zdCBhbHdheXMgZGVzaXJhYmxlLCBidXQgbm90IGluIHRoZSBweXNxbGl0ZSBjb250ZXh0ICovCiAgICAgaW50IGRlY3JlZl9mYWN0b3J5OwogfSBDYWNoZTsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uYyBiL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmMKaW5kZXggNzhhYWQzNy4uNjRlNDNlYiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uYworKysgYi9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5jCkBAIC01Niw2ICs1Niw3IEBACiAgICAgc2VsZi0+YmVnaW5fc3RhdGVtZW50ID0gTlVMTDsKIAogICAgIHNlbGYtPnN0YXRlbWVudF9jYWNoZSA9IE5VTEw7CisgICAgc2VsZi0+c3RhdGVtZW50cyA9IE5VTEw7CiAKICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgc2VsZi0+cm93X2ZhY3RvcnkgPSBQeV9Ob25lOwpAQCAtNzQsNiArNzUsOSBAQAogCiAgICAgaWYgKCFpc29sYXRpb25fbGV2ZWwpIHsKICAgICAgICAgaXNvbGF0aW9uX2xldmVsID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgICAgIGlmICghaXNvbGF0aW9uX2xldmVsKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBQeV9JTkNSRUYoaXNvbGF0aW9uX2xldmVsKTsKICAgICB9CkBAIC04Niw2ICs5MCwxMiBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCisgICAgc2VsZi0+c3RhdGVtZW50cyA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKCFzZWxmLT5zdGF0ZW1lbnRzKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgc2VsZi0+Y3JlYXRlZF9zdGF0ZW1lbnRzID0gMDsKKwogICAgIC8qIEJ5IGRlZmF1bHQsIHRoZSBDYWNoZSBjbGFzcyBJTkNSRUZzIHRoZSBmYWN0b3J5IGluIGl0cyBpbml0aWFsaXplciwgYW5kCiAgICAgICogZGVjcmVmcyBpdCBpbiBpdHMgZGVhbGxvY2F0b3IgbWV0aG9kLiBTaW5jZSB0aGlzIHdvdWxkIGNyZWF0ZSBhIGNpcmN1bGFyCiAgICAgICogcmVmZXJlbmNlIGhlcmUsIHdlJ3JlIGJyZWFraW5nIGl0IGJ5IGRlY3JlbWVudGluZyBzZWxmLCBhbmQgdGVsbGluZyB0aGUKQEAgLTEyNiw2ICsxMzYsNyBAQAogICAgIHJldHVybiAwOwogfQogCisvKiBFbXB0eSB0aGUgZW50aXJlIHN0YXRlbWVudCBjYWNoZSBvZiB0aGlzIGNvbm5lY3Rpb24gKi8KIHZvaWQgZmx1c2hfc3RhdGVtZW50X2NhY2hlKENvbm5lY3Rpb24qIHNlbGYpCiB7CiAgICAgTm9kZSogbm9kZTsKQEAgLTE0NywxNSArMTU4LDE2IEBACiAKIHZvaWQgcmVzZXRfYWxsX3N0YXRlbWVudHMoQ29ubmVjdGlvbiogc2VsZikKIHsKLSAgICBOb2RlKiBub2RlOwotICAgIFN0YXRlbWVudCogc3RhdGVtZW50OworICAgIGludCBpOworICAgIFB5T2JqZWN0KiB3ZWFrcmVmOworICAgIFB5T2JqZWN0KiBzdGF0ZW1lbnQ7CiAKLSAgICBub2RlID0gc2VsZi0+c3RhdGVtZW50X2NhY2hlLT5maXJzdDsKLQotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIHN0YXRlbWVudCA9IChTdGF0ZW1lbnQqKShub2RlLT5kYXRhKTsKLSAgICAgICAgKHZvaWQpc3RhdGVtZW50X3Jlc2V0KHN0YXRlbWVudCk7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIGZvciAoaSA9IDA7IGkgPCBQeUxpc3RfU2l6ZShzZWxmLT5zdGF0ZW1lbnRzKTsgaSsrKSB7CisgICAgICAgIHdlYWtyZWYgPSBQeUxpc3RfR2V0SXRlbShzZWxmLT5zdGF0ZW1lbnRzLCBpKTsKKyAgICAgICAgc3RhdGVtZW50ID0gUHlXZWFrcmVmX0dldE9iamVjdCh3ZWFrcmVmKTsKKyAgICAgICAgaWYgKHN0YXRlbWVudCAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICAodm9pZClzdGF0ZW1lbnRfcmVzZXQoKFN0YXRlbWVudCopc3RhdGVtZW50KTsKKyAgICAgICAgfQogICAgIH0KIH0KIApAQCAtMTc4LDYgKzE5MCw3IEBACiAgICAgUHlfWERFQ1JFRihzZWxmLT5yb3dfZmFjdG9yeSk7CiAgICAgUHlfWERFQ1JFRihzZWxmLT50ZXh0X2ZhY3RvcnkpOwogICAgIFB5X1hERUNSRUYoc2VsZi0+Y29sbGF0aW9ucyk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5zdGF0ZW1lbnRzKTsKIAogICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKIH0KQEAgLTM5MSw3ICs0MDQsNyBAQAogICAgIFB5X3NzaXplX3QgYnVmbGVuOwogICAgIFB5T2JqZWN0KiBzdHJpbmd2YWw7CiAKLSAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgIGlmICgoIXB5X3ZhbCkgfHwgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICAvKiBFcnJvcnMgaW4gY2FsbGJhY2tzIGFyZSBpZ25vcmVkLCBhbmQgd2UgcmV0dXJuIE5VTEwgKi8KICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICAgc3FsaXRlM19yZXN1bHRfbnVsbChjb250ZXh0KTsKQEAgLTM5OSwyMSArNDEyLDIzIEBACiAgICAgICAgIHNxbGl0ZTNfcmVzdWx0X251bGwoY29udGV4dCk7CiAgICAgfSBlbHNlIGlmIChQeUludF9DaGVjayhweV92YWwpKSB7CiAgICAgICAgIGxvbmd2YWwgPSBQeUludF9Bc0xvbmcocHlfdmFsKTsKLSAgICAgICAgLyogVE9ETzogaW52ZXN0aWdhdGUgd2hhdCB0byBkbyB3aXRoIHJhbmdlIG92ZXJmbG93cyAtIGxvbmcgdnMuIGxvbmcgbG9uZyAqLwogICAgICAgICBzcWxpdGUzX3Jlc3VsdF9pbnQ2NChjb250ZXh0LCAoUFlfTE9OR19MT05HKWxvbmd2YWwpOwogICAgIH0gZWxzZSBpZiAoUHlGbG9hdF9DaGVjayhweV92YWwpKSB7CiAgICAgICAgIHNxbGl0ZTNfcmVzdWx0X2RvdWJsZShjb250ZXh0LCBQeUZsb2F0X0FzRG91YmxlKHB5X3ZhbCkpOwogICAgIH0gZWxzZSBpZiAoUHlCdWZmZXJfQ2hlY2socHlfdmFsKSkgewogICAgICAgICBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHB5X3ZhbCwgJmJ1ZmZlciwgJmJ1ZmxlbikgIT0gMCkgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJjb3VsZCBub3QgY29udmVydCBCTE9CIHRvIGJ1ZmZlciIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3FsaXRlM19yZXN1bHRfYmxvYihjb250ZXh0LCBidWZmZXIsIGJ1ZmxlbiwgU1FMSVRFX1RSQU5TSUVOVCk7CiAgICAgICAgIH0KLSAgICAgICAgc3FsaXRlM19yZXN1bHRfYmxvYihjb250ZXh0LCBidWZmZXIsIGJ1ZmxlbiwgU1FMSVRFX1RSQU5TSUVOVCk7CiAgICAgfSBlbHNlIGlmIChQeVN0cmluZ19DaGVjayhweV92YWwpKSB7CiAgICAgICAgIHNxbGl0ZTNfcmVzdWx0X3RleHQoY29udGV4dCwgUHlTdHJpbmdfQXNTdHJpbmcocHlfdmFsKSwgLTEsIFNRTElURV9UUkFOU0lFTlQpOwogICAgIH0gZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHB5X3ZhbCkpIHsKICAgICAgICAgc3RyaW5ndmFsID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyhweV92YWwpOwotICAgICAgICBzcWxpdGUzX3Jlc3VsdF90ZXh0KGNvbnRleHQsIFB5U3RyaW5nX0FzU3RyaW5nKHN0cmluZ3ZhbCksIC0xLCBTUUxJVEVfVFJBTlNJRU5UKTsKLSAgICAgICAgUHlfREVDUkVGKHN0cmluZ3ZhbCk7CisgICAgICAgIGlmIChzdHJpbmd2YWwpIHsKKyAgICAgICAgICAgIHNxbGl0ZTNfcmVzdWx0X3RleHQoY29udGV4dCwgUHlTdHJpbmdfQXNTdHJpbmcoc3RyaW5ndmFsKSwgLTEsIFNRTElURV9UUkFOU0lFTlQpOworICAgICAgICAgICAgUHlfREVDUkVGKHN0cmluZ3ZhbCk7CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAvKiBUT0RPOiByYWlzZSBlcnJvciAqLwogICAgIH0KQEAgLTQ1MCw2ICs0NjUsNyBAQAogICAgICAgICAgICAgICAgIGN1cl9weV92YWx1ZSA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KHZhbF9zdHIsIHN0cmxlbih2YWxfc3RyKSwgTlVMTCk7CiAgICAgICAgICAgICAgICAgLyogVE9ETzogaGF2ZSBhIHdheSB0byBzaG93IGVycm9ycyBoZXJlICovCiAgICAgICAgICAgICAgICAgaWYgKCFjdXJfcHlfdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgICAgICAgICAgICAgICBjdXJfcHlfdmFsdWUgPSBQeV9Ob25lOwogICAgICAgICAgICAgICAgIH0KQEAgLTQ1OCwxMCArNDc0LDEyIEBACiAgICAgICAgICAgICAgICAgYnVmbGVuID0gc3FsaXRlM192YWx1ZV9ieXRlcyhjdXJfdmFsdWUpOwogICAgICAgICAgICAgICAgIGN1cl9weV92YWx1ZSA9IFB5QnVmZmVyX05ldyhidWZsZW4pOwogICAgICAgICAgICAgICAgIGlmICghY3VyX3B5X3ZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFRPRE86IGVycm9yICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoUHlPYmplY3RfQXNXcml0ZUJ1ZmZlcihjdXJfcHlfdmFsdWUsICZyYXdfYnVmZmVyLCAmYnVmbGVuKSkgewotICAgICAgICAgICAgICAgICAgICAvKiBUT0RPOiBlcnJvciAqLworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY3VyX3B5X3ZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgY3VyX3B5X3ZhbHVlID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1lbWNweShyYXdfYnVmZmVyLCBzcWxpdGUzX3ZhbHVlX2Jsb2IoY3VyX3ZhbHVlKSwgYnVmbGVuKTsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTQ3MCw2ICs0ODgsMTIgQEAKICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgICAgICAgICAgICAgY3VyX3B5X3ZhbHVlID0gUHlfTm9uZTsKICAgICAgICAgfQorCisgICAgICAgIGlmICghY3VyX3B5X3ZhbHVlKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCiAgICAgICAgIFB5VHVwbGVfU2V0SXRlbShhcmdzLCBpLCBjdXJfcHlfdmFsdWUpOwogCiAgICAgfQpAQCAtNDgxLDggKzUwNSw3IEBACiB7CiAgICAgUHlPYmplY3QqIGFyZ3M7CiAgICAgUHlPYmplY3QqIHB5X2Z1bmM7Ci0gICAgUHlPYmplY3QqIHB5X3JldHZhbDsKLQorICAgIFB5T2JqZWN0KiBweV9yZXR2YWwgPSBOVUxMOwogCiAgICAgUHlHSUxTdGF0ZV9TVEFURSB0aHJlYWRzdGF0ZTsKIApAQCAtNDkxLDkgKzUxNCwxMCBAQAogICAgIHB5X2Z1bmMgPSAoUHlPYmplY3QqKXNxbGl0ZTNfdXNlcl9kYXRhKGNvbnRleHQpOwogCiAgICAgYXJncyA9IF9idWlsZF9weV9wYXJhbXMoY29udGV4dCwgYXJnYywgYXJndik7Ci0KLSAgICBweV9yZXR2YWwgPSBQeU9iamVjdF9DYWxsT2JqZWN0KHB5X2Z1bmMsIGFyZ3MpOwotICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICBpZiAoYXJncykgeworICAgICAgICBweV9yZXR2YWwgPSBQeU9iamVjdF9DYWxsT2JqZWN0KHB5X2Z1bmMsIGFyZ3MpOworICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgfQogCiAgICAgX3NldF9yZXN1bHQoY29udGV4dCwgcHlfcmV0dmFsKTsKICAgICBQeV9YREVDUkVGKHB5X3JldHZhbCk7CkBAIC01MDQsMTAgKzUyOCwxMCBAQAogc3RhdGljIHZvaWQgX3N0ZXBfY2FsbGJhY2soc3FsaXRlM19jb250ZXh0ICpjb250ZXh0LCBpbnQgYXJnYywgc3FsaXRlM192YWx1ZSoqIHBhcmFtcykKIHsKICAgICBQeU9iamVjdCogYXJnczsKLSAgICBQeU9iamVjdCogZnVuY3Rpb25fcmVzdWx0OworICAgIFB5T2JqZWN0KiBmdW5jdGlvbl9yZXN1bHQgPSBOVUxMOwogICAgIFB5T2JqZWN0KiBhZ2dyZWdhdGVfY2xhc3M7CiAgICAgUHlPYmplY3QqKiBhZ2dyZWdhdGVfaW5zdGFuY2U7Ci0gICAgUHlPYmplY3QqIHN0ZXBtZXRob2Q7CisgICAgUHlPYmplY3QqIHN0ZXBtZXRob2QgPSBOVUxMOwogCiAgICAgUHlHSUxTdGF0ZV9TVEFURSB0aHJlYWRzdGF0ZTsKIApAQCAtNTIwLDQ0ICs1NDQsNDIgQEAKICAgICBpZiAoKmFnZ3JlZ2F0ZV9pbnN0YW5jZSA9PSAwKSB7CiAgICAgICAgICphZ2dyZWdhdGVfaW5zdGFuY2UgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oYWdncmVnYXRlX2NsYXNzLCAiIik7CiAKLSAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgIHsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgICAgICAqYWdncmVnYXRlX2luc3RhbmNlID0gMDsKLSAgICAgICAgICAgIFB5R0lMU3RhdGVfUmVsZWFzZSh0aHJlYWRzdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAgICAgfQogCiAgICAgc3RlcG1ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKmFnZ3JlZ2F0ZV9pbnN0YW5jZSwgInN0ZXAiKTsKLSAgICBpZiAoIXN0ZXBtZXRob2QpCi0gICAgewotICAgICAgICBQeUdJTFN0YXRlX1JlbGVhc2UodGhyZWFkc3RhdGUpOwotICAgICAgICByZXR1cm47CisgICAgaWYgKCFzdGVwbWV0aG9kKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCiAgICAgYXJncyA9IF9idWlsZF9weV9wYXJhbXMoY29udGV4dCwgYXJnYywgcGFyYW1zKTsKKyAgICBpZiAoIWFyZ3MpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKICAgICBmdW5jdGlvbl9yZXN1bHQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KHN0ZXBtZXRob2QsIGFyZ3MpOwogICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICBQeV9ERUNSRUYoc3RlcG1ldGhvZCk7CiAKLSAgICBpZiAoZnVuY3Rpb25fcmVzdWx0ID09IE5VTEwpIHsKKyAgICBpZiAoIWZ1bmN0aW9uX3Jlc3VsdCkgewogICAgICAgICBQeUVycl9DbGVhcigpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFB5X0RFQ1JFRihmdW5jdGlvbl9yZXN1bHQpOwogICAgIH0KIAorZXJyb3I6CisgICAgUHlfWERFQ1JFRihzdGVwbWV0aG9kKTsKKyAgICBQeV9YREVDUkVGKGZ1bmN0aW9uX3Jlc3VsdCk7CisKICAgICBQeUdJTFN0YXRlX1JlbGVhc2UodGhyZWFkc3RhdGUpOwogfQogCiB2b2lkIF9maW5hbF9jYWxsYmFjayhzcWxpdGUzX2NvbnRleHQqIGNvbnRleHQpCiB7Ci0gICAgUHlPYmplY3QqIGFyZ3M7Ci0gICAgUHlPYmplY3QqIGZ1bmN0aW9uX3Jlc3VsdDsKKyAgICBQeU9iamVjdCogZnVuY3Rpb25fcmVzdWx0ID0gTlVMTDsKICAgICBQeU9iamVjdCoqIGFnZ3JlZ2F0ZV9pbnN0YW5jZTsKICAgICBQeU9iamVjdCogYWdncmVnYXRlX2NsYXNzOwotICAgIFB5T2JqZWN0KiBmaW5hbGl6ZW1ldGhvZDsKIAogICAgIFB5R0lMU3RhdGVfU1RBVEUgdGhyZWFkc3RhdGU7CiAKQEAgLTU3MCwzNSArNTkyLDU2IEBACiAgICAgICAgIC8qIHRoaXMgYnJhbmNoIGlzIGV4ZWN1dGVkIGlmIHRoZXJlIHdhcyBhbiBleGNlcHRpb24gaW4gdGhlIGFnZ3JlZ2F0ZSdzCiAgICAgICAgICAqIF9faW5pdF9fICovCiAKLSAgICAgICAgUHlHSUxTdGF0ZV9SZWxlYXNlKHRocmVhZHN0YXRlKTsKLSAgICAgICAgcmV0dXJuOworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAotICAgIGZpbmFsaXplbWV0aG9kID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygqYWdncmVnYXRlX2luc3RhbmNlLCAiZmluYWxpemUiKTsKLQotICAgIGlmICghZmluYWxpemVtZXRob2QpIHsKLSAgICAgICAgLyoKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFByb2dyYW1taW5nRXJyb3IsICJmaW5hbGl6ZSBtZXRob2QgbWlzc2luZyIpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAqLworICAgIGZ1bmN0aW9uX3Jlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QoKmFnZ3JlZ2F0ZV9pbnN0YW5jZSwgImZpbmFsaXplIiwgIiIpOworICAgIGlmICghZnVuY3Rpb25fcmVzdWx0KSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICAgICAgZnVuY3Rpb25fcmVzdWx0ID0gUHlfTm9uZTsKLSAgICB9IGVsc2UgewotICAgICAgICBhcmdzID0gUHlUdXBsZV9OZXcoMCk7Ci0gICAgICAgIGlmICghYXJncykKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGZ1bmN0aW9uX3Jlc3VsdCA9IFB5T2JqZWN0X0NhbGxPYmplY3QoZmluYWxpemVtZXRob2QsIGFyZ3MpOwotICAgICAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgICAgIFB5X0RFQ1JFRihmaW5hbGl6ZW1ldGhvZCk7CiAgICAgfQogCiAgICAgX3NldF9yZXN1bHQoY29udGV4dCwgZnVuY3Rpb25fcmVzdWx0KTsKKworZXJyb3I6CiAgICAgUHlfWERFQ1JFRigqYWdncmVnYXRlX2luc3RhbmNlKTsKICAgICBQeV9YREVDUkVGKGZ1bmN0aW9uX3Jlc3VsdCk7CiAKICAgICBQeUdJTFN0YXRlX1JlbGVhc2UodGhyZWFkc3RhdGUpOwogfQogCit2b2lkIF9kcm9wX3VudXNlZF9zdGF0ZW1lbnRfcmVmZXJlbmNlcyhDb25uZWN0aW9uKiBzZWxmKQoreworICAgIFB5T2JqZWN0KiBuZXdfbGlzdDsKKyAgICBQeU9iamVjdCogd2Vha3JlZjsKKyAgICBpbnQgaTsKKworICAgIC8qIHdlIG9ubHkgbmVlZCB0byBkbyB0aGlzIG9uY2UgaW4gYSB3aGlsZSAqLworICAgIGlmIChzZWxmLT5jcmVhdGVkX3N0YXRlbWVudHMrKyA8IDIwMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2VsZi0+Y3JlYXRlZF9zdGF0ZW1lbnRzID0gMDsKKworICAgIG5ld19saXN0ID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAoIW5ld19saXN0KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlMaXN0X1NpemUoc2VsZi0+c3RhdGVtZW50cyk7IGkrKykgeworICAgICAgICB3ZWFrcmVmID0gUHlMaXN0X0dldEl0ZW0oc2VsZi0+c3RhdGVtZW50cywgaSk7CisgICAgICAgIGlmICh3ZWFrcmVmICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKG5ld19saXN0LCB3ZWFrcmVmKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ld19saXN0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBQeV9ERUNSRUYoc2VsZi0+c3RhdGVtZW50cyk7CisgICAgc2VsZi0+c3RhdGVtZW50cyA9IG5ld19saXN0OworfQogCiBQeU9iamVjdCogY29ubmVjdGlvbl9jcmVhdGVfZnVuY3Rpb24oQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCiB7CkBAIC02MTcsMTAgKzY2MCwxNiBAQAogCiAgICAgcmMgPSBzcWxpdGUzX2NyZWF0ZV9mdW5jdGlvbihzZWxmLT5kYiwgbmFtZSwgbmFyZywgU1FMSVRFX1VURjgsICh2b2lkKilmdW5jLCBfZnVuY19jYWxsYmFjaywgTlVMTCwgTlVMTCk7CiAKLSAgICBQeURpY3RfU2V0SXRlbShzZWxmLT5mdW5jdGlvbl9waW5ib2FyZCwgZnVuYywgUHlfTm9uZSk7CisgICAgaWYgKHJjICE9IFNRTElURV9PSykgeworICAgICAgICAvKiBXb3JrYXJvdW5kIGZvciBTUUxpdGUgYnVnOiBubyBlcnJvciBjb2RlIG9yIHN0cmluZyBpcyBhdmFpbGFibGUgaGVyZSAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoT3BlcmF0aW9uYWxFcnJvciwgIkVycm9yIGNyZWF0aW5nIGZ1bmN0aW9uIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5RGljdF9TZXRJdGVtKHNlbGYtPmZ1bmN0aW9uX3BpbmJvYXJkLCBmdW5jLCBQeV9Ob25lKTsKIAotICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CiB9CiAKIFB5T2JqZWN0KiBjb25uZWN0aW9uX2NyZWF0ZV9hZ2dyZWdhdGUoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCkBAIC02MzksNyArNjg4LDggQEAKIAogICAgIHJjID0gc3FsaXRlM19jcmVhdGVfZnVuY3Rpb24oc2VsZi0+ZGIsIG5hbWUsIG5fYXJnLCBTUUxJVEVfVVRGOCwgKHZvaWQqKWFnZ3JlZ2F0ZV9jbGFzcywgMCwgJl9zdGVwX2NhbGxiYWNrLCAmX2ZpbmFsX2NhbGxiYWNrKTsKICAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7Ci0gICAgICAgIF9zZXRlcnJvcihzZWxmLT5kYik7CisgICAgICAgIC8qIFdvcmthcm91bmQgZm9yIFNRTGl0ZSBidWc6IG5vIGVycm9yIGNvZGUgb3Igc3RyaW5nIGlzIGF2YWlsYWJsZSBoZXJlICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhPcGVyYXRpb25hbEVycm9yLCAiRXJyb3IgY3JlYXRpbmcgYWdncmVnYXRlIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0gZWxzZSB7CiAgICAgICAgIFB5RGljdF9TZXRJdGVtKHNlbGYtPmZ1bmN0aW9uX3BpbmJvYXJkLCBhZ2dyZWdhdGVfY2xhc3MsIFB5X05vbmUpOwpAQCAtNjgyLDcgKzczMiw2IEBACiAKIHN0YXRpYyBpbnQgY29ubmVjdGlvbl9zZXRfaXNvbGF0aW9uX2xldmVsKENvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBpc29sYXRpb25fbGV2ZWwpCiB7Ci0gICAgUHlPYmplY3QqIGVtcHR5OwogICAgIFB5T2JqZWN0KiByZXM7CiAgICAgUHlPYmplY3QqIGJlZ2luX3N0YXRlbWVudDsKIApAQCAtNjk3LDE1ICs3NDYsMTAgQEAKICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgICBzZWxmLT5pc29sYXRpb25fbGV2ZWwgPSBQeV9Ob25lOwogCi0gICAgICAgIGVtcHR5ID0gUHlUdXBsZV9OZXcoMCk7Ci0gICAgICAgIGlmICghZW1wdHkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXMgPSBjb25uZWN0aW9uX2NvbW1pdChzZWxmLCBlbXB0eSk7CisgICAgICAgIHJlcyA9IGNvbm5lY3Rpb25fY29tbWl0KHNlbGYsIE5VTEwpOwogICAgICAgICBpZiAoIXJlcykgewogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9Ci0gICAgICAgIFB5X0RFQ1JFRihlbXB0eSk7CiAgICAgICAgIFB5X0RFQ1JFRihyZXMpOwogCiAgICAgICAgIHNlbGYtPmluVHJhbnNhY3Rpb24gPSAwOwpAQCAtNzM4LDEyICs3ODIsMTUgQEAKIHsKICAgICBQeU9iamVjdCogc3FsOwogICAgIFN0YXRlbWVudCogc3RhdGVtZW50OworICAgIFB5T2JqZWN0KiB3ZWFrcmVmOwogICAgIGludCByYzsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyIsICZzcWwpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAorICAgIF9kcm9wX3VudXNlZF9zdGF0ZW1lbnRfcmVmZXJlbmNlcyhzZWxmKTsKKwogICAgIHN0YXRlbWVudCA9IFB5T2JqZWN0X05ldyhTdGF0ZW1lbnQsICZTdGF0ZW1lbnRUeXBlKTsKICAgICBpZiAoIXN0YXRlbWVudCkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTc2Miw4ICs4MDksMjQgQEAKIAogICAgICAgICBQeV9ERUNSRUYoc3RhdGVtZW50KTsKICAgICAgICAgc3RhdGVtZW50ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICB3ZWFrcmVmID0gUHlXZWFrcmVmX05ld1JlZigoUHlPYmplY3QqKXN0YXRlbWVudCwgTlVMTCk7CisgICAgICAgIGlmICghd2Vha3JlZikgeworICAgICAgICAgICAgUHlfREVDUkVGKHN0YXRlbWVudCk7CisgICAgICAgICAgICBzdGF0ZW1lbnQgPSAwOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKHNlbGYtPnN0YXRlbWVudHMsIHdlYWtyZWYpICE9IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3ZWFrcmVmKTsKKyAgICAgICAgICAgIHN0YXRlbWVudCA9IDA7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKyAgICAgICAgUHlfREVDUkVGKHdlYWtyZWYpOwogICAgIH0KIAorZXJyb3I6CiAgICAgcmV0dXJuIChQeU9iamVjdCopc3RhdGVtZW50OwogfQogCkBAIC05ODMsNyArMTA0Niw3IEBACiB9CiAKIHN0YXRpYyBjaGFyIGNvbm5lY3Rpb25fZG9jW10gPQotUHlEb2NfU1RSKCI8bWlzc2luZyBkb2NzdHJpbmc+Iik7CitQeURvY19TVFIoIlNRTGl0ZSBkYXRhYmFzZSBjb25uZWN0aW9uIG9iamVjdC4iKTsKIAogc3RhdGljIFB5R2V0U2V0RGVmIGNvbm5lY3Rpb25fZ2V0c2V0W10gPSB7CiAgICAgeyJpc29sYXRpb25fbGV2ZWwiLCAgKGdldHRlciljb25uZWN0aW9uX2dldF9pc29sYXRpb25fbGV2ZWwsIChzZXR0ZXIpY29ubmVjdGlvbl9zZXRfaXNvbGF0aW9uX2xldmVsfSwKQEAgLTEwMTEsNyArMTA3NCw3IEBACiAgICAgeyJleGVjdXRlc2NyaXB0IiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fZXhlY3V0ZXNjcmlwdCwgTUVUSF9WQVJBUkdTLAogICAgICAgICBQeURvY19TVFIoIkV4ZWN1dGVzIGEgbXVsdGlwbGUgU1FMIHN0YXRlbWVudHMgYXQgb25jZS4gTm9uLXN0YW5kYXJkLiIpfSwKICAgICB7ImNyZWF0ZV9jb2xsYXRpb24iLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9jcmVhdGVfY29sbGF0aW9uLCBNRVRIX1ZBUkFSR1MsCi0gICAgICAgIFB5RG9jX1NUUigiQ3JlYXRlcyBhIGNvbGxhdGlvbiBmdW5jdGlvbi4iKX0sCisgICAgICAgIFB5RG9jX1NUUigiQ3JlYXRlcyBhIGNvbGxhdGlvbiBmdW5jdGlvbi4gTm9uLXN0YW5kYXJkLiIpfSwKICAgICB7TlVMTCwgTlVMTH0KIH07CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmggYi9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5oCmluZGV4IGZhYWU2ZTQuLjhmNGQzNmUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmgKKysrIGIvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uaApAQCAtMSw2ICsxLDYgQEAKIC8qIGNvbm5lY3Rpb24uaCAtIGRlZmluaXRpb25zIGZvciB0aGUgY29ubmVjdGlvbiB0eXBlCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgogICoKQEAgLTM3LDcgKzM3LDEyIEBACiAgICAgUHlPYmplY3RfSEVBRAogICAgIHNxbGl0ZTMqIGRiOwogCisgICAgLyogMSBpZiB3ZSBhcmUgY3VycmVudGx5IHdpdGhpbiBhIHRyYW5zYWN0aW9uLCBpLiBlLiBpZiBhIEJFR0lOIGhhcyBiZWVuCisgICAgICogaXNzdWVkICovCiAgICAgaW50IGluVHJhbnNhY3Rpb247CisKKyAgICAvKiB0aGUgdHlwZSBkZXRlY3Rpb24gbW9kZS4gT25seSAwLCBQQVJTRV9ERUNMVFlQRVMsIFBBUlNFX0NPTE5BTUVTIG9yIGEKKyAgICAgKiBiaXR3aXNlIGNvbWJpbmF0aW9uIHRoZXJlb2YgbWFrZXMgc2Vuc2UgKi8KICAgICBpbnQgZGV0ZWN0X3R5cGVzOwogCiAgICAgLyogdGhlIHRpbWVvdXQgdmFsdWUgaW4gc2Vjb25kcyBmb3IgZGF0YWJhc2UgbG9ja3MgKi8KQEAgLTU0LDEzICs1OSwzMSBAQAogICAgICAqIGZyZWVkIGluIGNvbm5lY3Rpb24gZGVzdHJ1Y3RvciAqLwogICAgIGNoYXIqIGJlZ2luX3N0YXRlbWVudDsKIAorICAgIC8qIDEgaWYgYSBjaGVjayBzaG91bGQgYmUgcGVyZm9ybWVkIGZvciBlYWNoIEFQSSBjYWxsIGlmIHRoZSBjb25uZWN0aW9uIGlzCisgICAgICogdXNlZCBmcm9tIHRoZSBzYW1lIHRocmVhZCBpdCB3YXMgY3JlYXRlZCBpbiAqLwogICAgIGludCBjaGVja19zYW1lX3RocmVhZDsKKworICAgIC8qIHRocmVhZCBpZGVudGlmaWNhdGlvbiBvZiB0aGUgdGhyZWFkIHRoZSBjb25uZWN0aW9uIHdhcyBjcmVhdGVkIGluICovCiAgICAgbG9uZyB0aHJlYWRfaWRlbnQ7CiAKICAgICBDYWNoZSogc3RhdGVtZW50X2NhY2hlOwogCisgICAgLyogQSBsaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyB0byBzdGF0ZW1lbnRzIHVzZWQgd2l0aGluIHRoaXMgY29ubmVjdGlvbiAqLworICAgIFB5T2JqZWN0KiBzdGF0ZW1lbnRzOworCisgICAgLyogYSBjb3VudGVyIGZvciBob3cgbWFueSBzdGF0ZW1lbnRzIHdlcmUgY3JlYXRlZCBpbiB0aGUgY29ubmVjdGlvbi4gTWF5IGJlCisgICAgICogcmVzZXQgdG8gMCBhdCBjZXJ0YWluIGludGVydmFscyAqLworICAgIGludCBjcmVhdGVkX3N0YXRlbWVudHM7CisKICAgICBQeU9iamVjdCogcm93X2ZhY3Rvcnk7CiAKKyAgICAvKiBEZXRlcm1pbmVzIGhvdyBieXRlc3RyaW5ncyBmcm9tIFNRTGl0ZSBhcmUgY29udmVydGVkIHRvIFB5dGhvbiBvYmplY3RzOgorICAgICAqIC0gUHlVbmljb2RlX1R5cGU6ICAgICAgICBQeXRob24gVW5pY29kZSBvYmplY3RzIGFyZSBjb25zdHJ1Y3RlZCBmcm9tIFVURi04IGJ5dGVzdHJpbmdzCisgICAgICogLSBPcHRpbWl6ZWRVbmljb2RlOiAgICAgIExpa2UgYmVmb3JlLCBidXQgZm9yIEFTQ0lJIGRhdGEsIG9ubHkgUHlTdHJpbmdzIGFyZSBjcmVhdGVkLgorICAgICAqIC0gUHlTdHJpbmdfVHlwZTogICAgICAgICBQeVN0cmluZ3MgYXJlIGNyZWF0ZWQgYXMtaXMuCisgICAgICogLSBBbnkgY3VzdG9tIGNhbGxhYmxlOiAgIEFueSBvYmplY3QgcmV0dXJuZWQgZnJvbSB0aGUgY2FsbGFibGUgY2FsbGVkIHdpdGggdGhlIGJ5dGVzdHJpbmcKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgc2luZ2xlIHBhcmFtZXRlci4KKyAgICAgKi8KICAgICBQeU9iamVjdCogdGV4dF9mYWN0b3J5OwogCiAgICAgLyogcmVtZW1iZXIgcmVmZXJlbmNlcyB0byBmdW5jdGlvbnMvY2xhc3NlcyB1c2VkIGluCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvY29udmVydGVycy5jIGIvTW9kdWxlcy9fc3FsaXRlL2NvbnZlcnRlcnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE4MDYzYS4uMDAwMDAwMAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvY29udmVydGVycy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyogY29udmVydGVycy5jIC0gZGVmYXVsdCBjb252ZXJ0ZXJzCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA1IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwotICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLSAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLSAqCi0gKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAotICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKLSAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLSAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCi0gKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgotICovCi0KLSNpbmNsdWRlICJ1dGlsLmgiCi0jaW5jbHVkZSAibW9kdWxlLmgiCi0jaW5jbHVkZSAiYWRhcHRlcnMuaCIKLQotLyogZHVtbXksIHdpbGwgYmUgaW1wbGVtZW50ZWQgaW4gYSBsYXRlciB2ZXJzaW9uICovCi0KLVB5T2JqZWN0KiBjb252ZXJ0X2RhdGUoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQotewotICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICByZXR1cm4gUHlfTm9uZTsKLX0KLQotUHlPYmplY3QqIGNvbnZlcnRfdGltZXN0YW1wKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKLXsKLSAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgcmV0dXJuIFB5X05vbmU7Ci19CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvY29udmVydGVycy5oIGIvTW9kdWxlcy9fc3FsaXRlL2NvbnZlcnRlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYzNzY4YS4uMDAwMDAwMAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvY29udmVydGVycy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyogY29udmVydGVycy5oIC0gZGVmYXVsdCBjb252ZXJ0ZXJzCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA1IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwotICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLSAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLSAqCi0gKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAotICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKLSAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLSAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCi0gKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgotICovCi0KLSNpZm5kZWYgUFlTUUxJVEVfQ09OVkVSVEVSU19ICi0jZGVmaW5lIFBZU1FMSVRFX0NPTlZFUlRFUlNfSAotI2luY2x1ZGUgIlB5dGhvbi5oIgotI2luY2x1ZGUgInB5dGhyZWFkLmgiCi0jaW5jbHVkZSAic3FsaXRlMy5oIgotCi1QeU9iamVjdCogY29udmVydF9kYXRlKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncyk7Ci1QeU9iamVjdCogY29udmVydF90aW1lc3RhbXAoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmMgYi9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmMKaW5kZXggYzZiOGM3Ny4uNmVlOGJlYSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5jCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuYwpAQCAtMjcsOCArMjcsMTIgQEAKICNpbmNsdWRlICJzcWxpdGVjb21wYXQuaCIKIAogLyogdXNlZCB0byBkZWNpZGUgd2V0aGVyIHRvIGNhbGwgUHlJbnRfRnJvbUxvbmcgb3IgUHlMb25nX0Zyb21Mb25nTG9uZyAqLworI2lmbmRlZiBJTlQzMl9NSU4KICNkZWZpbmUgSU5UMzJfTUlOICgtMjE0NzQ4MzY0NyAtIDEpCisjZW5kaWYKKyNpZm5kZWYgSU5UMzJfTUFYCiAjZGVmaW5lIElOVDMyX01BWCAyMTQ3NDgzNjQ3CisjZW5kaWYKIAogUHlPYmplY3QqIGN1cnNvcl9pdGVybmV4dChDdXJzb3IgKnNlbGYpOwogCkBAIC0xNTcsMjQgKzE2MSwyNCBAQAogCiAgICAgICAgIGlmIChzZWxmLT5jb25uZWN0aW9uLT5kZXRlY3RfdHlwZXMgfCBQQVJTRV9DT0xOQU1FUykgewogICAgICAgICAgICAgY29sbmFtZSA9IHNxbGl0ZTNfY29sdW1uX25hbWUoc2VsZi0+c3RhdGVtZW50LT5zdCwgaSk7CisgICAgICAgICAgICBpZiAoY29sbmFtZSkgeworICAgICAgICAgICAgICAgIGZvciAocG9zID0gY29sbmFtZTsgKnBvcyAhPSAwOyBwb3MrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoKnBvcyA9PSAnWycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfc3RhcnQgPSBwb3MgKyAxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCpwb3MgPT0gJ10nICYmIHR5cGVfc3RhcnQgIT0gKGNvbnN0IGNoYXIqKS0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSh0eXBlX3N0YXJ0LCBwb3MgLSB0eXBlX3N0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgha2V5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3JlYXRpbmcgYSBzdHJpbmcgZmFpbGVkLCBidXQgaXQgaXMgdG9vIGNvbXBsaWNhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdG8gcHJvcGFnYXRlIHRoZSBlcnJvciBoZXJlLCB3ZSBqdXN0IGFzc3VtZSB0aGVyZSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG5vIGNvbnZlcnRlciBhbmQgcHJvY2VlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmb3IgKHBvcyA9IGNvbG5hbWU7ICpwb3MgIT0gMDsgcG9zKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoKnBvcyA9PSAnWycpIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZV9zdGFydCA9IHBvcyArIDE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgqcG9zID09ICddJyAmJiB0eXBlX3N0YXJ0ICE9IChjb25zdCBjaGFyKiktMSkgewotICAgICAgICAgICAgICAgICAgICBrZXkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSh0eXBlX3N0YXJ0LCBwb3MgLSB0eXBlX3N0YXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFrZXkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNyZWF0aW5nIGEgc3RyaW5nIGZhaWxlZCwgYnV0IGl0IGlzIHRvbyBjb21wbGljYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICogdG8gcHJvcGFnYXRlIHRoZSBlcnJvciBoZXJlLCB3ZSBqdXN0IGFzc3VtZSB0aGVyZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICogbm8gY29udmVydGVyIGFuZCBwcm9jZWVkICovCisgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIgPSBQeURpY3RfR2V0SXRlbShjb252ZXJ0ZXJzLCBrZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlciA9IFB5RGljdF9HZXRJdGVtKGNvbnZlcnRlcnMsIGtleSk7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yNzYsNiArMjgwLDcgQEAKICAgICB2b2lkKiByYXdfYnVmZmVyOwogICAgIGNvbnN0IGNoYXIqIHZhbF9zdHI7CiAgICAgY2hhciBidWZbMjAwXTsKKyAgICBjb25zdCBjaGFyKiBjb2xuYW1lOwogCiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgIG51bWNvbHMgPSBzcWxpdGUzX2RhdGFfY291bnQoc2VsZi0+c3RhdGVtZW50LT5zdCk7CkBAIC0zNDAsOCArMzQ1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5jb25uZWN0aW9uLT50ZXh0X2ZhY3RvcnkgPT0gT3B0aW1pemVkVW5pY29kZSA/IDEgOiAwKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnZlcnRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZSA9IHNxbGl0ZTNfY29sdW1uX25hbWUoc2VsZi0+c3RhdGVtZW50LT5zdCwgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sbmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWUgPSAiPHVua25vd24gY29sdW1uIG5hbWU+IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSAtIDEsICJDb3VsZCBub3QgZGVjb2RlIHRvIFVURi04IGNvbHVtbiAlcyB3aXRoIHRleHQgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FsaXRlM19jb2x1bW5fbmFtZShzZWxmLT5zdGF0ZW1lbnQtPnN0LCBpKSwgdmFsX3N0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbmFtZSAsIHZhbF9zdHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKE9wZXJhdGlvbmFsRXJyb3IsIGJ1Zik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGYtPmNvbm5lY3Rpb24tPnRleHRfZmFjdG9yeSA9PSAoUHlPYmplY3QqKSZQeVN0cmluZ19UeXBlKSB7CkBAIC00MTksOCArNDI4LDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qIHNlcXVlbmNlICovCiAgICAgICAgICAgICBwYXJhbWV0ZXJzX2l0ZXIgPSBQeU9iamVjdF9HZXRJdGVyKHNlY29uZF9hcmd1bWVudCk7Ci0gICAgICAgICAgICBpZiAoIXBhcmFtZXRlcnNfaXRlcikKLSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghcGFyYW1ldGVyc19pdGVyKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTUwNiwxMiArNTE0LDcgQEAKICAgICAgICAgICAgICAgICAvKiBpdCdzIGEgRERMIHN0YXRlbWVudCBvciBzb21ldGhpbmcgc2ltaWxhcgogICAgICAgICAgICAgICAgICAgIC0gd2UgYmV0dGVyIENPTU1JVCBmaXJzdCBzbyBpdCB3b3JrcyBmb3IgYWxsIGNhc2VzICovCiAgICAgICAgICAgICAgICAgaWYgKHNlbGYtPmNvbm5lY3Rpb24tPmluVHJhbnNhY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgZnVuY19hcmdzID0gUHlUdXBsZV9OZXcoMCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZnVuY19hcmdzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbm5lY3Rpb25fY29tbWl0KHNlbGYtPmNvbm5lY3Rpb24sIGZ1bmNfYXJncyk7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jX2FyZ3MpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjb25uZWN0aW9uX2NvbW1pdChzZWxmLT5jb25uZWN0aW9uLCBOVUxMKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTcwMSw3ICs3MDQsNiBAQAogICAgIGNvbnN0IGNoYXIqIHNjcmlwdF9jc3RyOwogICAgIHNxbGl0ZTNfc3RtdCogc3RhdGVtZW50OwogICAgIGludCByYzsKLSAgICBQeU9iamVjdCogZnVuY19hcmdzOwogICAgIFB5T2JqZWN0KiByZXN1bHQ7CiAgICAgaW50IHN0YXRlbWVudF9jb21wbGV0ZWQgPSAwOwogCkBAIC03MjgsMTIgKzczMCw3IEBACiAgICAgfQogCiAgICAgLyogY29tbWl0IGZpcnN0ICovCi0gICAgZnVuY19hcmdzID0gUHlUdXBsZV9OZXcoMCk7Ci0gICAgaWYgKCFmdW5jX2FyZ3MpIHsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0gICAgcmVzdWx0ID0gY29ubmVjdGlvbl9jb21taXQoc2VsZi0+Y29ubmVjdGlvbiwgZnVuY19hcmdzKTsKLSAgICBQeV9ERUNSRUYoZnVuY19hcmdzKTsKKyAgICByZXN1bHQgPSBjb25uZWN0aW9uX2NvbW1pdChzZWxmLT5jb25uZWN0aW9uLCBOVUxMKTsKICAgICBpZiAoIXJlc3VsdCkgewogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KQEAgLTk3Nyw2ICs5NzQsOSBAQAogICAgIHtOVUxMfQogfTsKIAorc3RhdGljIGNoYXIgY3Vyc29yX2RvY1tdID0KK1B5RG9jX1NUUigiU1FMaXRlIGRhdGFiYXNlIGN1cnNvciBjbGFzcy4iKTsKKwogUHlUeXBlT2JqZWN0IEN1cnNvclR5cGUgPSB7CiAgICAgICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQogICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvYl9zaXplICovCkBAIC05OTksNyArOTk5LDcgQEAKICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAgICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0hBVkVfSVRFUnxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAgICAgY3Vyc29yX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCiAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCiAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmggYi9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmgKaW5kZXggN2Y1Njc5OS4uODMxZmY4MSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5oCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuaApAQCAtMSw2ICsxLDYgQEAKIC8qIGN1cnNvci5oIC0gZGVmaW5pdGlvbnMgZm9yIHRoZSBjdXJzb3IgdHlwZQogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KICAqCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvbWljcm9wcm90b2NvbHMuaCBiL01vZHVsZXMvX3NxbGl0ZS9taWNyb3Byb3RvY29scy5oCmluZGV4IGQyZDliNjUuLmY2MDFiYjMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9taWNyb3Byb3RvY29scy5oCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9taWNyb3Byb3RvY29scy5oCkBAIC01NCw2ICs1NCw2IEBACiBleHRlcm4gUHlPYmplY3QgKgogICAgIHBzeWNvX21pY3JvcHJvdG9jb2xzX2FkYXB0KEN1cnNvciogc2VsZiwgUHlPYmplY3QgKmFyZ3MpOyAgIAogI2RlZmluZSBwc3ljb19taWNyb3Byb3RvY29sc19hZGFwdF9kb2MgXAotICAgICJhZGFwdChvYmosIHByb3RvY29sLCBhbHRlcm5hdGUpIC0+IGFkYXB0IG9iaiB0byBnaXZlbiBwcm90b2NvbCIKLSAgICAKKyAgICAiYWRhcHQob2JqLCBwcm90b2NvbCwgYWx0ZXJuYXRlKSAtPiBhZGFwdCBvYmogdG8gZ2l2ZW4gcHJvdG9jb2wuIE5vbi1zdGFuZGFyZC4iCisKICNlbmRpZiAvKiAhZGVmaW5lZChQU1lDT1BHX01JQ1JPUFJPVE9DT0xTX0gpICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmMgYi9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmMKaW5kZXggMTUzN2U3OS4uZmI2ZWIwNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5jCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuYwpAQCAtMTY3LDEyICsxNjcsMTIgQEAKIAogc3RhdGljIFB5TWV0aG9kRGVmIG1vZHVsZV9tZXRob2RzW10gPSB7CiAgICAgeyJjb25uZWN0IiwgIChQeUNGdW5jdGlvbiltb2R1bGVfY29ubmVjdCwgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBQeURvY19TVFIoIkNyZWF0ZXMgYSBjb25uZWN0aW9uLiIpfSwKLSAgICB7ImNvbXBsZXRlX3N0YXRlbWVudCIsICAoUHlDRnVuY3Rpb24pbW9kdWxlX2NvbXBsZXRlLCAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIFB5RG9jX1NUUigiQ2hlY2tzIGlmIGEgc3RyaW5nIGNvbnRhaW5zIGEgY29tcGxldGUgU1FMIHN0YXRlbWVudC4iKX0sCisgICAgeyJjb21wbGV0ZV9zdGF0ZW1lbnQiLCAgKFB5Q0Z1bmN0aW9uKW1vZHVsZV9jb21wbGV0ZSwgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBQeURvY19TVFIoIkNoZWNrcyBpZiBhIHN0cmluZyBjb250YWlucyBhIGNvbXBsZXRlIFNRTCBzdGF0ZW1lbnQuIE5vbi1zdGFuZGFyZC4iKX0sCiAjaWZkZWYgSEFWRV9TSEFSRURfQ0FDSEUKLSAgICB7ImVuYWJsZV9zaGFyZWRfY2FjaGUiLCAgKFB5Q0Z1bmN0aW9uKW1vZHVsZV9lbmFibGVfc2hhcmVkX2NhY2hlLCAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIFB5RG9jX1NUUigiRW5hYmxlIG9yIGRpc2FibGUgc2hhcmVkIGNhY2hlIG1vZGUgZm9yIHRoZSBjYWxsaW5nIHRocmVhZC4iKX0sCisgICAgeyJlbmFibGVfc2hhcmVkX2NhY2hlIiwgIChQeUNGdW5jdGlvbiltb2R1bGVfZW5hYmxlX3NoYXJlZF9jYWNoZSwgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBQeURvY19TVFIoIkVuYWJsZSBvciBkaXNhYmxlIHNoYXJlZCBjYWNoZSBtb2RlIGZvciB0aGUgY2FsbGluZyB0aHJlYWQuIEV4cGVyaW1lbnRhbC9Ob24tc3RhbmRhcmQuIil9LAogI2VuZGlmCi0gICAgeyJyZWdpc3Rlcl9hZGFwdGVyIiwgKFB5Q0Z1bmN0aW9uKW1vZHVsZV9yZWdpc3Rlcl9hZGFwdGVyLCBNRVRIX1ZBUkFSR1MsIFB5RG9jX1NUUigiUmVnaXN0ZXJzIGFuIGFkYXB0ZXIgd2l0aCBzcWxpdGUncyBhZGFwdGVyIHJlZ2lzdHJ5LiIpfSwKLSAgICB7InJlZ2lzdGVyX2NvbnZlcnRlciIsIChQeUNGdW5jdGlvbiltb2R1bGVfcmVnaXN0ZXJfY29udmVydGVyLCBNRVRIX1ZBUkFSR1MsIFB5RG9jX1NUUigiUmVnaXN0ZXJzIGEgY29udmVydGVyIHdpdGggc3FsaXRlLiIpfSwKKyAgICB7InJlZ2lzdGVyX2FkYXB0ZXIiLCAoUHlDRnVuY3Rpb24pbW9kdWxlX3JlZ2lzdGVyX2FkYXB0ZXIsIE1FVEhfVkFSQVJHUywgUHlEb2NfU1RSKCJSZWdpc3RlcnMgYW4gYWRhcHRlciB3aXRoIHB5c3FsaXRlJ3MgYWRhcHRlciByZWdpc3RyeS4gTm9uLXN0YW5kYXJkLiIpfSwKKyAgICB7InJlZ2lzdGVyX2NvbnZlcnRlciIsIChQeUNGdW5jdGlvbiltb2R1bGVfcmVnaXN0ZXJfY29udmVydGVyLCBNRVRIX1ZBUkFSR1MsIFB5RG9jX1NUUigiUmVnaXN0ZXJzIGEgY29udmVydGVyIHdpdGggcHlzcWxpdGUuIE5vbi1zdGFuZGFyZC4iKX0sCiAgICAgeyJhZGFwdCIsICAoUHlDRnVuY3Rpb24pcHN5Y29fbWljcm9wcm90b2NvbHNfYWRhcHQsIE1FVEhfVkFSQVJHUywgcHN5Y29fbWljcm9wcm90b2NvbHNfYWRhcHRfZG9jfSwKICAgICB7TlVMTCwgTlVMTH0KIH07CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmggYi9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmgKaW5kZXggNjY5NDczNS4uZjNlMmFhMSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5oCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuaApAQCAtMSw2ICsxLDYgQEAKIC8qIG1vZHVsZS5oIC0gZGVmaW5pdGlvbnMgZm9yIHRoZSBtb2R1bGUKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiAgKgpAQCAtMjUsNyArMjUsNyBAQAogI2RlZmluZSBQWVNRTElURV9NT0RVTEVfSAogI2luY2x1ZGUgIlB5dGhvbi5oIgogCi0jZGVmaW5lIFBZU1FMSVRFX1ZFUlNJT04gIjIuMi4wIgorI2RlZmluZSBQWVNRTElURV9WRVJTSU9OICIyLjIuMiIKIAogZXh0ZXJuIFB5T2JqZWN0KiBFcnJvcjsKIGV4dGVybiBQeU9iamVjdCogV2FybmluZzsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9zdGF0ZW1lbnQuYyBiL01vZHVsZXMvX3NxbGl0ZS9zdGF0ZW1lbnQuYwppbmRleCAwYzkzNjUxLi41NTkyM2U3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvc3RhdGVtZW50LmMKKysrIGIvTW9kdWxlcy9fc3FsaXRlL3N0YXRlbWVudC5jCkBAIC02NCw2ICs2NCw3IEBACiAgICAgICAgIHJldHVybiByYzsKICAgICB9CiAKKyAgICBzZWxmLT5pbl93ZWFrcmVmbGlzdCA9IE5VTEw7CiAgICAgc2VsZi0+c3FsID0gc3FsX3N0cjsKIAogICAgIHNxbF9jc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcoc3FsX3N0cik7CkBAIC0zMDQsNiArMzA1LDEwIEBACiAKICAgICBQeV9YREVDUkVGKHNlbGYtPnNxbCk7CiAKKyAgICBpZiAoc2VsZi0+aW5fd2Vha3JlZmxpc3QgIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCopc2VsZik7CisgICAgfQorCiAgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QqKXNlbGYpOwogfQogCkBAIC0zOTgsMTIgKzQwMywxMiBAQAogICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwogICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwogICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KLSAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLCAgLyogdHBfZmxhZ3MgKi8KICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCiAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCiAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgICAgIG9mZnNldG9mKFN0YXRlbWVudCwgaW5fd2Vha3JlZmxpc3QpLCAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL3N0YXRlbWVudC5oIGIvTW9kdWxlcy9fc3FsaXRlL3N0YXRlbWVudC5oCmluZGV4IGU0NWEwZmMuLjU3ZWUzNmYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9zdGF0ZW1lbnQuaAorKysgYi9Nb2R1bGVzL19zcWxpdGUvc3RhdGVtZW50LmgKQEAgLTM4LDYgKzM4LDcgQEAKICAgICBzcWxpdGUzX3N0bXQqIHN0OwogICAgIFB5T2JqZWN0KiBzcWw7CiAgICAgaW50IGluX3VzZTsKKyAgICBQeU9iamVjdCogaW5fd2Vha3JlZmxpc3Q7IC8qIExpc3Qgb2Ygd2VhayByZWZlcmVuY2VzICovCiB9IFN0YXRlbWVudDsKIAogZXh0ZXJuIFB5VHlwZU9iamVjdCBTdGF0ZW1lbnRUeXBlOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3JlLmMgYi9Nb2R1bGVzL19zcmUuYwppbmRleCA0YWYwOGVkLi4wNmFjYjY4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcmUuYworKysgYi9Nb2R1bGVzL19zcmUuYwpAQCAtMjU0LDcgKzI1NCw3IEBACiBkYXRhX3N0YWNrX2RlYWxsb2MoU1JFX1NUQVRFKiBzdGF0ZSkKIHsKICAgICBpZiAoc3RhdGUtPmRhdGFfc3RhY2spIHsKLSAgICAgICAgZnJlZShzdGF0ZS0+ZGF0YV9zdGFjayk7CisgICAgICAgIFB5TWVtX0ZSRUUoc3RhdGUtPmRhdGFfc3RhY2spOwogICAgICAgICBzdGF0ZS0+ZGF0YV9zdGFjayA9IE5VTEw7CiAgICAgfQogICAgIHN0YXRlLT5kYXRhX3N0YWNrX3NpemUgPSBzdGF0ZS0+ZGF0YV9zdGFja19iYXNlID0gMDsKQEAgLTI3MCw3ICsyNzAsNyBAQAogICAgICAgICB2b2lkKiBzdGFjazsKICAgICAgICAgY3Vyc2l6ZSA9IG1pbnNpemUrbWluc2l6ZS80KzEwMjQ7CiAgICAgICAgIFRSQUNFKCgiYWxsb2NhdGUvZ3JvdyBzdGFjayAlZFxuIiwgY3Vyc2l6ZSkpOwotICAgICAgICBzdGFjayA9IHJlYWxsb2Moc3RhdGUtPmRhdGFfc3RhY2ssIGN1cnNpemUpOworICAgICAgICBzdGFjayA9IFB5TWVtX1JFQUxMT0Moc3RhdGUtPmRhdGFfc3RhY2ssIGN1cnNpemUpOwogICAgICAgICBpZiAoIXN0YWNrKSB7CiAgICAgICAgICAgICBkYXRhX3N0YWNrX2RlYWxsb2Moc3RhdGUpOwogICAgICAgICAgICAgcmV0dXJuIFNSRV9FUlJPUl9NRU1PUlk7CkBAIC0xMTYzLDcgKzExNjMsNyBAQAogICAgICAgICAgICAgICAgICAgIGN0eC0+cGF0dGVyblsxXSwgY3R4LT5wYXR0ZXJuWzJdKSk7CiAKICAgICAgICAgICAgIC8qIGluc3RhbGwgbmV3IHJlcGVhdCBjb250ZXh0ICovCi0gICAgICAgICAgICBjdHgtPnUucmVwID0gKFNSRV9SRVBFQVQqKSBtYWxsb2Moc2l6ZW9mKCpjdHgtPnUucmVwKSk7CisgICAgICAgICAgICBjdHgtPnUucmVwID0gKFNSRV9SRVBFQVQqKSBQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKCpjdHgtPnUucmVwKSk7CiAgICAgICAgICAgICBjdHgtPnUucmVwLT5jb3VudCA9IC0xOwogICAgICAgICAgICAgY3R4LT51LnJlcC0+cGF0dGVybiA9IGN0eC0+cGF0dGVybjsKICAgICAgICAgICAgIGN0eC0+dS5yZXAtPnByZXYgPSBzdGF0ZS0+cmVwZWF0OwpAQCAtMTE3Myw3ICsxMTczLDcgQEAKICAgICAgICAgICAgIHN0YXRlLT5wdHIgPSBjdHgtPnB0cjsKICAgICAgICAgICAgIERPX0pVTVAoSlVNUF9SRVBFQVQsIGp1bXBfcmVwZWF0LCBjdHgtPnBhdHRlcm4rY3R4LT5wYXR0ZXJuWzBdKTsKICAgICAgICAgICAgIHN0YXRlLT5yZXBlYXQgPSBjdHgtPnUucmVwLT5wcmV2OwotICAgICAgICAgICAgZnJlZShjdHgtPnUucmVwKTsKKyAgICAgICAgICAgIFB5T2JqZWN0X0ZSRUUoY3R4LT51LnJlcCk7CiAKICAgICAgICAgICAgIGlmIChyZXQpIHsKICAgICAgICAgICAgICAgICBSRVRVUk5fT05fRVJST1IocmV0KTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NzbC5jIGIvTW9kdWxlcy9fc3NsLmMKaW5kZXggNGMwZGE2Zi4uZjQ5MzkxZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3NsLmMKKysrIGIvTW9kdWxlcy9fc3NsLmMKQEAgLTE4MywxMCArMTgzLDggQEAKIAlpbnQgc29ja3N0YXRlOwogCiAJc2VsZiA9IFB5T2JqZWN0X05ldyhQeVNTTE9iamVjdCwgJlB5U1NMX1R5cGUpOyAvKiBDcmVhdGUgbmV3IG9iamVjdCAqLwotCWlmIChzZWxmID09IE5VTEwpewotCQllcnJzdHIgPSAibmV3UHlTU0xPYmplY3QgZXJyb3IiOwotCQlnb3RvIGZhaWw7Ci0JfQorCWlmIChzZWxmID09IE5VTEwpCisJCXJldHVybiBOVUxMOwogCW1lbXNldChzZWxmLT5zZXJ2ZXIsICdcMCcsIHNpemVvZihjaGFyKSAqIFg1MDlfTkFNRV9NQVhMRU4pOwogCW1lbXNldChzZWxmLT5pc3N1ZXIsICdcMCcsIHNpemVvZihjaGFyKSAqIFg1MDlfTkFNRV9NQVhMRU4pOwogCXNlbGYtPnNlcnZlcl9jZXJ0ID0gTlVMTDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3N0cnVjdC5jIGIvTW9kdWxlcy9fc3RydWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IyZTUzOAotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3N0cnVjdC5jCkBAIC0wLDAgKzEsMTY2MCBAQAorLyogc3RydWN0IG1vZHVsZSAtLSBwYWNrIHZhbHVlcyBpbnRvIGFuZCAob3V0IG9mKSBzdHJpbmdzICovCisKKy8qIE5ldyB2ZXJzaW9uIHN1cHBvcnRpbmcgYnl0ZSBvcmRlciwgYWxpZ25tZW50IGFuZCBzaXplIG9wdGlvbnMsCisgICBjaGFyYWN0ZXIgc3RyaW5ncywgYW5kIHVuc2lnbmVkIG51bWJlcnMgKi8KKworI2RlZmluZSBQWV9TU0laRV9UX0NMRUFOCisKKyNpbmNsdWRlICJQeXRob24uaCIKKyNpbmNsdWRlICJzdHJ1Y3RzZXEuaCIKKyNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorCitzdGF0aWMgUHlUeXBlT2JqZWN0IFB5U3RydWN0VHlwZTsKKworLyogY29tcGF0aWJpbGl0eSBtYWNyb3MgKi8KKyNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwKQordHlwZWRlZiBpbnQgUHlfc3NpemVfdDsKKyNlbmRpZgorCisvKiBUaGUgdHJhbnNsYXRpb24gZnVuY3Rpb24gZm9yIGVhY2ggZm9ybWF0IGNoYXJhY3RlciBpcyB0YWJsZSBkcml2ZW4gKi8KK3R5cGVkZWYgc3RydWN0IF9mb3JtYXRkZWYgeworCWNoYXIgZm9ybWF0OworCVB5X3NzaXplX3Qgc2l6ZTsKKwlQeV9zc2l6ZV90IGFsaWdubWVudDsKKwlQeU9iamVjdCogKCp1bnBhY2spKGNvbnN0IGNoYXIgKiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgX2Zvcm1hdGRlZiAqKTsKKwlpbnQgKCpwYWNrKShjaGFyICosIFB5T2JqZWN0ICosCisJCSAgICBjb25zdCBzdHJ1Y3QgX2Zvcm1hdGRlZiAqKTsKK30gZm9ybWF0ZGVmOworCit0eXBlZGVmIHN0cnVjdCBfZm9ybWF0Y29kZSB7CisJY29uc3Qgc3RydWN0IF9mb3JtYXRkZWYgKmZtdGRlZjsKKwlQeV9zc2l6ZV90IG9mZnNldDsKKwlQeV9zc2l6ZV90IHNpemU7Cit9IGZvcm1hdGNvZGU7CisKKy8qIFN0cnVjdCBvYmplY3QgaW50ZXJmYWNlICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlQeU9iamVjdF9IRUFECisJUHlfc3NpemVfdCBzX3NpemU7CisJUHlfc3NpemVfdCBzX2xlbjsKKwlmb3JtYXRjb2RlICpzX2NvZGVzOworCVB5T2JqZWN0ICpzX2Zvcm1hdDsKKwlQeU9iamVjdCAqd2Vha3JlZmxpc3Q7IC8qIExpc3Qgb2Ygd2VhayByZWZlcmVuY2VzICovCit9IFB5U3RydWN0T2JqZWN0OworCisKKyNkZWZpbmUgUHlTdHJ1Y3RfQ2hlY2sob3ApIFB5T2JqZWN0X1R5cGVDaGVjayhvcCwgJlB5U3RydWN0VHlwZSkKKyNkZWZpbmUgUHlTdHJ1Y3RfQ2hlY2tFeGFjdChvcCkgKChvcCktPm9iX3R5cGUgPT0gJlB5U3RydWN0VHlwZSkKKworCisvKiBFeGNlcHRpb24gKi8KKworc3RhdGljIFB5T2JqZWN0ICpTdHJ1Y3RFcnJvcjsKKworCisvKiBEZWZpbmUgdmFyaW91cyBzdHJ1Y3RzIHRvIGZpZ3VyZSBvdXQgdGhlIGFsaWdubWVudHMgb2YgdHlwZXMgKi8KKworCit0eXBlZGVmIHN0cnVjdCB7IGNoYXIgYzsgc2hvcnQgeDsgfSBzdF9zaG9ydDsKK3R5cGVkZWYgc3RydWN0IHsgY2hhciBjOyBpbnQgeDsgfSBzdF9pbnQ7Cit0eXBlZGVmIHN0cnVjdCB7IGNoYXIgYzsgbG9uZyB4OyB9IHN0X2xvbmc7Cit0eXBlZGVmIHN0cnVjdCB7IGNoYXIgYzsgZmxvYXQgeDsgfSBzdF9mbG9hdDsKK3R5cGVkZWYgc3RydWN0IHsgY2hhciBjOyBkb3VibGUgeDsgfSBzdF9kb3VibGU7Cit0eXBlZGVmIHN0cnVjdCB7IGNoYXIgYzsgdm9pZCAqeDsgfSBzdF92b2lkX3A7CisKKyNkZWZpbmUgU0hPUlRfQUxJR04gKHNpemVvZihzdF9zaG9ydCkgLSBzaXplb2Yoc2hvcnQpKQorI2RlZmluZSBJTlRfQUxJR04gKHNpemVvZihzdF9pbnQpIC0gc2l6ZW9mKGludCkpCisjZGVmaW5lIExPTkdfQUxJR04gKHNpemVvZihzdF9sb25nKSAtIHNpemVvZihsb25nKSkKKyNkZWZpbmUgRkxPQVRfQUxJR04gKHNpemVvZihzdF9mbG9hdCkgLSBzaXplb2YoZmxvYXQpKQorI2RlZmluZSBET1VCTEVfQUxJR04gKHNpemVvZihzdF9kb3VibGUpIC0gc2l6ZW9mKGRvdWJsZSkpCisjZGVmaW5lIFZPSURfUF9BTElHTiAoc2l6ZW9mKHN0X3ZvaWRfcCkgLSBzaXplb2Yodm9pZCAqKSkKKworLyogV2UgY2FuJ3Qgc3VwcG9ydCBxIGFuZCBRIGluIG5hdGl2ZSBtb2RlIHVubGVzcyB0aGUgY29tcGlsZXIgZG9lczsKKyAgIGluIHN0ZCBtb2RlLCB0aGV5J3JlIDggYnl0ZXMgb24gYWxsIHBsYXRmb3Jtcy4gKi8KKyNpZmRlZiBIQVZFX0xPTkdfTE9ORwordHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIGM7IFBZX0xPTkdfTE9ORyB4OyB9IHNfbG9uZ19sb25nOworI2RlZmluZSBMT05HX0xPTkdfQUxJR04gKHNpemVvZihzX2xvbmdfbG9uZykgLSBzaXplb2YoUFlfTE9OR19MT05HKSkKKyNlbmRpZgorCisjZGVmaW5lIFNUUklOR0lGWSh4KSAgICAjeAorCisjaWZkZWYgX19wb3dlcmMKKyNwcmFnbWEgb3B0aW9ucyBhbGlnbj1yZXNldAorI2VuZGlmCisKKy8qIEhlbHBlciB0byBnZXQgYSBQeUxvbmdPYmplY3QgYnkgaG9vayBvciBieSBjcm9vay4gIENhbGxlciBzaG91bGQgZGVjcmVmLiAqLworCitzdGF0aWMgUHlPYmplY3QgKgorZ2V0X3B5bG9uZyhQeU9iamVjdCAqdikKK3sKKwlQeU51bWJlck1ldGhvZHMgKm07CisKKwlhc3NlcnQodiAhPSBOVUxMKTsKKwlpZiAoUHlJbnRfQ2hlY2sodikpCisJCXJldHVybiBQeUxvbmdfRnJvbUxvbmcoUHlJbnRfQVNfTE9ORyh2KSk7CisJaWYgKFB5TG9uZ19DaGVjayh2KSkgeworCQlQeV9JTkNSRUYodik7CisJCXJldHVybiB2OworCX0KKwltID0gdi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOworCWlmIChtICE9IE5VTEwgJiYgbS0+bmJfbG9uZyAhPSBOVUxMKSB7CisJCXYgPSBtLT5uYl9sb25nKHYpOworCQlpZiAodiA9PSBOVUxMKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmIChQeUxvbmdfQ2hlY2sodikpCisJCQlyZXR1cm4gdjsKKwkJUHlfREVDUkVGKHYpOworCX0KKwlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCisJCQkiY2Fubm90IGNvbnZlcnQgYXJndW1lbnQgdG8gbG9uZyIpOworCXJldHVybiBOVUxMOworfQorCisvKiBIZWxwZXIgcm91dGluZSB0byBnZXQgYSBQeXRob24gaW50ZWdlciBhbmQgcmFpc2UgdGhlIGFwcHJvcHJpYXRlIGVycm9yCisgICBpZiBpdCBpc24ndCBvbmUgKi8KKworc3RhdGljIGludAorZ2V0X2xvbmcoUHlPYmplY3QgKnYsIGxvbmcgKnApCit7CisJbG9uZyB4ID0gUHlJbnRfQXNMb25nKHYpOworCWlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKwkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKKwkJCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKwkJCQkJInJlcXVpcmVkIGFyZ3VtZW50IGlzIG5vdCBhbiBpbnRlZ2VyIik7CisJCXJldHVybiAtMTsKKwl9CisJKnAgPSB4OworCXJldHVybiAwOworfQorCisKKy8qIFNhbWUsIGJ1dCBoYW5kbGluZyB1bnNpZ25lZCBsb25nICovCisKK3N0YXRpYyBpbnQKK2dldF91bG9uZyhQeU9iamVjdCAqdiwgdW5zaWduZWQgbG9uZyAqcCkKK3sKKwlpZiAoUHlMb25nX0NoZWNrKHYpKSB7CisJCXVuc2lnbmVkIGxvbmcgeCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyh2KTsKKwkJaWYgKHggPT0gKHVuc2lnbmVkIGxvbmcpKC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorCQkJcmV0dXJuIC0xOworCQkqcCA9IHg7CisJCXJldHVybiAwOworCX0KKwlpZiAoZ2V0X2xvbmcodiwgKGxvbmcgKilwKSA8IDApCisJCXJldHVybiAtMTsKKwlpZiAoKChsb25nKSpwKSA8IDApIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorCQkJCSJ1bnNpZ25lZCBhcmd1bWVudCBpcyA8IDAiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIEhBVkVfTE9OR19MT05HCisKKy8qIFNhbWUsIGJ1dCBoYW5kbGluZyBuYXRpdmUgbG9uZyBsb25nLiAqLworCitzdGF0aWMgaW50CitnZXRfbG9uZ2xvbmcoUHlPYmplY3QgKnYsIFBZX0xPTkdfTE9ORyAqcCkKK3sKKwlQWV9MT05HX0xPTkcgeDsKKworCXYgPSBnZXRfcHlsb25nKHYpOworCWlmICh2ID09IE5VTEwpCisJCXJldHVybiAtMTsKKwlhc3NlcnQoUHlMb25nX0NoZWNrKHYpKTsKKwl4ID0gUHlMb25nX0FzTG9uZ0xvbmcodik7CisJUHlfREVDUkVGKHYpOworCWlmICh4ID09IChQWV9MT05HX0xPTkcpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKwkJcmV0dXJuIC0xOworCSpwID0geDsKKwlyZXR1cm4gMDsKK30KKworLyogU2FtZSwgYnV0IGhhbmRsaW5nIG5hdGl2ZSB1bnNpZ25lZCBsb25nIGxvbmcuICovCisKK3N0YXRpYyBpbnQKK2dldF91bG9uZ2xvbmcoUHlPYmplY3QgKnYsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyAqcCkKK3sKKwl1bnNpZ25lZCBQWV9MT05HX0xPTkcgeDsKKworCXYgPSBnZXRfcHlsb25nKHYpOworCWlmICh2ID09IE5VTEwpCisJCXJldHVybiAtMTsKKwlhc3NlcnQoUHlMb25nX0NoZWNrKHYpKTsKKwl4ID0gUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZyh2KTsKKwlQeV9ERUNSRUYodik7CisJaWYgKHggPT0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorCQlyZXR1cm4gLTE7CisJKnAgPSB4OworCXJldHVybiAwOworfQorCisjZW5kaWYKKworLyogRmxvYXRpbmcgcG9pbnQgaGVscGVycyAqLworCitzdGF0aWMgUHlPYmplY3QgKgordW5wYWNrX2Zsb2F0KGNvbnN0IGNoYXIgKnAsICAvKiBzdGFydCBvZiA0LWJ5dGUgc3RyaW5nICovCisgICAgICAgICAgICAgaW50IGxlKQkgICAgIC8qIHRydWUgZm9yIGxpdHRsZS1lbmRpYW4sIGZhbHNlIGZvciBiaWctZW5kaWFuICovCit7CisJZG91YmxlIHg7CisKKwl4ID0gX1B5RmxvYXRfVW5wYWNrNCgodW5zaWduZWQgY2hhciAqKXAsIGxlKTsKKwlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisJCXJldHVybiBOVUxMOworCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCit1bnBhY2tfZG91YmxlKGNvbnN0IGNoYXIgKnAsICAvKiBzdGFydCBvZiA4LWJ5dGUgc3RyaW5nICovCisgICAgICAgICAgICAgIGludCBsZSkgICAgICAgICAvKiB0cnVlIGZvciBsaXR0bGUtZW5kaWFuLCBmYWxzZSBmb3IgYmlnLWVuZGlhbiAqLworeworCWRvdWJsZSB4OworCisJeCA9IF9QeUZsb2F0X1VucGFjazgoKHVuc2lnbmVkIGNoYXIgKilwLCBsZSk7CisJaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOworfQorCisvKiBIZWxwZXIgdG8gZm9ybWF0IHRoZSByYW5nZSBlcnJvciBleGNlcHRpb25zICovCitzdGF0aWMgaW50CitfcmFuZ2VfZXJyb3IoY2hhciBmb3JtYXQsIFB5X3NzaXplX3Qgc2l6ZSwgaW50IGlzX3Vuc2lnbmVkKQoreworCWlmIChpc191bnNpZ25lZCA9PSAwKSB7CisJCWxvbmcgc21hbGxlc3QgPSAwLCBsYXJnZXN0ID0gMDsKKwkJUHlfc3NpemVfdCBpID0gc2l6ZSAqIDg7CisJCXdoaWxlICgtLWkgPiAwKSB7CisJCQlzbWFsbGVzdCA9IChzbWFsbGVzdCAqIDIpIC0gMTsKKwkJCWxhcmdlc3QgPSAobGFyZ2VzdCAqIDIpICsgMTsKKwkJfQorCQlQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCisJCQkiJyVjJyBmb3JtYXQgcmVxdWlyZXMgJWxkIDw9IG51bWJlciA8PSAlbGQiLAorCQkJZm9ybWF0LAorCQkJc21hbGxlc3QsCisJCQlsYXJnZXN0KTsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBsb25nIGxhcmdlc3QgPSAwOworCQlQeV9zc2l6ZV90IGkgPSBzaXplICogODsKKwkJd2hpbGUgKC0taSA+PSAwKQorCQkJbGFyZ2VzdCA9IChsYXJnZXN0ICogMikgKyAxOworCQlQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCisJCQkiJyVjJyBmb3JtYXQgcmVxdWlyZXMgMCA8PSBudW1iZXIgPD0gJWx1IiwKKwkJCWZvcm1hdCwKKwkJCWxhcmdlc3QpOworCX0KKwlyZXR1cm4gLTE7Cit9CisKKworCisvKiBBIGxhcmdlIG51bWJlciBvZiBzbWFsbCByb3V0aW5lcyBmb2xsb3csIHdpdGggbmFtZXMgb2YgdGhlIGZvcm0KKworICAgW2Jsbl1bdXBdX1RZUEUKKworICAgW2Jsbl0gZGlzdGlndWlzaGVzIGFtb25nIGJpZy1lbmRpYW4sIGxpdHRsZS1lbmRpYW4gYW5kIG5hdGl2ZS4KKyAgIFtwdV0gZGlzdGlndWlzaGVzIGJldHdlZW4gcGFjayAodG8gc3RydWN0KSBhbmQgdW5wYWNrIChmcm9tIHN0cnVjdCkuCisgICBUWVBFIGlzIG9uZSBvZiBjaGFyLCBieXRlLCB1Ynl0ZSwgZXRjLgorKi8KKworLyogTmF0aXZlIG1vZGUgcm91dGluZXMuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBOT1RFOgorICAgSW4gYWxsIG5bdXBdXzx0eXBlPiByb3V0aW5lcyBoYW5kbGluZyB0eXBlcyBsYXJnZXIgdGhhbiAxIGJ5dGUsIHRoZXJlIGlzCisgICAqbm8qIGd1YXJhbnRlZSB0aGF0IHRoZSBwIHBvaW50ZXIgaXMgcHJvcGVybHkgYWxpZ25lZCBmb3IgZWFjaCB0eXBlLAorICAgdGhlcmVmb3JlIG1lbWNweSBpcyBjYWxsZWQuICBBbiBpbnRlcm1lZGlhdGUgdmFyaWFibGUgaXMgdXNlZCB0bworICAgY29tcGVuc2F0ZSBmb3IgYmlnLWVuZGlhbiBhcmNoaXRlY3R1cmVzLgorICAgTm9ybWFsbHkgYm90aCB0aGUgaW50ZXJtZWRpYXRlIHZhcmlhYmxlIGFuZCB0aGUgbWVtY3B5IGNhbGwgd2lsbCBiZQorICAgc2tpcHBlZCBieSBDIG9wdGltaXNhdGlvbiBpbiBsaXR0bGUtZW5kaWFuIGFyY2hpdGVjdHVyZXMgKGdjYyA+PSAyLjkxCisgICBkb2VzIHRoaXMpLiAqLworCitzdGF0aWMgUHlPYmplY3QgKgorbnVfY2hhcihjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHAsIDEpOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorbnVfYnl0ZShjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSAqKHNpZ25lZCBjaGFyICopcCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitudV91Ynl0ZShjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSAqKHVuc2lnbmVkIGNoYXIgKilwKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK251X3Nob3J0KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlzaG9ydCB4OworCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7CisJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorbnVfdXNob3J0KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwl1bnNpZ25lZCBzaG9ydCB4OworCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7CisJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorbnVfaW50KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlpbnQgeDsKKwltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOworCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl4KTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK251X3VpbnQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCXVuc2lnbmVkIGludCB4OworCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7CisjaWYgKFNJWkVPRl9MT05HID4gU0laRU9GX0lOVCkKKwlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpeCk7CisjZWxzZQorCWlmICh4IDw9ICgodW5zaWduZWQgaW50KUxPTkdfTUFYKSkKKwkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOworCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygodW5zaWduZWQgbG9uZyl4KTsKKyNlbmRpZgorfQorCitzdGF0aWMgUHlPYmplY3QgKgorbnVfbG9uZyhjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJbG9uZyB4OworCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7CisJcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorbnVfdWxvbmcoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCXVuc2lnbmVkIGxvbmcgeDsKKwltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOworCWlmICh4IDw9IExPTkdfTUFYKQorCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpeCk7CisJcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHgpOworfQorCisvKiBOYXRpdmUgbW9kZSBkb2Vzbid0IHN1cHBvcnQgcSBvciBRIHVubGVzcyB0aGUgcGxhdGZvcm0gQyBzdXBwb3J0cworICAgbG9uZyBsb25nIChvciwgb24gV2luZG93cywgX19pbnQ2NCkuICovCisKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworCitzdGF0aWMgUHlPYmplY3QgKgorbnVfbG9uZ2xvbmcoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCVBZX0xPTkdfTE9ORyB4OworCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7CisJaWYgKHggPj0gTE9OR19NSU4gJiYgeCA8PSBMT05HX01BWCkKKwkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKFB5X1NBRkVfRE9XTkNBU1QoeCwgUFlfTE9OR19MT05HLCBsb25nKSk7CisJcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoeCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitudV91bG9uZ2xvbmcoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyB4OworCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7CisJaWYgKHggPD0gTE9OR19NQVgpCisJCXJldHVybiBQeUludF9Gcm9tTG9uZyhQeV9TQUZFX0RPV05DQVNUKHgsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORywgbG9uZykpOworCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoeCk7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgUHlPYmplY3QgKgorbnVfZmxvYXQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCWZsb2F0IHg7CisJbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKKwlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKChkb3VibGUpeCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitudV9kb3VibGUoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCWRvdWJsZSB4OworCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7CisJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh4KTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK251X3ZvaWRfcChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJdm9pZCAqeDsKKwltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOworCXJldHVybiBQeUxvbmdfRnJvbVZvaWRQdHIoeCk7Cit9CisKK3N0YXRpYyBpbnQKK25wX2J5dGUoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlsb25nIHg7CisJaWYgKGdldF9sb25nKHYsICZ4KSA8IDApCisJCXJldHVybiAtMTsKKwlpZiAoeCA8IC0xMjggfHwgeCA+IDEyNyl7CisJCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKwkJCQkiYnl0ZSBmb3JtYXQgcmVxdWlyZXMgLTEyOCA8PSBudW1iZXIgPD0gMTI3Iik7CisJCXJldHVybiAtMTsKKwl9CisJKnAgPSAoY2hhcil4OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitucF91Ynl0ZShjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCWxvbmcgeDsKKwlpZiAoZ2V0X2xvbmcodiwgJngpIDwgMCkKKwkJcmV0dXJuIC0xOworCWlmICh4IDwgMCB8fCB4ID4gMjU1KXsKKwkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorCQkJCSJ1Ynl0ZSBmb3JtYXQgcmVxdWlyZXMgMCA8PSBudW1iZXIgPD0gMjU1Iik7CisJCXJldHVybiAtMTsKKwl9CisJKnAgPSAoY2hhcil4OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitucF9jaGFyKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJaWYgKCFQeVN0cmluZ19DaGVjayh2KSB8fCBQeVN0cmluZ19TaXplKHYpICE9IDEpIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorCQkJCSJjaGFyIGZvcm1hdCByZXF1aXJlIHN0cmluZyBvZiBsZW5ndGggMSIpOworCQlyZXR1cm4gLTE7CisJfQorCSpwID0gKlB5U3RyaW5nX0FzU3RyaW5nKHYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitucF9zaG9ydChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCWxvbmcgeDsKKwlzaG9ydCB5OworCWlmIChnZXRfbG9uZyh2LCAmeCkgPCAwKQorCQlyZXR1cm4gLTE7CisJaWYgKHggPCBTSFJUX01JTiB8fCB4ID4gU0hSVF9NQVgpeworCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCisJCQkJInNob3J0IGZvcm1hdCByZXF1aXJlcyAiIFNUUklOR0lGWShTSFJUX01JTikKKwkJCQkiIDw9IG51bWJlciA8PSAiIFNUUklOR0lGWShTSFJUX01BWCkpOworCQlyZXR1cm4gLTE7CisJfQorCXkgPSAoc2hvcnQpeDsKKwltZW1jcHkocCwgKGNoYXIgKikmeSwgc2l6ZW9mIHkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitucF91c2hvcnQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlsb25nIHg7CisJdW5zaWduZWQgc2hvcnQgeTsKKwlpZiAoZ2V0X2xvbmcodiwgJngpIDwgMCkKKwkJcmV0dXJuIC0xOworCWlmICh4IDwgMCB8fCB4ID4gVVNIUlRfTUFYKXsKKwkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorCQkJCSJzaG9ydCBmb3JtYXQgcmVxdWlyZXMgMCA8PSBudW1iZXIgPD0gIiBTVFJJTkdJRlkoVVNIUlRfTUFYKSk7CisJCXJldHVybiAtMTsKKwl9CisJeSA9ICh1bnNpZ25lZCBzaG9ydCl4OworCW1lbWNweShwLCAoY2hhciAqKSZ5LCBzaXplb2YgeSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25wX2ludChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCWxvbmcgeDsKKwlpbnQgeTsKKwlpZiAoZ2V0X2xvbmcodiwgJngpIDwgMCkKKwkJcmV0dXJuIC0xOworI2lmIChTSVpFT0ZfTE9ORyA+IFNJWkVPRl9JTlQpCisJaWYgKCh4IDwgKChsb25nKUlOVF9NSU4pKSB8fCAoeCA+ICgobG9uZylJTlRfTUFYKSkpCisJCXJldHVybiBfcmFuZ2VfZXJyb3IoZi0+Zm9ybWF0LCBzaXplb2YoeSksIDApOworI2VuZGlmCisJeSA9IChpbnQpeDsKKwltZW1jcHkocCwgKGNoYXIgKikmeSwgc2l6ZW9mIHkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitucF91aW50KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJdW5zaWduZWQgbG9uZyB4OworCXVuc2lnbmVkIGludCB5OworCWlmIChnZXRfdWxvbmcodiwgJngpIDwgMCkKKwkJcmV0dXJuIF9yYW5nZV9lcnJvcihmLT5mb3JtYXQsIHNpemVvZih5KSwgMSk7CisJeSA9ICh1bnNpZ25lZCBpbnQpeDsKKyNpZiAoU0laRU9GX0xPTkcgPiBTSVpFT0ZfSU5UKQorCWlmICh4ID4gKCh1bnNpZ25lZCBsb25nKVVJTlRfTUFYKSkKKwkJcmV0dXJuIF9yYW5nZV9lcnJvcihmLT5mb3JtYXQsIHNpemVvZih5KSwgMSk7CisjZW5kaWYKKwltZW1jcHkocCwgKGNoYXIgKikmeSwgc2l6ZW9mIHkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitucF9sb25nKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJbG9uZyB4OworCWlmIChnZXRfbG9uZyh2LCAmeCkgPCAwKQorCQlyZXR1cm4gLTE7CisJbWVtY3B5KHAsIChjaGFyICopJngsIHNpemVvZiB4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnBfdWxvbmcoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwl1bnNpZ25lZCBsb25nIHg7CisJaWYgKGdldF91bG9uZyh2LCAmeCkgPCAwKQorCQlyZXR1cm4gX3JhbmdlX2Vycm9yKGYtPmZvcm1hdCwgc2l6ZW9mKHgpLCAxKTsKKwltZW1jcHkocCwgKGNoYXIgKikmeCwgc2l6ZW9mIHgpOworCXJldHVybiAwOworfQorCisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKworc3RhdGljIGludAorbnBfbG9uZ2xvbmcoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlQWV9MT05HX0xPTkcgeDsKKwlpZiAoZ2V0X2xvbmdsb25nKHYsICZ4KSA8IDApCisJCXJldHVybiAtMTsKKwltZW1jcHkocCwgKGNoYXIgKikmeCwgc2l6ZW9mIHgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitucF91bG9uZ2xvbmcoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwl1bnNpZ25lZCBQWV9MT05HX0xPTkcgeDsKKwlpZiAoZ2V0X3Vsb25nbG9uZyh2LCAmeCkgPCAwKQorCQlyZXR1cm4gLTE7CisJbWVtY3B5KHAsIChjaGFyICopJngsIHNpemVvZiB4KTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50CitucF9mbG9hdChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCWZsb2F0IHggPSAoZmxvYXQpUHlGbG9hdF9Bc0RvdWJsZSh2KTsKKwlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisJCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKwkJCQkicmVxdWlyZWQgYXJndW1lbnQgaXMgbm90IGEgZmxvYXQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1jcHkocCwgKGNoYXIgKikmeCwgc2l6ZW9mIHgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitucF9kb3VibGUoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7CisJaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCisJCQkJInJlcXVpcmVkIGFyZ3VtZW50IGlzIG5vdCBhIGZsb2F0Iik7CisJCXJldHVybiAtMTsKKwl9CisJbWVtY3B5KHAsIChjaGFyICopJngsIHNpemVvZihkb3VibGUpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnBfdm9pZF9wKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJdm9pZCAqeDsKKworCXYgPSBnZXRfcHlsb25nKHYpOworCWlmICh2ID09IE5VTEwpCisJCXJldHVybiAtMTsKKwlhc3NlcnQoUHlMb25nX0NoZWNrKHYpKTsKKwl4ID0gUHlMb25nX0FzVm9pZFB0cih2KTsKKwlQeV9ERUNSRUYodik7CisJaWYgKHggPT0gTlVMTCAmJiBQeUVycl9PY2N1cnJlZCgpKQorCQlyZXR1cm4gLTE7CisJbWVtY3B5KHAsIChjaGFyICopJngsIHNpemVvZiB4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGZvcm1hdGRlZiBuYXRpdmVfdGFibGVbXSA9IHsKKwl7J3gnLAlzaXplb2YoY2hhciksCTAsCQlOVUxMfSwKKwl7J2InLAlzaXplb2YoY2hhciksCTAsCQludV9ieXRlLAlucF9ieXRlfSwKKwl7J0InLAlzaXplb2YoY2hhciksCTAsCQludV91Ynl0ZSwJbnBfdWJ5dGV9LAorCXsnYycsCXNpemVvZihjaGFyKSwJMCwJCW51X2NoYXIsCW5wX2NoYXJ9LAorCXsncycsCXNpemVvZihjaGFyKSwJMCwJCU5VTEx9LAorCXsncCcsCXNpemVvZihjaGFyKSwJMCwJCU5VTEx9LAorCXsnaCcsCXNpemVvZihzaG9ydCksCVNIT1JUX0FMSUdOLAludV9zaG9ydCwJbnBfc2hvcnR9LAorCXsnSCcsCXNpemVvZihzaG9ydCksCVNIT1JUX0FMSUdOLAludV91c2hvcnQsCW5wX3VzaG9ydH0sCisJeydpJywJc2l6ZW9mKGludCksCUlOVF9BTElHTiwJbnVfaW50LAkJbnBfaW50fSwKKwl7J0knLAlzaXplb2YoaW50KSwJSU5UX0FMSUdOLAludV91aW50LAlucF91aW50fSwKKwl7J2wnLAlzaXplb2YobG9uZyksCUxPTkdfQUxJR04sCW51X2xvbmcsCW5wX2xvbmd9LAorCXsnTCcsCXNpemVvZihsb25nKSwJTE9OR19BTElHTiwJbnVfdWxvbmcsCW5wX3Vsb25nfSwKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworCXsncScsCXNpemVvZihQWV9MT05HX0xPTkcpLCBMT05HX0xPTkdfQUxJR04sIG51X2xvbmdsb25nLCBucF9sb25nbG9uZ30sCisJeydRJywJc2l6ZW9mKFBZX0xPTkdfTE9ORyksIExPTkdfTE9OR19BTElHTiwgbnVfdWxvbmdsb25nLG5wX3Vsb25nbG9uZ30sCisjZW5kaWYKKwl7J2YnLAlzaXplb2YoZmxvYXQpLAlGTE9BVF9BTElHTiwJbnVfZmxvYXQsCW5wX2Zsb2F0fSwKKwl7J2QnLAlzaXplb2YoZG91YmxlKSwJRE9VQkxFX0FMSUdOLAludV9kb3VibGUsCW5wX2RvdWJsZX0sCisJeydQJywJc2l6ZW9mKHZvaWQgKiksCVZPSURfUF9BTElHTiwJbnVfdm9pZF9wLAlucF92b2lkX3B9LAorCXswfQorfTsKKworLyogQmlnLWVuZGlhbiByb3V0aW5lcy4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBQeU9iamVjdCAqCitidV9pbnQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCWxvbmcgeCA9IDA7CisJUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKKwlkbyB7CisJCXggPSAoeDw8OCkgfCAoKnArKyAmIDB4RkYpOworCX0gd2hpbGUgKC0taSA+IDApOworCS8qIEV4dGVuZCB0aGUgc2lnbiBiaXQuICovCisJaWYgKFNJWkVPRl9MT05HID4gZi0+c2l6ZSkKKwkJeCB8PSAtKHggJiAoMUwgPDwgKCg4ICogZi0+c2l6ZSkgLSAxKSkpOworCXJldHVybiBQeUludF9Gcm9tTG9uZyh4KTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2J1X3VpbnQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCXVuc2lnbmVkIGxvbmcgeCA9IDA7CisJUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKKwlkbyB7CisJCXggPSAoeDw8OCkgfCAoKnArKyAmIDB4RkYpOworCX0gd2hpbGUgKC0taSA+IDApOworCWlmICh4IDw9IExPTkdfTUFYKQorCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpeCk7CisJcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHgpOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorYnVfbG9uZ2xvbmcoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworI2lmZGVmIEhBVkVfTE9OR19MT05HCisJUFlfTE9OR19MT05HIHggPSAwOworCVB5X3NzaXplX3QgaSA9IGYtPnNpemU7CisJZG8geworCQl4ID0gKHg8PDgpIHwgKCpwKysgJiAweEZGKTsKKwl9IHdoaWxlICgtLWkgPiAwKTsKKwkvKiBFeHRlbmQgdGhlIHNpZ24gYml0LiAqLworCWlmIChTSVpFT0ZfTE9OR19MT05HID4gZi0+c2l6ZSkKKwkJeCB8PSAtKHggJiAoMUwgPDwgKCg4ICogZi0+c2l6ZSkgLSAxKSkpOworCWlmICh4ID49IExPTkdfTUlOICYmIHggPD0gTE9OR19NQVgpCisJCXJldHVybiBQeUludF9Gcm9tTG9uZyhQeV9TQUZFX0RPV05DQVNUKHgsIFBZX0xPTkdfTE9ORywgbG9uZykpOworCXJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHgpOworI2Vsc2UKKwlyZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KChjb25zdCB1bnNpZ25lZCBjaGFyICopcCwKKwkJCQkgICAgICA4LAorCQkJCSAgICAgIDAsIC8qIGxpdHRsZS1lbmRpYW4gKi8KKwkJCQkgICAgICAxICAvKiBzaWduZWQgKi8pOworI2VuZGlmCit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitidV91bG9uZ2xvbmcoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworI2lmZGVmIEhBVkVfTE9OR19MT05HCisJdW5zaWduZWQgUFlfTE9OR19MT05HIHggPSAwOworCVB5X3NzaXplX3QgaSA9IGYtPnNpemU7CisJZG8geworCQl4ID0gKHg8PDgpIHwgKCpwKysgJiAweEZGKTsKKwl9IHdoaWxlICgtLWkgPiAwKTsKKwlpZiAoeCA8PSBMT05HX01BWCkKKwkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKFB5X1NBRkVfRE9XTkNBU1QoeCwgdW5zaWduZWQgUFlfTE9OR19MT05HLCBsb25nKSk7CisJcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyh4KTsKKyNlbHNlCisJcmV0dXJuIF9QeUxvbmdfRnJvbUJ5dGVBcnJheSgoY29uc3QgdW5zaWduZWQgY2hhciAqKXAsCisJCQkJICAgICAgOCwKKwkJCQkgICAgICAwLCAvKiBsaXR0bGUtZW5kaWFuICovCisJCQkJICAgICAgMCAgLyogc2lnbmVkICovKTsKKyNlbmRpZgorfQorCitzdGF0aWMgUHlPYmplY3QgKgorYnVfZmxvYXQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCXJldHVybiB1bnBhY2tfZmxvYXQocCwgMCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitidV9kb3VibGUoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCXJldHVybiB1bnBhY2tfZG91YmxlKHAsIDApOworfQorCitzdGF0aWMgaW50CiticF9pbnQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlsb25nIHg7CisJUHlfc3NpemVfdCBpOworCWlmIChnZXRfbG9uZyh2LCAmeCkgPCAwKQorCQlyZXR1cm4gLTE7CisJaSA9IGYtPnNpemU7CisJaWYgKGkgIT0gU0laRU9GX0xPTkcpIHsKKwkJaWYgKChpID09IDIpICYmICh4IDwgLTMyNzY4IHx8IHggPiAzMjc2NykpCisJCQlyZXR1cm4gX3JhbmdlX2Vycm9yKGYtPmZvcm1hdCwgaSwgMCk7CisjaWYgKFNJWkVPRl9MT05HICE9IDQpCisJCWVsc2UgaWYgKChpID09IDQpICYmICh4IDwgLTIxNDc0ODM2NDhMIHx8IHggPiAyMTQ3NDgzNjQ3TCkpCisJCQlyZXR1cm4gX3JhbmdlX2Vycm9yKGYtPmZvcm1hdCwgaSwgMCk7CisjZW5kaWYKKwl9CisJZG8geworCQlwWy0taV0gPSAoY2hhcil4OworCQl4ID4+PSA4OworCX0gd2hpbGUgKGkgPiAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYnBfdWludChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCXVuc2lnbmVkIGxvbmcgeDsKKwlQeV9zc2l6ZV90IGk7CisJaWYgKGdldF91bG9uZyh2LCAmeCkgPCAwKQorCQlyZXR1cm4gLTE7CisJaSA9IGYtPnNpemU7CisJaWYgKGkgIT0gU0laRU9GX0xPTkcpIHsKKwkJdW5zaWduZWQgbG9uZyBtYXhpbnQgPSAxOworCQltYXhpbnQgPDw9ICh1bnNpZ25lZCBsb25nKShpICogOCk7CisJCWlmICh4ID49IG1heGludCkKKwkJCXJldHVybiBfcmFuZ2VfZXJyb3IoZi0+Zm9ybWF0LCBmLT5zaXplLCAxKTsKKwl9CisJZG8geworCQlwWy0taV0gPSAoY2hhcil4OworCQl4ID4+PSA4OworCX0gd2hpbGUgKGkgPiAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYnBfbG9uZ2xvbmcoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlpbnQgcmVzOworCXYgPSBnZXRfcHlsb25nKHYpOworCWlmICh2ID09IE5VTEwpCisJCXJldHVybiAtMTsKKwlyZXMgPSBfUHlMb25nX0FzQnl0ZUFycmF5KChQeUxvbmdPYmplY3QgKil2LAorCQkJICAgCSAgKHVuc2lnbmVkIGNoYXIgKilwLAorCQkJCSAgOCwKKwkJCQkgIDAsIC8qIGxpdHRsZV9lbmRpYW4gKi8KKwkJCQkgIDEgIC8qIHNpZ25lZCAqLyk7CisJUHlfREVDUkVGKHYpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQKK2JwX3Vsb25nbG9uZyhjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCWludCByZXM7CisJdiA9IGdldF9weWxvbmcodik7CisJaWYgKHYgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCXJlcyA9IF9QeUxvbmdfQXNCeXRlQXJyYXkoKFB5TG9uZ09iamVjdCAqKXYsCisJCQkgICAJICAodW5zaWduZWQgY2hhciAqKXAsCisJCQkJICA4LAorCQkJCSAgMCwgLyogbGl0dGxlX2VuZGlhbiAqLworCQkJCSAgMCAgLyogc2lnbmVkICovKTsKKwlQeV9ERUNSRUYodik7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludAorYnBfZmxvYXQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7CisJaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCisJCQkJInJlcXVpcmVkIGFyZ3VtZW50IGlzIG5vdCBhIGZsb2F0Iik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIF9QeUZsb2F0X1BhY2s0KHgsICh1bnNpZ25lZCBjaGFyICopcCwgMCk7Cit9CisKK3N0YXRpYyBpbnQKK2JwX2RvdWJsZShjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCWRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKKwlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisJCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKwkJCQkicmVxdWlyZWQgYXJndW1lbnQgaXMgbm90IGEgZmxvYXQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gX1B5RmxvYXRfUGFjazgoeCwgKHVuc2lnbmVkIGNoYXIgKilwLCAwKTsKK30KKworc3RhdGljIGZvcm1hdGRlZiBiaWdlbmRpYW5fdGFibGVbXSA9IHsKKwl7J3gnLAkxLAkJMCwJCU5VTEx9LAorCXsnYicsCTEsCQkwLAkJbnVfYnl0ZSwJbnBfYnl0ZX0sCisJeydCJywJMSwJCTAsCQludV91Ynl0ZSwJbnBfdWJ5dGV9LAorCXsnYycsCTEsCQkwLAkJbnVfY2hhciwJbnBfY2hhcn0sCisJeydzJywJMSwJCTAsCQlOVUxMfSwKKwl7J3AnLAkxLAkJMCwJCU5VTEx9LAorCXsnaCcsCTIsCQkwLAkJYnVfaW50LAkJYnBfaW50fSwKKwl7J0gnLAkyLAkJMCwJCWJ1X3VpbnQsCWJwX3VpbnR9LAorCXsnaScsCTQsCQkwLAkJYnVfaW50LAkJYnBfaW50fSwKKwl7J0knLAk0LAkJMCwJCWJ1X3VpbnQsCWJwX3VpbnR9LAorCXsnbCcsCTQsCQkwLAkJYnVfaW50LAkJYnBfaW50fSwKKwl7J0wnLAk0LAkJMCwJCWJ1X3VpbnQsCWJwX3VpbnR9LAorCXsncScsCTgsCQkwLAkJYnVfbG9uZ2xvbmcsCWJwX2xvbmdsb25nfSwKKwl7J1EnLAk4LAkJMCwJCWJ1X3Vsb25nbG9uZywJYnBfdWxvbmdsb25nfSwKKwl7J2YnLAk0LAkJMCwJCWJ1X2Zsb2F0LAlicF9mbG9hdH0sCisJeydkJywJOCwJCTAsCQlidV9kb3VibGUsCWJwX2RvdWJsZX0sCisJezB9Cit9OworCisvKiBMaXR0bGUtZW5kaWFuIHJvdXRpbmVzLiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIFB5T2JqZWN0ICoKK2x1X2ludChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJbG9uZyB4ID0gMDsKKwlQeV9zc2l6ZV90IGkgPSBmLT5zaXplOworCWRvIHsKKwkJeCA9ICh4PDw4KSB8IChwWy0taV0gJiAweEZGKTsKKwl9IHdoaWxlIChpID4gMCk7CisJLyogRXh0ZW5kIHRoZSBzaWduIGJpdC4gKi8KKwlpZiAoU0laRU9GX0xPTkcgPiBmLT5zaXplKQorCQl4IHw9IC0oeCAmICgxTCA8PCAoKDggKiBmLT5zaXplKSAtIDEpKSk7CisJcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorbHVfdWludChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJdW5zaWduZWQgbG9uZyB4ID0gMDsKKwlQeV9zc2l6ZV90IGkgPSBmLT5zaXplOworCWRvIHsKKwkJeCA9ICh4PDw4KSB8IChwWy0taV0gJiAweEZGKTsKKwl9IHdoaWxlIChpID4gMCk7CisJaWYgKHggPD0gTE9OR19NQVgpCisJCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl4KTsKKwlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKGxvbmcpeCk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitsdV9sb25nbG9uZyhjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKwlQWV9MT05HX0xPTkcgeCA9IDA7CisJUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKKwlkbyB7CisJCXggPSAoeDw8OCkgfCAocFstLWldICYgMHhGRik7CisJfSB3aGlsZSAoaSA+IDApOworCS8qIEV4dGVuZCB0aGUgc2lnbiBiaXQuICovCisJaWYgKFNJWkVPRl9MT05HX0xPTkcgPiBmLT5zaXplKQorCQl4IHw9IC0oeCAmICgxTCA8PCAoKDggKiBmLT5zaXplKSAtIDEpKSk7CisJaWYgKHggPj0gTE9OR19NSU4gJiYgeCA8PSBMT05HX01BWCkKKwkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKFB5X1NBRkVfRE9XTkNBU1QoeCwgUFlfTE9OR19MT05HLCBsb25nKSk7CisJcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoeCk7CisjZWxzZQorCXJldHVybiBfUHlMb25nX0Zyb21CeXRlQXJyYXkoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwLAorCQkJCSAgICAgIDgsCisJCQkJICAgICAgMSwgLyogbGl0dGxlLWVuZGlhbiAqLworCQkJCSAgICAgIDEgIC8qIHNpZ25lZCAqLyk7CisjZW5kaWYKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2x1X3Vsb25nbG9uZyhjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKwl1bnNpZ25lZCBQWV9MT05HX0xPTkcgeCA9IDA7CisJUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKKwlkbyB7CisJCXggPSAoeDw8OCkgfCAocFstLWldICYgMHhGRik7CisJfSB3aGlsZSAoaSA+IDApOworCWlmICh4IDw9IExPTkdfTUFYKQorCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCB1bnNpZ25lZCBQWV9MT05HX0xPTkcsIGxvbmcpKTsKKwlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHgpOworI2Vsc2UKKwlyZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KChjb25zdCB1bnNpZ25lZCBjaGFyICopcCwKKwkJCQkgICAgICA4LAorCQkJCSAgICAgIDEsIC8qIGxpdHRsZS1lbmRpYW4gKi8KKwkJCQkgICAgICAwICAvKiBzaWduZWQgKi8pOworI2VuZGlmCit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitsdV9mbG9hdChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJcmV0dXJuIHVucGFja19mbG9hdChwLCAxKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2x1X2RvdWJsZShjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJcmV0dXJuIHVucGFja19kb3VibGUocCwgMSk7Cit9CisKK3N0YXRpYyBpbnQKK2xwX2ludChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCWxvbmcgeDsKKwlQeV9zc2l6ZV90IGk7CisJaWYgKGdldF9sb25nKHYsICZ4KSA8IDApCisJCXJldHVybiAtMTsKKwlpID0gZi0+c2l6ZTsKKwlpZiAoaSAhPSBTSVpFT0ZfTE9ORykgeworCQlpZiAoKGkgPT0gMikgJiYgKHggPCAtMzI3NjggfHwgeCA+IDMyNzY3KSkKKwkJCXJldHVybiBfcmFuZ2VfZXJyb3IoZi0+Zm9ybWF0LCBpLCAwKTsKKyNpZiAoU0laRU9GX0xPTkcgIT0gNCkKKwkJZWxzZSBpZiAoKGkgPT0gNCkgJiYgKHggPCAtMjE0NzQ4MzY0OEwgfHwgeCA+IDIxNDc0ODM2NDdMKSkKKwkJCXJldHVybiBfcmFuZ2VfZXJyb3IoZi0+Zm9ybWF0LCBpLCAwKTsKKyNlbmRpZgorCX0KKwlkbyB7CisJCSpwKysgPSAoY2hhcil4OworCQl4ID4+PSA4OworCX0gd2hpbGUgKC0taSA+IDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitscF91aW50KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCit7CisJdW5zaWduZWQgbG9uZyB4OworCVB5X3NzaXplX3QgaTsKKwlpZiAoZ2V0X3Vsb25nKHYsICZ4KSA8IDApCisJCXJldHVybiAtMTsKKwlpID0gZi0+c2l6ZTsKKwlpZiAoaSAhPSBTSVpFT0ZfTE9ORykgeworCQl1bnNpZ25lZCBsb25nIG1heGludCA9IDE7CisJCW1heGludCA8PD0gKHVuc2lnbmVkIGxvbmcpKGkgKiA4KTsKKwkJaWYgKHggPj0gbWF4aW50KQorCQkJcmV0dXJuIF9yYW5nZV9lcnJvcihmLT5mb3JtYXQsIGYtPnNpemUsIDEpOworCX0KKwlkbyB7CisJCSpwKysgPSAoY2hhcil4OworCQl4ID4+PSA4OworCX0gd2hpbGUgKC0taSA+IDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitscF9sb25nbG9uZyhjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCWludCByZXM7CisJdiA9IGdldF9weWxvbmcodik7CisJaWYgKHYgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCXJlcyA9IF9QeUxvbmdfQXNCeXRlQXJyYXkoKFB5TG9uZ09iamVjdCopdiwKKwkJCSAgIAkgICh1bnNpZ25lZCBjaGFyICopcCwKKwkJCQkgIDgsCisJCQkJICAxLCAvKiBsaXR0bGVfZW5kaWFuICovCisJCQkJICAxICAvKiBzaWduZWQgKi8pOworCVB5X0RFQ1JFRih2KTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50CitscF91bG9uZ2xvbmcoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlpbnQgcmVzOworCXYgPSBnZXRfcHlsb25nKHYpOworCWlmICh2ID09IE5VTEwpCisJCXJldHVybiAtMTsKKwlyZXMgPSBfUHlMb25nX0FzQnl0ZUFycmF5KChQeUxvbmdPYmplY3QqKXYsCisJCQkgICAJICAodW5zaWduZWQgY2hhciAqKXAsCisJCQkJICA4LAorCQkJCSAgMSwgLyogbGl0dGxlX2VuZGlhbiAqLworCQkJCSAgMCAgLyogc2lnbmVkICovKTsKKwlQeV9ERUNSRUYodik7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludAorbHBfZmxvYXQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKK3sKKwlkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7CisJaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCisJCQkJInJlcXVpcmVkIGFyZ3VtZW50IGlzIG5vdCBhIGZsb2F0Iik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIF9QeUZsb2F0X1BhY2s0KHgsICh1bnNpZ25lZCBjaGFyICopcCwgMSk7Cit9CisKK3N0YXRpYyBpbnQKK2xwX2RvdWJsZShjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCWRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKKwlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisJCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKwkJCQkicmVxdWlyZWQgYXJndW1lbnQgaXMgbm90IGEgZmxvYXQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gX1B5RmxvYXRfUGFjazgoeCwgKHVuc2lnbmVkIGNoYXIgKilwLCAxKTsKK30KKworc3RhdGljIGZvcm1hdGRlZiBsaWxlbmRpYW5fdGFibGVbXSA9IHsKKwl7J3gnLAkxLAkJMCwJCU5VTEx9LAorCXsnYicsCTEsCQkwLAkJbnVfYnl0ZSwJbnBfYnl0ZX0sCisJeydCJywJMSwJCTAsCQludV91Ynl0ZSwJbnBfdWJ5dGV9LAorCXsnYycsCTEsCQkwLAkJbnVfY2hhciwJbnBfY2hhcn0sCisJeydzJywJMSwJCTAsCQlOVUxMfSwKKwl7J3AnLAkxLAkJMCwJCU5VTEx9LAorCXsnaCcsCTIsCQkwLAkJbHVfaW50LAkJbHBfaW50fSwKKwl7J0gnLAkyLAkJMCwJCWx1X3VpbnQsCWxwX3VpbnR9LAorCXsnaScsCTQsCQkwLAkJbHVfaW50LAkJbHBfaW50fSwKKwl7J0knLAk0LAkJMCwJCWx1X3VpbnQsCWxwX3VpbnR9LAorCXsnbCcsCTQsCQkwLAkJbHVfaW50LAkJbHBfaW50fSwKKwl7J0wnLAk0LAkJMCwJCWx1X3VpbnQsCWxwX3VpbnR9LAorCXsncScsCTgsCQkwLAkJbHVfbG9uZ2xvbmcsCWxwX2xvbmdsb25nfSwKKwl7J1EnLAk4LAkJMCwJCWx1X3Vsb25nbG9uZywJbHBfdWxvbmdsb25nfSwKKwl7J2YnLAk0LAkJMCwJCWx1X2Zsb2F0LAlscF9mbG9hdH0sCisJeydkJywJOCwJCTAsCQlsdV9kb3VibGUsCWxwX2RvdWJsZX0sCisJezB9Cit9OworCisKK3N0YXRpYyBjb25zdCBmb3JtYXRkZWYgKgord2hpY2h0YWJsZShjaGFyICoqcGZtdCkKK3sKKwljb25zdCBjaGFyICpmbXQgPSAoKnBmbXQpKys7IC8qIE1heSBiZSBiYWNrZWQgb3V0IG9mIGxhdGVyICovCisJc3dpdGNoICgqZm10KSB7CisJY2FzZSAnPCc6CisJCXJldHVybiBsaWxlbmRpYW5fdGFibGU7CisJY2FzZSAnPic6CisJY2FzZSAnISc6IC8qIE5ldHdvcmsgYnl0ZSBvcmRlciBpcyBiaWctZW5kaWFuICovCisJCXJldHVybiBiaWdlbmRpYW5fdGFibGU7CisJY2FzZSAnPSc6IHsgLyogSG9zdCBieXRlIG9yZGVyIC0tIGRpZmZlcmVudCBmcm9tIG5hdGl2ZSBpbiBhbGlnbWVudCEgKi8KKwkJaW50IG4gPSAxOworCQljaGFyICpwID0gKGNoYXIgKikgJm47CisJCWlmICgqcCA9PSAxKQorCQkJcmV0dXJuIGxpbGVuZGlhbl90YWJsZTsKKwkJZWxzZQorCQkJcmV0dXJuIGJpZ2VuZGlhbl90YWJsZTsKKwl9CisJZGVmYXVsdDoKKwkJLS0qcGZtdDsgLyogQmFjayBvdXQgb2YgcG9pbnRlciBpbmNyZW1lbnQgKi8KKwkJLyogRmFsbCB0aHJvdWdoICovCisJY2FzZSAnQCc6CisJCXJldHVybiBuYXRpdmVfdGFibGU7CisJfQorfQorCisKKy8qIEdldCB0aGUgdGFibGUgZW50cnkgZm9yIGEgZm9ybWF0IGNvZGUgKi8KKworc3RhdGljIGNvbnN0IGZvcm1hdGRlZiAqCitnZXRlbnRyeShpbnQgYywgY29uc3QgZm9ybWF0ZGVmICpmKQoreworCWZvciAoOyBmLT5mb3JtYXQgIT0gJ1wwJzsgZisrKSB7CisJCWlmIChmLT5mb3JtYXQgPT0gYykgeworCQkJcmV0dXJuIGY7CisJCX0KKwl9CisJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLCAiYmFkIGNoYXIgaW4gc3RydWN0IGZvcm1hdCIpOworCXJldHVybiBOVUxMOworfQorCisKKy8qIEFsaWduIGEgc2l6ZSBhY2NvcmRpbmcgdG8gYSBmb3JtYXQgY29kZSAqLworCitzdGF0aWMgaW50CithbGlnbihQeV9zc2l6ZV90IHNpemUsIGNoYXIgYywgY29uc3QgZm9ybWF0ZGVmICplKQoreworCWlmIChlLT5mb3JtYXQgPT0gYykgeworCQlpZiAoZS0+YWxpZ25tZW50KSB7CisJCQlzaXplID0gKChzaXplICsgZS0+YWxpZ25tZW50IC0gMSkKKwkJCQkvIGUtPmFsaWdubWVudCkKKwkJCQkqIGUtPmFsaWdubWVudDsKKwkJfQorCX0KKwlyZXR1cm4gc2l6ZTsKK30KKworCisvKiBjYWxjdWxhdGUgdGhlIHNpemUgb2YgYSBmb3JtYXQgc3RyaW5nICovCisKK3N0YXRpYyBpbnQKK3ByZXBhcmVfcyhQeVN0cnVjdE9iamVjdCAqc2VsZikKK3sKKwljb25zdCBmb3JtYXRkZWYgKmY7CisJY29uc3QgZm9ybWF0ZGVmICplOworCWZvcm1hdGNvZGUgKmNvZGVzOworCQorCWNvbnN0IGNoYXIgKnM7CisJY29uc3QgY2hhciAqZm10OworCWNoYXIgYzsKKwlQeV9zc2l6ZV90IHNpemUsIGxlbiwgbnVtLCBpdGVtc2l6ZSwgeDsKKworCWZtdCA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmLT5zX2Zvcm1hdCk7CisKKwlmID0gd2hpY2h0YWJsZSgoY2hhciAqKikmZm10KTsKKwkKKwlzID0gZm10OworCXNpemUgPSAwOworCWxlbiA9IDA7CisJd2hpbGUgKChjID0gKnMrKykgIT0gJ1wwJykgeworCQlpZiAoaXNzcGFjZShQeV9DSEFSTUFTSyhjKSkpCisJCQljb250aW51ZTsKKwkJaWYgKCcwJyA8PSBjICYmIGMgPD0gJzknKSB7CisJCQludW0gPSBjIC0gJzAnOworCQkJd2hpbGUgKCcwJyA8PSAoYyA9ICpzKyspICYmIGMgPD0gJzknKSB7CisJCQkJeCA9IG51bSoxMCArIChjIC0gJzAnKTsKKwkJCQlpZiAoeC8xMCAhPSBudW0pIHsKKwkJCQkJUHlFcnJfU2V0U3RyaW5nKAorCQkJCQkJU3RydWN0RXJyb3IsCisJCQkJCQkib3ZlcmZsb3cgaW4gaXRlbSBjb3VudCIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCW51bSA9IHg7CisJCQl9CisJCQlpZiAoYyA9PSAnXDAnKQorCQkJCWJyZWFrOworCQl9CisJCWVsc2UKKwkJCW51bSA9IDE7CisKKwkJZSA9IGdldGVudHJ5KGMsIGYpOworCQlpZiAoZSA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCQkKKwkJc3dpdGNoIChjKSB7CisJCQljYXNlICdzJzogLyogZmFsbCB0aHJvdWdoICovCisJCQljYXNlICdwJzogbGVuKys7IGJyZWFrOworCQkJY2FzZSAneCc6IGJyZWFrOworCQkJZGVmYXVsdDogbGVuICs9IG51bTsgYnJlYWs7CisJCX0KKworCQlpdGVtc2l6ZSA9IGUtPnNpemU7CisJCXNpemUgPSBhbGlnbihzaXplLCBjLCBlKTsKKwkJeCA9IG51bSAqIGl0ZW1zaXplOworCQlzaXplICs9IHg7CisJCWlmICh4L2l0ZW1zaXplICE9IG51bSB8fCBzaXplIDwgMCkgeworCQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorCQkJCQkidG90YWwgc3RydWN0IHNpemUgdG9vIGxvbmciKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXNlbGYtPnNfc2l6ZSA9IHNpemU7CisJc2VsZi0+c19sZW4gPSBsZW47CisJY29kZXMgPSBQeU1lbV9NQUxMT0MoKGxlbiArIDEpICogc2l6ZW9mKGZvcm1hdGNvZGUpKTsKKwlpZiAoY29kZXMgPT0gTlVMTCkgeworCQlQeUVycl9Ob01lbW9yeSgpOworCQlyZXR1cm4gLTE7CisJfQorCXNlbGYtPnNfY29kZXMgPSBjb2RlczsKKwkKKwlzID0gZm10OworCXNpemUgPSAwOworCXdoaWxlICgoYyA9ICpzKyspICE9ICdcMCcpIHsKKwkJaWYgKGlzc3BhY2UoUHlfQ0hBUk1BU0soYykpKQorCQkJY29udGludWU7CisJCWlmICgnMCcgPD0gYyAmJiBjIDw9ICc5JykgeworCQkJbnVtID0gYyAtICcwJzsKKwkJCXdoaWxlICgnMCcgPD0gKGMgPSAqcysrKSAmJiBjIDw9ICc5JykKKwkJCQludW0gPSBudW0qMTAgKyAoYyAtICcwJyk7CisJCQlpZiAoYyA9PSAnXDAnKQorCQkJCWJyZWFrOworCQl9CisJCWVsc2UKKwkJCW51bSA9IDE7CisKKwkJZSA9IGdldGVudHJ5KGMsIGYpOworCQkKKwkJc2l6ZSA9IGFsaWduKHNpemUsIGMsIGUpOworCQlpZiAoYyA9PSAncycgfHwgYyA9PSAncCcpIHsKKwkJCWNvZGVzLT5vZmZzZXQgPSBzaXplOworCQkJY29kZXMtPnNpemUgPSBudW07CisJCQljb2Rlcy0+Zm10ZGVmID0gZTsKKwkJCWNvZGVzKys7CisJCQlzaXplICs9IG51bTsKKwkJfSBlbHNlIGlmIChjID09ICd4JykgeworCQkJc2l6ZSArPSBudW07CisJCX0gZWxzZSB7CisJCQl3aGlsZSAoLS1udW0gPj0gMCkgeworCQkJCWNvZGVzLT5vZmZzZXQgPSBzaXplOworCQkJCWNvZGVzLT5zaXplID0gZS0+c2l6ZTsKKwkJCQljb2Rlcy0+Zm10ZGVmID0gZTsKKwkJCQljb2RlcysrOworCQkJCXNpemUgKz0gZS0+c2l6ZTsKKwkJCX0KKwkJfQorCX0KKwljb2Rlcy0+Zm10ZGVmID0gTlVMTDsKKwljb2Rlcy0+b2Zmc2V0ID0gc2l6ZTsKKwljb2Rlcy0+c2l6ZSA9IDA7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitzX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKK3sKKwlQeU9iamVjdCAqc2VsZjsKKworCWFzc2VydCh0eXBlICE9IE5VTEwgJiYgdHlwZS0+dHBfYWxsb2MgIT0gTlVMTCk7CisKKwlzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisJaWYgKHNlbGYgIT0gTlVMTCkgeworCQlQeVN0cnVjdE9iamVjdCAqcyA9IChQeVN0cnVjdE9iamVjdCopc2VsZjsKKwkJUHlfSU5DUkVGKFB5X05vbmUpOworCQlzLT5zX2Zvcm1hdCA9IFB5X05vbmU7CisJCXMtPnNfY29kZXMgPSBOVUxMOworCQlzLT5zX3NpemUgPSAtMTsKKwkJcy0+c19sZW4gPSAtMTsKKwl9CisJcmV0dXJuIHNlbGY7Cit9CisKK3N0YXRpYyBpbnQKK3NfaW5pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQoreworCVB5U3RydWN0T2JqZWN0ICpzb3NlbGYgPSAoUHlTdHJ1Y3RPYmplY3QgKilzZWxmOworCVB5T2JqZWN0ICpvX2Zvcm1hdCA9IE5VTEw7CisJaW50IHJldCA9IDA7CisJc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJmb3JtYXQiLCAwfTsKKworCWFzc2VydChQeVN0cnVjdF9DaGVjayhzZWxmKSk7CisKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiUzpTdHJ1Y3QiLCBrd2xpc3QsCisJCQkJCSAmb19mb3JtYXQpKQorCQlyZXR1cm4gLTE7CisKKwlQeV9JTkNSRUYob19mb3JtYXQpOworCVB5X1hERUNSRUYoc29zZWxmLT5zX2Zvcm1hdCk7CisJc29zZWxmLT5zX2Zvcm1hdCA9IG9fZm9ybWF0OworCQorCXJldCA9IHByZXBhcmVfcyhzb3NlbGYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitzX2RlYWxsb2MoUHlTdHJ1Y3RPYmplY3QgKnMpCit7CisJaWYgKHMtPndlYWtyZWZsaXN0ICE9IE5VTEwpCisJCVB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoKFB5T2JqZWN0ICopcyk7CisJaWYgKHMtPnNfY29kZXMgIT0gTlVMTCkgeworCQlQeU1lbV9GUkVFKHMtPnNfY29kZXMpOworCX0KKwlQeV9YREVDUkVGKHMtPnNfZm9ybWF0KTsKKwlzLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXMpOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorc191bnBhY2tfaW50ZXJuYWwoUHlTdHJ1Y3RPYmplY3QgKnNvc2VsZiwgY2hhciAqc3RhcnRmcm9tKSB7CisJZm9ybWF0Y29kZSAqY29kZTsKKwlQeV9zc2l6ZV90IGkgPSAwOworCVB5T2JqZWN0ICpyZXN1bHQgPSBQeVR1cGxlX05ldyhzb3NlbGYtPnNfbGVuKTsKKwlpZiAocmVzdWx0ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJZm9yIChjb2RlID0gc29zZWxmLT5zX2NvZGVzOyBjb2RlLT5mbXRkZWYgIT0gTlVMTDsgY29kZSsrKSB7CisJCVB5T2JqZWN0ICp2OworCQljb25zdCBmb3JtYXRkZWYgKmUgPSBjb2RlLT5mbXRkZWY7CisJCWNvbnN0IGNoYXIgKnJlcyA9IHN0YXJ0ZnJvbSArIGNvZGUtPm9mZnNldDsKKwkJaWYgKGUtPmZvcm1hdCA9PSAncycpIHsKKwkJCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShyZXMsIGNvZGUtPnNpemUpOworCQkJaWYgKHYgPT0gTlVMTCkKKwkJCQlnb3RvIGZhaWw7CisJCQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSsrLCB2KTsKKwkJfSBlbHNlIGlmIChlLT5mb3JtYXQgPT0gJ3AnKSB7CisJCQlQeV9zc2l6ZV90IG4gPSAqKHVuc2lnbmVkIGNoYXIqKXJlczsKKwkJCWlmIChuID49IGNvZGUtPnNpemUpCisJCQkJbiA9IGNvZGUtPnNpemUgLSAxOworCQkJdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHJlcyArIDEsIG4pOworCQkJaWYgKHYgPT0gTlVMTCkKKwkJCQlnb3RvIGZhaWw7CisJCQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSsrLCB2KTsKKwkJfSBlbHNlIHsKKwkJCXYgPSBlLT51bnBhY2socmVzLCBlKTsKKwkJCWlmICh2ID09IE5VTEwpCisJCQkJZ290byBmYWlsOworCQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGkrKywgdik7CisJCX0KKwl9CisKKwlyZXR1cm4gcmVzdWx0OworZmFpbDoKKwlQeV9ERUNSRUYocmVzdWx0KTsKKwlyZXR1cm4gTlVMTDsKK30KKworCitQeURvY19TVFJWQVIoc191bnBhY2tfX2RvY19fLAorIlMudW5wYWNrKHN0cikgLT4gKHYxLCB2MiwgLi4uKVxuXAorXG5cCitSZXR1cm4gdHVwbGUgY29udGFpbmluZyB2YWx1ZXMgdW5wYWNrZWQgYWNjb3JkaW5nIHRvIHRoaXMgU3RydWN0J3MgZm9ybWF0LlxuXAorUmVxdWlyZXMgbGVuKHN0cikgPT0gc2VsZi5zaXplLiBTZWUgc3RydWN0Ll9fZG9jX18gZm9yIG1vcmUgb24gZm9ybWF0XG5cCitzdHJpbmdzLiIpOworCitzdGF0aWMgUHlPYmplY3QgKgorc191bnBhY2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICppbnB1dHN0cikKK3sKKwlQeVN0cnVjdE9iamVjdCAqc29zZWxmID0gKFB5U3RydWN0T2JqZWN0ICopc2VsZjsKKwlhc3NlcnQoUHlTdHJ1Y3RfQ2hlY2soc2VsZikpOworCWFzc2VydChzb3NlbGYtPnNfY29kZXMgIT0gTlVMTCk7CQorCWlmIChpbnB1dHN0ciA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhpbnB1dHN0cikgfHwKKwkJUHlTdHJpbmdfR0VUX1NJWkUoaW5wdXRzdHIpICE9IHNvc2VsZi0+c19zaXplKSB7CisJCVB5RXJyX0Zvcm1hdChTdHJ1Y3RFcnJvciwKKwkJCSJ1bnBhY2sgcmVxdWlyZXMgYSBzdHJpbmcgYXJndW1lbnQgb2YgbGVuZ3RoICV6ZCIsIHNvc2VsZi0+c19zaXplKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBzX3VucGFja19pbnRlcm5hbChzb3NlbGYsIFB5U3RyaW5nX0FTX1NUUklORyhpbnB1dHN0cikpOworfQorCitQeURvY19TVFJWQVIoc191bnBhY2tfZnJvbV9fZG9jX18sCisiUy51bnBhY2tfZnJvbShidWZmZXJbLCBvZmZzZXRdKSAtPiAodjEsIHYyLCAuLi4pXG5cCitcblwKK1JldHVybiB0dXBsZSBjb250YWluaW5nIHZhbHVlcyB1bnBhY2tlZCBhY2NvcmRpbmcgdG8gdGhpcyBTdHJ1Y3QncyBmb3JtYXQuXG5cCitVbmxpa2UgdW5wYWNrLCB1bnBhY2tfZnJvbSBjYW4gdW5wYWNrIHZhbHVlcyBmcm9tIGFueSBvYmplY3Qgc3VwcG9ydGluZ1xuXAordGhlIGJ1ZmZlciBBUEksIG5vdCBqdXN0IHN0ci4gUmVxdWlyZXMgbGVuKGJ1ZmZlcltvZmZzZXQ6XSkgPj0gc2VsZi5zaXplLlxuXAorU2VlIHN0cnVjdC5fX2RvY19fIGZvciBtb3JlIG9uIGZvcm1hdCBzdHJpbmdzLiIpOworCitzdGF0aWMgUHlPYmplY3QgKgorc191bnBhY2tfZnJvbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQoreworCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiYnVmZmVyIiwgIm9mZnNldCIsIDB9OworI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCisJc3RhdGljIGNoYXIgKmZtdCA9ICJ6I3xpOnVucGFja19mcm9tIjsKKyNlbHNlCisJc3RhdGljIGNoYXIgKmZtdCA9ICJ6I3xuOnVucGFja19mcm9tIjsKKyNlbmRpZgorCVB5X3NzaXplX3QgYnVmZmVyX2xlbiA9IDAsIG9mZnNldCA9IDA7CisJY2hhciAqYnVmZmVyID0gTlVMTDsKKwlQeVN0cnVjdE9iamVjdCAqc29zZWxmID0gKFB5U3RydWN0T2JqZWN0ICopc2VsZjsKKwlhc3NlcnQoUHlTdHJ1Y3RfQ2hlY2soc2VsZikpOworCWFzc2VydChzb3NlbGYtPnNfY29kZXMgIT0gTlVMTCk7CisKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCBmbXQsIGt3bGlzdCwKKwkJCQkJICZidWZmZXIsICZidWZmZXJfbGVuLCAmb2Zmc2V0KSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoYnVmZmVyID09IE5VTEwpIHsKKwkJUHlFcnJfRm9ybWF0KFN0cnVjdEVycm9yLAorCQkJInVucGFja19mcm9tIHJlcXVpcmVzIGEgYnVmZmVyIGFyZ3VtZW50Iik7CisJCXJldHVybiBOVUxMOworCX0KKwkKKwlpZiAob2Zmc2V0IDwgMCkKKwkJb2Zmc2V0ICs9IGJ1ZmZlcl9sZW47CisKKwlpZiAob2Zmc2V0IDwgMCB8fCAoYnVmZmVyX2xlbiAtIG9mZnNldCkgPCBzb3NlbGYtPnNfc2l6ZSkgeworCQlQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCisJCQkidW5wYWNrX2Zyb20gcmVxdWlyZXMgYSBidWZmZXIgb2YgYXQgbGVhc3QgJXpkIGJ5dGVzIiwKKwkJCXNvc2VsZi0+c19zaXplKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBzX3VucGFja19pbnRlcm5hbChzb3NlbGYsIGJ1ZmZlciArIG9mZnNldCk7Cit9CisKKworLyoKKyAqIEd1dHMgb2YgdGhlIHBhY2sgZnVuY3Rpb24uCisgKgorICogVGFrZXMgYSBzdHJ1Y3Qgb2JqZWN0LCBhIHR1cGxlIG9mIGFyZ3VtZW50cywgYW5kIG9mZnNldCBpbiB0aGF0IHR1cGxlIG9mCisgKiBhcmd1bWVudCBmb3Igd2hlcmUgdG8gc3RhcnQgcHJvY2Vzc2luZyB0aGUgYXJndW1lbnRzIGZvciBwYWNraW5nLCBhbmQgYQorICogY2hhcmFjdGVyIGJ1ZmZlciBmb3Igd3JpdGluZyB0aGUgcGFja2VkIHN0cmluZy4gIFRoZSBjYWxsZXIgbXVzdCBpbnN1cmUKKyAqIHRoYXQgdGhlIGJ1ZmZlciBtYXkgY29udGFpbiB0aGUgcmVxdWlyZWQgbGVuZ3RoIGZvciBwYWNraW5nIHRoZSBhcmd1bWVudHMuCisgKiAwIGlzIHJldHVybmVkIG9uIHN1Y2Nlc3MsIDEgaXMgcmV0dXJuZWQgaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgKgorICovCitzdGF0aWMgaW50CitzX3BhY2tfaW50ZXJuYWwoUHlTdHJ1Y3RPYmplY3QgKnNvc2VsZiwgUHlPYmplY3QgKmFyZ3MsIGludCBvZmZzZXQsIGNoYXIqIGJ1ZikKK3sKKwlmb3JtYXRjb2RlICpjb2RlOworCVB5X3NzaXplX3QgaTsKKworCW1lbXNldChidWYsICdcMCcsIHNvc2VsZi0+c19zaXplKTsKKwlpID0gb2Zmc2V0OworCWZvciAoY29kZSA9IHNvc2VsZi0+c19jb2RlczsgY29kZS0+Zm10ZGVmICE9IE5VTEw7IGNvZGUrKykgeworCQlQeV9zc2l6ZV90IG47CisJCVB5T2JqZWN0ICp2OworCQljb25zdCBmb3JtYXRkZWYgKmUgPSBjb2RlLT5mbXRkZWY7CisJCWNoYXIgKnJlcyA9IGJ1ZiArIGNvZGUtPm9mZnNldDsKKwkJaWYgKGUtPmZvcm1hdCA9PSAncycpIHsKKwkJCXYgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkrKyk7CisJCQlpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKSB7CisJCQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorCQkJCQkJImFyZ3VtZW50IGZvciAncycgbXVzdCBiZSBhIHN0cmluZyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCW4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKKwkJCWlmIChuID4gY29kZS0+c2l6ZSkKKwkJCQluID0gY29kZS0+c2l6ZTsKKwkJCWlmIChuID4gMCkKKwkJCQltZW1jcHkocmVzLCBQeVN0cmluZ19BU19TVFJJTkcodiksIG4pOworCQl9IGVsc2UgaWYgKGUtPmZvcm1hdCA9PSAncCcpIHsKKwkJCXYgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkrKyk7CisJCQlpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKSB7CisJCQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorCQkJCQkJImFyZ3VtZW50IGZvciAncCcgbXVzdCBiZSBhIHN0cmluZyIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCW4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKKwkJCWlmIChuID4gKGNvZGUtPnNpemUgLSAxKSkKKwkJCQluID0gY29kZS0+c2l6ZSAtIDE7CisJCQlpZiAobiA+IDApCisJCQkJbWVtY3B5KHJlcyArIDEsIFB5U3RyaW5nX0FTX1NUUklORyh2KSwgbik7CisJCQlpZiAobiA+IDI1NSkKKwkJCQluID0gMjU1OworCQkJKnJlcyA9IFB5X1NBRkVfRE9XTkNBU1QobiwgUHlfc3NpemVfdCwgdW5zaWduZWQgY2hhcik7CisJCX0gZWxzZSB7CisJCQl2ID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKyspOworCQkJaWYgKGUtPnBhY2socmVzLCB2LCBlKSA8IDApCisJCQkJcmV0dXJuIC0xOworCQl9CisJfQorCQorCS8qIFN1Y2Nlc3MgKi8KKwlyZXR1cm4gMDsKK30KKworCitQeURvY19TVFJWQVIoc19wYWNrX19kb2NfXywKKyJTLnBhY2sodjEsIHYyLCAuLi4pIC0+IHN0cmluZ1xuXAorXG5cCitSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB2YWx1ZXMgdjEsIHYyLCAuLi4gcGFja2VkIGFjY29yZGluZyB0byB0aGlzXG5cCitTdHJ1Y3QncyBmb3JtYXQuIFNlZSBzdHJ1Y3QuX19kb2NfXyBmb3IgbW9yZSBvbiBmb3JtYXQgc3RyaW5ncy4iKTsKKworc3RhdGljIFB5T2JqZWN0ICoKK3NfcGFjayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisJUHlTdHJ1Y3RPYmplY3QgKnNvc2VsZjsKKwlQeU9iamVjdCAqcmVzdWx0OworCisJLyogVmFsaWRhdGUgYXJndW1lbnRzLiAqLworCXNvc2VsZiA9IChQeVN0cnVjdE9iamVjdCAqKXNlbGY7CisJYXNzZXJ0KFB5U3RydWN0X0NoZWNrKHNlbGYpKTsKKwlhc3NlcnQoc29zZWxmLT5zX2NvZGVzICE9IE5VTEwpOworCWlmIChhcmdzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2soYXJncykgfHwKKwkgICAgUHlUdXBsZV9HRVRfU0laRShhcmdzKSAhPSBzb3NlbGYtPnNfbGVuKQorCXsKKwkJUHlFcnJfRm9ybWF0KFN0cnVjdEVycm9yLAorCQkJInBhY2sgcmVxdWlyZXMgZXhhY3RseSAlemQgYXJndW1lbnRzIiwgc29zZWxmLT5zX2xlbik7CisJCXJldHVybiBOVUxMOworCX0KKwkKKwkvKiBBbGxvY2F0ZSBhIG5ldyBzdHJpbmcgKi8KKwlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHNvc2VsZi0+c19zaXplKTsKKwlpZiAocmVzdWx0ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCQorCS8qIENhbGwgdGhlIGd1dHMgKi8KKwlpZiAoIHNfcGFja19pbnRlcm5hbChzb3NlbGYsIGFyZ3MsIDAsIFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpKSAhPSAwICkgeworCQlQeV9ERUNSRUYocmVzdWx0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworUHlEb2NfU1RSVkFSKHNfcGFja190b19fZG9jX18sCisiUy5wYWNrX3RvKGJ1ZmZlciwgb2Zmc2V0LCB2MSwgdjIsIC4uLilcblwKK1xuXAorUGFjayB0aGUgdmFsdWVzIHYyLCB2MiwgLi4uIGFjY29yZGluZyB0byB0aGlzIFN0cnVjdCdzIGZvcm1hdCwgd3JpdGUgXG5cCit0aGUgcGFja2VkIGJ5dGVzIGludG8gdGhlIHdyaXRhYmxlIGJ1ZmZlciBidWYgc3RhcnRpbmcgYXQgb2Zmc2V0LiAgTm90ZVxuXAordGhhdCB0aGUgb2Zmc2V0IGlzIG5vdCBhbiBvcHRpb25hbCBhcmd1bWVudC4gIFNlZSBzdHJ1Y3QuX19kb2NfXyBmb3IgXG5cCittb3JlIG9uIGZvcm1hdCBzdHJpbmdzLiIpOworCitzdGF0aWMgUHlPYmplY3QgKgorc19wYWNrX3RvKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKwlQeVN0cnVjdE9iamVjdCAqc29zZWxmOworCWNoYXIgKmJ1ZmZlcjsKKwlQeV9zc2l6ZV90IGJ1ZmZlcl9sZW4sIG9mZnNldDsKKworCS8qIFZhbGlkYXRlIGFyZ3VtZW50cy4gICsxIGlzIGZvciB0aGUgZmlyc3QgYXJnIGFzIGJ1ZmZlci4gKi8KKwlzb3NlbGYgPSAoUHlTdHJ1Y3RPYmplY3QgKilzZWxmOworCWFzc2VydChQeVN0cnVjdF9DaGVjayhzZWxmKSk7CisJYXNzZXJ0KHNvc2VsZi0+c19jb2RlcyAhPSBOVUxMKTsKKwlpZiAoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpIHx8CisJICAgIFB5VHVwbGVfR0VUX1NJWkUoYXJncykgIT0gKHNvc2VsZi0+c19sZW4gKyAyKSkKKwl7CisJCVB5RXJyX0Zvcm1hdChTdHJ1Y3RFcnJvciwKKwkJCSAgICAgInBhY2tfdG8gcmVxdWlyZXMgZXhhY3RseSAlemQgYXJndW1lbnRzIiwgCisJCQkgICAgIChzb3NlbGYtPnNfbGVuICsgMikpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBFeHRyYWN0IGEgd3JpdGFibGUgbWVtb3J5IGJ1ZmZlciBmcm9tIHRoZSBmaXJzdCBhcmd1bWVudCAqLworCWlmICggUHlPYmplY3RfQXNXcml0ZUJ1ZmZlcihQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApLCAKKwkJCQkJCQkJKHZvaWQqKikmYnVmZmVyLCAmYnVmZmVyX2xlbikgPT0gLTEgKSB7IAorCQlyZXR1cm4gTlVMTDsKKwl9CisJYXNzZXJ0KCBidWZmZXJfbGVuID49IDAgKTsKKworCS8qIEV4dHJhY3QgdGhlIG9mZnNldCBmcm9tIHRoZSBmaXJzdCBhcmd1bWVudCAqLworCW9mZnNldCA9IFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDEpKTsKKworCS8qIFN1cHBvcnQgbmVnYXRpdmUgb2Zmc2V0cy4gKi8KKwlpZiAob2Zmc2V0IDwgMCkKKwkJb2Zmc2V0ICs9IGJ1ZmZlcl9sZW47CisKKwkvKiBDaGVjayBib3VuZGFyaWVzICovCisJaWYgKG9mZnNldCA8IDAgfHwgKGJ1ZmZlcl9sZW4gLSBvZmZzZXQpIDwgc29zZWxmLT5zX3NpemUpIHsKKwkJUHlFcnJfRm9ybWF0KFN0cnVjdEVycm9yLAorCQkJICAgICAicGFja190byByZXF1aXJlcyBhIGJ1ZmZlciBvZiBhdCBsZWFzdCAlemQgYnl0ZXMiLAorCQkJICAgICBzb3NlbGYtPnNfc2l6ZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkKKwkvKiBDYWxsIHRoZSBndXRzICovCisJaWYgKCBzX3BhY2tfaW50ZXJuYWwoc29zZWxmLCBhcmdzLCAyLCBidWZmZXIgKyBvZmZzZXQpICE9IDAgKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBQeV9Ob25lOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorc19nZXRfZm9ybWF0KFB5U3RydWN0T2JqZWN0ICpzZWxmLCB2b2lkICp1bnVzZWQpCit7CisJUHlfSU5DUkVGKHNlbGYtPnNfZm9ybWF0KTsKKwlyZXR1cm4gc2VsZi0+c19mb3JtYXQ7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitzX2dldF9zaXplKFB5U3RydWN0T2JqZWN0ICpzZWxmLCB2b2lkICp1bnVzZWQpCit7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHNlbGYtPnNfc2l6ZSk7Cit9CisKKy8qIExpc3Qgb2YgZnVuY3Rpb25zICovCisKK3N0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgc19tZXRob2RzW10gPSB7CisJeyJwYWNrIiwJKFB5Q0Z1bmN0aW9uKXNfcGFjaywJCU1FVEhfVkFSQVJHUywgc19wYWNrX19kb2NfX30sCisJeyJwYWNrX3RvIiwJKFB5Q0Z1bmN0aW9uKXNfcGFja190bywJCU1FVEhfVkFSQVJHUywgc19wYWNrX3RvX19kb2NfX30sIAorCXsidW5wYWNrIiwJKFB5Q0Z1bmN0aW9uKXNfdW5wYWNrLAkJTUVUSF9PLCBzX3VucGFja19fZG9jX199LAorCXsidW5wYWNrX2Zyb20iLAkoUHlDRnVuY3Rpb24pc191bnBhY2tfZnJvbSwJTUVUSF9LRVlXT1JEUywgc191bnBhY2tfZnJvbV9fZG9jX199LAorCXtOVUxMLAkgTlVMTH0JCS8qIHNlbnRpbmVsICovCit9OworCitQeURvY19TVFJWQVIoc19fZG9jX18sICJDb21waWxlZCBzdHJ1Y3Qgb2JqZWN0Iik7CisKKyNkZWZpbmUgT0ZGKHgpIG9mZnNldG9mKFB5U3RydWN0T2JqZWN0LCB4KQorCitzdGF0aWMgUHlHZXRTZXREZWYgc19nZXRzZXRsaXN0W10gPSB7CisJeyJmb3JtYXQiLCAoZ2V0dGVyKXNfZ2V0X2Zvcm1hdCwgKHNldHRlcilOVUxMLCAic3RydWN0IGZvcm1hdCBzdHJpbmciLCBOVUxMfSwKKwl7InNpemUiLCAoZ2V0dGVyKXNfZ2V0X3NpemUsIChzZXR0ZXIpTlVMTCwgInN0cnVjdCBzaXplIGluIGJ5dGVzIiwgTlVMTH0sCisJe05VTEx9IC8qIHNlbnRpbmVsICovCit9OworCitzdGF0aWMKK1B5VHlwZU9iamVjdCBQeVN0cnVjdFR5cGUgPSB7CisJUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisJMCwKKwkiU3RydWN0IiwKKwlzaXplb2YoUHlTdHJ1Y3RPYmplY3QpLAorCTAsCisJKGRlc3RydWN0b3Ipc19kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCisJMCwJCQkJCS8qIHRwX3ByaW50ICovCisJMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KKwkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLworCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCisJMCwJCQkJCS8qIHRwX3JlcHIgKi8KKwkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCisJMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCisJMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KKwkwLAkJCQkJLyogdHBfaGFzaCAqLworCTAsCQkJCQkvKiB0cF9jYWxsICovCisJMCwJCQkJCS8qIHRwX3N0ciAqLworCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLworCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLAkvKiB0cF9zZXRhdHRybyAqLworCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KKwlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLC8qIHRwX2ZsYWdzICovCisJc19fZG9jX18sCQkJLyogdHBfZG9jICovCisJMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCisJMCwJCQkJCS8qIHRwX2NsZWFyICovCisJMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCisJb2Zmc2V0b2YoUHlTdHJ1Y3RPYmplY3QsIHdlYWtyZWZsaXN0KSwJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKwkwLAkJCQkJLyogdHBfaXRlciAqLworCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLworCXNfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCisJTlVMTCwJCQkJLyogdHBfbWVtYmVycyAqLworCXNfZ2V0c2V0bGlzdCwJCS8qIHRwX2dldHNldCAqLworCTAsCQkJCQkvKiB0cF9iYXNlICovCisJMCwJCQkJCS8qIHRwX2RpY3QgKi8KKwkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCisJMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLworCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCisJc19pbml0LAkJCQkvKiB0cF9pbml0ICovCisJUHlUeXBlX0dlbmVyaWNBbGxvYywvKiB0cF9hbGxvYyAqLworCXNfbmV3LAkJCQkvKiB0cF9uZXcgKi8KKwlQeU9iamVjdF9EZWwsCQkvKiB0cF9mcmVlICovCit9OworCisvKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gKi8KKworUHlNT0RJTklUX0ZVTkMKK2luaXRfc3RydWN0KHZvaWQpCit7CisJUHlPYmplY3QgKm0gPSBQeV9Jbml0TW9kdWxlKCJfc3RydWN0IiwgTlVMTCk7CisJaWYgKG0gPT0gTlVMTCkKKwkJcmV0dXJuOworCisJUHlTdHJ1Y3RUeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisJaWYgKFB5VHlwZV9SZWFkeSgmUHlTdHJ1Y3RUeXBlKSA8IDApCisJCXJldHVybjsKKworCS8qIENoZWNrIGVuZGlhbiBhbmQgc3dhcCBpbiBmYXN0ZXIgZnVuY3Rpb25zICovCisJeworCQlpbnQgb25lID0gMTsKKwkJZm9ybWF0ZGVmICpuYXRpdmUgPSBuYXRpdmVfdGFibGU7CisJCWZvcm1hdGRlZiAqb3RoZXIsICpwdHI7CisJCWlmICgoaW50KSoodW5zaWduZWQgY2hhciopJm9uZSkKKwkJCW90aGVyID0gbGlsZW5kaWFuX3RhYmxlOworCQllbHNlCisJCQlvdGhlciA9IGJpZ2VuZGlhbl90YWJsZTsKKwkJLyogU2NhbiB0aHJvdWdoIHRoZSBuYXRpdmUgdGFibGUsIGZpbmQgYSBtYXRjaGluZworCQkgICBlbnRyeSBpbiB0aGUgZW5kaWFuIHRhYmxlIGFuZCBzd2FwIGluIHRoZQorCQkgICBuYXRpdmUgaW1wbGVtZW50YXRpb25zIHdoZW5ldmVyIHBvc3NpYmxlCisJCSAgICg2NC1iaXQgcGxhdGZvcm1zIG1heSBub3QgaGF2ZSAic3RhbmRhcmQiIHNpemVzKSAqLworCQl3aGlsZSAobmF0aXZlLT5mb3JtYXQgIT0gJ1wwJyAmJiBvdGhlci0+Zm9ybWF0ICE9ICdcMCcpIHsKKwkJCXB0ciA9IG90aGVyOworCQkJd2hpbGUgKHB0ci0+Zm9ybWF0ICE9ICdcMCcpIHsKKwkJCQlpZiAocHRyLT5mb3JtYXQgPT0gbmF0aXZlLT5mb3JtYXQpIHsKKwkJCQkJLyogTWF0Y2ggZmFzdGVyIHdoZW4gZm9ybWF0cyBhcmUKKwkJCQkJICAgbGlzdGVkIGluIHRoZSBzYW1lIG9yZGVyICovCisJCQkJCWlmIChwdHIgPT0gb3RoZXIpCisJCQkJCQlvdGhlcisrOworCQkJCQkvKiBPbmx5IHVzZSB0aGUgdHJpY2sgaWYgdGhlIAorCQkJCQkgICBzaXplIG1hdGNoZXMgKi8KKwkJCQkJaWYgKHB0ci0+c2l6ZSAhPSBuYXRpdmUtPnNpemUpCisJCQkJCQlicmVhazsKKwkJCQkJLyogU2tpcCBmbG9hdCBhbmQgZG91YmxlLCBjb3VsZCBiZQorCQkJCQkgICAidW5rbm93biIgZmxvYXQgZm9ybWF0ICovCisJCQkJCWlmIChwdHItPmZvcm1hdCA9PSAnZCcgfHwgcHRyLT5mb3JtYXQgPT0gJ2YnKQorCQkJCQkJYnJlYWs7CisJCQkJCXB0ci0+cGFjayA9IG5hdGl2ZS0+cGFjazsKKwkJCQkJcHRyLT51bnBhY2sgPSBuYXRpdmUtPnVucGFjazsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXB0cisrOworCQkJfQorCQkJbmF0aXZlKys7CisJCX0KKwl9CisJCisJLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KKwlpZiAoU3RydWN0RXJyb3IgPT0gTlVMTCkgeworCQlTdHJ1Y3RFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigic3RydWN0LmVycm9yIiwgTlVMTCwgTlVMTCk7CisJCWlmIChTdHJ1Y3RFcnJvciA9PSBOVUxMKQorCQkJcmV0dXJuOworCX0KKworCVB5X0lOQ1JFRihTdHJ1Y3RFcnJvcik7CisJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIFN0cnVjdEVycm9yKTsKKworCVB5X0lOQ1JFRigoUHlPYmplY3QqKSZQeVN0cnVjdFR5cGUpOworCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiU3RydWN0IiwgKFB5T2JqZWN0KikmUHlTdHJ1Y3RUeXBlKTsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMgYi9Nb2R1bGVzL190ZXN0Y2FwaW1vZHVsZS5jCmluZGV4IGU4ODgxZGMuLjZiOWRmZmQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fdGVzdGNhcGltb2R1bGUuYwpAQCAtNDg2LDggKzQ4Niw4IEBACiAJcmV0dXJuIFB5X05vbmU7CiB9CiAKLXN0YXRpYwotUHlPYmplY3QgKmNvZGVjX2luY3JlbWVudGFsZW5jb2RlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCitzdGF0aWMgUHlPYmplY3QgKgorY29kZWNfaW5jcmVtZW50YWxlbmNvZGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKIAljb25zdCBjaGFyICplbmNvZGluZywgKmVycm9ycyA9IE5VTEw7CiAJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfHM6dGVzdF9pbmNyZW1lbnRhbGVuY29kZXIiLApAQCAtNDk2LDggKzQ5Niw4IEBACiAJcmV0dXJuIFB5Q29kZWNfSW5jcmVtZW50YWxFbmNvZGVyKGVuY29kaW5nLCBlcnJvcnMpOwogfQogCi1zdGF0aWMKLVB5T2JqZWN0ICpjb2RlY19pbmNyZW1lbnRhbGRlY29kZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQorc3RhdGljIFB5T2JqZWN0ICoKK2NvZGVjX2luY3JlbWVudGFsZGVjb2RlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAJY29uc3QgY2hhciAqZW5jb2RpbmcsICplcnJvcnMgPSBOVUxMOwogCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xzOnRlc3RfaW5jcmVtZW50YWxkZWNvZGVyIiwKQEAgLTY2MCw2ICs2NjAsNDIgQEAKIH0KICNlbmRpZgogCisvKiBTb21lIHRlc3RzIG9mIFB5U3RyaW5nX0Zyb21Gb3JtYXQoKS4gIFRoaXMgbmVlZHMgbW9yZSB0ZXN0cy4gKi8KK3N0YXRpYyBQeU9iamVjdCAqCit0ZXN0X3N0cmluZ19mcm9tX2Zvcm1hdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisJUHlPYmplY3QgKnJlc3VsdDsKKwljaGFyICptc2c7CisKKyNkZWZpbmUgQ0hFQ0tfMV9GT1JNQVQoRk9STUFULCBUWVBFKSAJCQlcCisJcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdChGT1JNQVQsIChUWVBFKTEpOwlcCisJaWYgKHJlc3VsdCA9PSBOVUxMKQkJCQlcCisJCXJldHVybiBOVUxMOwkJCQlcCisJaWYgKHN0cmNtcChQeVN0cmluZ19Bc1N0cmluZyhyZXN1bHQpLCAiMSIpKSB7CVwKKwkJbXNnID0gRk9STUFUICIgZmFpbGVkIGF0IDEiOwkJXAorCQlnb3RvIEZhaWw7CQkJCVwKKwl9CQkJCQkJXAorCVB5X0RFQ1JFRihyZXN1bHQpCisKKwlDSEVDS18xX0ZPUk1BVCgiJWQiLCBpbnQpOworCUNIRUNLXzFfRk9STUFUKCIlbGQiLCBsb25nKTsKKwkvKiBUaGUgeiB3aWR0aCBtb2RpZmllciB3YXMgYWRkZWQgaW4gUHl0aG9uIDIuNS4gKi8KKwlDSEVDS18xX0ZPUk1BVCgiJXpkIiwgUHlfc3NpemVfdCk7CisKKwkvKiBUaGUgdSB0eXBlIGNvZGUgd2FzIGFkZGVkIGluIFB5dGhvbiAyLjUuICovCisJQ0hFQ0tfMV9GT1JNQVQoIiV1IiwgdW5zaWduZWQgaW50KTsKKwlDSEVDS18xX0ZPUk1BVCgiJWx1IiwgdW5zaWduZWQgbG9uZyk7CisJQ0hFQ0tfMV9GT1JNQVQoIiV6dSIsIHNpemVfdCk7CisKKwlQeV9SRVRVUk5fTk9ORTsKKworIEZhaWw6CisgCVB5X1hERUNSRUYocmVzdWx0KTsKKwlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3Rfc3RyaW5nX2Zyb21fZm9ybWF0IiwgbXNnKTsKKworI3VuZGVmIENIRUNLXzFfRk9STUFUCit9CisKIHN0YXRpYyBQeU1ldGhvZERlZiBUZXN0TWV0aG9kc1tdID0gewogCXsicmFpc2VfZXhjZXB0aW9uIiwJcmFpc2VfZXhjZXB0aW9uLAkJIE1FVEhfVkFSQVJHU30sCiAJeyJ0ZXN0X2NvbmZpZyIsCQkoUHlDRnVuY3Rpb24pdGVzdF9jb25maWcsCSBNRVRIX05PQVJHU30sCkBAIC02NjksNiArNzA1LDcgQEAKIAl7InRlc3RfbG9uZ19udW1iaXRzIiwJKFB5Q0Z1bmN0aW9uKXRlc3RfbG9uZ19udW1iaXRzLAkgTUVUSF9OT0FSR1N9LAogCXsidGVzdF9rX2NvZGUiLAkJKFB5Q0Z1bmN0aW9uKXRlc3Rfa19jb2RlLAkgTUVUSF9OT0FSR1N9LAogCXsidGVzdF9udWxsX3N0cmluZ3MiLAkoUHlDRnVuY3Rpb24pdGVzdF9udWxsX3N0cmluZ3MsCSBNRVRIX05PQVJHU30sCisJeyJ0ZXN0X3N0cmluZ19mcm9tX2Zvcm1hdCIsIChQeUNGdW5jdGlvbil0ZXN0X3N0cmluZ19mcm9tX2Zvcm1hdCwgTUVUSF9OT0FSR1N9LAogCiAJeyJnZXRhcmdzX2IiLAkJZ2V0YXJnc19iLAkJCSBNRVRIX1ZBUkFSR1N9LAogCXsiZ2V0YXJnc19CIiwJCWdldGFyZ3NfQiwJCQkgTUVUSF9WQVJBUkdTfSwKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3RraW50ZXIuYyBiL01vZHVsZXMvX3RraW50ZXIuYwppbmRleCBjMTdiNmM2Li43NzU4M2I3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL190a2ludGVyLmMKKysrIGIvTW9kdWxlcy9fdGtpbnRlci5jCkBAIC0yNjE5LDIxICsyNjE5LDMyIEBACiBzdGF0aWMgUHlPYmplY3QJKgogVGthcHBfVGtJbml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKKwlzdGF0aWMgaW50IGhhc19mYWlsZWQ7CiAJVGNsX0ludGVycCAqaW50ZXJwID0gVGthcHBfSW50ZXJwKHNlbGYpOwogCVRrX1dpbmRvdyBtYWluX3dpbmRvdzsKIAljb25zdCBjaGFyICogX3RrX2V4aXN0cyA9IE5VTEw7Ci0JUHlPYmplY3QgKnJlcyA9CU5VTEw7CiAJaW50IGVycjsKIAltYWluX3dpbmRvdyA9IFRrX01haW5XaW5kb3coaW50ZXJwKTsKIAorCS8qIEluIGFsbCBjdXJyZW50IHZlcnNpb25zIG9mIFRrIChpbmNsdWRpbmcgOC40LjEzKSwgVGtfSW5pdAorCSAgIGRlYWRsb2NrcyBvbiB0aGUgc2Vjb25kIGNhbGwgd2hlbiB0aGUgZmlyc3QgY2FsbCBmYWlsZWQuCisJICAgVG8gYXZvaWQgdGhlIGRlYWRsb2NrLCB3ZSBqdXN0IHJlZnVzZSB0aGUgc2Vjb25kIGNhbGwgdGhyb3VnaAorCSAgIGEgc3RhdGljIHZhcmlhYmxlLiAqLworCWlmIChoYXNfZmFpbGVkKSB7CisJCVB5RXJyX1NldFN0cmluZyhUa2ludGVyX1RjbEVycm9yLCAKKwkJCQkiQ2FsbGluZyBUa19Jbml0IGFnYWluIGFmdGVyIGEgcHJldmlvdXMgY2FsbCBmYWlsZWQgbWlnaHQgZGVhZGxvY2siKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCSAgIAogCS8qIFdlIHdhbnQgdG8gZ3VhcmQgYWdhaW5zdCBjYWxsaW5nIFRrX0luaXQoKSBtdWx0aXBsZSB0aW1lcyAqLwogCUNIRUNLX1RDTF9BUFBBUlRNRU5UOwogCUVOVEVSX1RDTAogCWVyciA9IFRjbF9FdmFsKFRrYXBwX0ludGVycChzZWxmKSwgImluZm8gZXhpc3RzCXRrX3ZlcnNpb24iKTsKIAlFTlRFUl9PVkVSTEFQCiAJaWYgKGVyciA9PSBUQ0xfRVJST1IpIHsKLQkJLyogWFhYOiBzaG91bGRuJ3Qgd2UgZG8gc29tZXRoaW5nIHdpdGggcmVzPyAqLwotCQlyZXMgPSBUa2ludGVyX0Vycm9yKHNlbGYpOworCQkvKiBUaGlzIHNldHMgYW4gZXhjZXB0aW9uLCBidXQgd2UgY2Fubm90IHJldHVybiByaWdodAorCQkgICBhd2F5IGJlY2F1c2Ugd2UgbmVlZCB0byBleGl0IHRoZSBvdmVybGFwIGZpcnN0LiAqLworCQlUa2ludGVyX0Vycm9yKHNlbGYpOwogCX0gZWxzZSB7CiAJCV90a19leGlzdHMgPSBUa2FwcF9SZXN1bHQoc2VsZik7CiAJfQpAQCAtMjY0NCw2ICsyNjU1LDcgQEAKIAlpZiAoX3RrX2V4aXN0cyA9PSBOVUxMIHx8IHN0cmNtcChfdGtfZXhpc3RzLCAiMSIpICE9IDApCXsKIAkJaWYgKFRrX0luaXQoaW50ZXJwKQk9PSBUQ0xfRVJST1IpIHsKIAkJICAgICAgICBQeUVycl9TZXRTdHJpbmcoVGtpbnRlcl9UY2xFcnJvciwgVGNsX0dldFN0cmluZ1Jlc3VsdChUa2FwcF9JbnRlcnAoc2VsZikpKTsKKwkJCWhhc19mYWlsZWQgPSAxOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2FycmF5bW9kdWxlLmMgYi9Nb2R1bGVzL2FycmF5bW9kdWxlLmMKaW5kZXggNTJhN2Y1ZS4uYWYxMjc2OSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9hcnJheW1vZHVsZS5jCisrKyBiL01vZHVsZXMvYXJyYXltb2R1bGUuYwpAQCAtMTk3NSw5ICsxOTc1LDkgQEAKIAkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwogCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCiAJKHJlcHJmdW5jKWFycmF5X3JlcHIsCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hcyBfbnVtYmVyKi8KLQkmYXJyYXlfYXNfc2VxdWVuY2UsCQkJLyogdHBfYXMgX3NlcXVlbmNlKi8KLQkmYXJyYXlfYXNfbWFwcGluZywJCQkvKiB0cF9hcyBfbWFwcGluZyovCisJMCwJCQkJCS8qIHRwX2FzX251bWJlciovCisJJmFycmF5X2FzX3NlcXVlbmNlLAkJCS8qIHRwX2FzX3NlcXVlbmNlKi8KKwkmYXJyYXlfYXNfbWFwcGluZywJCQkvKiB0cF9hc19tYXBwaW5nKi8KIAkwLCAJCQkJCS8qIHRwX2hhc2ggKi8KIAkwLAkJCQkJLyogdHBfY2FsbCAqLwogCTAsCQkJCQkvKiB0cF9zdHIgKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY1BpY2tsZS5jIGIvTW9kdWxlcy9jUGlja2xlLmMKaW5kZXggMThkZjU5OS4uODVmZDQ1OSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jUGlja2xlLmMKKysrIGIvTW9kdWxlcy9jUGlja2xlLmMKQEAgLTExNTEsNyArMTE1MSw5IEBACiAJZWxzZSB7CiAJCWNoYXIgY19zdHJbMjUwXTsKIAkJY19zdHJbMF0gPSBGTE9BVDsKLQkJUHlPU19zbnByaW50ZihjX3N0ciArIDEsIHNpemVvZihjX3N0cikgLSAxLCAiJS4xN2dcbiIsIHgpOworCQlQeU9TX2FzY2lpX2Zvcm1hdGQoY19zdHIgKyAxLCBzaXplb2YoY19zdHIpIC0gMiwgIiUuMTdnIiwgeCk7CisJCS8qIEV4dGVuZCB0aGUgZm9ybWF0dGVkIHN0cmluZyB3aXRoIGEgbmV3bGluZSBjaGFyYWN0ZXIgKi8KKwkJc3RyY2F0KGNfc3RyLCAiXG4iKTsKIAogCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBjX3N0ciwgc3RybGVuKGNfc3RyKSkgPCAwKQogCQkJcmV0dXJuIC0xOwpAQCAtMzA3MSw4ICszMDczLDggQEAKIAkJCQkJInBpY2tsZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIik7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQotCQlyZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGZjLCAiT08iLCBweV9tb2R1bGVfbmFtZSwKLQkJCQkJICAgICBweV9nbG9iYWxfbmFtZSk7CisJCXJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGZjLCBweV9tb2R1bGVfbmFtZSwKKwkJCQkJICAgICAgICAgICAgcHlfZ2xvYmFsX25hbWUsIE5VTEwpOwogCX0KIAogCW1vZHVsZSA9IFB5U3lzX0dldE9iamVjdCgibW9kdWxlcyIpOwpAQCAtNTYyMyw3ICs1NjI1LDYgQEAKIAogCWlmICghKCB0PVB5RGljdF9OZXcoKSkpICByZXR1cm4gLTE7CiAJaWYgKCEoIHI9UHlSdW5fU3RyaW5nKAotCQkgICAgICAgImRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6IHNlbGYuYXJncz1hcmdzXG5cbiIKIAkJICAgICAgICJkZWYgX19zdHJfXyhzZWxmKTpcbiIKIAkJICAgICAgICIgIHJldHVybiBzZWxmLmFyZ3MgYW5kICgnJXMnICUgc2VsZi5hcmdzWzBdKSBvciAnKHdoYXQpJ1xuIiwKIAkJICAgICAgIFB5X2ZpbGVfaW5wdXQsCkBAIC01NjQzLDcgKzU2NDQsNiBAQAogCiAJaWYgKCEoIHQ9UHlEaWN0X05ldygpKSkgIHJldHVybiAtMTsKIAlpZiAoISggcj1QeVJ1bl9TdHJpbmcoCi0JCSAgICAgICAiZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKTogc2VsZi5hcmdzPWFyZ3NcblxuIgogCQkgICAgICAgImRlZiBfX3N0cl9fKHNlbGYpOlxuIgogCQkgICAgICAgIiAgYT1zZWxmLmFyZ3NcbiIKIAkJICAgICAgICIgIGE9YSBhbmQgdHlwZShhWzBdKSBvciAnKHdoYXQpJ1xuIgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jamtjb2RlY3MvbXVsdGlieXRlY29kZWMuYyBiL01vZHVsZXMvY2prY29kZWNzL211bHRpYnl0ZWNvZGVjLmMKaW5kZXggYWEwMDk2YS4uN2U2YWVkYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jamtjb2RlY3MvbXVsdGlieXRlY29kZWMuYworKysgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9tdWx0aWJ5dGVjb2RlYy5jCkBAIC04MzEsNyArODMxLDcgQEAKIHsKIAl3aGlsZSAoYnVmLT5pbmJ1ZiA8IGJ1Zi0+aW5idWZfZW5kKSB7CiAJCVB5X3NzaXplX3QgaW5sZWZ0LCBvdXRsZWZ0OwotCQlpbnQgcjsKKwkJUHlfc3NpemVfdCByOwogCiAJCWlubGVmdCA9IChQeV9zc2l6ZV90KShidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWYpOwogCQlvdXRsZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi0+b3V0YnVmX2VuZCAtIGJ1Zi0+b3V0YnVmKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvZGF0ZXRpbWVtb2R1bGUuYyBiL01vZHVsZXMvZGF0ZXRpbWVtb2R1bGUuYwppbmRleCA5YWUyMzVhLi43NjBhYjMxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2RhdGV0aW1lbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9kYXRldGltZW1vZHVsZS5jCkBAIC0zNjc5LDYgKzM2NzksMTMgQEAKIAkJcmV0dXJuIE5VTEw7CiAJZnJhY3Rpb24gPSB0aW1lc3RhbXAgLSAoZG91YmxlKXRpbWV0OwogCXVzID0gKGludClyb3VuZF90b19sb25nKGZyYWN0aW9uICogMWU2KTsKKwkvKiBJZiB0aW1lc3RhbXAgaXMgbGVzcyB0aGFuIG9uZSBtaWNyb3NlY29uZCBzbWFsbGVyIHRoYW4gYQorCSAqIGZ1bGwgc2Vjb25kLCByb3VuZCB1cC4gT3RoZXJ3aXNlLCBWYWx1ZUVycm9ycyBhcmUgcmFpc2VkCisJICogZm9yIHNvbWUgZmxvYXRzLiAqLworCWlmICh1cyA9PSAxMDAwMDAwKSB7CisJCXRpbWV0ICs9IDE7CisJCXVzID0gMDsKKwl9CiAJcmV0dXJuIGRhdGV0aW1lX2Zyb21fdGltZXRfYW5kX3VzKGNscywgZiwgdGltZXQsIHVzLCB0emluZm8pOwogfQogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2V4cGF0L2V4cGF0X2NvbmZpZy5oIGIvTW9kdWxlcy9leHBhdC9leHBhdF9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGMxNjM5Ci0tLSAvZGV2L251bGwKKysrIGIvTW9kdWxlcy9leHBhdC9leHBhdF9jb25maWcuaApAQCAtMCwwICsxLDE5IEBACisvKgorICogRXhwYXQgY29uZmlndXJhdGlvbiBmb3IgcHl0aG9uLiBUaGlzIGZpbGUgaXMgbm90IHBhcnQgb2YgdGhlIGV4cGF0CisgKiBkaXN0cmlidXRpb24uCisgKi8KKyNpZm5kZWYgRVhQQVRfQ09ORklHX0gKKyNkZWZpbmUgRVhQQVRfQ09ORklHX0gKKworI2luY2x1ZGUgPHB5Y29uZmlnLmg+CisjaWZkZWYgV09SRFNfQklHRU5ESUFOCisjZGVmaW5lIEJZVEVPUkRFUiA0MzIxCisjZWxzZQorI2RlZmluZSBCWVRFT1JERVIgMTIzNAorI2VuZGlmCisKKyNkZWZpbmUgWE1MX05TIDEKKyNkZWZpbmUgWE1MX0RURCAxCisjZGVmaW5lIFhNTF9DT05URVhUX0JZVEVTIDEwMjQKKworI2VuZGlmIC8qIEVYUEFUX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2V4cGF0L3htbHBhcnNlLmMgYi9Nb2R1bGVzL2V4cGF0L3htbHBhcnNlLmMKaW5kZXggMzM3MmJjOS4uNDJkOTViNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9leHBhdC94bWxwYXJzZS5jCisrKyBiL01vZHVsZXMvZXhwYXQveG1scGFyc2UuYwpAQCAtMiwxMCArMiw2IEBACiAgICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgY29weWluZyBwZXJtaXNzaW9uLgogKi8KIAotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPiAgICAgICAgICAgICAgICAgICAgIC8qIG1lbXNldCgpLCBtZW1jcHkoKSAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotCiAjZGVmaW5lIFhNTF9CVUlMRElOR19FWFBBVCAxCiAKICNpZmRlZiBDT01QSUxFRF9GUk9NX0RTUApAQCAtMTYsNiArMTIsMTAgQEAKICNpbmNsdWRlIDxleHBhdF9jb25maWcuaD4KICNlbmRpZiAvKiBuZGVmIENPTVBJTEVEX0ZST01fRFNQICovCiAKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4gICAgICAgICAgICAgICAgICAgICAvKiBtZW1zZXQoKSwgbWVtY3B5KCkgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKwogI2luY2x1ZGUgImV4cGF0LmgiCiAKICNpZmRlZiBYTUxfVU5JQ09ERQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9leHBhdC94bWxyb2xlLmMgYi9Nb2R1bGVzL2V4cGF0L3htbHJvbGUuYwppbmRleCAxOTI0ZmNiLi4yNTg3ZmRmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2V4cGF0L3htbHJvbGUuYworKysgYi9Nb2R1bGVzL2V4cGF0L3htbHJvbGUuYwpAQCAtMiw4ICsyLDYgQEAKICAgIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBjb3B5aW5nIHBlcm1pc3Npb24uCiAqLwogCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KICNpZmRlZiBDT01QSUxFRF9GUk9NX0RTUAogI2luY2x1ZGUgIndpbmNvbmZpZy5oIgogI2VsaWYgZGVmaW5lZChNQUNPU19DTEFTU0lDKQpAQCAtMTQsNiArMTIsOCBAQAogI2VuZGlmCiAjZW5kaWYgLyogbmRlZiBDT01QSUxFRF9GUk9NX0RTUCAqLwogCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKICNpbmNsdWRlICJleHBhdF9leHRlcm5hbC5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAieG1scm9sZS5oIgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9leHBhdC94bWx0b2suYyBiL01vZHVsZXMvZXhwYXQveG1sdG9rLmMKaW5kZXggMTYwZmE0MC4uOGI5ZDk5NyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9leHBhdC94bWx0b2suYworKysgYi9Nb2R1bGVzL2V4cGF0L3htbHRvay5jCkBAIC0yLDggKzIsNiBAQAogICAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIGNvcHlpbmcgcGVybWlzc2lvbi4KICovCiAKLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQogI2lmZGVmIENPTVBJTEVEX0ZST01fRFNQCiAjaW5jbHVkZSAid2luY29uZmlnLmgiCiAjZWxpZiBkZWZpbmVkKE1BQ09TX0NMQVNTSUMpCkBAIC0xNCw2ICsxMiw4IEBACiAjZW5kaWYKICNlbmRpZiAvKiBuZGVmIENPTVBJTEVEX0ZST01fRFNQICovCiAKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKwogI2luY2x1ZGUgImV4cGF0X2V4dGVybmFsLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJ4bWx0b2suaCIKZGlmZiAtLWdpdCBhL01vZHVsZXMvZmNudGxtb2R1bGUuYyBiL01vZHVsZXMvZmNudGxtb2R1bGUuYwppbmRleCBhMzY4NDk0Li40NzdhZjA2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2ZjbnRsbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9mY250bG1vZHVsZS5jCkBAIC05NSw2ICs5NSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmNudGxfaW9jdGwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogeworI2RlZmluZSBJT0NUTF9CVUZTWiAxMDI0CiAJaW50IGZkOwogCS8qIEluIFB5QXJnX1BhcnNlVHVwbGUgYmVsb3csIHVzZSB0aGUgdW5zaWduZWQgaW50ICdJJyBmb3JtYXQgZm9yCiAJICAgdGhlIHNpZ25lZCBpbnQgJ2NvZGUnIHZhcmlhYmxlLCBiZWNhdXNlIFB5dGhvbiB0dXJucyAweDgwMDAwMDAKQEAgLTEwNiw3ICsxMDcsNyBAQAogCWNoYXIgKnN0cjsKIAlQeV9zc2l6ZV90IGxlbjsKIAlpbnQgbXV0YXRlX2FyZyA9IDE7Ci0JY2hhciBidWZbMTAyNF07CisgCWNoYXIgYnVmW0lPQ1RMX0JVRlNaKzFdOyAgLyogYXJndW1lbnQgcGx1cyBOVUwgYnl0ZSAqLwogCiAJaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mSXcjfGk6aW9jdGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252X2Rlc2NyaXB0b3IsICZmZCwgJmNvZGUsIApAQCAtMTE0LDggKzExNSw5IEBACiAJCWNoYXIgKmFyZzsKIAogCSAgICAgICAJaWYgKG11dGF0ZV9hcmcpIHsKLQkJCWlmIChsZW4gPD0gc2l6ZW9mIGJ1ZikgeworCQkJaWYgKGxlbiA8PSBJT0NUTF9CVUZTWikgewogCQkJCW1lbWNweShidWYsIHN0ciwgbGVuKTsKKwkJCQlidWZbbGVuXSA9ICdcMCc7CiAJCQkJYXJnID0gYnVmOwogCQkJfSAKIAkJCWVsc2UgewpAQCAtMTIzLDEzICsxMjUsMTQgQEAKIAkJCX0KIAkJfQogCQllbHNlIHsKLQkJCWlmIChsZW4gPiBzaXplb2YgYnVmKSB7CisJCQlpZiAobGVuID4gSU9DVExfQlVGU1opIHsKIAkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKIAkJCQkJImlvY3RsIHN0cmluZyBhcmcgdG9vIGxvbmciKTsKIAkJCQlyZXR1cm4gTlVMTDsKIAkJCX0KIAkJCWVsc2UgewogCQkJCW1lbWNweShidWYsIHN0ciwgbGVuKTsKKwkJCQlidWZbbGVuXSA9ICdcMCc7CiAJCQkJYXJnID0gYnVmOwogCQkJfQogCQl9CkBAIC0xNDEsNyArMTQ0LDcgQEAKIAkJZWxzZSB7CiAJCQlyZXQgPSBpb2N0bChmZCwgY29kZSwgYXJnKTsKIAkJfQotCQlpZiAobXV0YXRlX2FyZyAmJiAobGVuIDwgc2l6ZW9mIGJ1ZikpIHsKKwkJaWYgKG11dGF0ZV9hcmcgJiYgKGxlbiA8IElPQ1RMX0JVRlNaKSkgewogCQkJbWVtY3B5KHN0ciwgYnVmLCBsZW4pOwogCQl9CiAJCWlmIChyZXQgPCAwKSB7CkBAIC0xNTksMTIgKzE2MiwxMyBAQAogCVB5RXJyX0NsZWFyKCk7CiAJaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mSXMjOmlvY3RsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlLCAmc3RyLCAmbGVuKSkgewotCQlpZiAobGVuID4gc2l6ZW9mIGJ1ZikgeworCQlpZiAobGVuID4gSU9DVExfQlVGU1opIHsKIAkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAogCQkJCQkiaW9jdGwgc3RyaW5nIGFyZyB0b28gbG9uZyIpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAkJbWVtY3B5KGJ1Ziwgc3RyLCBsZW4pOworCQlidWZbbGVuXSA9ICdcMCc7CiAJCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKIAkJcmV0ID0gaW9jdGwoZmQsIGNvZGUsIGJ1Zik7CiAJCVB5X0VORF9BTExPV19USFJFQURTCkBAIC0xOTUsNiArMTk5LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylyZXQpOworI3VuZGVmIElPQ1RMX0JVRlNaCiB9CiAKIFB5RG9jX1NUUlZBUihpb2N0bF9kb2MsCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2djbW9kdWxlLmMgYi9Nb2R1bGVzL2djbW9kdWxlLmMKaW5kZXggMDE3NmQ2Zi4uODcyNzI3ZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9nY21vZHVsZS5jCisrKyBiL01vZHVsZXMvZ2Ntb2R1bGUuYwpAQCAtNzUsNiArNzUsNyBAQAogCQkJCURFQlVHX09CSkVDVFMgfCBcCiAJCQkJREVCVUdfU0FWRUFMTAogc3RhdGljIGludCBkZWJ1ZzsKK3N0YXRpYyBQeU9iamVjdCAqdG1vZCA9IE5VTEw7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGdjX3JlZnMgdmFsdWVzLgpAQCAtNjAyLDcgKzYwMyw3IEBACiAJCWFzc2VydChjYWxsYmFjayAhPSBOVUxMKTsKIAogCQkvKiBjb3B5LXBhc3RlIG9mIHdlYWtyZWZvYmplY3QuYydzIGhhbmRsZV9jYWxsYmFjaygpICovCi0JCXRlbXAgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY2FsbGJhY2ssICJPIiwgd3IpOworCQl0ZW1wID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjYWxsYmFjaywgd3IsIE5VTEwpOwogCQlpZiAodGVtcCA9PSBOVUxMKQogCQkJUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGNhbGxiYWNrKTsKIAkJZWxzZQpAQCAtNzM0LDcgKzczNSw2IEBACiAJUHlHQ19IZWFkIHVucmVhY2hhYmxlOyAvKiBub24tcHJvYmxlbWF0aWMgdW5yZWFjaGFibGUgdHJhc2ggKi8KIAlQeUdDX0hlYWQgZmluYWxpemVyczsgIC8qIG9iamVjdHMgd2l0aCwgJiByZWFjaGFibGUgZnJvbSwgX19kZWxfXyAqLwogCVB5R0NfSGVhZCAqZ2M7Ci0Jc3RhdGljIFB5T2JqZWN0ICp0bW9kID0gTlVMTDsKIAlkb3VibGUgdDEgPSAwLjA7CiAKIAlpZiAoZGVsc3RyID09IE5VTEwpIHsKQEAgLTc0MywxMiArNzQzLDYgQEAKIAkJCVB5X0ZhdGFsRXJyb3IoImdjIGNvdWxkbid0IGFsbG9jYXRlIFwiX19kZWxfX1wiIik7CiAJfQogCi0JaWYgKHRtb2QgPT0gTlVMTCkgewotCQl0bW9kID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJ0aW1lIik7Ci0JCWlmICh0bW9kID09IE5VTEwpCi0JCQlQeUVycl9DbGVhcigpOwotCX0KLQogCWlmIChkZWJ1ZyAmIERFQlVHX1NUQVRTKSB7CiAJCWlmICh0bW9kICE9IE5VTEwpIHsKIAkJCVB5T2JqZWN0ICpmID0gUHlPYmplY3RfQ2FsbE1ldGhvZCh0bW9kLCAidGltZSIsIE5VTEwpOwpAQCAtMTIzMyw2ICsxMjI3LDE5IEBACiAJUHlfSU5DUkVGKGdhcmJhZ2UpOwogCWlmIChQeU1vZHVsZV9BZGRPYmplY3QobSwgImdhcmJhZ2UiLCBnYXJiYWdlKSA8IDApCiAJCXJldHVybjsKKworCS8qIEltcG9ydGluZyBjYW4ndCBiZSBkb25lIGluIGNvbGxlY3QoKSBiZWNhdXNlIGNvbGxlY3QoKQorCSAqIGNhbiBiZSBjYWxsZWQgdmlhIFB5R0NfQ29sbGVjdCgpIGluIFB5X0ZpbmFsaXplKCkuCisJICogVGhpcyB3b3VsZG4ndCBiZSBhIHByb2JsZW0sIGV4Y2VwdCB0aGF0IDxpbml0aWFsaXplZD4gaXMKKwkgKiByZXNldCB0byAwIGJlZm9yZSBjYWxsaW5nIGNvbGxlY3Qgd2hpY2ggdHJpcHMgdXAKKwkgKiB0aGUgaW1wb3J0IGFuZCB0cmlnZ2VycyBhbiBhc3NlcnRpb24uCisJICovCisJaWYgKHRtb2QgPT0gTlVMTCkgeworCQl0bW9kID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJ0aW1lIik7CisJCWlmICh0bW9kID09IE5VTEwpCisJCQlQeUVycl9DbGVhcigpOworCX0KKwogI2RlZmluZSBBRERfSU5UKE5BTUUpIGlmIChQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAjTkFNRSwgTkFNRSkgPCAwKSByZXR1cm4KIAlBRERfSU5UKERFQlVHX1NUQVRTKTsKIAlBRERfSU5UKERFQlVHX0NPTExFQ1RBQkxFKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvZ3JwbW9kdWxlLmMgYi9Nb2R1bGVzL2dycG1vZHVsZS5jCmluZGV4IDEyZDMzZGQuLmU1YjlmNDcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZ3JwbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9ncnBtb2R1bGUuYwpAQCAtODQsMTIgKzg0LDE4IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ncnBfZ2V0Z3JnaWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQorZ3JwX2dldGdyZ2lkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqcHlvX2lkKQogeworICAgIFB5T2JqZWN0ICpweV9pbnRfaWQ7CiAgICAgdW5zaWduZWQgaW50IGdpZDsKICAgICBzdHJ1Y3QgZ3JvdXAgKnA7Ci0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJJOmdldGdyZ2lkIiwgJmdpZCkpCi0gICAgICAgIHJldHVybiBOVUxMOworCisgICAgcHlfaW50X2lkID0gUHlOdW1iZXJfSW50KHB5b19pZCk7CisgICAgaWYgKCFweV9pbnRfaWQpCisJICAgIHJldHVybiBOVUxMOworICAgIGdpZCA9IFB5SW50X0FTX0xPTkcocHlfaW50X2lkKTsKKyAgICBQeV9ERUNSRUYocHlfaW50X2lkKTsKKwogICAgIGlmICgocCA9IGdldGdyZ2lkKGdpZCkpID09IE5VTEwpIHsKIAlQeUVycl9Gb3JtYXQoUHlFeGNfS2V5RXJyb3IsICJnZXRncmdpZCgpOiBnaWQgbm90IGZvdW5kOiAlZCIsIGdpZCk7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtOTgsMjcgKzEwNCwzMyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotZ3JwX2dldGdybmFtKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK2dycF9nZXRncm5hbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnB5b19uYW1lKQogeworICAgIFB5T2JqZWN0ICpweV9zdHJfbmFtZTsKICAgICBjaGFyICpuYW1lOwogICAgIHN0cnVjdCBncm91cCAqcDsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Z2V0Z3JuYW0iLCAmbmFtZSkpCi0gICAgICAgIHJldHVybiBOVUxMOworCisgICAgcHlfc3RyX25hbWUgPSBQeU9iamVjdF9TdHIocHlvX25hbWUpOworICAgIGlmICghcHlfc3RyX25hbWUpCisJICAgIHJldHVybiBOVUxMOworICAgIG5hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcocHlfc3RyX25hbWUpOworICAgIAogICAgIGlmICgocCA9IGdldGdybmFtKG5hbWUpKSA9PSBOVUxMKSB7CiAJUHlFcnJfRm9ybWF0KFB5RXhjX0tleUVycm9yLCAiZ2V0Z3JuYW0oKTogbmFtZSBub3QgZm91bmQ6ICVzIiwgbmFtZSk7CisJUHlfREVDUkVGKHB5X3N0cl9uYW1lKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQorCisgICAgUHlfREVDUkVGKHB5X3N0cl9uYW1lKTsKICAgICByZXR1cm4gbWtncmVudChwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLWdycF9nZXRncmFsbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCitncnBfZ2V0Z3JhbGwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICppZ25vcmUpCiB7CiAgICAgUHlPYmplY3QgKmQ7CiAgICAgc3RydWN0IGdyb3VwICpwOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Z2V0Z3JhbGwiKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaWYgKChkID0gUHlMaXN0X05ldygwKSkgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgc2V0Z3JlbnQoKTsKQEAgLTEzNiwxNSArMTQ4LDE1IEBACiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBncnBfbWV0aG9kc1tdID0gewotICAgIHsiZ2V0Z3JnaWQiLAlncnBfZ2V0Z3JnaWQsCU1FVEhfVkFSQVJHUywKKyAgICB7ImdldGdyZ2lkIiwJZ3JwX2dldGdyZ2lkLAlNRVRIX08sCiAgICAgICJnZXRncmdpZChpZCkgLT4gdHVwbGVcblwKIFJldHVybiB0aGUgZ3JvdXAgZGF0YWJhc2UgZW50cnkgZm9yIHRoZSBnaXZlbiBudW1lcmljIGdyb3VwIElELiAgSWZcblwKIGlkIGlzIG5vdCB2YWxpZCwgcmFpc2UgS2V5RXJyb3IuIn0sCi0gICAgeyJnZXRncm5hbSIsCWdycF9nZXRncm5hbSwJTUVUSF9WQVJBUkdTLAorICAgIHsiZ2V0Z3JuYW0iLAlncnBfZ2V0Z3JuYW0sCU1FVEhfTywKICAgICAgImdldGdybmFtKG5hbWUpIC0+IHR1cGxlXG5cCiBSZXR1cm4gdGhlIGdyb3VwIGRhdGFiYXNlIGVudHJ5IGZvciB0aGUgZ2l2ZW4gZ3JvdXAgbmFtZS4gIElmXG5cCiBuYW1lIGlzIG5vdCB2YWxpZCwgcmFpc2UgS2V5RXJyb3IuIn0sCi0gICAgeyJnZXRncmFsbCIsCWdycF9nZXRncmFsbCwJTUVUSF9WQVJBUkdTLAorICAgIHsiZ2V0Z3JhbGwiLAlncnBfZ2V0Z3JhbGwsCU1FVEhfTk9BUkdTLAogICAgICAiZ2V0Z3JhbGwoKSAtPiBsaXN0IG9mIHR1cGxlc1xuXAogUmV0dXJuIGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIGdyb3VwIGVudHJpZXMsIGluIGFyYml0cmFyeSBvcmRlci4ifSwKICAgICB7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9pdGVydG9vbHNtb2R1bGUuYyBiL01vZHVsZXMvaXRlcnRvb2xzbW9kdWxlLmMKaW5kZXggOTQ2MTdhOS4uODZiMWJiZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9pdGVydG9vbHNtb2R1bGUuYworKysgYi9Nb2R1bGVzL2l0ZXJ0b29sc21vZHVsZS5jCkBAIC0xMDkzLDEwICsxMDkzLDEwIEBACiB0eXBlZGVmIHN0cnVjdCB7CiAJUHlPYmplY3RfSEVBRAogCVB5T2JqZWN0ICppdDsKLQlsb25nCW5leHQ7Ci0JbG9uZwlzdG9wOwotCWxvbmcJc3RlcDsKLQlsb25nCWNudDsKKwlQeV9zc2l6ZV90IG5leHQ7CisJUHlfc3NpemVfdCBzdG9wOworCVB5X3NzaXplX3Qgc3RlcDsKKwlQeV9zc2l6ZV90IGNudDsKIH0gaXNsaWNlb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGlzbGljZV90eXBlOwpAQCAtMTEwNSw3ICsxMTA1LDcgQEAKIGlzbGljZV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7CiAJUHlPYmplY3QgKnNlcTsKLQlsb25nIHN0YXJ0PTAsIHN0b3A9LTEsIHN0ZXA9MTsKKwlQeV9zc2l6ZV90IHN0YXJ0PTAsIHN0b3A9LTEsIHN0ZXA9MTsKIAlQeU9iamVjdCAqaXQsICphMT1OVUxMLCAqYTI9TlVMTCwgKmEzPU5VTEw7CiAJUHlfc3NpemVfdCBudW1hcmdzOwogCWlzbGljZW9iamVjdCAqbHo7CkBAIC0xMTE5LDcgKzExMTksNyBAQAogCW51bWFyZ3MgPSBQeVR1cGxlX1NpemUoYXJncyk7CiAJaWYgKG51bWFyZ3MgPT0gMikgewogCQlpZiAoYTEgIT0gUHlfTm9uZSkgewotCQkJc3RvcCA9IFB5SW50X0FzTG9uZyhhMSk7CisJCQlzdG9wID0gUHlJbnRfQXNTc2l6ZV90KGExKTsKIAkJCWlmIChzdG9wID09IC0xKSB7CiAJCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCiAJCQkJCVB5RXJyX0NsZWFyKCk7CkBAIC0xMTMwLDExICsxMTMwLDExIEBACiAJCX0KIAl9IGVsc2UgewogCQlpZiAoYTEgIT0gUHlfTm9uZSkKLQkJCXN0YXJ0ID0gUHlJbnRfQXNMb25nKGExKTsKKwkJCXN0YXJ0ID0gUHlJbnRfQXNTc2l6ZV90KGExKTsKIAkJaWYgKHN0YXJ0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAJCQlQeUVycl9DbGVhcigpOwogCQlpZiAoYTIgIT0gUHlfTm9uZSkgewotCQkJc3RvcCA9IFB5SW50X0FzTG9uZyhhMik7CisJCQlzdG9wID0gUHlJbnRfQXNTc2l6ZV90KGEyKTsKIAkJCWlmIChzdG9wID09IC0xKSB7CiAJCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCiAJCQkJCVB5RXJyX0NsZWFyKCk7CkBAIC0xMTUyLDcgKzExNTIsNyBAQAogCiAJaWYgKGEzICE9IE5VTEwpIHsKIAkJaWYgKGEzICE9IFB5X05vbmUpCi0JCQlzdGVwID0gUHlJbnRfQXNMb25nKGEzKTsKKwkJCXN0ZXAgPSBQeUludF9Bc1NzaXplX3QoYTMpOwogCQlpZiAoc3RlcCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogCQkJUHlFcnJfQ2xlYXIoKTsKIAl9CkBAIC0xMjAyLDcgKzEyMDIsNyBAQAogewogCVB5T2JqZWN0ICppdGVtOwogCVB5T2JqZWN0ICppdCA9IGx6LT5pdDsKLQlsb25nIG9sZG5leHQ7CisJUHlfc3NpemVfdCBvbGRuZXh0OwogCVB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKIAogCWFzc2VydChQeUl0ZXJfQ2hlY2soaXQpKTsKQEAgLTE2MDAsOCArMTYwMCw4IEBACiAKIHR5cGVkZWYgc3RydWN0IHsKIAlQeU9iamVjdF9IRUFECi0JUHlfc3NpemVfdAl0dXBsZXNpemU7Ci0JbG9uZwlpdGVybnVtOwkJLyogd2hpY2ggaXRlcmF0b3IgaXMgYWN0aXZlICovCisJUHlfc3NpemVfdCB0dXBsZXNpemU7CisJUHlfc3NpemVfdCBpdGVybnVtOwkJLyogd2hpY2ggaXRlcmF0b3IgaXMgYWN0aXZlICovCiAJUHlPYmplY3QgKml0dHVwbGU7CQkvKiB0dXBsZSBvZiBpdGVyYXRvcnMgKi8KIH0gY2hhaW5vYmplY3Q7CiAKQEAgLTE2MTIsNyArMTYxMiw3IEBACiB7CiAJY2hhaW5vYmplY3QgKmx6OwogCVB5X3NzaXplX3QgdHVwbGVzaXplID0gUHlTZXF1ZW5jZV9MZW5ndGgoYXJncyk7Ci0JaW50IGk7CisJUHlfc3NpemVfdCBpOwogCVB5T2JqZWN0ICppdHR1cGxlOwogCiAJaWYgKCFfUHlBcmdfTm9LZXl3b3JkcygiY2hhaW4oKSIsIGt3ZHMpKQpAQCAtMTYyMSw3ICsxNjIxLDcgQEAKIAkvKiBvYnRhaW4gaXRlcmF0b3JzICovCiAJYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYXJncykpOwogCWl0dHVwbGUgPSBQeVR1cGxlX05ldyh0dXBsZXNpemUpOwotCWlmKGl0dHVwbGUgPT0gTlVMTCkKKwlpZiAoaXR0dXBsZSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAlmb3IgKGk9MDsgaSA8IHR1cGxlc2l6ZTsgKytpKSB7CiAJCVB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKQEAgLTE2MjksNyArMTYyOSw3IEBACiAJCWlmIChpdCA9PSBOVUxMKSB7CiAJCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQogCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICJjaGFpbiBhcmd1bWVudCAjJWQgbXVzdCBzdXBwb3J0IGl0ZXJhdGlvbiIsCisJCQkJICAgICJjaGFpbiBhcmd1bWVudCAjJXpkIG11c3Qgc3VwcG9ydCBpdGVyYXRpb24iLAogCQkJCSAgICBpKzEpOwogCQkJUHlfREVDUkVGKGl0dHVwbGUpOwogCQkJcmV0dXJuIE5VTEw7CkBAIC0yMDMzLDcgKzIwMzMsNyBAQAogCiB0eXBlZGVmIHN0cnVjdCB7CiAJUHlPYmplY3RfSEVBRAotCWxvbmcJY250OworCVB5X3NzaXplX3QgY250OwogfSBjb3VudG9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBjb3VudF90eXBlOwpAQCAtMjA0MiwxMiArMjA0MiwxMiBAQAogY291bnRfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewogCWNvdW50b2JqZWN0ICpsejsKLQlsb25nIGNudCA9IDA7CisJUHlfc3NpemVfdCBjbnQgPSAwOwogCiAJaWYgKCFfUHlBcmdfTm9LZXl3b3JkcygiY291bnQoKSIsIGt3ZHMpKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGw6Y291bnQiLCAmY250KSkKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxuOmNvdW50IiwgJmNudCkpCiAJCXJldHVybiBOVUxMOwogCiAJLyogY3JlYXRlIGNvdW50b2JqZWN0IHN0cnVjdHVyZSAqLwpAQCAtMjA2MiwxMyArMjA2MiwxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNvdW50X25leHQoY291bnRvYmplY3QgKmx6KQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZyhsei0+Y250KyspOworCXJldHVybiBQeUludF9Gcm9tU2l6ZV90KGx6LT5jbnQrKyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb3VudF9yZXByKGNvdW50b2JqZWN0ICpseikKIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiY291bnQoJWxkKSIsIGx6LT5jbnQpOworCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCJjb3VudCglemQpIiwgbHotPmNudCk7CiB9CiAKIFB5RG9jX1NUUlZBUihjb3VudF9kb2MsCkBAIC0yMTM4LDcgKzIxMzgsNyBAQAogaXppcF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7CiAJaXppcG9iamVjdCAqbHo7Ci0JaW50IGk7CisJUHlfc3NpemVfdCBpOwogCVB5T2JqZWN0ICppdHR1cGxlOyAgLyogdHVwbGUgb2YgaXRlcmF0b3JzICovCiAJUHlPYmplY3QgKnJlc3VsdDsKIAlQeV9zc2l6ZV90IHR1cGxlc2l6ZSA9IFB5U2VxdWVuY2VfTGVuZ3RoKGFyZ3MpOwpAQCAtMjE1MSw3ICsyMTUxLDcgQEAKIAogCS8qIG9idGFpbiBpdGVyYXRvcnMgKi8KIAlpdHR1cGxlID0gUHlUdXBsZV9OZXcodHVwbGVzaXplKTsKLQlpZihpdHR1cGxlID09IE5VTEwpCisJaWYgKGl0dHVwbGUgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAJZm9yIChpPTA7IGkgPCB0dXBsZXNpemU7ICsraSkgewogCQlQeU9iamVjdCAqaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7CkBAIC0yMTU5LDcgKzIxNTksNyBAQAogCQlpZiAoaXQgPT0gTlVMTCkgewogCQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKIAkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAiaXppcCBhcmd1bWVudCAjJWQgbXVzdCBzdXBwb3J0IGl0ZXJhdGlvbiIsCisJCQkJICAgICJpemlwIGFyZ3VtZW50ICMlemQgbXVzdCBzdXBwb3J0IGl0ZXJhdGlvbiIsCiAJCQkJICAgIGkrMSk7CiAJCQlQeV9ERUNSRUYoaXR0dXBsZSk7CiAJCQlyZXR1cm4gTlVMTDsKQEAgLTIyMTIsNyArMjIxMiw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogaXppcF9uZXh0KGl6aXBvYmplY3QgKmx6KQogewotCWludCBpOworCVB5X3NzaXplX3QgaTsKIAlQeV9zc2l6ZV90IHR1cGxlc2l6ZSA9IGx6LT50dXBsZXNpemU7CiAJUHlPYmplY3QgKnJlc3VsdCA9IGx6LT5yZXN1bHQ7CiAJUHlPYmplY3QgKml0OwpAQCAtMjMxNCw3ICsyMzE0LDcgQEAKIHR5cGVkZWYgc3RydWN0IHsKIAlQeU9iamVjdF9IRUFECiAJUHlPYmplY3QgKmVsZW1lbnQ7Ci0JbG9uZyBjbnQ7CisJUHlfc3NpemVfdCBjbnQ7CiB9IHJlcGVhdG9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCByZXBlYXRfdHlwZTsKQEAgLTIzMjQsMTIgKzIzMjQsMTIgQEAKIHsKIAlyZXBlYXRvYmplY3QgKnJvOwogCVB5T2JqZWN0ICplbGVtZW50OwotCWxvbmcgY250ID0gLTE7CisJUHlfc3NpemVfdCBjbnQgPSAtMTsKIAogCWlmICghX1B5QXJnX05vS2V5d29yZHMoInJlcGVhdCgpIiwga3dkcykpCiAJCXJldHVybiBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfGw6cmVwZWF0IiwgJmVsZW1lbnQsICZjbnQpKQorCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xuOnJlcGVhdCIsICZlbGVtZW50LCAmY250KSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlpZiAoUHlUdXBsZV9TaXplKGFyZ3MpID09IDIgJiYgY250IDwgMCkKQEAgLTIzODMsNyArMjM4Myw3IEBACiAJCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoInJlcGVhdCglcykiLAogCQkJUHlTdHJpbmdfQVNfU1RSSU5HKG9ianJlcHIpKTsKIAllbHNlCi0JCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoInJlcGVhdCglcywgJWxkKSIsCisJCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoInJlcGVhdCglcywgJXpkKSIsCiAJCQlQeVN0cmluZ19BU19TVFJJTkcob2JqcmVwciksIHJvLT5jbnQpOwogCVB5X0RFQ1JFRihvYmpyZXByKTsKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMjM5Niw3ICsyMzk2LDcgQEAKICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibGVuKCkgb2YgdW5zaXplZCBvYmplY3QiKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcocm8tPmNudCk7CisgICAgICAgIHJldHVybiBQeUludF9Gcm9tU2l6ZV90KHJvLT5jbnQpOwogfQogCiBQeURvY19TVFJWQVIobGVuZ3RoX2hpbnRfZG9jLCAiUHJpdmF0ZSBtZXRob2QgcmV0dXJuaW5nIGFuIGVzdGltYXRlIG9mIGxlbihsaXN0KGl0KSkuIik7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL21haW4uYyBiL01vZHVsZXMvbWFpbi5jCmluZGV4IDczMjZhMjcuLjIzYTc2MGYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvbWFpbi5jCisrKyBiL01vZHVsZXMvbWFpbi5jCkBAIC05LDggKzksMTAgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChNU19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisjaWZkZWYgSEFWRV9GQ05UTF9ICiAjaW5jbHVkZSA8ZmNudGwuaD4KICNlbmRpZgorI2VuZGlmCiAKICNpZiAoZGVmaW5lZChQWU9TX09TMikgJiYgIWRlZmluZWQoUFlDQ19HQ0MpKSB8fCBkZWZpbmVkKE1TX1dJTkRPV1MpCiAjZGVmaW5lIFBZVEhPTkhPTUVIRUxQICI8cHJlZml4PlxcbGliIgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9vcGVyYXRvci5jIGIvTW9kdWxlcy9vcGVyYXRvci5jCmluZGV4IGNiY2UxNmUuLmJmM2RlZjQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvb3BlcmF0b3IuYworKysgYi9Nb2R1bGVzL29wZXJhdG9yLmMKQEAgLTQ4LDYgKzQ4LDEyIEBACiAgIGlmKC0xID09IChyPUFPUChhMSxhMikpKSByZXR1cm4gTlVMTDsgXAogICByZXR1cm4gUHlJbnRfRnJvbUxvbmcocik7IH0KIAorI2RlZmluZSBzcGFtbjIoT1AsQU9QKSBzdGF0aWMgUHlPYmplY3QgKk9QKFB5T2JqZWN0ICpzLCBQeU9iamVjdCAqYSkgeyBcCisgIFB5T2JqZWN0ICphMSwgKmEyOyBQeV9zc2l6ZV90IHI7IFwKKyAgaWYoISBQeUFyZ19VbnBhY2tUdXBsZShhLCNPUCwyLDIsJmExLCZhMikpIHJldHVybiBOVUxMOyBcCisgIGlmKC0xID09IChyPUFPUChhMSxhMikpKSByZXR1cm4gTlVMTDsgXAorICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3Qocik7IH0KKwogI2RlZmluZSBzcGFtaTJiKE9QLEFPUCkgc3RhdGljIFB5T2JqZWN0ICpPUChQeU9iamVjdCAqcywgUHlPYmplY3QgKmEpIHsgXAogICBQeU9iamVjdCAqYTEsICphMjsgbG9uZyByOyBcCiAgIGlmKCEgUHlBcmdfVW5wYWNrVHVwbGUoYSwjT1AsMiwyLCZhMSwmYTIpKSByZXR1cm4gTlVMTDsgXApAQCAtOTcsOCArMTAzLDggQEAKIHNwYW1vaShvcF9pcmVwZWF0ICAgICAgLCBQeVNlcXVlbmNlX0luUGxhY2VSZXBlYXQpCiBzcGFtaTJiKG9wX2NvbnRhaW5zICAgICAsIFB5U2VxdWVuY2VfQ29udGFpbnMpCiBzcGFtaTJiKHNlcXVlbmNlSW5jbHVkZXMsIFB5U2VxdWVuY2VfQ29udGFpbnMpCi1zcGFtaTIoaW5kZXhPZiAgICAgICAgICwgUHlTZXF1ZW5jZV9JbmRleCkKLXNwYW1pMihjb3VudE9mICAgICAgICAgLCBQeVNlcXVlbmNlX0NvdW50KQorc3BhbW4yKGluZGV4T2YgICAgICAgICAsIFB5U2VxdWVuY2VfSW5kZXgpCitzcGFtbjIoY291bnRPZiAgICAgICAgICwgUHlTZXF1ZW5jZV9Db3VudCkKIHNwYW1pKGlzTWFwcGluZ1R5cGUgICAgLCBQeU1hcHBpbmdfQ2hlY2spCiBzcGFtMihvcF9nZXRpdGVtICAgICAgICwgUHlPYmplY3RfR2V0SXRlbSkKIHNwYW0ybihvcF9kZWxpdGVtICAgICAgICwgUHlPYmplY3RfRGVsSXRlbSkKZGlmZiAtLWdpdCBhL01vZHVsZXMvcGFyc2VybW9kdWxlLmMgYi9Nb2R1bGVzL3BhcnNlcm1vZHVsZS5jCmluZGV4IGM5ZWRhZTYuLmUzMzE5N2UgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvcGFyc2VybW9kdWxlLmMKKysrIGIvTW9kdWxlcy9wYXJzZXJtb2R1bGUuYwpAQCAtMzI2Nyw4ICszMjY3LDggQEAKICAgICAgICAgICAgICYmIChwaWNrbGVyICE9IE5VTEwpKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqcmVzOwogCi0gICAgICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oZnVuYywgIk9PTyIsICZQeVNUX1R5cGUsIHBpY2tsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlja2xlX2NvbnN0cnVjdG9yKTsKKyAgICAgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZnVuYywgJlB5U1RfVHlwZSwgcGlja2xlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlja2xlX2NvbnN0cnVjdG9yLCBOVUxMKTsKICAgICAgICAgICAgIFB5X1hERUNSRUYocmVzKTsKICAgICAgICAgfQogICAgICAgICBQeV9YREVDUkVGKGZ1bmMpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9wb3NpeG1vZHVsZS5jIGIvTW9kdWxlcy9wb3NpeG1vZHVsZS5jCmluZGV4IGI1MWJhNWQuLjdmMGEyNjEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvcG9zaXhtb2R1bGUuYworKysgYi9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmMKQEAgLTEzLDYgKzEzLDE4IEBACiAKIC8qIFNlZSBhbHNvIC4uL0Rvcy9kb3Ntb2R1bGUuYyAqLwogCisjaWZkZWYgX19BUFBMRV9fCisgICAvKgorICAgICogU3RlcCAxIG9mIHN1cHBvcnQgZm9yIHdlYWstbGlua2luZyBhIG51bWJlciBvZiBzeW1ib2xzIGV4aXN0aW5nIG9uIAorICAgICogT1NYIDEwLjQgYW5kIGxhdGVyLCBzZWUgdGhlIGNvbW1lbnQgaW4gdGhlICNpZmRlZiBfX0FQUExFX18gYmxvY2sKKyAgICAqIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICovCisjICBwcmFnbWEgd2VhayBsY2hvd24KKyMgIHByYWdtYSB3ZWFrIHN0YXR2ZnMKKyMgIHByYWdtYSB3ZWFrIGZzdGF0dmZzCisKKyNlbmRpZiAvKiBfX0FQUExFX18gKi8KKwogI2RlZmluZSBQWV9TU0laRV9UX0NMRUFOCiAKICNpbmNsdWRlICJQeXRob24uaCIKQEAgLTI1MCw3ICsyNjIsMTEgQEAKICNlbmRpZiAvKiBPUzIgKi8KIAogI2lmbmRlZiBNQVhQQVRITEVOCisjaWYgZGVmaW5lZChQQVRIX01BWCkgJiYgUEFUSF9NQVggPiAxMDI0CisjZGVmaW5lIE1BWFBBVEhMRU4gUEFUSF9NQVgKKyNlbHNlCiAjZGVmaW5lIE1BWFBBVEhMRU4gMTAyNAorI2VuZGlmCiAjZW5kaWYgLyogTUFYUEFUSExFTiAqLwogCiAjaWZkZWYgVU5JT05fV0FJVApAQCAtNDQyLDIxICs0NTgsMjkgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpfUHlVbmljb2RlX0Zyb21GaWxlU3lzdGVtRW5jb2RlZE9iamVjdChyZWdpc3RlciBQeU9iamVjdCAqb2JqKQogewotCS8qIFhYWCBQZXJoYXBzIHdlIHNob3VsZCBtYWtlIHRoaXMgQVBJIGFuIGFsaWFzIG9mCi0JICAgUHlPYmplY3RfVW5pY29kZSgpIGluc3RlYWQgPyEgKi8KLQlpZiAoUHlVbmljb2RlX0NoZWNrRXhhY3Qob2JqKSkgewotCQlQeV9JTkNSRUYob2JqKTsKLQkJcmV0dXJuIG9iajsKLQl9Ci0JaWYgKFB5VW5pY29kZV9DaGVjayhvYmopKSB7Cit9CisKKy8qIEZ1bmN0aW9uIHN1aXRhYmxlIGZvciBPJiBjb252ZXJzaW9uICovCitzdGF0aWMgaW50Citjb252ZXJ0X3RvX3VuaWNvZGUoUHlPYmplY3QgKmFyZywgdm9pZCogX3BhcmFtKQoreworCVB5T2JqZWN0ICoqcGFyYW0gPSAoUHlPYmplY3QqKilfcGFyYW07CisJaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KGFyZykpIHsKKwkJUHlfSU5DUkVGKGFyZyk7CisJCSpwYXJhbSA9IGFyZzsKKwl9IAorCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhhcmcpKSB7CiAJCS8qIEZvciBhIFVuaWNvZGUgc3VidHlwZSB0aGF0J3Mgbm90IGEgVW5pY29kZSBvYmplY3QsCiAJCSAgIHJldHVybiBhIHRydWUgVW5pY29kZSBvYmplY3Qgd2l0aCB0aGUgc2FtZSBkYXRhLiAqLwotCXJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoUHlVbmljb2RlX0FTX1VOSUNPREUob2JqKSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShvYmopKTsKKwkJKnBhcmFtID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKFB5VW5pY29kZV9BU19VTklDT0RFKGFyZyksCisJCQkJCSAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoYXJnKSk7CisJCXJldHVybiAqcGFyYW0gIT0gTlVMTDsKIAl9Ci0JcmV0dXJuIFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdChvYmosCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmljdCIpOworCWVsc2UKKwkJKnBhcmFtID0gUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KGFyZywKKwkJCQkgICAgICAgICAgICAgICAgICAgICBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nLAorCQkJCQkgICAgICAgICAgICAgInN0cmljdCIpOworCXJldHVybiAoKnBhcmFtKSAhPSBOVUxMOwogfQogCiAjZW5kaWYgLyogUHlfV0lOX1dJREVfRklMRU5BTUVTICovCkBAIC01NzMsMzUgKzU5NywxMCBAQAogI2VuZGlmCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1wb3NpeF8xc3RyKFB5T2JqZWN0ICphcmdzLCBjaGFyICpmb3JtYXQsIGludCAoKmZ1bmMpKGNvbnN0IGNoYXIqKSwKLQkgICBjaGFyICp3Zm9ybWF0LCBpbnQgKCp3ZnVuYykoY29uc3QgUHlfVU5JQ09ERSopKQorcG9zaXhfMXN0cihQeU9iamVjdCAqYXJncywgY2hhciAqZm9ybWF0LCBpbnQgKCpmdW5jKShjb25zdCBjaGFyKikpCiB7CiAJY2hhciAqcGF0aDEgPSBOVUxMOwogCWludCByZXM7Ci0jaWZkZWYgUHlfV0lOX1dJREVfRklMRU5BTUVTCi0JaWYgKHVuaWNvZGVfZmlsZV9uYW1lcygpKSB7Ci0JCVB5VW5pY29kZU9iamVjdCAqcG87Ci0JCWlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIHdmb3JtYXQsICZwbykpIHsKLQkJCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJCS8qICBQeVVuaWNvZGVfQVNfVU5JQ09ERSBPSyB3aXRob3V0IHRocmVhZAotCQkJICAgIGxvY2sgYXMgaXQgaXMgYSBzaW1wbGUgZGVyZWZlcmVuY2UuICovCi0JCQlyZXMgPSAoKndmdW5jKShQeVVuaWNvZGVfQVNfVU5JQ09ERShwbykpOwotCQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJCWlmIChyZXMgPCAwKQotCQkJCXJldHVybiBwb3NpeF9lcnJvcl93aXRoX3VuaWNvZGVfZmlsZW5hbWUoUHlVbmljb2RlX0FTX1VOSUNPREUocG8pKTsKLQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCXJldHVybiBQeV9Ob25lOwotCQl9Ci0JCS8qIERyb3AgdGhlIGFyZ3VtZW50IHBhcnNpbmcgZXJyb3IgYXMgbmFycm93Ci0JCSAgIHN0cmluZ3MgYXJlIGFsc28gdmFsaWQuICovCi0JCVB5RXJyX0NsZWFyKCk7Ci0JfQotI2Vsc2UKLQkvKiBQbGF0Zm9ybXMgdGhhdCBkb24ndCBzdXBwb3J0IFVuaWNvZGUgZmlsZW5hbWVzCi0JICAgc2hvdWxkbid0IGJlIHBhc3NpbmcgdGhlc2UgZXh0cmEgcGFyYW1zICovCi0JYXNzZXJ0KHdmb3JtYXQ9PU5VTEwgJiYgd2Z1bmMgPT0gTlVMTCk7Ci0jZW5kaWYKLQogCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBmb3JtYXQsCiAJICAgICAgICAgICAgICAgICAgICAgIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcsICZwYXRoMSkpCiAJCXJldHVybiBOVUxMOwpAQCAtNjE4LDUyICs2MTcsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBwb3NpeF8yc3RyKFB5T2JqZWN0ICphcmdzLAogCSAgIGNoYXIgKmZvcm1hdCwKLQkgICBpbnQgKCpmdW5jKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiksCi0JICAgY2hhciAqd2Zvcm1hdCwKLQkgICBpbnQgKCp3ZnVuYykoY29uc3QgUHlfVU5JQ09ERSAqLCBjb25zdCBQeV9VTklDT0RFICopKQorCSAgIGludCAoKmZ1bmMpKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSkKIHsKIAljaGFyICpwYXRoMSA9IE5VTEwsICpwYXRoMiA9IE5VTEw7CiAJaW50IHJlczsKLSNpZmRlZiBQeV9XSU5fV0lERV9GSUxFTkFNRVMKLQlpZiAodW5pY29kZV9maWxlX25hbWVzKCkpIHsKLQkJUHlPYmplY3QgKnBvMTsKLQkJUHlPYmplY3QgKnBvMjsKLQkJaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgd2Zvcm1hdCwgJnBvMSwgJnBvMikpIHsKLQkJCWlmIChQeVVuaWNvZGVfQ2hlY2socG8xKSB8fCBQeVVuaWNvZGVfQ2hlY2socG8yKSkgewotCQkJCVB5T2JqZWN0ICp3cGF0aDE7Ci0JCQkJUHlPYmplY3QgKndwYXRoMjsKLQkJCQl3cGF0aDEgPSBfUHlVbmljb2RlX0Zyb21GaWxlU3lzdGVtRW5jb2RlZE9iamVjdChwbzEpOwotCQkJCXdwYXRoMiA9IF9QeVVuaWNvZGVfRnJvbUZpbGVTeXN0ZW1FbmNvZGVkT2JqZWN0KHBvMik7Ci0JCQkJaWYgKCF3cGF0aDEgfHwgIXdwYXRoMikgewotCQkJCQlQeV9YREVDUkVGKHdwYXRoMSk7Ci0JCQkJCVB5X1hERUNSRUYod3BhdGgyKTsKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJfQotCQkJCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJCQkvKiBQeVVuaWNvZGVfQVNfVU5JQ09ERSBPSyB3aXRob3V0IHRocmVhZAotCQkJCSAgIGxvY2sgYXMgaXQgaXMgYSBzaW1wbGUgZGVyZWZlcmVuY2UuICAqLwotCQkJCXJlcyA9ICgqd2Z1bmMpKFB5VW5pY29kZV9BU19VTklDT0RFKHdwYXRoMSksCi0JCQkJCSAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERSh3cGF0aDIpKTsKLQkJCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQkJCVB5X1hERUNSRUYod3BhdGgxKTsKLQkJCQlQeV9YREVDUkVGKHdwYXRoMik7Ci0JCQkJaWYgKHJlcyAhPSAwKQotCQkJCQlyZXR1cm4gcG9zaXhfZXJyb3IoKTsKLQkJCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQkJcmV0dXJuIFB5X05vbmU7Ci0JCQl9Ci0JCQkvKiBFbHNlIGZsb3cgdGhyb3VnaCBhcyBuZWl0aGVyIGlzIFVuaWNvZGUuICovCi0JCX0KLQkJLyogRHJvcCB0aGUgYXJndW1lbnQgcGFyc2luZyBlcnJvciBhcyBuYXJyb3cKLQkJICAgc3RyaW5ncyBhcmUgYWxzbyB2YWxpZC4gKi8KLQkJUHlFcnJfQ2xlYXIoKTsKLQl9Ci0jZWxzZQotCS8qIFBsYXRmb3JtcyB0aGF0IGRvbid0IHN1cHBvcnQgVW5pY29kZSBmaWxlbmFtZXMKLQkgICBzaG91bGRuJ3QgYmUgcGFzc2luZyB0aGVzZSBleHRyYSBwYXJhbXMgKi8KLQlhc3NlcnQod2Zvcm1hdD09TlVMTCAmJiB3ZnVuYyA9PSBOVUxMKTsKLSNlbmRpZgotCiAJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIGZvcm1hdCwKIAkgICAgICAgICAgICAgICAgICAgICAgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZywgJnBhdGgxLAogCSAgICAgICAgICAgICAgICAgICAgICBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nLCAmcGF0aDIpKQpAQCAtNjgwLDYgKzYzNywxMDEgQEAKIAlyZXR1cm4gUHlfTm9uZTsKIH0KIAorI2lmZGVmIFB5X1dJTl9XSURFX0ZJTEVOQU1FUworc3RhdGljIFB5T2JqZWN0Kgord2luMzJfMXN0cihQeU9iamVjdCogYXJncywgY2hhciogZnVuYywgCisJICAgY2hhciogZm9ybWF0LCBCT09MIChfX3N0ZGNhbGwgKmZ1bmNBKShMUENTVFIpLCAKKwkgICBjaGFyKiB3Zm9ybWF0LCBCT09MIChfX3N0ZGNhbGwgKmZ1bmNXKShMUFdTVFIpKQoreworCVB5T2JqZWN0ICp1bmk7CisJY2hhciAqYW5zaTsKKwlCT09MIHJlc3VsdDsKKwlpZiAodW5pY29kZV9maWxlX25hbWVzKCkpIHsKKwkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIHdmb3JtYXQsICZ1bmkpKQorCQkJUHlFcnJfQ2xlYXIoKTsKKwkJZWxzZSB7CisJCQlQeV9CRUdJTl9BTExPV19USFJFQURTCisJCQlyZXN1bHQgPSBmdW5jVyhQeVVuaWNvZGVfQXNVbmljb2RlKHVuaSkpOworCQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKKwkJCWlmICghcmVzdWx0KQorCQkJCXJldHVybiB3aW4zMl9lcnJvcl91bmljb2RlKGZ1bmMsIFB5VW5pY29kZV9Bc1VuaWNvZGUodW5pKSk7CisJCQlQeV9JTkNSRUYoUHlfTm9uZSk7CisJCQlyZXR1cm4gUHlfTm9uZTsKKwkJfQorCX0KKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgZm9ybWF0LCAmYW5zaSkpCisJCXJldHVybiBOVUxMOworCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKwlyZXN1bHQgPSBmdW5jQShhbnNpKTsKKwlQeV9FTkRfQUxMT1dfVEhSRUFEUworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gd2luMzJfZXJyb3IoZnVuYywgYW5zaSk7CisJUHlfSU5DUkVGKFB5X05vbmUpOworCXJldHVybiBQeV9Ob25lOworCit9CisKKy8qIFRoaXMgaXMgYSByZWltcGxlbWVudGF0aW9uIG9mIHRoZSBDIGxpYnJhcnkncyBjaGRpciBmdW5jdGlvbiwKKyAgIGJ1dCBvbmUgdGhhdCBwcm9kdWNlcyBXaW4zMiBlcnJvcnMgaW5zdGVhZCBvZiBET1MgZXJyb3IgY29kZXMuCisgICBjaGRpciBpcyBlc3NlbnRpYWxseSBhIHdyYXBwZXIgYXJvdW5kIFNldEN1cnJlbnREaXJlY3Rvcnk7IGhvd2V2ZXIsCisgICBpdCBhbHNvIG5lZWRzIHRvIHNldCAibWFnaWMiIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbmRpY2F0aW5nCisgICB0aGUgcGVyLWRyaXZlIGN1cnJlbnQgZGlyZWN0b3J5LCB3aGljaCBhcmUgb2YgdGhlIGZvcm0gPTxkcml2ZT46ICovCitCT09MIF9fc3RkY2FsbAord2luMzJfY2hkaXIoTFBDU1RSIHBhdGgpCit7CisJY2hhciBuZXdfcGF0aFtNQVhfUEFUSCsxXTsKKwlpbnQgcmVzdWx0OworCWNoYXIgZW52WzRdID0gIj14OiI7CisKKwlpZighU2V0Q3VycmVudERpcmVjdG9yeUEocGF0aCkpCisJCXJldHVybiBGQUxTRTsKKwlyZXN1bHQgPSBHZXRDdXJyZW50RGlyZWN0b3J5QShNQVhfUEFUSCsxLCBuZXdfcGF0aCk7CisJaWYgKCFyZXN1bHQpCisJCXJldHVybiBGQUxTRTsKKwkvKiBJbiB0aGUgQU5TSSBBUEksIHRoZXJlIHNob3VsZCBub3QgYmUgYW55IHBhdGhzIGxvbmdlcgorCSAgIHRoYW4gTUFYX1BBVEguICovCisJYXNzZXJ0KHJlc3VsdCA8PSBNQVhfUEFUSCsxKTsKKwlpZiAoc3RybmNtcChuZXdfcGF0aCwgIlxcXFwiLCAyKSA9PSAwIHx8CisJICAgIHN0cm5jbXAobmV3X3BhdGgsICIvLyIsIDIpID09IDApCisJICAgIC8qIFVOQyBwYXRoLCBub3RoaW5nIHRvIGRvLiAqLworCSAgICByZXR1cm4gVFJVRTsKKwllbnZbMV0gPSBuZXdfcGF0aFswXTsKKwlyZXR1cm4gU2V0RW52aXJvbm1lbnRWYXJpYWJsZUEoZW52LCBuZXdfcGF0aCk7Cit9CisKKy8qIFRoZSBVbmljb2RlIHZlcnNpb24gZGlmZmVycyBmcm9tIHRoZSBBTlNJIHZlcnNpb24KKyAgIHNpbmNlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBtaWdodCBleGNlZWQgTUFYX1BBVEggY2hhcmFjdGVycyAqLworQk9PTCBfX3N0ZGNhbGwKK3dpbjMyX3djaGRpcihMUENXU1RSIHBhdGgpCit7CisJd2NoYXJfdCBfbmV3X3BhdGhbTUFYX1BBVEgrMV0sICpuZXdfcGF0aCA9IF9uZXdfcGF0aDsKKwlpbnQgcmVzdWx0OworCXdjaGFyX3QgZW52WzRdID0gTCI9eDoiOworCisJaWYoIVNldEN1cnJlbnREaXJlY3RvcnlXKHBhdGgpKQorCQlyZXR1cm4gRkFMU0U7CisJcmVzdWx0ID0gR2V0Q3VycmVudERpcmVjdG9yeVcoTUFYX1BBVEgrMSwgbmV3X3BhdGgpOworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gRkFMU0U7CisJaWYgKHJlc3VsdCA+IE1BWF9QQVRIKzEpIHsKKwkJbmV3X3BhdGggPSBtYWxsb2MocmVzdWx0KTsKKwkJaWYgKCFuZXdfcGF0aCkgeworCQkJU2V0TGFzdEVycm9yKEVSUk9SX09VVE9GTUVNT1JZKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0KKwlpZiAod2NzbmNtcChuZXdfcGF0aCwgTCJcXFxcIiwgMikgPT0gMCB8fAorCSAgICB3Y3NuY21wKG5ld19wYXRoLCBMIi8vIiwgMikgPT0gMCkKKwkgICAgLyogVU5DIHBhdGgsIG5vdGhpbmcgdG8gZG8uICovCisJICAgIHJldHVybiBUUlVFOworCWVudlsxXSA9IG5ld19wYXRoWzBdOworCXJlc3VsdCA9IFNldEVudmlyb25tZW50VmFyaWFibGVXKGVudiwgbmV3X3BhdGgpOworCWlmIChuZXdfcGF0aCAhPSBfbmV3X3BhdGgpCisJCWZyZWUobmV3X3BhdGgpOworCXJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYKKwogI2lmZGVmIE1TX1dJTkRPV1MKIC8qIFRoZSBDUlQgb2YgV2luZG93cyBoYXMgYSBudW1iZXIgb2YgZmxhd3Mgd3J0LiBpdHMgc3RhdCgpIGltcGxlbWVudGF0aW9uOgogICAgLSB0aW1lIHN0YW1wcyBhcmUgcmVzdHJpY3RlZCB0byBzZWNvbmQgcmVzb2x1dGlvbgpAQCAtNzExLDEzICs3NjMsMjYgQEAKIHN0YXRpYyB2b2lkCiBGSUxFX1RJTUVfdG9fdGltZV90X25zZWMoRklMRVRJTUUgKmluX3B0ciwgaW50ICp0aW1lX291dCwgaW50KiBuc2VjX291dCkKIHsKLQkvKiBYWFggZW5kaWFubmVzcyAqLwotCV9faW50NjQgaW4gPSAqKF9faW50NjQqKWluX3B0cjsKKwkvKiBYWFggZW5kaWFubmVzcy4gU2hvdWxkbid0IG1hdHRlciwgYXMgYWxsIFdpbmRvd3MgaW1wbGVtZW50YXRpb25zIGFyZSBsaXR0bGUtZW5kaWFuICovCisJLyogQ2Fubm90IHNpbXBseSBjYXN0IGFuZCBkZXJlZmVyZW5jZSBpbl9wdHIsIAorCSAgIHNpbmNlIGl0IG1pZ2h0IG5vdCBiZSBhbGlnbmVkIHByb3Blcmx5ICovCisJX19pbnQ2NCBpbjsKKwltZW1jcHkoJmluLCBpbl9wdHIsIHNpemVvZihpbikpOwogCSpuc2VjX291dCA9IChpbnQpKGluICUgMTAwMDAwMDApICogMTAwOyAvKiBGSUxFVElNRSBpcyBpbiB1bml0cyBvZiAxMDAgbnNlYy4gKi8KIAkvKiBYWFggV2luMzIgc3VwcG9ydHMgdGltZSBzdGFtcHMgcGFzdCAyMDM4OyB3ZSBjdXJyZW50bHkgZG9uJ3QgKi8KIAkqdGltZV9vdXQgPSBQeV9TQUZFX0RPV05DQVNUKChpbiAvIDEwMDAwMDAwKSAtIHNlY3NfYmV0d2Vlbl9lcG9jaHMsIF9faW50NjQsIGludCk7CiB9CiAKK3N0YXRpYyB2b2lkCit0aW1lX3RfdG9fRklMRV9USU1FKGludCB0aW1lX2luLCBpbnQgbnNlY19pbiwgRklMRVRJTUUgKm91dF9wdHIpCit7CisJLyogWFhYIGVuZGlhbm5lc3MgKi8KKwlfX2ludDY0IG91dDsKKwlvdXQgPSB0aW1lX2luICsgc2Vjc19iZXR3ZWVuX2Vwb2NoczsKKwlvdXQgPSBvdXQgKiAxMDAwMDAwMCArIG5zZWNfaW47CisJbWVtY3B5KG91dF9wdHIsICZvdXQsIHNpemVvZihvdXQpKTsKK30KKwogLyogQmVsb3csIHdlICprbm93KiB0aGF0IHVnbytyIGlzIDA0NDQgKi8KICNpZiBfU19JUkVBRCAhPSAwNDAwCiAjZXJyb3IgVW5zdXBwb3J0ZWQgQyBsaWJyYXJ5CkBAIC0xMjkyLDI0ICsxMzU3LDM5IEBACiB7CiAJY2hhciAqcGF0aDsKIAlpbnQgbW9kZTsKLQlpbnQgcmVzOwotCisJCiAjaWZkZWYgUHlfV0lOX1dJREVfRklMRU5BTUVTCisJRFdPUkQgYXR0cjsKIAlpZiAodW5pY29kZV9maWxlX25hbWVzKCkpIHsKIAkJUHlVbmljb2RlT2JqZWN0ICpwbzsKIAkJaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlVpOmFjY2VzcyIsICZwbywgJm1vZGUpKSB7CiAJCQlQeV9CRUdJTl9BTExPV19USFJFQURTCiAJCQkvKiBQeVVuaWNvZGVfQVNfVU5JQ09ERSBPSyB3aXRob3V0IHRocmVhZCBsb2NrIGFzCiAJCQkgICBpdCBpcyBhIHNpbXBsZSBkZXJlZmVyZW5jZS4gKi8KLQkJCXJlcyA9IF93YWNjZXNzKFB5VW5pY29kZV9BU19VTklDT0RFKHBvKSwgbW9kZSk7CisJCQlhdHRyID0gR2V0RmlsZUF0dHJpYnV0ZXNXKFB5VW5pY29kZV9BU19VTklDT0RFKHBvKSk7CiAJCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQkJcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXMgPT0gMCk7CisJCQlnb3RvIGZpbmlzaDsKIAkJfQogCQkvKiBEcm9wIHRoZSBhcmd1bWVudCBwYXJzaW5nIGVycm9yIGFzIG5hcnJvdyBzdHJpbmdzCiAJCSAgIGFyZSBhbHNvIHZhbGlkLiAqLwogCQlQeUVycl9DbGVhcigpOwogCX0KLSNlbmRpZgorCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZXRpOmFjY2VzcyIsCisJCQkgICAgICBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nLCAmcGF0aCwgJm1vZGUpKQorCQlyZXR1cm4gMDsKKwlQeV9CRUdJTl9BTExPV19USFJFQURTCisJYXR0ciA9IEdldEZpbGVBdHRyaWJ1dGVzQShwYXRoKTsKKwlQeV9FTkRfQUxMT1dfVEhSRUFEUworCVB5TWVtX0ZyZWUocGF0aCk7CitmaW5pc2g6CisJaWYgKGF0dHIgPT0gMHhGRkZGRkZGRikKKwkJLyogRmlsZSBkb2VzIG5vdCBleGlzdCwgb3IgY2Fubm90IHJlYWQgYXR0cmlidXRlcyAqLworCQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOworCS8qIEFjY2VzcyBpcyBwb3NzaWJsZSBpZiBlaXRoZXIgd3JpdGUgYWNjZXNzIHdhc24ndCByZXF1ZXN0ZWQsIG9yCisJICAgdGhlIGZpbGUgaXNuJ3QgcmVhZC1vbmx5LiAqLworCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoIShtb2RlICYgMikgfHwgIShhdHRyICYmIEZJTEVfQVRUUklCVVRFX1JFQURPTkxZKSk7CisjZWxzZQorCWludCByZXM7CiAJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJldGk6YWNjZXNzIiwgCiAJCQkgICAgICBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nLCAmcGF0aCwgJm1vZGUpKQogCQlyZXR1cm4gTlVMTDsKQEAgLTEzMTgsNiArMTM5OCw3IEBACiAJUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAlQeU1lbV9GcmVlKHBhdGgpOwogCXJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzID09IDApOworI2VuZGlmCiB9CiAKICNpZm5kZWYgRl9PSwpAQCAtMTM5NCwxNCArMTQ3NSwxMyBAQAogcG9zaXhfY2hkaXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogI2lmZGVmIE1TX1dJTkRPV1MKLQlyZXR1cm4gcG9zaXhfMXN0cihhcmdzLCAiZXQ6Y2hkaXIiLCBjaGRpciwgIlU6Y2hkaXIiLCBfd2NoZGlyKTsKKwlyZXR1cm4gd2luMzJfMXN0cihhcmdzLCAiY2hkaXIiLCAiczpjaGRpciIsIHdpbjMyX2NoZGlyLCAiVTpjaGRpciIsIHdpbjMyX3djaGRpcik7CiAjZWxpZiBkZWZpbmVkKFBZT1NfT1MyKSAmJiBkZWZpbmVkKFBZQ0NfR0NDKQotCXJldHVybiBwb3NpeF8xc3RyKGFyZ3MsICJldDpjaGRpciIsIF9jaGRpcjIsIE5VTEwsIE5VTEwpOworCXJldHVybiBwb3NpeF8xc3RyKGFyZ3MsICJldDpjaGRpciIsIF9jaGRpcjIpOwogI2VsaWYgZGVmaW5lZChfX1ZNUykKLQlyZXR1cm4gcG9zaXhfMXN0cihhcmdzLCAiZXQ6Y2hkaXIiLCAoaW50ICgqKShjb25zdCBjaGFyICopKWNoZGlyLAotCQkJICBOVUxMLCBOVUxMKTsKKwlyZXR1cm4gcG9zaXhfMXN0cihhcmdzLCAiZXQ6Y2hkaXIiLCAoaW50ICgqKShjb25zdCBjaGFyICopKWNoZGlyKTsKICNlbHNlCi0JcmV0dXJuIHBvc2l4XzFzdHIoYXJncywgImV0OmNoZGlyIiwgY2hkaXIsIE5VTEwsIE5VTEwpOworCXJldHVybiBwb3NpeF8xc3RyKGFyZ3MsICJldDpjaGRpciIsIGNoZGlyKTsKICNlbmRpZgogfQogCkBAIC0xNDMwLDE0ICsxNTEwLDI0IEBACiAJaW50IGk7CiAJaW50IHJlczsKICNpZmRlZiBQeV9XSU5fV0lERV9GSUxFTkFNRVMKKwlEV09SRCBhdHRyOwogCWlmICh1bmljb2RlX2ZpbGVfbmFtZXMoKSkgewogCQlQeVVuaWNvZGVPYmplY3QgKnBvOwogCQlpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVWl8OmNobW9kIiwgJnBvLCAmaSkpIHsKIAkJCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJCXJlcyA9IF93Y2htb2QoUHlVbmljb2RlX0FTX1VOSUNPREUocG8pLCBpKTsKKwkJCWF0dHIgPSBHZXRGaWxlQXR0cmlidXRlc1coUHlVbmljb2RlX0FTX1VOSUNPREUocG8pKTsKKwkJCWlmIChhdHRyICE9IDB4RkZGRkZGRkYpIHsKKwkJCQlpZiAoaSAmIF9TX0lXUklURSkKKwkJCQkJYXR0ciAmPSB+RklMRV9BVFRSSUJVVEVfUkVBRE9OTFk7CisJCQkJZWxzZQorCQkJCQlhdHRyIHw9IEZJTEVfQVRUUklCVVRFX1JFQURPTkxZOworCQkJCXJlcyA9IFNldEZpbGVBdHRyaWJ1dGVzVyhQeVVuaWNvZGVfQVNfVU5JQ09ERShwbyksIGF0dHIpOworCQkJfQorCQkJZWxzZQorCQkJCXJlcyA9IDA7CiAJCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQkJaWYgKHJlcyA8IDApCi0JCQkJcmV0dXJuIHBvc2l4X2Vycm9yX3dpdGhfdW5pY29kZV9maWxlbmFtZSgKKwkJCWlmICghcmVzKQorCQkJCXJldHVybiB3aW4zMl9lcnJvcl91bmljb2RlKCJjaG1vZCIsCiAJCQkJCQlQeVVuaWNvZGVfQVNfVU5JQ09ERShwbykpOwogCQkJUHlfSU5DUkVGKFB5X05vbmUpOwogCQkJcmV0dXJuIFB5X05vbmU7CkBAIC0xNDQ2LDcgKzE1MzYsMzAgQEAKIAkJICAgYXJlIGFsc28gdmFsaWQuICovCiAJCVB5RXJyX0NsZWFyKCk7CiAJfQotI2VuZGlmIC8qIFB5X1dJTl9XSURFX0ZJTEVOQU1FUyAqLworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZXRpOmNobW9kIiwgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZywKKwkgICAgICAgICAgICAgICAgICAgICAgJnBhdGgsICZpKSkKKwkJcmV0dXJuIE5VTEw7CisJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworCWF0dHIgPSBHZXRGaWxlQXR0cmlidXRlc0EocGF0aCk7CisJaWYgKGF0dHIgIT0gMHhGRkZGRkZGRikgeworCQlpZiAoaSAmIF9TX0lXUklURSkKKwkJCWF0dHIgJj0gfkZJTEVfQVRUUklCVVRFX1JFQURPTkxZOworCQllbHNlCisJCQlhdHRyIHw9IEZJTEVfQVRUUklCVVRFX1JFQURPTkxZOworCQlyZXMgPSBTZXRGaWxlQXR0cmlidXRlc0EocGF0aCwgYXR0cik7CisJfQorCWVsc2UKKwkJcmVzID0gMDsKKwlQeV9FTkRfQUxMT1dfVEhSRUFEUworCWlmICghcmVzKSB7CisJCXdpbjMyX2Vycm9yKCJjaG1vZCIsIHBhdGgpOworCQlQeU1lbV9GcmVlKHBhdGgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJUHlNZW1fRnJlZShwYXRoKTsKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisJcmV0dXJuIFB5X05vbmU7CisjZWxzZSAvKiBQeV9XSU5fV0lERV9GSUxFTkFNRVMgKi8KIAlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0aTpjaG1vZCIsIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcsCiAJICAgICAgICAgICAgICAgICAgICAgICZwYXRoLCAmaSkpCiAJCXJldHVybiBOVUxMOwpAQCAtMTQ1OCw2ICsxNTcxLDcgQEAKIAlQeU1lbV9GcmVlKHBhdGgpOwogCVB5X0lOQ1JFRihQeV9Ob25lKTsKIAlyZXR1cm4gUHlfTm9uZTsKKyNlbmRpZgogfQogCiAKQEAgLTE0NjksNyArMTU4Myw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcG9zaXhfY2hyb290KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gcG9zaXhfMXN0cihhcmdzLCAiZXQ6Y2hyb290IiwgY2hyb290LCBOVUxMLCBOVUxMKTsKKwlyZXR1cm4gcG9zaXhfMXN0cihhcmdzLCAiZXQ6Y2hyb290IiwgY2hyb290KTsKIH0KICNlbmRpZgogCkBAIC0xNTkzLDE1ICsxNzA3LDMzIEBACiAJY2hhciAqcmVzOwogCiAjaWZkZWYgUHlfV0lOX1dJREVfRklMRU5BTUVTCisJRFdPUkQgbGVuOwogCWlmICh1bmljb2RlX2ZpbGVfbmFtZXMoKSkgewotCQl3Y2hhcl90ICp3cmVzOwogCQl3Y2hhcl90IHdidWZbMTAyNl07CisJCXdjaGFyX3QgKndidWYyID0gd2J1ZjsKKwkJUHlPYmplY3QgKnJlc29iajsKIAkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQl3cmVzID0gX3dnZXRjd2Qod2J1Ziwgc2l6ZW9mIHdidWYvIHNpemVvZiB3YnVmWzBdKTsKKwkJbGVuID0gR2V0Q3VycmVudERpcmVjdG9yeVcoc2l6ZW9mIHdidWYvIHNpemVvZiB3YnVmWzBdLCB3YnVmKTsKKwkJLyogSWYgdGhlIGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2gsIGxlbiBkb2VzIG5vdCBpbmNsdWRlIHRoZQorCQkgICB0ZXJtaW5hdGluZyBcMC4gSWYgdGhlIGJ1ZmZlciBpcyB0b28gc21hbGwsIGxlbiBpbmNsdWRlcworCQkgICB0aGUgc3BhY2UgbmVlZGVkIGZvciB0aGUgdGVybWluYXRvci4gKi8KKwkJaWYgKGxlbiA+PSBzaXplb2Ygd2J1Zi8gc2l6ZW9mIHdidWZbMF0pIHsKKwkJCXdidWYyID0gbWFsbG9jKGxlbiAqIHNpemVvZih3Y2hhcl90KSk7CisJCQlpZiAod2J1ZjIpCisJCQkJbGVuID0gR2V0Q3VycmVudERpcmVjdG9yeVcobGVuLCB3YnVmMik7CisJCX0KIAkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJaWYgKHdyZXMgPT0gTlVMTCkKLQkJCXJldHVybiBwb3NpeF9lcnJvcigpOwotCQlyZXR1cm4gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcih3YnVmLCB3Y3NsZW4od2J1ZikpOworCQlpZiAoIXdidWYyKSB7CisJCQlQeUVycl9Ob01lbW9yeSgpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKCFsZW4pIHsKKwkJCWlmICh3YnVmMiAhPSB3YnVmKSBmcmVlKHdidWYyKTsKKwkJCXJldHVybiB3aW4zMl9lcnJvcigiZ2V0Y3dkdSIsIE5VTEwpOworCQl9CisJCXJlc29iaiA9IFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIod2J1ZjIsIGxlbik7CisJCWlmICh3YnVmMiAhPSB3YnVmKSBmcmVlKHdidWYyKTsKKwkJcmV0dXJuIHJlc29iajsKIAl9CiAjZW5kaWYKIApAQCAtMTYyOCw3ICsxNzYwLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBwb3NpeF9saW5rKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gcG9zaXhfMnN0cihhcmdzLCAiZXRldDpsaW5rIiwgbGluaywgTlVMTCwgTlVMTCk7CisJcmV0dXJuIHBvc2l4XzJzdHIoYXJncywgImV0ZXQ6bGluayIsIGxpbmspOwogfQogI2VuZGlmIC8qIEhBVkVfTElOSyAqLwogCkBAIC0xNjUzLDM3ICsxNzg1LDQ2IEBACiAJSEFORExFIGhGaW5kRmlsZTsKIAlCT09MIHJlc3VsdDsKIAlXSU4zMl9GSU5EX0RBVEEgRmlsZURhdGE7Ci0JLyogTUFYX1BBVEggY2hhcmFjdGVycyBjb3VsZCBtZWFuIGEgYmlnZ2VyIGVuY29kZWQgc3RyaW5nICovCi0JY2hhciBuYW1lYnVmW01BWF9QQVRIKjIrNV07CisJY2hhciBuYW1lYnVmW01BWF9QQVRIKzVdOyAvKiBPdmVyYWxsb2NhdGUgZm9yIFxcKi4qXDAgKi8KIAljaGFyICpidWZwdHIgPSBuYW1lYnVmOwotCVB5X3NzaXplX3QgbGVuID0gc2l6ZW9mKG5hbWVidWYpL3NpemVvZihuYW1lYnVmWzBdKTsKKwlQeV9zc2l6ZV90IGxlbiA9IHNpemVvZihuYW1lYnVmKS01OyAvKiBvbmx5IGNsYWltIHRvIGhhdmUgc3BhY2UgZm9yIE1BWF9QQVRIICovCiAKICNpZmRlZiBQeV9XSU5fV0lERV9GSUxFTkFNRVMKIAkvKiBJZiBvbiB3aWRlLWNoYXJhY3Rlci1jYXBhYmxlIE9TIHNlZSBpZiBhcmd1bWVudAogCSAgIGlzIFVuaWNvZGUgYW5kIGlmIHNvIHVzZSB3aWRlIEFQSS4gICovCiAJaWYgKHVuaWNvZGVfZmlsZV9uYW1lcygpKSB7Ci0JCVB5VW5pY29kZU9iamVjdCAqcG87CisJCVB5T2JqZWN0ICpwbzsKIAkJaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlU6bGlzdGRpciIsICZwbykpIHsKIAkJCVdJTjMyX0ZJTkRfREFUQVcgd0ZpbGVEYXRhOwotCQkJUHlfVU5JQ09ERSB3bmFtZWJ1ZltNQVhfUEFUSCoyKzVdOworCQkJUHlfVU5JQ09ERSAqd25hbWVidWY7CiAJCQlQeV9VTklDT0RFIHdjaDsKLQkJCXdjc25jcHkod25hbWVidWYsIFB5VW5pY29kZV9BU19VTklDT0RFKHBvKSwgTUFYX1BBVEgpOwotCQkJd25hbWVidWZbTUFYX1BBVEhdID0gTCdcMCc7Ci0JCQlsZW4gPSB3Y3NsZW4od25hbWVidWYpOwotCQkJd2NoID0gKGxlbiA+IDApID8gd25hbWVidWZbbGVuLTFdIDogTCdcMCc7Ci0JCQlpZiAod2NoICE9IEwnLycgJiYgd2NoICE9IEwnXFwnICYmIHdjaCAhPSBMJzonKQotCQkJCXduYW1lYnVmW2xlbisrXSA9IEwnLyc7Ci0JCQl3Y3NjcHkod25hbWVidWYgKyBsZW4sIEwiKi4qIik7Ci0JCQlpZiAoKGQgPSBQeUxpc3RfTmV3KDApKSA9PSBOVUxMKQorCQkJLyogT3ZlcmFsbG9jYXRlIGZvciBcXCouKlwwICovCisJCQlsZW4gPSBQeVVuaWNvZGVfR0VUX1NJWkUocG8pOworCQkJd25hbWVidWYgPSBtYWxsb2MoKGxlbiArIDUpICogc2l6ZW9mKHdjaGFyX3QpKTsKKwkJCWlmICghd25hbWVidWYpIHsKKwkJCQlQeUVycl9Ob01lbW9yeSgpOwogCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJd2NzY3B5KHduYW1lYnVmLCBQeVVuaWNvZGVfQVNfVU5JQ09ERShwbykpOworCQkJd2NoID0gbGVuID4gMCA/IHduYW1lYnVmW2xlbi0xXSA6ICdcMCc7CisJCQlpZiAod2NoICE9IEwnLycgJiYgd2NoICE9IEwnXFwnICYmIHdjaCAhPSBMJzonKQorCQkJCXduYW1lYnVmW2xlbisrXSA9IEwnXFwnOworCQkJd2NzY3B5KHduYW1lYnVmICsgbGVuLCBMIiouKiIpOworCQkJaWYgKChkID0gUHlMaXN0X05ldygwKSkgPT0gTlVMTCkgeworCQkJCWZyZWUod25hbWVidWYpOworCQkJCXJldHVybiBOVUxMOworCQkJfQogCQkJaEZpbmRGaWxlID0gRmluZEZpcnN0RmlsZVcod25hbWVidWYsICZ3RmlsZURhdGEpOwogCQkJaWYgKGhGaW5kRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotCQkJCWVycm5vID0gR2V0TGFzdEVycm9yKCk7Ci0JCQkJaWYgKGVycm5vID09IEVSUk9SX0ZJTEVfTk9UX0ZPVU5EKSB7CisJCQkJaW50IGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisJCQkJaWYgKGVycm9yID09IEVSUk9SX0ZJTEVfTk9UX0ZPVU5EKSB7CisJCQkJCWZyZWUod25hbWVidWYpOwogCQkJCQlyZXR1cm4gZDsKIAkJCQl9CiAJCQkJUHlfREVDUkVGKGQpOwotCQkJCXJldHVybiB3aW4zMl9lcnJvcl91bmljb2RlKCJGaW5kRmlyc3RGaWxlVyIsIHduYW1lYnVmKTsKKwkJCQl3aW4zMl9lcnJvcl91bmljb2RlKCJGaW5kRmlyc3RGaWxlVyIsIHduYW1lYnVmKTsKKwkJCQlmcmVlKHduYW1lYnVmKTsKKwkJCQlyZXR1cm4gTlVMTDsKIAkJCX0KIAkJCWRvIHsKIAkJCQkvKiBTa2lwIG92ZXIgLiBhbmQgLi4gKi8KQEAgLTE3MTAsOCArMTg1MSwxMSBAQAogCiAJCQlpZiAoRmluZENsb3NlKGhGaW5kRmlsZSkgPT0gRkFMU0UpIHsKIAkJCQlQeV9ERUNSRUYoZCk7Ci0JCQkJcmV0dXJuIHdpbjMyX2Vycm9yX3VuaWNvZGUoIkZpbmRDbG9zZSIsIHduYW1lYnVmKTsKKwkJCQl3aW4zMl9lcnJvcl91bmljb2RlKCJGaW5kQ2xvc2UiLCB3bmFtZWJ1Zik7CisJCQkJZnJlZSh3bmFtZWJ1Zik7CisJCQkJcmV0dXJuIE5VTEw7CiAJCQl9CisJCQlmcmVlKHduYW1lYnVmKTsKIAkJCXJldHVybiBkOwogCQl9CiAJCS8qIERyb3AgdGhlIGFyZ3VtZW50IHBhcnNpbmcgZXJyb3IgYXMgbmFycm93IHN0cmluZ3MKQEAgLTE3MzUsOCArMTg3OSw4IEBACiAKIAloRmluZEZpbGUgPSBGaW5kRmlyc3RGaWxlKG5hbWVidWYsICZGaWxlRGF0YSk7CiAJaWYgKGhGaW5kRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotCQllcnJubyA9IEdldExhc3RFcnJvcigpOwotCQlpZiAoZXJybm8gPT0gRVJST1JfRklMRV9OT1RfRk9VTkQpCisJCWludCBlcnJvciA9IEdldExhc3RFcnJvcigpOworCQlpZiAoZXJyb3IgPT0gRVJST1JfRklMRV9OT1RfRk9VTkQpCiAJCQlyZXR1cm4gZDsKIAkJUHlfREVDUkVGKGQpOwogCQlyZXR1cm4gd2luMzJfZXJyb3IoIkZpbmRGaXJzdEZpbGUiLCBuYW1lYnVmKTsKQEAgLTE5ODIsMTAgKzIxMjYsMTAgQEAKIAkJCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKIAkJCS8qIFB5VW5pY29kZV9BU19VTklDT0RFIE9LIHdpdGhvdXQgdGhyZWFkIGxvY2sgYXMKIAkJCSAgIGl0IGlzIGEgc2ltcGxlIGRlcmVmZXJlbmNlLiAqLwotCQkJcmVzID0gX3dta2RpcihQeVVuaWNvZGVfQVNfVU5JQ09ERShwbykpOworCQkJcmVzID0gQ3JlYXRlRGlyZWN0b3J5VyhQeVVuaWNvZGVfQVNfVU5JQ09ERShwbyksIE5VTEwpOwogCQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJCWlmIChyZXMgPCAwKQotCQkJCXJldHVybiBwb3NpeF9lcnJvcigpOworCQkJaWYgKCFyZXMpCisJCQkJcmV0dXJuIHdpbjMyX2Vycm9yX3VuaWNvZGUoIm1rZGlyIiwgUHlVbmljb2RlX0FTX1VOSUNPREUocG8pKTsKIAkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKIAkJCXJldHVybiBQeV9Ob25lOwogCQl9CkBAIC0xOTkzLDEzICsyMTM3LDI5IEBACiAJCSAgIGFyZSBhbHNvIHZhbGlkLiAqLwogCQlQeUVycl9DbGVhcigpOwogCX0KLSNlbmRpZgorCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZXR8aTpta2RpciIsCisJICAgICAgICAgICAgICAgICAgICAgIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcsICZwYXRoLCAmbW9kZSkpCisJCXJldHVybiBOVUxMOworCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKwkvKiBQeVVuaWNvZGVfQVNfVU5JQ09ERSBPSyB3aXRob3V0IHRocmVhZCBsb2NrIGFzCisJICAgaXQgaXMgYSBzaW1wbGUgZGVyZWZlcmVuY2UuICovCisJcmVzID0gQ3JlYXRlRGlyZWN0b3J5QShwYXRoLCBOVUxMKTsKKwlQeV9FTkRfQUxMT1dfVEhSRUFEUworCWlmICghcmVzKSB7CisJCXdpbjMyX2Vycm9yKCJta2RpciIsIHBhdGgpOworCQlQeU1lbV9GcmVlKHBhdGgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJUHlNZW1fRnJlZShwYXRoKTsKKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisJcmV0dXJuIFB5X05vbmU7CisjZWxzZQogCiAJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJldHxpOm1rZGlyIiwKIAkgICAgICAgICAgICAgICAgICAgICAgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZywgJnBhdGgsICZtb2RlKSkKIAkJcmV0dXJuIE5VTEw7CiAJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotI2lmICggZGVmaW5lZChfX1dBVENPTUNfXykgfHwgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChQWUNDX1ZBQ1BQKSApICYmICFkZWZpbmVkKF9fUU5YX18pCisjaWYgKCBkZWZpbmVkKF9fV0FUQ09NQ19fKSB8fCBkZWZpbmVkKFBZQ0NfVkFDUFApICkgJiYgIWRlZmluZWQoX19RTlhfXykKIAlyZXMgPSBta2RpcihwYXRoKTsKICNlbHNlCiAJcmVzID0gbWtkaXIocGF0aCwgbW9kZSk7CkBAIC0yMDEwLDYgKzIxNzAsNyBAQAogCVB5TWVtX0ZyZWUocGF0aCk7CiAJUHlfSU5DUkVGKFB5X05vbmUpOwogCXJldHVybiBQeV9Ob25lOworI2VuZGlmCiB9CiAKIApAQCAtMjA1NSw3ICsyMjE2LDYgQEAKIH0KICNlbmRpZiAvKiBIQVZFX05JQ0UgKi8KIAotCiBQeURvY19TVFJWQVIocG9zaXhfcmVuYW1lX19kb2NfXywKICJyZW5hbWUob2xkLCBuZXcpXG5cblwKIFJlbmFtZSBhIGZpbGUgb3IgZGlyZWN0b3J5LiIpOwpAQCAtMjA2NCw5ICsyMjI0LDM4IEBACiBwb3NpeF9yZW5hbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogI2lmZGVmIE1TX1dJTkRPV1MKLQlyZXR1cm4gcG9zaXhfMnN0cihhcmdzLCAiZXRldDpyZW5hbWUiLCByZW5hbWUsICJPTzpyZW5hbWUiLCBfd3JlbmFtZSk7CisJUHlPYmplY3QgKm8xLCAqbzI7CisJY2hhciAqcDEsICpwMjsKKwlCT09MIHJlc3VsdDsKKwlpZiAodW5pY29kZV9maWxlX25hbWVzKCkpIHsKKwkgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mOnJlbmFtZSIsIAorCQljb252ZXJ0X3RvX3VuaWNvZGUsICZvMSwKKwkJY29udmVydF90b191bmljb2RlLCAmbzIpKQorCQkgICAgUHlFcnJfQ2xlYXIoKTsKKwkgICAgZWxzZSB7CisJCSAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisJCSAgICByZXN1bHQgPSBNb3ZlRmlsZVcoUHlVbmljb2RlX0FzVW5pY29kZShvMSksCisJCQkJICAgICAgIFB5VW5pY29kZV9Bc1VuaWNvZGUobzIpKTsKKwkJICAgIFB5X0VORF9BTExPV19USFJFQURTCisJCSAgICBQeV9ERUNSRUYobzEpOworCQkgICAgUHlfREVDUkVGKG8yKTsKKwkJICAgIGlmICghcmVzdWx0KQorCQkJICAgIHJldHVybiB3aW4zMl9lcnJvcigicmVuYW1lIiwgTlVMTCk7CisJCSAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisJCSAgICByZXR1cm4gUHlfTm9uZTsKKwkgICAgfQorCX0KKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzOnJlbmFtZSIsICZwMSwgJnAyKSkKKwkJcmV0dXJuIE5VTEw7CisJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworCXJlc3VsdCA9IE1vdmVGaWxlQShwMSwgcDIpOworCVB5X0VORF9BTExPV19USFJFQURTCisJaWYgKCFyZXN1bHQpCisJCXJldHVybiB3aW4zMl9lcnJvcigicmVuYW1lIiwgTlVMTCk7CisJUHlfSU5DUkVGKFB5X05vbmUpOworCXJldHVybiBQeV9Ob25lOwogI2Vsc2UKLQlyZXR1cm4gcG9zaXhfMnN0cihhcmdzLCAiZXRldDpyZW5hbWUiLCByZW5hbWUsIE5VTEwsIE5VTEwpOworCXJldHVybiBwb3NpeF8yc3RyKGFyZ3MsICJldGV0OnJlbmFtZSIsIHJlbmFtZSk7CiAjZW5kaWYKIH0KIApAQCAtMjA3OSw5ICsyMjY4LDkgQEAKIHBvc2l4X3JtZGlyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKICNpZmRlZiBNU19XSU5ET1dTCi0JcmV0dXJuIHBvc2l4XzFzdHIoYXJncywgImV0OnJtZGlyIiwgcm1kaXIsICJVOnJtZGlyIiwgX3dybWRpcik7CisJcmV0dXJuIHdpbjMyXzFzdHIoYXJncywgInJtZGlyIiwgInM6cm1kaXIiLCBSZW1vdmVEaXJlY3RvcnlBLCAiVTpybWRpciIsIFJlbW92ZURpcmVjdG9yeVcpOwogI2Vsc2UKLQlyZXR1cm4gcG9zaXhfMXN0cihhcmdzLCAiZXQ6cm1kaXIiLCBybWRpciwgTlVMTCwgTlVMTCk7CisJcmV0dXJuIHBvc2l4XzFzdHIoYXJncywgImV0OnJtZGlyIiwgcm1kaXIpOwogI2VuZGlmCiB9CiAKQEAgLTIxNTAsOSArMjMzOSw5IEBACiBwb3NpeF91bmxpbmsoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogI2lmZGVmIE1TX1dJTkRPV1MKLQlyZXR1cm4gcG9zaXhfMXN0cihhcmdzLCAiZXQ6cmVtb3ZlIiwgdW5saW5rLCAiVTpyZW1vdmUiLCBfd3VubGluayk7CisJcmV0dXJuIHdpbjMyXzFzdHIoYXJncywgInJlbW92ZSIsICJzOnJlbW92ZSIsIERlbGV0ZUZpbGVBLCAiVTpyZW1vdmUiLCBEZWxldGVGaWxlVyk7CiAjZWxzZQotCXJldHVybiBwb3NpeF8xc3RyKGFyZ3MsICJldDpyZW1vdmUiLCB1bmxpbmssIE5VTEwsIE5VTEwpOworCXJldHVybiBwb3NpeF8xc3RyKGFyZ3MsICJldDpyZW1vdmUiLCB1bmxpbmspOwogI2VuZGlmCiB9CiAKQEAgLTIyMTIsNyArMjQwMSw3IEBACiB9CiAKIFB5RG9jX1NUUlZBUihwb3NpeF91dGltZV9fZG9jX18sCi0idXRpbWUocGF0aCwgKGF0aW1lLCB1dGltZSkpXG5cCisidXRpbWUocGF0aCwgKGF0aW1lLCBtdGltZSkpXG5cCiB1dGltZShwYXRoLCBOb25lKVxuXG5cCiBTZXQgdGhlIGFjY2VzcyBhbmQgbW9kaWZpZWQgdGltZSBvZiB0aGUgZmlsZSB0byB0aGUgZ2l2ZW4gdmFsdWVzLiAgSWYgdGhlXG5cCiBzZWNvbmQgZm9ybSBpcyB1c2VkLCBzZXQgdGhlIGFjY2VzcyBhbmQgbW9kaWZpZWQgdGltZXMgdG8gdGhlIGN1cnJlbnQgdGltZS4iKTsKQEAgLTIyMjAsNiArMjQwOSw4NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHBvc2l4X3V0aW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKKyNpZmRlZiBQeV9XSU5fV0lERV9GSUxFTkFNRVMKKwlQeU9iamVjdCAqYXJnOworCVB5VW5pY29kZU9iamVjdCAqb2J3cGF0aDsKKwl3Y2hhcl90ICp3cGF0aCA9IE5VTEw7CisJY2hhciAqYXBhdGggPSBOVUxMOworCUhBTkRMRSBoRmlsZTsKKwlsb25nIGF0aW1lc2VjLCBtdGltZXNlYywgYXVzZWMsIG11c2VjOworCUZJTEVUSU1FIGF0aW1lLCBtdGltZTsKKwlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKworCWlmICh1bmljb2RlX2ZpbGVfbmFtZXMoKSkgeworCQlpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVU98OnV0aW1lIiwgJm9id3BhdGgsICZhcmcpKSB7CisJCQl3cGF0aCA9IFB5VW5pY29kZV9BU19VTklDT0RFKG9id3BhdGgpOworCQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworCQkJaEZpbGUgPSBDcmVhdGVGaWxlVyh3cGF0aCwgRklMRV9XUklURV9BVFRSSUJVVEVTLCAwLAorCQkJCQkgICAgTlVMTCwgT1BFTl9FWElTVElORywgMCwgTlVMTCk7CisJCQlQeV9FTkRfQUxMT1dfVEhSRUFEUworCQkJaWYgKGhGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorCQkJCXJldHVybiB3aW4zMl9lcnJvcl91bmljb2RlKCJ1dGltZSIsIHdwYXRoKTsKKwkJfSBlbHNlCisJCQkvKiBEcm9wIHRoZSBhcmd1bWVudCBwYXJzaW5nIGVycm9yIGFzIG5hcnJvdyBzdHJpbmdzCisJCQkgICBhcmUgYWxzbyB2YWxpZC4gKi8KKwkJCVB5RXJyX0NsZWFyKCk7CisJfQorCWlmICghd3BhdGgpIHsKKwkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJldE86dXRpbWUiLAorCQkJCVB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcsICZhcGF0aCwgJmFyZykpCisJCQlyZXR1cm4gTlVMTDsKKwkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworCQloRmlsZSA9IENyZWF0ZUZpbGVBKGFwYXRoLCBGSUxFX1dSSVRFX0FUVFJJQlVURVMsIDAsCisJCQkJICAgIE5VTEwsIE9QRU5fRVhJU1RJTkcsIDAsIE5VTEwpOworCQlQeV9FTkRfQUxMT1dfVEhSRUFEUworCQlpZiAoaEZpbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKwkJCXdpbjMyX2Vycm9yKCJ1dGltZSIsIGFwYXRoKTsKKwkJCVB5TWVtX0ZyZWUoYXBhdGgpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJUHlNZW1fRnJlZShhcGF0aCk7CisJfQorCQorCWlmIChhcmcgPT0gUHlfTm9uZSkgeworCQlTWVNURU1USU1FIG5vdzsKKwkJR2V0U3lzdGVtVGltZSgmbm93KTsKKwkJaWYgKCFTeXN0ZW1UaW1lVG9GaWxlVGltZSgmbm93LCAmbXRpbWUpIHx8CisJCSAgICAhU3lzdGVtVGltZVRvRmlsZVRpbWUoJm5vdywgJmF0aW1lKSkgeworCQkJd2luMzJfZXJyb3IoInV0aW1lIiwgTlVMTCk7CisJCQlnb3RvIGRvbmU7CisJCSAgICB9CisJfQorCWVsc2UgaWYgKCFQeVR1cGxlX0NoZWNrKGFyZykgfHwgUHlUdXBsZV9TaXplKGFyZykgIT0gMikgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorCQkJCSJ1dGltZSgpIGFyZyAyIG11c3QgYmUgYSB0dXBsZSAoYXRpbWUsIG10aW1lKSIpOworCQlnb3RvIGRvbmU7CisJfQorCWVsc2UgeworCQlpZiAoZXh0cmFjdF90aW1lKFB5VHVwbGVfR0VUX0lURU0oYXJnLCAwKSwKKwkJCQkgJmF0aW1lc2VjLCAmYXVzZWMpID09IC0xKQorCQkJZ290byBkb25lOworCQl0aW1lX3RfdG9fRklMRV9USU1FKGF0aW1lc2VjLCBhdXNlYywgJmF0aW1lKTsKKwkJaWYgKGV4dHJhY3RfdGltZShQeVR1cGxlX0dFVF9JVEVNKGFyZywgMSksCisJCQkJICZtdGltZXNlYywgJm11c2VjKSA9PSAtMSkKKwkJCWdvdG8gZG9uZTsKKwkJdGltZV90X3RvX0ZJTEVfVElNRShtdGltZXNlYywgbXVzZWMsICZtdGltZSk7CisJfQorCWlmICghU2V0RmlsZVRpbWUoaEZpbGUsIE5VTEwsICZhdGltZSwgJm10aW1lKSkgeworCQkvKiBBdm9pZCBwdXR0aW5nIHRoZSBmaWxlIG5hbWUgaW50byB0aGUgZXJyb3IgaGVyZSwKKwkJICAgYXMgdGhhdCBtYXkgY29uZnVzZSB0aGUgdXNlciBpbnRvIGJlbGlldmluZyB0aGF0CisJCSAgIHNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHRoZSBmaWxlLCB3aGVuIGl0IGFsc28KKwkJICAgY291bGQgYmUgdGhlIHRpbWUgc3RhbXAgdGhhdCBnaXZlcyBhIHByb2JsZW0uICovCisJCXdpbjMyX2Vycm9yKCJ1dGltZSIsIE5VTEwpOworCX0KKwlQeV9JTkNSRUYoUHlfTm9uZSk7CisJcmVzdWx0ID0gUHlfTm9uZTsKK2RvbmU6CisJQ2xvc2VIYW5kbGUoaEZpbGUpOworCXJldHVybiByZXN1bHQ7CisjZWxzZSAvKiBQeV9XSU5fV0lERV9GSUxFTkFNRVMgKi8KKwogCWNoYXIgKnBhdGggPSBOVUxMOwogCWxvbmcgYXRpbWUsIG10aW1lLCBhdXNlYywgbXVzZWM7CiAJaW50IHJlczsKQEAgLTIyNDIsMzMgKzI1MDksMTMgQEAKICNkZWZpbmUgVVRJTUVfQVJHIGJ1ZgogI2VuZGlmIC8qIEhBVkVfVVRJTUVTICovCiAKLQlpbnQgaGF2ZV91bmljb2RlX2ZpbGVuYW1lID0gMDsKLSNpZmRlZiBQeV9XSU5fV0lERV9GSUxFTkFNRVMKLQlQeVVuaWNvZGVPYmplY3QgKm9id3BhdGg7Ci0Jd2NoYXJfdCAqd3BhdGg7Ci0JaWYgKHVuaWNvZGVfZmlsZV9uYW1lcygpKSB7Ci0JCWlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVT3w6dXRpbWUiLCAmb2J3cGF0aCwgJmFyZykpIHsKLQkJCXdwYXRoID0gUHlVbmljb2RlX0FTX1VOSUNPREUob2J3cGF0aCk7Ci0JCQloYXZlX3VuaWNvZGVfZmlsZW5hbWUgPSAxOwotCQl9IGVsc2UKLQkJCS8qIERyb3AgdGhlIGFyZ3VtZW50IHBhcnNpbmcgZXJyb3IgYXMgbmFycm93IHN0cmluZ3MKLQkJCSAgIGFyZSBhbHNvIHZhbGlkLiAqLwotCQkJUHlFcnJfQ2xlYXIoKTsKLQl9Ci0jZW5kaWYgLyogUHlfV0lOX1dJREVfRklMRU5BTUVTICovCiAKLQlpZiAoIWhhdmVfdW5pY29kZV9maWxlbmFtZSAmJiBcCi0JCSFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJldE86dXRpbWUiLAorCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZXRPOnV0aW1lIiwKIAkJCQkgIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcsICZwYXRoLCAmYXJnKSkKIAkJcmV0dXJuIE5VTEw7CiAJaWYgKGFyZyA9PSBQeV9Ob25lKSB7CiAJCS8qIG9wdGlvbmFsIHRpbWUgdmFsdWVzIG5vdCBnaXZlbiAqLwogCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0jaWZkZWYgUHlfV0lOX1dJREVfRklMRU5BTUVTCi0JCWlmIChoYXZlX3VuaWNvZGVfZmlsZW5hbWUpCi0JCQlyZXMgPSBfd3V0aW1lKHdwYXRoLCBOVUxMKTsKLQkJZWxzZQotI2VuZGlmIC8qIFB5X1dJTl9XSURFX0ZJTEVOQU1FUyAqLwogCQlyZXMgPSB1dGltZShwYXRoLCBOVUxMKTsKIAkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAl9CkBAIC0yMjk5LDIzICsyNTQ2LDExIEBACiAJCVB5X0VORF9BTExPV19USFJFQURTCiAjZWxzZQogCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0jaWZkZWYgUHlfV0lOX1dJREVfRklMRU5BTUVTCi0JCWlmIChoYXZlX3VuaWNvZGVfZmlsZW5hbWUpCi0JCQkvKiB1dGltZSBpcyBPSyB3aXRoIHV0aW1idWYsIGJ1dCBfd3V0aW1lIGluc2lzdHMKLQkJCSAgIG9uIF91dGltYnVmICh0aGUgbXN2YyBoZWFkZXJzIGFzc2VydCB0aGUKLQkJCSAgIHVuZGVyc2NvcmUgdmVyc2lvbiBpcyBhbnNpKSAqLwotCQkJcmVzID0gX3d1dGltZSh3cGF0aCwgKHN0cnVjdCBfdXRpbWJ1ZiAqKVVUSU1FX0FSRyk7Ci0JCWVsc2UKLSNlbmRpZiAvKiBQeV9XSU5fV0lERV9GSUxFTkFNRVMgKi8KIAkJcmVzID0gdXRpbWUocGF0aCwgVVRJTUVfQVJHKTsKIAkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKICNlbmRpZiAvKiBIQVZFX1VUSU1FUyAqLwogCX0KIAlpZiAocmVzIDwgMCkgewotI2lmZGVmIFB5X1dJTl9XSURFX0ZJTEVOQU1FUwotCQlpZiAoaGF2ZV91bmljb2RlX2ZpbGVuYW1lKQotCQkJcmV0dXJuIHBvc2l4X2Vycm9yX3dpdGhfdW5pY29kZV9maWxlbmFtZSh3cGF0aCk7Ci0jZW5kaWYgLyogUHlfV0lOX1dJREVfRklMRU5BTUVTICovCiAJCXJldHVybiBwb3NpeF9lcnJvcl93aXRoX2FsbG9jYXRlZF9maWxlbmFtZShwYXRoKTsKIAl9CiAJUHlNZW1fRnJlZShwYXRoKTsKQEAgLTIzMjQsNiArMjU1OSw3IEBACiAjdW5kZWYgVVRJTUVfQVJHCiAjdW5kZWYgQVRJTUUKICN1bmRlZiBNVElNRQorI2VuZGlmIC8qIFB5X1dJTl9XSURFX0ZJTEVOQU1FUyAqLwogfQogCiAKQEAgLTI0NDAsNyArMjY3Niw3IEBACiAJUHlPYmplY3QgKmtleSwgKnZhbCwgKmtleXM9TlVMTCwgKnZhbHM9TlVMTDsKIAlQeV9zc2l6ZV90IGksIHBvcywgYXJnYywgZW52YzsKIAlQeU9iamVjdCAqKCpnZXRpdGVtKShQeU9iamVjdCAqLCBQeV9zc2l6ZV90KTsKLQlpbnQgbGFzdGFyZyA9IDA7CisJUHlfc3NpemVfdCBsYXN0YXJnID0gMDsKIAogCS8qIGV4ZWN2ZSBoYXMgdGhyZWUgYXJndW1lbnRzOiAocGF0aCwgYXJndiwgZW52KSwgd2hlcmUKIAkgICBhcmd2IGlzIGEgbGlzdCBvciB0dXBsZSBvZiBzdHJpbmdzIGFuZCBlbnYgaXMgYSBkaWN0aW9uYXJ5CkBAIC0yNTgxLDcgKzI4MTcsOCBAQAogCWNoYXIgKnBhdGg7CiAJUHlPYmplY3QgKmFyZ3Y7CiAJY2hhciAqKmFyZ3ZsaXN0OwotCWludCBtb2RlLCBpLCBhcmdjOworCWludCBtb2RlLCBpOworCVB5X3NzaXplX3QgYXJnYzsKIAlQeV9pbnRwdHJfdCBzcGF3bnZhbDsKIAlQeU9iamVjdCAqKCpnZXRpdGVtKShQeU9iamVjdCAqLCBQeV9zc2l6ZV90KTsKIApAQCAtMjY3MCwxMCArMjkwNywxMSBAQAogCWNoYXIgKiphcmd2bGlzdDsKIAljaGFyICoqZW52bGlzdDsKIAlQeU9iamVjdCAqa2V5LCAqdmFsLCAqa2V5cz1OVUxMLCAqdmFscz1OVUxMLCAqcmVzPU5VTEw7Ci0JaW50IG1vZGUsIGksIHBvcywgYXJnYywgZW52YzsKKwlpbnQgbW9kZSwgcG9zLCBlbnZjOworCVB5X3NzaXplX3QgYXJnYywgaTsKIAlQeV9pbnRwdHJfdCBzcGF3bnZhbDsKIAlQeU9iamVjdCAqKCpnZXRpdGVtKShQeU9iamVjdCAqLCBQeV9zc2l6ZV90KTsKLQlpbnQgbGFzdGFyZyA9IDA7CisJUHlfc3NpemVfdCBsYXN0YXJnID0gMDsKIAogCS8qIHNwYXdudmUgaGFzIGZvdXIgYXJndW1lbnRzOiAobW9kZSwgcGF0aCwgYXJndiwgZW52KSwgd2hlcmUKIAkgICBhcmd2IGlzIGEgbGlzdCBvciB0dXBsZSBvZiBzdHJpbmdzIGFuZCBlbnYgaXMgYSBkaWN0aW9uYXJ5CkBAIC00Mzc0LDcgKzQ2MTIsNyBAQAogCQkJY2hhciBtb2R1bGVwYXRoW19NQVhfUEFUSF07CiAJCQlzdHJ1Y3Qgc3RhdCBzdGF0aW5mbzsKIAkJCUdldE1vZHVsZUZpbGVOYW1lKE5VTEwsIG1vZHVsZXBhdGgsIHNpemVvZihtb2R1bGVwYXRoKSk7Ci0JCQlmb3IgKGkgPSB4ID0gMDsgbW9kdWxlcGF0aFtpXTsgaSsrKQorCQkJZm9yICh4ID0gaSA9IDA7IG1vZHVsZXBhdGhbaV07IGkrKykKIAkJCQlpZiAobW9kdWxlcGF0aFtpXSA9PSBTRVApCiAJCQkJCXggPSBpKzE7CiAJCQltb2R1bGVwYXRoW3hdID0gJ1wwJzsKQEAgLTQ1NTEsNyArNDc4OSw3IEBACiAJCSBzd2l0Y2ggKG1vZGUgJiAoX09fUkRPTkxZIHwgX09fVEVYVCB8IF9PX0JJTkFSWSB8IF9PX1dST05MWSkpIHsKIAkJIGNhc2UgX09fV1JPTkxZIHwgX09fVEVYVDoKIAkJCSAvKiBDYXNlIGZvciB3cml0aW5nIHRvIGNoaWxkIFN0ZGluIGluIHRleHQgbW9kZS4gKi8KLQkJCSBmZDEgPSBfb3Blbl9vc2ZoYW5kbGUoKGludHB0cl90KWhDaGlsZFN0ZGluV3JEdXAsIG1vZGUpOworCQkJIGZkMSA9IF9vcGVuX29zZmhhbmRsZSgoUHlfaW50cHRyX3QpaENoaWxkU3RkaW5XckR1cCwgbW9kZSk7CiAJCQkgZjEgPSBfZmRvcGVuKGZkMSwgInciKTsKIAkJCSBmID0gUHlGaWxlX0Zyb21GaWxlKGYxLCBjbWRzdHJpbmcsICJ3IiwgX1B5UGNsb3NlKTsKIAkJCSBQeUZpbGVfU2V0QnVmU2l6ZShmLCAwKTsKQEAgLTQ1NjIsNyArNDgwMCw3IEBACiAKIAkJIGNhc2UgX09fUkRPTkxZIHwgX09fVEVYVDoKIAkJCSAvKiBDYXNlIGZvciByZWFkaW5nIGZyb20gY2hpbGQgU3Rkb3V0IGluIHRleHQgbW9kZS4gKi8KLQkJCSBmZDEgPSBfb3Blbl9vc2ZoYW5kbGUoKGludHB0cl90KWhDaGlsZFN0ZG91dFJkRHVwLCBtb2RlKTsKKwkJCSBmZDEgPSBfb3Blbl9vc2ZoYW5kbGUoKFB5X2ludHB0cl90KWhDaGlsZFN0ZG91dFJkRHVwLCBtb2RlKTsKIAkJCSBmMSA9IF9mZG9wZW4oZmQxLCAiciIpOwogCQkJIGYgPSBQeUZpbGVfRnJvbUZpbGUoZjEsIGNtZHN0cmluZywgInIiLCBfUHlQY2xvc2UpOwogCQkJIFB5RmlsZV9TZXRCdWZTaXplKGYsIDApOwpAQCAtNDU3Myw3ICs0ODExLDcgQEAKIAogCQkgY2FzZSBfT19SRE9OTFkgfCBfT19CSU5BUlk6CiAJCQkgLyogQ2FzZSBmb3IgcmVhZGluaWcgZnJvbSBjaGlsZCBTdGRvdXQgaW4gYmluYXJ5IG1vZGUuICovCi0JCQkgZmQxID0gX29wZW5fb3NmaGFuZGxlKChpbnRwdHJfdCloQ2hpbGRTdGRvdXRSZER1cCwgbW9kZSk7CisJCQkgZmQxID0gX29wZW5fb3NmaGFuZGxlKChQeV9pbnRwdHJfdCloQ2hpbGRTdGRvdXRSZER1cCwgbW9kZSk7CiAJCQkgZjEgPSBfZmRvcGVuKGZkMSwgInJiIik7CiAJCQkgZiA9IFB5RmlsZV9Gcm9tRmlsZShmMSwgY21kc3RyaW5nLCAicmIiLCBfUHlQY2xvc2UpOwogCQkJIFB5RmlsZV9TZXRCdWZTaXplKGYsIDApOwpAQCAtNDU4NCw3ICs0ODIyLDcgQEAKIAogCQkgY2FzZSBfT19XUk9OTFkgfCBfT19CSU5BUlk6CiAJCQkgLyogQ2FzZSBmb3Igd3JpdGluZyB0byBjaGlsZCBTdGRpbiBpbiBiaW5hcnkgbW9kZS4gKi8KLQkJCSBmZDEgPSBfb3Blbl9vc2ZoYW5kbGUoKGludHB0cl90KWhDaGlsZFN0ZGluV3JEdXAsIG1vZGUpOworCQkJIGZkMSA9IF9vcGVuX29zZmhhbmRsZSgoUHlfaW50cHRyX3QpaENoaWxkU3RkaW5XckR1cCwgbW9kZSk7CiAJCQkgZjEgPSBfZmRvcGVuKGZkMSwgIndiIik7CiAJCQkgZiA9IFB5RmlsZV9Gcm9tRmlsZShmMSwgY21kc3RyaW5nLCAid2IiLCBfUHlQY2xvc2UpOwogCQkJIFB5RmlsZV9TZXRCdWZTaXplKGYsIDApOwpAQCAtNDYxMCw5ICs0ODQ4LDkgQEAKIAkJCSBtMiA9ICJ3YiI7CiAJCSB9CiAKLQkJIGZkMSA9IF9vcGVuX29zZmhhbmRsZSgoaW50cHRyX3QpaENoaWxkU3RkaW5XckR1cCwgbW9kZSk7CisJCSBmZDEgPSBfb3Blbl9vc2ZoYW5kbGUoKFB5X2ludHB0cl90KWhDaGlsZFN0ZGluV3JEdXAsIG1vZGUpOwogCQkgZjEgPSBfZmRvcGVuKGZkMSwgbTIpOwotCQkgZmQyID0gX29wZW5fb3NmaGFuZGxlKChpbnRwdHJfdCloQ2hpbGRTdGRvdXRSZER1cCwgbW9kZSk7CisJCSBmZDIgPSBfb3Blbl9vc2ZoYW5kbGUoKFB5X2ludHB0cl90KWhDaGlsZFN0ZG91dFJkRHVwLCBtb2RlKTsKIAkJIGYyID0gX2Zkb3BlbihmZDIsIG0xKTsKIAkJIHAxID0gUHlGaWxlX0Zyb21GaWxlKGYxLCBjbWRzdHJpbmcsIG0yLCBfUHlQY2xvc2UpOwogCQkgUHlGaWxlX1NldEJ1ZlNpemUocDEsIDApOwpAQCAtNDY0MiwxMSArNDg4MCwxMSBAQAogCQkJIG0yID0gIndiIjsKIAkJIH0KIAotCQkgZmQxID0gX29wZW5fb3NmaGFuZGxlKChpbnRwdHJfdCloQ2hpbGRTdGRpbldyRHVwLCBtb2RlKTsKKwkJIGZkMSA9IF9vcGVuX29zZmhhbmRsZSgoUHlfaW50cHRyX3QpaENoaWxkU3RkaW5XckR1cCwgbW9kZSk7CiAJCSBmMSA9IF9mZG9wZW4oZmQxLCBtMik7Ci0JCSBmZDIgPSBfb3Blbl9vc2ZoYW5kbGUoKGludHB0cl90KWhDaGlsZFN0ZG91dFJkRHVwLCBtb2RlKTsKKwkJIGZkMiA9IF9vcGVuX29zZmhhbmRsZSgoUHlfaW50cHRyX3QpaENoaWxkU3Rkb3V0UmREdXAsIG1vZGUpOwogCQkgZjIgPSBfZmRvcGVuKGZkMiwgbTEpOwotCQkgZmQzID0gX29wZW5fb3NmaGFuZGxlKChpbnRwdHJfdCloQ2hpbGRTdGRlcnJSZER1cCwgbW9kZSk7CisJCSBmZDMgPSBfb3Blbl9vc2ZoYW5kbGUoKFB5X2ludHB0cl90KWhDaGlsZFN0ZGVyclJkRHVwLCBtb2RlKTsKIAkJIGYzID0gX2Zkb3BlbihmZDMsIG0xKTsKIAkJIHAxID0gUHlGaWxlX0Zyb21GaWxlKGYxLCBjbWRzdHJpbmcsIG0yLCBfUHlQY2xvc2UpOwogCQkgcDIgPSBQeUZpbGVfRnJvbUZpbGUoZjIsIGNtZHN0cmluZywgbTEsIF9QeVBjbG9zZSk7CkBAIC01MjUwLDcgKzU0ODgsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHBvc2l4X3dhaXRwaWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludHB0cl90IHBpZDsKKwlQeV9pbnRwdHJfdCBwaWQ7CiAJaW50IHN0YXR1cywgb3B0aW9uczsKIAogCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6d2FpdHBpZCIsICZwaWQsICZvcHRpb25zKSkKQEAgLTUzMzksNyArNTU3Nyw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcG9zaXhfc3ltbGluayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIHBvc2l4XzJzdHIoYXJncywgImV0ZXQ6c3ltbGluayIsIHN5bWxpbmssIE5VTEwsIE5VTEwpOworCXJldHVybiBwb3NpeF8yc3RyKGFyZ3MsICJldGV0OnN5bWxpbmsiLCBzeW1saW5rKTsKIH0KICNlbmRpZiAvKiBIQVZFX1NZTUxJTksgKi8KIApAQCAtNjI4MCw3ICs2NTE4LDcgQEAKICNlbmRpZiAvKiBIQVZFX1NZU19XQUlUX0ggKi8KIAogCi0jaWYgZGVmaW5lZChIQVZFX0ZTVEFUVkZTKQorI2lmIGRlZmluZWQoSEFWRV9GU1RBVFZGUykgJiYgZGVmaW5lZChIQVZFX1NZU19TVEFUVkZTX0gpCiAjaWZkZWYgX1NDT19EUwogLyogU0NPIE9wZW5TZXJ2ZXIgNS4wIGFuZCBsYXRlciByZXF1aXJlcyBfU1ZJRDMgYmVmb3JlIGl0IHJldmVhbHMgdGhlCiAgICBuZWVkZWQgZGVmaW5pdGlvbnMgaW4gc3lzL3N0YXR2ZnMuaCAqLwpAQCAtNjM0NywxMCArNjU4NSwxMCBAQAogCiAgICAgICAgIHJldHVybiBfcHlzdGF0dmZzX2Zyb21zdHJ1Y3RzdGF0dmZzKHN0KTsKIH0KLSNlbmRpZiAvKiBIQVZFX0ZTVEFUVkZTICovCisjZW5kaWYgLyogSEFWRV9GU1RBVFZGUyAmJiBIQVZFX1NZU19TVEFUVkZTX0ggKi8KIAogCi0jaWYgZGVmaW5lZChIQVZFX1NUQVRWRlMpCisjaWYgZGVmaW5lZChIQVZFX1NUQVRWRlMpICYmIGRlZmluZWQoSEFWRV9TWVNfU1RBVFZGU19IKQogI2luY2x1ZGUgPHN5cy9zdGF0dmZzLmg+CiAKIFB5RG9jX1NUUlZBUihwb3NpeF9zdGF0dmZzX19kb2NfXywKQEAgLTc4ODgsMTAgKzgxMjYsMTAgQEAKICAgICAgICAgeyJXU1RPUFNJRyIsCXBvc2l4X1dTVE9QU0lHLCBNRVRIX1ZBUkFSR1MsIHBvc2l4X1dTVE9QU0lHX19kb2NfX30sCiAjZW5kaWYgLyogV1NUT1BTSUcgKi8KICNlbmRpZiAvKiBIQVZFX1NZU19XQUlUX0ggKi8KLSNpZmRlZiBIQVZFX0ZTVEFUVkZTCisjaWYgZGVmaW5lZChIQVZFX0ZTVEFUVkZTKSAmJiBkZWZpbmVkKEhBVkVfU1lTX1NUQVRWRlNfSCkKIAl7ImZzdGF0dmZzIiwJcG9zaXhfZnN0YXR2ZnMsIE1FVEhfVkFSQVJHUywgcG9zaXhfZnN0YXR2ZnNfX2RvY19ffSwKICNlbmRpZgotI2lmZGVmIEhBVkVfU1RBVFZGUworI2lmIGRlZmluZWQoSEFWRV9TVEFUVkZTKSAmJiBkZWZpbmVkKEhBVkVfU1lTX1NUQVRWRlNfSCkKIAl7InN0YXR2ZnMiLAlwb3NpeF9zdGF0dmZzLCBNRVRIX1ZBUkFSR1MsIHBvc2l4X3N0YXR2ZnNfX2RvY19ffSwKICNlbmRpZgogI2lmZGVmIEhBVkVfVE1QRklMRQpAQCAtODI2NCw2ICs4NTAyLDQ1IEBACiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzdGF0dmZzX3Jlc3VsdCIsCiAJCQkgICAoUHlPYmplY3QqKSAmU3RhdFZGU1Jlc3VsdFR5cGUpOwogCWluaXRpYWxpemVkID0gMTsKKworI2lmZGVmIF9fQVBQTEVfXworCS8qCisJICogU3RlcCAyIG9mIHdlYWstbGlua2luZyBzdXBwb3J0IG9uIE1hYyBPUyBYLgorCSAqCisJICogVGhlIGNvZGUgYmVsb3cgcmVtb3ZlcyBmdW5jdGlvbnMgdGhhdCBhcmUgbm90IGF2YWlsYWJsZSBvbiB0aGUKKwkgKiBjdXJyZW50bHkgYWN0aXZlIHBsYXRmb3JtLiAKKwkgKgorCSAqIFRoaXMgYmxvY2sgYWxsb3cgb25lIHRvIHVzZSBhIHB5dGhvbiBiaW5hcnkgdGhhdCB3YXMgYnVpbGQgb24KKwkgKiBPU1ggMTAuNCBvbiBPU1ggMTAuMywgd2l0aG91dCBsb29zaW5nIGFjY2VzcyB0byBuZXcgQVBJcyBvbiAKKwkgKiBPU1ggMTAuNC4KKwkgKi8KKyNpZmRlZiBIQVZFX0ZTVEFUVkZTCisJaWYgKGZzdGF0dmZzID09IE5VTEwpIHsKKwkJaWYgKFB5T2JqZWN0X0RlbEF0dHJTdHJpbmcobSwgImZzdGF0dmZzIikgPT0gLTEpIHsKKwkJCXJldHVybjsKKwkJfQorCX0KKyNlbmRpZiAvKiBIQVZFX0ZTVEFUVkZTICovCisKKyNpZmRlZiBIQVZFX1NUQVRWRlMKKwlpZiAoc3RhdHZmcyA9PSBOVUxMKSB7CisJCWlmIChQeU9iamVjdF9EZWxBdHRyU3RyaW5nKG0sICJzdGF0dmZzIikgPT0gLTEpIHsKKwkJCXJldHVybjsKKwkJfQorCX0KKyNlbmRpZiAvKiBIQVZFX1NUQVRWRlMgKi8KKworIyBpZmRlZiBIQVZFX0xDSE9XTgorCWlmIChsY2hvd24gPT0gTlVMTCkgeworCQlpZiAoUHlPYmplY3RfRGVsQXR0clN0cmluZyhtLCAibGNob3duIikgPT0gLTEpIHsKKwkJCXJldHVybjsKKwkJfQorCX0KKyNlbmRpZiAvKiBIQVZFX0xDSE9XTiAqLworCisKKyNlbmRpZiAvKiBfX0FQUExFX18gKi8KKwogfQogCiAjaWZkZWYgX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL01vZHVsZXMvcm90YXRpbmd0cmVlLmggYi9Nb2R1bGVzL3JvdGF0aW5ndHJlZS5oCmluZGV4IDk3Y2M4ZTguLjNhYTA5ODYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvcm90YXRpbmd0cmVlLmgKKysrIGIvTW9kdWxlcy9yb3RhdGluZ3RyZWUuaApAQCAtNCw3ICs0LDcgQEAKICAqCiAgKiBJdCdzIGEgZGljdC1saWtlIGRhdGEgc3RydWN0dXJlIHRoYXQgd29ya3MgYmVzdCB3aGVuIGFjY2Vzc2VzIGFyZSBub3QKICAqIHJhbmRvbSwgYnV0IGZvbGxvdyBhIHN0cm9uZyBwYXR0ZXJuLiAgVGhlIG9uZSBpbXBsZW1lbnRlZCBoZXJlIGlzIGZvcgotICogYWNjZXNzZXMgcGF0dGVybnMgd2hlcmUgdGhlIHNhbWUgc21hbGwgc2V0IG9mIGtleXMgaXMgbG9va2VkIHVwIG92ZXIKKyAqIGFjY2VzcyBwYXR0ZXJucyB3aGVyZSB0aGUgc2FtZSBzbWFsbCBzZXQgb2Yga2V5cyBpcyBsb29rZWQgdXAgb3ZlcgogICogYW5kIG92ZXIgYWdhaW4sIGFuZCB0aGlzIHNldCBvZiBrZXlzIGV2b2x2ZXMgc2xvd2x5IG92ZXIgdGltZS4KICAqLwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3NlbGVjdG1vZHVsZS5jIGIvTW9kdWxlcy9zZWxlY3Rtb2R1bGUuYwppbmRleCBjOWQ0MDNhLi40YTA0YWYxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3NlbGVjdG1vZHVsZS5jCisrKyBiL01vZHVsZXMvc2VsZWN0bW9kdWxlLmMKQEAgLTgsNiArOCwxMyBAQAogCiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAKKyNpZmRlZiBfX0FQUExFX18KKyAgICAvKiBQZXJmb3JtIHJ1bnRpbWUgdGVzdGluZyBmb3IgYSBicm9rZW4gcG9sbCBvbiBPU1ggdG8gbWFrZSBpdCBlYXNpZXIKKyAgICAgKiB0byB1c2UgdGhlIHNhbWUgYmluYXJ5IG9uIG11bHRpcGxlIHJlbGVhc2VzIG9mIHRoZSBPUy4KKyAgICAgKi8KKyN1bmRlZiBIQVZFX0JST0tFTl9QT0xMCisjZW5kaWYKKwogLyogV2luZG93cyAjZGVmaW5lcyBGRF9TRVRTSVpFIHRvIDY0IGlmIEZEX1NFVFNJWkUgaXNuJ3QgYWxyZWFkeSBkZWZpbmVkLgogICAgNjQgaXMgdG9vIHNtYWxsICh0b28gbWFueSBwZW9wbGUgaGF2ZSBidW1wZWQgaW50byB0aGF0IGxpbWl0KS4KICAgIEhlcmUgd2UgYm9vc3QgaXQuCkBAIC02MTgsNyArNjI1LDM4IEBACiAJCXJldHVybiBOVUxMOwogCXJldHVybiAoUHlPYmplY3QgKilydjsKIH0KLSNlbmRpZiAvKiBIQVZFX1BPTEwgJiYgIUhBVkVfQlJPS0VOX1BPTEwgKi8KKworI2lmZGVmIF9fQVBQTEVfXworLyogCisgKiBPbiBzb21lIHN5c3RlbXMgcG9sbCgpIHNldHMgZXJybm8gb24gaW52YWxpZCBmaWxlIGRlc2NyaXB0b3JzLiBXZSB0ZXN0CisgKiBmb3IgdGhpcyBhdCBydW50aW1lIGJlY2F1c2UgdGhpcyBidWcgbWF5IGJlIGZpeGVkIG9yIGludHJvZHVjZWQgYmV0d2VlbgorICogT1MgcmVsZWFzZXMuCisgKi8KK3N0YXRpYyBpbnQgc2VsZWN0X2hhdmVfYnJva2VuX3BvbGwodm9pZCkKK3sKKwlpbnQgcG9sbF90ZXN0OworCWludCBmaWxlZGVzWzJdOworCisJc3RydWN0IHBvbGxmZCBwb2xsX3N0cnVjdCA9IHsgMCwgUE9MTElOfFBPTExQUkl8UE9MTE9VVCwgMCB9OworCisJLyogQ3JlYXRlIGEgZmlsZSBkZXNjcmlwdG9yIHRvIG1ha2UgaW52YWxpZCAqLworCWlmIChwaXBlKGZpbGVkZXMpIDwgMCkgeworCQlyZXR1cm4gMTsKKwl9CisJcG9sbF9zdHJ1Y3QuZmQgPSBmaWxlZGVzWzBdOworCWNsb3NlKGZpbGVkZXNbMF0pOworCWNsb3NlKGZpbGVkZXNbMV0pOworCXBvbGxfdGVzdCA9IHBvbGwoJnBvbGxfc3RydWN0LCAxLCAwKTsKKwlpZiAocG9sbF90ZXN0IDwgMCkgeworCQlyZXR1cm4gMTsKKwl9IGVsc2UgaWYgKHBvbGxfdGVzdCA9PSAwICYmIHBvbGxfc3RydWN0LnJldmVudHMgIT0gUE9MTE5WQUwpIHsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmIC8qIF9fQVBQTEVfXyAqLworCisjZW5kaWYgLyogSEFWRV9QT0xMICovCiAKIFB5RG9jX1NUUlZBUihzZWxlY3RfZG9jLAogInNlbGVjdChybGlzdCwgd2xpc3QsIHhsaXN0WywgdGltZW91dF0pIC0+IChybGlzdCwgd2xpc3QsIHhsaXN0KVxuXApAQCAtNjQ1LDkgKzY4Myw5IEBACiAKIHN0YXRpYyBQeU1ldGhvZERlZiBzZWxlY3RfbWV0aG9kc1tdID0gewogICAgIHsic2VsZWN0IiwJc2VsZWN0X3NlbGVjdCwgTUVUSF9WQVJBUkdTLCBzZWxlY3RfZG9jfSwKLSNpZiBkZWZpbmVkKEhBVkVfUE9MTCkgJiYgIWRlZmluZWQoSEFWRV9CUk9LRU5fUE9MTCkKKyNpZiBkZWZpbmVkKEhBVkVfUE9MTCkgCiAgICAgeyJwb2xsIiwgICAgc2VsZWN0X3BvbGwsICAgTUVUSF9WQVJBUkdTLCBwb2xsX2RvY30sCi0jZW5kaWYgLyogSEFWRV9QT0xMICYmICFIQVZFX0JST0tFTl9QT0xMICovCisjZW5kaWYgLyogSEFWRV9QT0xMICovCiAgICAgezAsICAJMH0sCQkJICAgICAvKiBzZW50aW5lbCAqLwogfTsKIApAQCAtNjY4LDI5ICs3MDYsNDAgQEAKIAlTZWxlY3RFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigic2VsZWN0LmVycm9yIiwgTlVMTCwgTlVMTCk7CiAJUHlfSU5DUkVGKFNlbGVjdEVycm9yKTsKIAlQeU1vZHVsZV9BZGRPYmplY3QobSwgImVycm9yIiwgU2VsZWN0RXJyb3IpOwotI2lmIGRlZmluZWQoSEFWRV9QT0xMKSAmJiAhZGVmaW5lZChIQVZFX0JST0tFTl9QT0xMKQotCXBvbGxfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMSU4iLCBQT0xMSU4pOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMUFJJIiwgUE9MTFBSSSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExPVVQiLCBQT0xMT1VUKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTEVSUiIsIFBPTExFUlIpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMSFVQIiwgUE9MTEhVUCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExOVkFMIiwgUE9MTE5WQUwpOworI2lmIGRlZmluZWQoSEFWRV9QT0xMKSAKKworI2lmZGVmIF9fQVBQTEVfXworCWlmIChzZWxlY3RfaGF2ZV9icm9rZW5fcG9sbCgpKSB7CisJCWlmIChQeU9iamVjdF9EZWxBdHRyU3RyaW5nKG0sICJwb2xsIikgPT0gLTEpIHsKKwkJCVB5RXJyX0NsZWFyKCk7CisJCX0KKwl9IGVsc2UgeworI2Vsc2UKKwl7CisjZW5kaWYKKwkJcG9sbF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisJCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMSU4iLCBQT0xMSU4pOworCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTFBSSSIsIFBPTExQUkkpOworCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTE9VVCIsIFBPTExPVVQpOworCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTEVSUiIsIFBPTExFUlIpOworCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTEhVUCIsIFBPTExIVVApOworCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTE5WQUwiLCBQT0xMTlZBTCk7CiAKICNpZmRlZiBQT0xMUkROT1JNCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExSRE5PUk0iLCBQT0xMUkROT1JNKTsKKwkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExSRE5PUk0iLCBQT0xMUkROT1JNKTsKICNlbmRpZgogI2lmZGVmIFBPTExSREJBTkQKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTFJEQkFORCIsIFBPTExSREJBTkQpOworCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTFJEQkFORCIsIFBPTExSREJBTkQpOwogI2VuZGlmCiAjaWZkZWYgUE9MTFdSTk9STQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMV1JOT1JNIiwgUE9MTFdSTk9STSk7CisJCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMV1JOT1JNIiwgUE9MTFdSTk9STSk7CiAjZW5kaWYKICNpZmRlZiBQT0xMV1JCQU5ECi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExXUkJBTkQiLCBQT0xMV1JCQU5EKTsKKwkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBPTExXUkJBTkQiLCBQT0xMV1JCQU5EKTsKICNlbmRpZgogI2lmZGVmIFBPTExNU0cKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTE1TRyIsIFBPTExNU0cpOworCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTE1TRyIsIFBPTExNU0cpOwogI2VuZGlmCi0jZW5kaWYgLyogSEFWRV9QT0xMICYmICFIQVZFX0JST0tFTl9QT0xMICovCisJfQorI2VuZGlmIC8qIEhBVkVfUE9MTCAqLwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zaGE1MTJtb2R1bGUuYyBiL01vZHVsZXMvc2hhNTEybW9kdWxlLmMKaW5kZXggNTM5MjA0ZS4uYzVhODVmZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zaGE1MTJtb2R1bGUuYworKysgYi9Nb2R1bGVzL3NoYTUxMm1vZHVsZS5jCkBAIC0xMjEsMTIgKzEyMSwxMiBAQAogCiAvKiBWYXJpb3VzIGxvZ2ljYWwgZnVuY3Rpb25zICovCiAjZGVmaW5lIFJPUjY0KHgsIHkpIFwKLSAgICAoICgoKCh4KSAmIDB4RkZGRkZGRkZGRkZGRkZGRlVMTCk+PigodW5zaWduZWQgUFlfTE9OR19MT05HKSh5KSAmIDYzKSkgfCBcCi0gICAgICAoKHgpPDwoKHVuc2lnbmVkIFBZX0xPTkdfTE9ORykoNjQtKCh5KSAmIDYzKSkpKSkgJiAweEZGRkZGRkZGRkZGRkZGRkZVTEwpCisgICAgKCAoKCgoeCkgJiBQeV9VTEwoMHhGRkZGRkZGRkZGRkZGRkZGKSk+PigodW5zaWduZWQgUFlfTE9OR19MT05HKSh5KSAmIDYzKSkgfCBcCisgICAgICAoKHgpPDwoKHVuc2lnbmVkIFBZX0xPTkdfTE9ORykoNjQtKCh5KSAmIDYzKSkpKSkgJiBQeV9VTEwoMHhGRkZGRkZGRkZGRkZGRkZGKSkKICNkZWZpbmUgQ2goeCx5LHopICAgICAgICh6IF4gKHggJiAoeSBeIHopKSkKICNkZWZpbmUgTWFqKHgseSx6KSAgICAgICgoKHggfCB5KSAmIHopIHwgKHggJiB5KSkgCiAjZGVmaW5lIFMoeCwgbikgICAgICAgICBST1I2NCgoeCksKG4pKQotI2RlZmluZSBSKHgsIG4pICAgICAgICAgKCgoeCkgJiAweEZGRkZGRkZGRkZGRkZGRkZVTEwpID4+ICgodW5zaWduZWQgUFlfTE9OR19MT05HKW4pKQorI2RlZmluZSBSKHgsIG4pICAgICAgICAgKCgoeCkgJiBQeV9VTEwoMHhGRkZGRkZGRkZGRkZGRkZGKSkgPj4gKCh1bnNpZ25lZCBQWV9MT05HX0xPTkcpbikpCiAjZGVmaW5lIFNpZ21hMCh4KSAgICAgICAoUyh4LCAyOCkgXiBTKHgsIDM0KSBeIFMoeCwgMzkpKQogI2RlZmluZSBTaWdtYTEoeCkgICAgICAgKFMoeCwgMTQpIF4gUyh4LCAxOCkgXiBTKHgsIDQxKSkKICNkZWZpbmUgR2FtbWEwKHgpICAgICAgIChTKHgsIDEpIF4gUyh4LCA4KSBeIFIoeCwgNykpCkBAIC0xNTYsODYgKzE1Niw4NiBAQAogICAgICBkICs9IHQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIGggID0gdDAgKyB0MTsKIAotICAgIFJORChTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sMCwweDQyOGEyZjk4ZDcyOGFlMjJVTEwpOwotICAgIFJORChTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sMSwweDcxMzc0NDkxMjNlZjY1Y2RVTEwpOwotICAgIFJORChTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sMiwweGI1YzBmYmNmZWM0ZDNiMmZVTEwpOwotICAgIFJORChTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sMywweGU5YjVkYmE1ODE4OWRiYmNVTEwpOwotICAgIFJORChTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sNCwweDM5NTZjMjViZjM0OGI1MzhVTEwpOwotICAgIFJORChTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sNSwweDU5ZjExMWYxYjYwNWQwMTlVTEwpOwotICAgIFJORChTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sNiwweDkyM2Y4MmE0YWYxOTRmOWJVTEwpOwotICAgIFJORChTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sNywweGFiMWM1ZWQ1ZGE2ZDgxMThVTEwpOwotICAgIFJORChTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sOCwweGQ4MDdhYTk4YTMwMzAyNDJVTEwpOwotICAgIFJORChTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sOSwweDEyODM1YjAxNDU3MDZmYmVVTEwpOwotICAgIFJORChTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sMTAsMHgyNDMxODViZTRlZTRiMjhjVUxMKTsKLSAgICBSTkQoU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLDExLDB4NTUwYzdkYzNkNWZmYjRlMlVMTCk7Ci0gICAgUk5EKFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSwxMiwweDcyYmU1ZDc0ZjI3Yjg5NmZVTEwpOwotICAgIFJORChTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sMTMsMHg4MGRlYjFmZTNiMTY5NmIxVUxMKTsKLSAgICBSTkQoU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLDE0LDB4OWJkYzA2YTcyNWM3MTIzNVVMTCk7Ci0gICAgUk5EKFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSwxNSwweGMxOWJmMTc0Y2Y2OTI2OTRVTEwpOwotICAgIFJORChTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sMTYsMHhlNDliNjljMTllZjE0YWQyVUxMKTsKLSAgICBSTkQoU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLDE3LDB4ZWZiZTQ3ODYzODRmMjVlM1VMTCk7Ci0gICAgUk5EKFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSwxOCwweDBmYzE5ZGM2OGI4Y2Q1YjVVTEwpOwotICAgIFJORChTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sMTksMHgyNDBjYTFjYzc3YWM5YzY1VUxMKTsKLSAgICBSTkQoU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLDIwLDB4MmRlOTJjNmY1OTJiMDI3NVVMTCk7Ci0gICAgUk5EKFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSwyMSwweDRhNzQ4NGFhNmVhNmU0ODNVTEwpOwotICAgIFJORChTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sMjIsMHg1Y2IwYTlkY2JkNDFmYmQ0VUxMKTsKLSAgICBSTkQoU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLDIzLDB4NzZmOTg4ZGE4MzExNTNiNVVMTCk7Ci0gICAgUk5EKFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSwyNCwweDk4M2U1MTUyZWU2NmRmYWJVTEwpOwotICAgIFJORChTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sMjUsMHhhODMxYzY2ZDJkYjQzMjEwVUxMKTsKLSAgICBSTkQoU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLDI2LDB4YjAwMzI3Yzg5OGZiMjEzZlVMTCk7Ci0gICAgUk5EKFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSwyNywweGJmNTk3ZmM3YmVlZjBlZTRVTEwpOwotICAgIFJORChTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sMjgsMHhjNmUwMGJmMzNkYTg4ZmMyVUxMKTsKLSAgICBSTkQoU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLDI5LDB4ZDVhNzkxNDc5MzBhYTcyNVVMTCk7Ci0gICAgUk5EKFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSwzMCwweDA2Y2E2MzUxZTAwMzgyNmZVTEwpOwotICAgIFJORChTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sMzEsMHgxNDI5Mjk2NzBhMGU2ZTcwVUxMKTsKLSAgICBSTkQoU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLDMyLDB4MjdiNzBhODU0NmQyMmZmY1VMTCk7Ci0gICAgUk5EKFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSwzMywweDJlMWIyMTM4NWMyNmM5MjZVTEwpOwotICAgIFJORChTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sMzQsMHg0ZDJjNmRmYzVhYzQyYWVkVUxMKTsKLSAgICBSTkQoU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLDM1LDB4NTMzODBkMTM5ZDk1YjNkZlVMTCk7Ci0gICAgUk5EKFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSwzNiwweDY1MGE3MzU0OGJhZjYzZGVVTEwpOwotICAgIFJORChTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sMzcsMHg3NjZhMGFiYjNjNzdiMmE4VUxMKTsKLSAgICBSTkQoU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLDM4LDB4ODFjMmM5MmU0N2VkYWVlNlVMTCk7Ci0gICAgUk5EKFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSwzOSwweDkyNzIyYzg1MTQ4MjM1M2JVTEwpOwotICAgIFJORChTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sNDAsMHhhMmJmZThhMTRjZjEwMzY0VUxMKTsKLSAgICBSTkQoU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLDQxLDB4YTgxYTY2NGJiYzQyMzAwMVVMTCk7Ci0gICAgUk5EKFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSw0MiwweGMyNGI4YjcwZDBmODk3OTFVTEwpOwotICAgIFJORChTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sNDMsMHhjNzZjNTFhMzA2NTRiZTMwVUxMKTsKLSAgICBSTkQoU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLDQ0LDB4ZDE5MmU4MTlkNmVmNTIxOFVMTCk7Ci0gICAgUk5EKFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSw0NSwweGQ2OTkwNjI0NTU2NWE5MTBVTEwpOwotICAgIFJORChTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sNDYsMHhmNDBlMzU4NTU3NzEyMDJhVUxMKTsKLSAgICBSTkQoU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLDQ3LDB4MTA2YWEwNzAzMmJiZDFiOFVMTCk7Ci0gICAgUk5EKFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSw0OCwweDE5YTRjMTE2YjhkMmQwYzhVTEwpOwotICAgIFJORChTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sNDksMHgxZTM3NmMwODUxNDFhYjUzVUxMKTsKLSAgICBSTkQoU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLDUwLDB4Mjc0ODc3NGNkZjhlZWI5OVVMTCk7Ci0gICAgUk5EKFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSw1MSwweDM0YjBiY2I1ZTE5YjQ4YThVTEwpOwotICAgIFJORChTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sNTIsMHgzOTFjMGNiM2M1Yzk1YTYzVUxMKTsKLSAgICBSTkQoU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLDUzLDB4NGVkOGFhNGFlMzQxOGFjYlVMTCk7Ci0gICAgUk5EKFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSw1NCwweDViOWNjYTRmNzc2M2UzNzNVTEwpOwotICAgIFJORChTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sNTUsMHg2ODJlNmZmM2Q2YjJiOGEzVUxMKTsKLSAgICBSTkQoU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLDU2LDB4NzQ4ZjgyZWU1ZGVmYjJmY1VMTCk7Ci0gICAgUk5EKFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSw1NywweDc4YTU2MzZmNDMxNzJmNjBVTEwpOwotICAgIFJORChTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sNTgsMHg4NGM4NzgxNGExZjBhYjcyVUxMKTsKLSAgICBSTkQoU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLDU5LDB4OGNjNzAyMDgxYTY0MzllY1VMTCk7Ci0gICAgUk5EKFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSw2MCwweDkwYmVmZmZhMjM2MzFlMjhVTEwpOwotICAgIFJORChTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sNjEsMHhhNDUwNmNlYmRlODJiZGU5VUxMKTsKLSAgICBSTkQoU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLDYyLDB4YmVmOWEzZjdiMmM2NzkxNVVMTCk7Ci0gICAgUk5EKFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSw2MywweGM2NzE3OGYyZTM3MjUzMmJVTEwpOwotICAgIFJORChTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sNjQsMHhjYTI3M2VjZWVhMjY2MTljVUxMKTsKLSAgICBSTkQoU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLDY1LDB4ZDE4NmI4YzcyMWMwYzIwN1VMTCk7Ci0gICAgUk5EKFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSw2NiwweGVhZGE3ZGQ2Y2RlMGViMWVVTEwpOwotICAgIFJORChTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sNjcsMHhmNTdkNGY3ZmVlNmVkMTc4VUxMKTsKLSAgICBSTkQoU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLDY4LDB4MDZmMDY3YWE3MjE3NmZiYVVMTCk7Ci0gICAgUk5EKFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSw2OSwweDBhNjM3ZGM1YTJjODk4YTZVTEwpOwotICAgIFJORChTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sNzAsMHgxMTNmOTgwNGJlZjkwZGFlVUxMKTsKLSAgICBSTkQoU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLDcxLDB4MWI3MTBiMzUxMzFjNDcxYlVMTCk7Ci0gICAgUk5EKFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSw3MiwweDI4ZGI3N2Y1MjMwNDdkODRVTEwpOwotICAgIFJORChTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sNzMsMHgzMmNhYWI3YjQwYzcyNDkzVUxMKTsKLSAgICBSTkQoU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLDc0LDB4M2M5ZWJlMGExNWM5YmViY1VMTCk7Ci0gICAgUk5EKFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSw3NSwweDQzMWQ2N2M0OWMxMDBkNGNVTEwpOwotICAgIFJORChTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sNzYsMHg0Y2M1ZDRiZWNiM2U0MmI2VUxMKTsKLSAgICBSTkQoU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLDc3LDB4NTk3ZjI5OWNmYzY1N2UyYVVMTCk7Ci0gICAgUk5EKFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSw3OCwweDVmY2I2ZmFiM2FkNmZhZWNVTEwpOwotICAgIFJORChTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sNzksMHg2YzQ0MTk4YzRhNDc1ODE3VUxMKTsKKyAgICBSTkQoU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLDAsUHlfVUxMKDB4NDI4YTJmOThkNzI4YWUyMikpOworICAgIFJORChTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sMSxQeV9VTEwoMHg3MTM3NDQ5MTIzZWY2NWNkKSk7CisgICAgUk5EKFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSwyLFB5X1VMTCgweGI1YzBmYmNmZWM0ZDNiMmYpKTsKKyAgICBSTkQoU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLDMsUHlfVUxMKDB4ZTliNWRiYTU4MTg5ZGJiYykpOworICAgIFJORChTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sNCxQeV9VTEwoMHgzOTU2YzI1YmYzNDhiNTM4KSk7CisgICAgUk5EKFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSw1LFB5X1VMTCgweDU5ZjExMWYxYjYwNWQwMTkpKTsKKyAgICBSTkQoU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLDYsUHlfVUxMKDB4OTIzZjgyYTRhZjE5NGY5YikpOworICAgIFJORChTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sNyxQeV9VTEwoMHhhYjFjNWVkNWRhNmQ4MTE4KSk7CisgICAgUk5EKFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSw4LFB5X1VMTCgweGQ4MDdhYTk4YTMwMzAyNDIpKTsKKyAgICBSTkQoU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLDksUHlfVUxMKDB4MTI4MzViMDE0NTcwNmZiZSkpOworICAgIFJORChTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sMTAsUHlfVUxMKDB4MjQzMTg1YmU0ZWU0YjI4YykpOworICAgIFJORChTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sMTEsUHlfVUxMKDB4NTUwYzdkYzNkNWZmYjRlMikpOworICAgIFJORChTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sMTIsUHlfVUxMKDB4NzJiZTVkNzRmMjdiODk2ZikpOworICAgIFJORChTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sMTMsUHlfVUxMKDB4ODBkZWIxZmUzYjE2OTZiMSkpOworICAgIFJORChTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sMTQsUHlfVUxMKDB4OWJkYzA2YTcyNWM3MTIzNSkpOworICAgIFJORChTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sMTUsUHlfVUxMKDB4YzE5YmYxNzRjZjY5MjY5NCkpOworICAgIFJORChTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sMTYsUHlfVUxMKDB4ZTQ5YjY5YzE5ZWYxNGFkMikpOworICAgIFJORChTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sMTcsUHlfVUxMKDB4ZWZiZTQ3ODYzODRmMjVlMykpOworICAgIFJORChTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sMTgsUHlfVUxMKDB4MGZjMTlkYzY4YjhjZDViNSkpOworICAgIFJORChTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sMTksUHlfVUxMKDB4MjQwY2ExY2M3N2FjOWM2NSkpOworICAgIFJORChTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sMjAsUHlfVUxMKDB4MmRlOTJjNmY1OTJiMDI3NSkpOworICAgIFJORChTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sMjEsUHlfVUxMKDB4NGE3NDg0YWE2ZWE2ZTQ4MykpOworICAgIFJORChTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sMjIsUHlfVUxMKDB4NWNiMGE5ZGNiZDQxZmJkNCkpOworICAgIFJORChTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sMjMsUHlfVUxMKDB4NzZmOTg4ZGE4MzExNTNiNSkpOworICAgIFJORChTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sMjQsUHlfVUxMKDB4OTgzZTUxNTJlZTY2ZGZhYikpOworICAgIFJORChTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sMjUsUHlfVUxMKDB4YTgzMWM2NmQyZGI0MzIxMCkpOworICAgIFJORChTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sMjYsUHlfVUxMKDB4YjAwMzI3Yzg5OGZiMjEzZikpOworICAgIFJORChTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sMjcsUHlfVUxMKDB4YmY1OTdmYzdiZWVmMGVlNCkpOworICAgIFJORChTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sMjgsUHlfVUxMKDB4YzZlMDBiZjMzZGE4OGZjMikpOworICAgIFJORChTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sMjksUHlfVUxMKDB4ZDVhNzkxNDc5MzBhYTcyNSkpOworICAgIFJORChTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sMzAsUHlfVUxMKDB4MDZjYTYzNTFlMDAzODI2ZikpOworICAgIFJORChTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sMzEsUHlfVUxMKDB4MTQyOTI5NjcwYTBlNmU3MCkpOworICAgIFJORChTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sMzIsUHlfVUxMKDB4MjdiNzBhODU0NmQyMmZmYykpOworICAgIFJORChTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sMzMsUHlfVUxMKDB4MmUxYjIxMzg1YzI2YzkyNikpOworICAgIFJORChTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sMzQsUHlfVUxMKDB4NGQyYzZkZmM1YWM0MmFlZCkpOworICAgIFJORChTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sMzUsUHlfVUxMKDB4NTMzODBkMTM5ZDk1YjNkZikpOworICAgIFJORChTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sMzYsUHlfVUxMKDB4NjUwYTczNTQ4YmFmNjNkZSkpOworICAgIFJORChTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sMzcsUHlfVUxMKDB4NzY2YTBhYmIzYzc3YjJhOCkpOworICAgIFJORChTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sMzgsUHlfVUxMKDB4ODFjMmM5MmU0N2VkYWVlNikpOworICAgIFJORChTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sMzksUHlfVUxMKDB4OTI3MjJjODUxNDgyMzUzYikpOworICAgIFJORChTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sNDAsUHlfVUxMKDB4YTJiZmU4YTE0Y2YxMDM2NCkpOworICAgIFJORChTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sNDEsUHlfVUxMKDB4YTgxYTY2NGJiYzQyMzAwMSkpOworICAgIFJORChTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sNDIsUHlfVUxMKDB4YzI0YjhiNzBkMGY4OTc5MSkpOworICAgIFJORChTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sNDMsUHlfVUxMKDB4Yzc2YzUxYTMwNjU0YmUzMCkpOworICAgIFJORChTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sNDQsUHlfVUxMKDB4ZDE5MmU4MTlkNmVmNTIxOCkpOworICAgIFJORChTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sNDUsUHlfVUxMKDB4ZDY5OTA2MjQ1NTY1YTkxMCkpOworICAgIFJORChTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sNDYsUHlfVUxMKDB4ZjQwZTM1ODU1NzcxMjAyYSkpOworICAgIFJORChTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sNDcsUHlfVUxMKDB4MTA2YWEwNzAzMmJiZDFiOCkpOworICAgIFJORChTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sNDgsUHlfVUxMKDB4MTlhNGMxMTZiOGQyZDBjOCkpOworICAgIFJORChTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sNDksUHlfVUxMKDB4MWUzNzZjMDg1MTQxYWI1MykpOworICAgIFJORChTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sNTAsUHlfVUxMKDB4Mjc0ODc3NGNkZjhlZWI5OSkpOworICAgIFJORChTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sNTEsUHlfVUxMKDB4MzRiMGJjYjVlMTliNDhhOCkpOworICAgIFJORChTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sNTIsUHlfVUxMKDB4MzkxYzBjYjNjNWM5NWE2MykpOworICAgIFJORChTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sNTMsUHlfVUxMKDB4NGVkOGFhNGFlMzQxOGFjYikpOworICAgIFJORChTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sNTQsUHlfVUxMKDB4NWI5Y2NhNGY3NzYzZTM3MykpOworICAgIFJORChTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sNTUsUHlfVUxMKDB4NjgyZTZmZjNkNmIyYjhhMykpOworICAgIFJORChTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sNTYsUHlfVUxMKDB4NzQ4ZjgyZWU1ZGVmYjJmYykpOworICAgIFJORChTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sNTcsUHlfVUxMKDB4NzhhNTYzNmY0MzE3MmY2MCkpOworICAgIFJORChTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sNTgsUHlfVUxMKDB4ODRjODc4MTRhMWYwYWI3MikpOworICAgIFJORChTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sNTksUHlfVUxMKDB4OGNjNzAyMDgxYTY0MzllYykpOworICAgIFJORChTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sNjAsUHlfVUxMKDB4OTBiZWZmZmEyMzYzMWUyOCkpOworICAgIFJORChTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sNjEsUHlfVUxMKDB4YTQ1MDZjZWJkZTgyYmRlOSkpOworICAgIFJORChTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sNjIsUHlfVUxMKDB4YmVmOWEzZjdiMmM2NzkxNSkpOworICAgIFJORChTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sNjMsUHlfVUxMKDB4YzY3MTc4ZjJlMzcyNTMyYikpOworICAgIFJORChTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sNjQsUHlfVUxMKDB4Y2EyNzNlY2VlYTI2NjE5YykpOworICAgIFJORChTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sNjUsUHlfVUxMKDB4ZDE4NmI4YzcyMWMwYzIwNykpOworICAgIFJORChTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sNjYsUHlfVUxMKDB4ZWFkYTdkZDZjZGUwZWIxZSkpOworICAgIFJORChTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sNjcsUHlfVUxMKDB4ZjU3ZDRmN2ZlZTZlZDE3OCkpOworICAgIFJORChTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sNjgsUHlfVUxMKDB4MDZmMDY3YWE3MjE3NmZiYSkpOworICAgIFJORChTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sNjksUHlfVUxMKDB4MGE2MzdkYzVhMmM4OThhNikpOworICAgIFJORChTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sNzAsUHlfVUxMKDB4MTEzZjk4MDRiZWY5MGRhZSkpOworICAgIFJORChTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sNzEsUHlfVUxMKDB4MWI3MTBiMzUxMzFjNDcxYikpOworICAgIFJORChTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sNzIsUHlfVUxMKDB4MjhkYjc3ZjUyMzA0N2Q4NCkpOworICAgIFJORChTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sNzMsUHlfVUxMKDB4MzJjYWFiN2I0MGM3MjQ5MykpOworICAgIFJORChTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sNzQsUHlfVUxMKDB4M2M5ZWJlMGExNWM5YmViYykpOworICAgIFJORChTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sNzUsUHlfVUxMKDB4NDMxZDY3YzQ5YzEwMGQ0YykpOworICAgIFJORChTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSxTWzJdLFNbM10sNzYsUHlfVUxMKDB4NGNjNWQ0YmVjYjNlNDJiNikpOworICAgIFJORChTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1swXSxTWzFdLFNbMl0sNzcsUHlfVUxMKDB4NTk3ZjI5OWNmYzY1N2UyYSkpOworICAgIFJORChTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sNzgsUHlfVUxMKDB4NWZjYjZmYWIzYWQ2ZmFlYykpOworICAgIFJORChTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sNzksUHlfVUxMKDB4NmM0NDE5OGM0YTQ3NTgxNykpOwogCiAjdW5kZWYgUk5EICAgICAKICAgICAKQEAgLTI1NCwxNCArMjU0LDE0IEBACiBzaGE1MTJfaW5pdChTSEFvYmplY3QgKnNoYV9pbmZvKQogewogICAgIFRlc3RFbmRpYW5uZXNzKHNoYV9pbmZvLT5FbmRpYW5uZXNzKQotICAgIHNoYV9pbmZvLT5kaWdlc3RbMF0gPSAweDZhMDllNjY3ZjNiY2M5MDhVTEw7Ci0gICAgc2hhX2luZm8tPmRpZ2VzdFsxXSA9IDB4YmI2N2FlODU4NGNhYTczYlVMTDsKLSAgICBzaGFfaW5mby0+ZGlnZXN0WzJdID0gMHgzYzZlZjM3MmZlOTRmODJiVUxMOwotICAgIHNoYV9pbmZvLT5kaWdlc3RbM10gPSAweGE1NGZmNTNhNWYxZDM2ZjFVTEw7Ci0gICAgc2hhX2luZm8tPmRpZ2VzdFs0XSA9IDB4NTEwZTUyN2ZhZGU2ODJkMVVMTDsKLSAgICBzaGFfaW5mby0+ZGlnZXN0WzVdID0gMHg5YjA1Njg4YzJiM2U2YzFmVUxMOwotICAgIHNoYV9pbmZvLT5kaWdlc3RbNl0gPSAweDFmODNkOWFiZmI0MWJkNmJVTEw7Ci0gICAgc2hhX2luZm8tPmRpZ2VzdFs3XSA9IDB4NWJlMGNkMTkxMzdlMjE3OVVMTDsKKyAgICBzaGFfaW5mby0+ZGlnZXN0WzBdID0gUHlfVUxMKDB4NmEwOWU2NjdmM2JjYzkwOCk7CisgICAgc2hhX2luZm8tPmRpZ2VzdFsxXSA9IFB5X1VMTCgweGJiNjdhZTg1ODRjYWE3M2IpOworICAgIHNoYV9pbmZvLT5kaWdlc3RbMl0gPSBQeV9VTEwoMHgzYzZlZjM3MmZlOTRmODJiKTsKKyAgICBzaGFfaW5mby0+ZGlnZXN0WzNdID0gUHlfVUxMKDB4YTU0ZmY1M2E1ZjFkMzZmMSk7CisgICAgc2hhX2luZm8tPmRpZ2VzdFs0XSA9IFB5X1VMTCgweDUxMGU1MjdmYWRlNjgyZDEpOworICAgIHNoYV9pbmZvLT5kaWdlc3RbNV0gPSBQeV9VTEwoMHg5YjA1Njg4YzJiM2U2YzFmKTsKKyAgICBzaGFfaW5mby0+ZGlnZXN0WzZdID0gUHlfVUxMKDB4MWY4M2Q5YWJmYjQxYmQ2Yik7CisgICAgc2hhX2luZm8tPmRpZ2VzdFs3XSA9IFB5X1VMTCgweDViZTBjZDE5MTM3ZTIxNzkpOwogICAgIHNoYV9pbmZvLT5jb3VudF9sbyA9IDBMOwogICAgIHNoYV9pbmZvLT5jb3VudF9oaSA9IDBMOwogICAgIHNoYV9pbmZvLT5sb2NhbCA9IDA7CkBAIC0yNzIsMTQgKzI3MiwxNCBAQAogc2hhMzg0X2luaXQoU0hBb2JqZWN0ICpzaGFfaW5mbykKIHsKICAgICBUZXN0RW5kaWFubmVzcyhzaGFfaW5mby0+RW5kaWFubmVzcykKLSAgICBzaGFfaW5mby0+ZGlnZXN0WzBdID0gMHhjYmJiOWQ1ZGMxMDU5ZWQ4VUxMOwotICAgIHNoYV9pbmZvLT5kaWdlc3RbMV0gPSAweDYyOWEyOTJhMzY3Y2Q1MDdVTEw7Ci0gICAgc2hhX2luZm8tPmRpZ2VzdFsyXSA9IDB4OTE1OTAxNWEzMDcwZGQxN1VMTDsKLSAgICBzaGFfaW5mby0+ZGlnZXN0WzNdID0gMHgxNTJmZWNkOGY3MGU1OTM5VUxMOwotICAgIHNoYV9pbmZvLT5kaWdlc3RbNF0gPSAweDY3MzMyNjY3ZmZjMDBiMzFVTEw7Ci0gICAgc2hhX2luZm8tPmRpZ2VzdFs1XSA9IDB4OGViNDRhODc2ODU4MTUxMVVMTDsKLSAgICBzaGFfaW5mby0+ZGlnZXN0WzZdID0gMHhkYjBjMmUwZDY0Zjk4ZmE3VUxMOwotICAgIHNoYV9pbmZvLT5kaWdlc3RbN10gPSAweDQ3YjU0ODFkYmVmYTRmYTRVTEw7CisgICAgc2hhX2luZm8tPmRpZ2VzdFswXSA9IFB5X1VMTCgweGNiYmI5ZDVkYzEwNTllZDgpOworICAgIHNoYV9pbmZvLT5kaWdlc3RbMV0gPSBQeV9VTEwoMHg2MjlhMjkyYTM2N2NkNTA3KTsKKyAgICBzaGFfaW5mby0+ZGlnZXN0WzJdID0gUHlfVUxMKDB4OTE1OTAxNWEzMDcwZGQxNyk7CisgICAgc2hhX2luZm8tPmRpZ2VzdFszXSA9IFB5X1VMTCgweDE1MmZlY2Q4ZjcwZTU5MzkpOworICAgIHNoYV9pbmZvLT5kaWdlc3RbNF0gPSBQeV9VTEwoMHg2NzMzMjY2N2ZmYzAwYjMxKTsKKyAgICBzaGFfaW5mby0+ZGlnZXN0WzVdID0gUHlfVUxMKDB4OGViNDRhODc2ODU4MTUxMSk7CisgICAgc2hhX2luZm8tPmRpZ2VzdFs2XSA9IFB5X1VMTCgweGRiMGMyZTBkNjRmOThmYTcpOworICAgIHNoYV9pbmZvLT5kaWdlc3RbN10gPSBQeV9VTEwoMHg0N2I1NDgxZGJlZmE0ZmE0KTsKICAgICBzaGFfaW5mby0+Y291bnRfbG8gPSAwTDsKICAgICBzaGFfaW5mby0+Y291bnRfaGkgPSAwTDsKICAgICBzaGFfaW5mby0+bG9jYWwgPSAwOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zb2NrZXRtb2R1bGUuYyBiL01vZHVsZXMvc29ja2V0bW9kdWxlLmMKaW5kZXggYzlkZDRhMy4uMTY0YTVkMSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zb2NrZXRtb2R1bGUuYworKysgYi9Nb2R1bGVzL3NvY2tldG1vZHVsZS5jCkBAIC02MSw2ICs2MSwxNSBAQAogCiAqLwogCisjaWZkZWYgX19BUFBMRV9fCisgIC8qCisgICAqIGluZXRfYXRvbiBpcyBub3QgYXZhaWxhYmxlIG9uIE9TWCAxMC4zLCB5ZXQgd2Ugd2FudCB0byB1c2UgYSBiaW5hcnkKKyAgICogdGhhdCB3YXMgYnVpbGQgb24gMTAuNCBvciBsYXRlciB0byB3b3JrIG9uIHRoYXQgcmVsZWFzZSwgd2VhayBsaW5raW5nCisgICAqIGNvbWVzIHRvIHRoZSByZXNjdWUuCisgICAqLworIyBwcmFnbWEgd2VhayBpbmV0X2F0b24KKyNlbmRpZgorCiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAjaW5jbHVkZSAic3RydWN0bWVtYmVyLmgiCiAKQEAgLTk1LDcgKzEwNCwxMCBAQAogbGlzdGVuKG4pIC0tIHN0YXJ0IGxpc3RlbmluZyBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnNcblwKIG1ha2VmaWxlKFttb2RlLCBbYnVmc2l6ZV1dKSAtLSByZXR1cm4gYSBmaWxlIG9iamVjdCBmb3IgdGhlIHNvY2tldCBbKl1cblwKIHJlY3YoYnVmbGVuWywgZmxhZ3NdKSAtLSByZWNlaXZlIGRhdGFcblwKLXJlY3Zmcm9tKGJ1ZmxlblssIGZsYWdzXSkgLS0gcmVjZWl2ZSBkYXRhIGFuZCBzZW5kZXIncyBhZGRyZXNzXG5cCityZWN2X2J1ZihidWZmZXJbLCBuYnl0ZXNbLCBmbGFnc11dKSAtLSByZWNlaXZlIGRhdGEgKGludG8gYSBidWZmZXIpXG5cCityZWN2ZnJvbShidWZsZW5bLCBmbGFnc10pIC0tIHJlY2VpdmUgZGF0YSBhbmQgc2VuZGVyXCdzIGFkZHJlc3NcblwKK3JlY3Zmcm9tX2J1ZihidWZmZXJbLCBuYnl0ZXMsIFssIGZsYWdzXSlcblwKKyAgLS0gcmVjZWl2ZSBkYXRhIGFuZCBzZW5kZXJcJ3MgYWRkcmVzcyAoaW50byBhIGJ1ZmZlcilcblwKIHNlbmRhbGwoZGF0YVssIGZsYWdzXSkgLS0gc2VuZCBhbGwgZGF0YVxuXAogc2VuZChkYXRhWywgZmxhZ3NdKSAtLSBzZW5kIGRhdGEsIG1heSBub3Qgc2VuZCBhbGwgb2YgaXRcblwKIHNlbmR0byhkYXRhWywgZmxhZ3NdLCBhZGRyKSAtLSBzZW5kIGRhdGEgdG8gYSBnaXZlbiBhZGRyZXNzXG5cCkBAIC0xOTYsNyArMjA4LDcgQEAKICAgIGZ1bmN0aW9ucyBhcmUgZGVjbGFyZWQgY29ycmVjdGx5IGlmIGNvbXBpbGluZyB3aXRoCiAgICBNSVBTUHJvIDcueCBpbiBBTlNJIEMgbW9kZSAoZGVmYXVsdCkgKi8KIAotLyogWFhYIFVzaW5nIF9TR0lBUEkgaXMgdGhlIHdyb25nIHRoaW5nLCAKKy8qIFhYWCBVc2luZyBfU0dJQVBJIGlzIHRoZSB3cm9uZyB0aGluZywKICAgIGJ1dCBJIGRvbid0IGtub3cgd2hhdCB0aGUgcmlnaHQgdGhpbmcgaXMuICovCiAjdW5kZWYgX1NHSUFQSSAvKiB0byBhdm9pZCB3YXJuaW5nICovCiAjZGVmaW5lIF9TR0lBUEkgMQpAQCAtMjE0LDggKzIyNiw4IEBACiAjaW5jbHVkZSA8bmV0ZGIuaD4KICNlbmRpZgogCi0vKiBJcml4IDYuNSBmYWlscyB0byBkZWZpbmUgdGhpcyB2YXJpYWJsZSBhdCBhbGwuIFRoaXMgaXMgbmVlZGVkIAotICAgZm9yIGJvdGggR0NDIGFuZCBTR0kncyBjb21waWxlci4gSSdkIHNheSB0aGF0IHRoZSBTR0kgaGVhZGVycyAKKy8qIElyaXggNi41IGZhaWxzIHRvIGRlZmluZSB0aGlzIHZhcmlhYmxlIGF0IGFsbC4gVGhpcyBpcyBuZWVkZWQKKyAgIGZvciBib3RoIEdDQyBhbmQgU0dJJ3MgY29tcGlsZXIuIEknZCBzYXkgdGhhdCB0aGUgU0dJIGhlYWRlcnMKICAgIGFyZSBqdXN0IGJ1c3RlZC4gU2FtZSB0aGluZyBmb3IgU29sYXJpcy4gKi8KICNpZiAoZGVmaW5lZChfX3NnaSkgfHwgZGVmaW5lZChzdW4pKSAmJiAhZGVmaW5lZChJTkVUX0FERFJTVFJMRU4pCiAjZGVmaW5lIElORVRfQUREUlNUUkxFTiAxNgpAQCAtMzA2LDYgKzMxOCwxMSBAQAogICAgb2xkZXIgcmVsZWFzZXMgZG9uJ3QgaGF2ZSAqLwogI3VuZGVmIEhBVkVfR0VUQUREUklORk8KICNlbmRpZgorCisjaWZkZWYgSEFWRV9JTkVUX0FUT04KKyNkZWZpbmUgVVNFX0lORVRfQVRPTl9XRUFLTElOSworI2VuZGlmCisKICNlbmRpZgogCiAvKiBJIGtub3cgdGhpcyBpcyBhIGJhZCBwcmFjdGljZSwgYnV0IGl0IGlzIHRoZSBlYXNpZXN0Li4uICovCkBAIC0xMTgwLDEwICsxMTk3LDEwIEBACiAJCQkJYXJncy0+b2JfdHlwZS0+dHBfbmFtZSk7CiAJCQlyZXR1cm4gMDsKIAkJfQotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0aTpnZXRzb2NrYWRkcmFyZyIsIAorCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0aTpnZXRzb2NrYWRkcmFyZyIsCiAJCQkJICAgICAgImlkbmEiLCAmaG9zdCwgJnBvcnQpKQogCQkJcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gc2V0aXBhZGRyKGhvc3QsIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyLCAKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzZXRpcGFkZHIoaG9zdCwgKHN0cnVjdCBzb2NrYWRkciAqKWFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqYWRkciksICBBRl9JTkVUKTsKICAgICAgICAgICAgICAgICBQeU1lbV9GcmVlKGhvc3QpOwogICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPCAwKQpAQCAtMTIwMywxMiArMTIyMCwyMCBAQAogCQlpbnQgcG9ydCwgZmxvd2luZm8sIHNjb3BlX2lkLCByZXN1bHQ7CiAgCQlhZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYqKSYocy0+c29ja19hZGRyKS5pbjY7CiAJCWZsb3dpbmZvID0gc2NvcGVfaWQgPSAwOwotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0aXxpaSIsIAorCQlpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKwkJCVB5RXJyX0Zvcm1hdCgKKwkJCQlQeUV4Y19UeXBlRXJyb3IsCisJCQkJImdldHNvY2thZGRyYXJnOiAiCisJCQkJIkFGX0lORVQ2IGFkZHJlc3MgbXVzdCBiZSB0dXBsZSwgbm90ICUuNTAwcyIsCisJCQkJYXJncy0+b2JfdHlwZS0+dHBfbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0aXxpaSIsCiAJCQkJICAgICAgImlkbmEiLCAmaG9zdCwgJnBvcnQsICZmbG93aW5mbywKIAkJCQkgICAgICAmc2NvcGVfaWQpKSB7CiAJCQlyZXR1cm4gMDsKIAkJfQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNldGlwYWRkcihob3N0LCAoc3RydWN0IHNvY2thZGRyICopYWRkciwgIAorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNldGlwYWRkcihob3N0LCAoc3RydWN0IHNvY2thZGRyICopYWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCphZGRyKSwgQUZfSU5FVDYpOwogICAgICAgICAgICAgICAgIFB5TWVtX0ZyZWUoaG9zdCk7CiAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA8IDApCkBAIC0xMzA1LDYgKzEzMzAsMTQgQEAKIAkJY2hhciAqaGFkZHIgPSBOVUxMOwogCQl1bnNpZ25lZCBpbnQgaGFsZW4gPSAwOwogCisJCWlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgeworCQkJUHlFcnJfRm9ybWF0KAorCQkJCVB5RXhjX1R5cGVFcnJvciwKKwkJCQkiZ2V0c29ja2FkZHJhcmc6ICIKKwkJCQkiQUZfUEFDS0VUIGFkZHJlc3MgbXVzdCBiZSB0dXBsZSwgbm90ICUuNTAwcyIsCisJCQkJYXJncy0+b2JfdHlwZS0+dHBfbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQogCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNpfGlpcyMiLCAmaW50ZXJmYWNlTmFtZSwKIAkJCQkgICAgICAmcHJvdG9OdW1iZXIsICZwa3R0eXBlLCAmaGF0eXBlLAogCQkJCSAgICAgICZoYWRkciwgJmhhbGVuKSkKQEAgLTE4MDksNyArMTg0Miw3IEBACiAJCQkJCWludCByZXNfc2l6ZSA9IHNpemVvZiByZXM7CiAJCQkJCS8qIEl0IG11c3QgYmUgaW4gdGhlIGV4Y2VwdGlvbiBzZXQgKi8KIAkJCQkJYXNzZXJ0KEZEX0lTU0VUKHMtPnNvY2tfZmQsICZmZHNfZXhjKSk7Ci0JCQkJCWlmICgwID09IGdldHNvY2tvcHQocy0+c29ja19mZCwgU09MX1NPQ0tFVCwgU09fRVJST1IsIAorCQkJCQlpZiAoMCA9PSBnZXRzb2Nrb3B0KHMtPnNvY2tfZmQsIFNPTF9TT0NLRVQsIFNPX0VSUk9SLAogCQkJCQkgICAgICAgICAgICAgICAgICAgIChjaGFyICopJnJlcywgJnJlc19zaXplKSkKIAkJCQkJCS8qIGdldHNvY2tvcHQgYWxzbyBjbGVhcnMgV1NBR2V0TGFzdEVycm9yLAogCQkJCQkJICAgc28gcmVzZXQgaXQgYmFjay4gKi8KQEAgLTIxMDUsOTUgKzIxMzgsMTI2IEBACiAKICNlbmRpZiAvKiBOT19EVVAgKi8KIAorLyoKKyAqIFRoaXMgaXMgdGhlIGd1dHMgb2YgdGhlIHJlY3YoKSBhbmQgcmVjdl9idWYoKSBtZXRob2RzLCB3aGljaCByZWFkcyBpbnRvIGEKKyAqIGNoYXIgYnVmZmVyLiAgSWYgeW91IGhhdmUgYW55IGluYy9kZWYgcmVmIHRvIGRvIHRvIHRoZSBvYmplY3RzIHRoYXQgY29udGFpbgorICogdGhlIGJ1ZmZlciwgZG8gaXQgaW4gdGhlIGNhbGxlci4gIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgKiBzdWNjZXNmdWxseSByZWFkLiAgSWYgdGhlcmUgd2FzIGFuIGVycm9yLCBpdCByZXR1cm5zIC0xLiAgTm90ZSB0aGF0IGl0IGlzCisgKiBhbHNvIHBvc3NpYmxlIHRoYXQgd2UgcmV0dXJuIGEgbnVtYmVyIG9mIGJ5dGVzIHNtYWxsZXIgdGhhbiB0aGUgcmVxdWVzdAorICogYnl0ZXMuCisgKi8KK3N0YXRpYyBpbnQKK3NvY2tfcmVjdl9ndXRzKFB5U29ja2V0U29ja09iamVjdCAqcywgY2hhciogY2J1ZiwgaW50IGxlbiwgaW50IGZsYWdzKQoreworICAgICAgICBpbnQgdGltZW91dCwgb3V0bGVuID0gMDsKKyNpZmRlZiBfX1ZNUworCWludCByZW1haW5pbmcsIG5yZWFkOworCWNoYXIgKnJlYWRfYnVmOworI2VuZGlmCisKKwlpZiAoIUlTX1NFTEVDVEFCTEUocykpIHsKKwkJc2VsZWN0X2Vycm9yKCk7CisJCXJldHVybiAtMTsKKwl9CisKKyNpZm5kZWYgX19WTVMKKwlQeV9CRUdJTl9BTExPV19USFJFQURTCisJdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAwKTsKKwlpZiAoIXRpbWVvdXQpCisJCW91dGxlbiA9IHJlY3Yocy0+c29ja19mZCwgY2J1ZiwgbGVuLCBmbGFncyk7CisJUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworCWlmICh0aW1lb3V0KSB7CisJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChvdXRsZW4gPCAwKSB7CisJCS8qIE5vdGU6IHRoZSBjYWxsIHRvIGVycm9yaGFuZGxlcigpIEFMV0FZUyBpbmRpcmVjdGx5IHJldHVybmVkCisJCSAgIE5VTEwsIHNvIGlnbm9yZSBpdHMgcmV0dXJuIHZhbHVlICovCisJCXMtPmVycm9yaGFuZGxlcigpOworCQlyZXR1cm4gLTE7CisJfQorI2Vsc2UKKwlyZWFkX2J1ZiA9IGNidWY7CisJcmVtYWluaW5nID0gbGVuOworCXdoaWxlIChyZW1haW5pbmcgIT0gMCkgeworCQl1bnNpZ25lZCBpbnQgc2VnbWVudDsKKworCQlzZWdtZW50ID0gcmVtYWluaW5nIC9TRUdNRU5UX1NJWkU7CisJCWlmIChzZWdtZW50ICE9IDApIHsKKwkJCXNlZ21lbnQgPSBTRUdNRU5UX1NJWkU7CisJCX0KKwkJZWxzZSB7CisJCQlzZWdtZW50ID0gcmVtYWluaW5nOworCQl9CisKKwkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworCQl0aW1lb3V0ID0gaW50ZXJuYWxfc2VsZWN0KHMsIDApOworCQlpZiAoIXRpbWVvdXQpCisJCQlucmVhZCA9IHJlY3Yocy0+c29ja19mZCwgcmVhZF9idWYsIHNlZ21lbnQsIGZsYWdzKTsKKwkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworCQlpZiAodGltZW91dCkgeworCQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF90aW1lb3V0LCAidGltZWQgb3V0Iik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKG5yZWFkIDwgMCkgeworCQkJcy0+ZXJyb3JoYW5kbGVyKCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKG5yZWFkICE9IHJlbWFpbmluZykgeworCQkJcmVhZF9idWYgKz0gbnJlYWQ7CisJCQlicmVhazsKKwkJfQorCisJCXJlbWFpbmluZyAtPSBzZWdtZW50OworCQlyZWFkX2J1ZiArPSBzZWdtZW50OworCX0KKwlvdXRsZW4gPSByZWFkX2J1ZiAtIGNidWY7CisjZW5kaWYgLyogIV9fVk1TICovCisKKwlyZXR1cm4gb3V0bGVuOworfQorCiAKIC8qIHMucmVjdihuYnl0ZXMgWyxmbGFnc10pIG1ldGhvZCAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgogc29ja19yZWN2KFB5U29ja2V0U29ja09iamVjdCAqcywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGxlbiwgbiA9IDAsIGZsYWdzID0gMCwgdGltZW91dDsKKwlpbnQgcmVjdmxlbiwgZmxhZ3MgPSAwLCBvdXRsZW47CiAJUHlPYmplY3QgKmJ1ZjsKLSNpZmRlZiBfX1ZNUwotCWludCByZWFkX2xlbmd0aDsKLQljaGFyICpyZWFkX2J1ZjsKLSNlbmRpZgogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpfGk6cmVjdiIsICZsZW4sICZmbGFncykpCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpfGk6cmVjdiIsICZyZWN2bGVuLCAmZmxhZ3MpKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmIChsZW4gPCAwKSB7CisJaWYgKHJlY3ZsZW4gPCAwKSB7CiAJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAogCQkJCSJuZWdhdGl2ZSBidWZmZXJzaXplIGluIHJlY3YiKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JYnVmID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikgMCwgbGVuKTsKKwkvKiBBbGxvY2F0ZSBhIG5ldyBzdHJpbmcuICovCisJYnVmID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikgMCwgcmVjdmxlbik7CiAJaWYgKGJ1ZiA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmICghSVNfU0VMRUNUQUJMRShzKSkKLQkJcmV0dXJuIHNlbGVjdF9lcnJvcigpOwotCi0jaWZuZGVmIF9fVk1TCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3QocywgMCk7Ci0JaWYgKCF0aW1lb3V0KQotCQluID0gcmVjdihzLT5zb2NrX2ZkLCBQeVN0cmluZ19BU19TVFJJTkcoYnVmKSwgbGVuLCBmbGFncyk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQotCWlmICh0aW1lb3V0KSB7CisJLyogQ2FsbCB0aGUgZ3V0cyAqLworCW91dGxlbiA9IHNvY2tfcmVjdl9ndXRzKHMsIFB5U3RyaW5nX0FzU3RyaW5nKGJ1ZiksIHJlY3ZsZW4sIGZsYWdzKTsKKwlpZiAob3V0bGVuIDwgMCkgeworCQkvKiBBbiBlcnJvciBvY2N1cmVkLCByZWxlYXNlIHRoZSBzdHJpbmcgYW5kIHJldHVybiBhbgorCQkgICBlcnJvci4gKi8KIAkJUHlfREVDUkVGKGJ1Zik7Ci0JCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JaWYgKG4gPCAwKSB7Ci0JCVB5X0RFQ1JFRihidWYpOwotCQlyZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7Ci0JfQotCWlmIChuICE9IGxlbikKLQkJX1B5U3RyaW5nX1Jlc2l6ZSgmYnVmLCBuKTsKLSNlbHNlCi0JcmVhZF9idWYgPSBQeVN0cmluZ19Bc1N0cmluZyhidWYpOwotCXJlYWRfbGVuZ3RoID0gbGVuOwotCXdoaWxlIChyZWFkX2xlbmd0aCAhPSAwKSB7Ci0JCXVuc2lnbmVkIGludCBzZWdtZW50OwotCi0JCXNlZ21lbnQgPSByZWFkX2xlbmd0aCAvU0VHTUVOVF9TSVpFOwotCQlpZiAoc2VnbWVudCAhPSAwKSB7Ci0JCQlzZWdtZW50ID0gU0VHTUVOVF9TSVpFOwotCQl9Ci0JCWVsc2UgewotCQkJc2VnbWVudCA9IHJlYWRfbGVuZ3RoOwotCQl9Ci0KLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQl0aW1lb3V0ID0gaW50ZXJuYWxfc2VsZWN0KHMsIDApOwotCQlpZiAoIXRpbWVvdXQpCi0JCQluID0gcmVjdihzLT5zb2NrX2ZkLCByZWFkX2J1Ziwgc2VnbWVudCwgZmxhZ3MpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCi0JCWlmICh0aW1lb3V0KSB7Ci0JCQlQeV9ERUNSRUYoYnVmKTsKLQkJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOworCWlmIChvdXRsZW4gIT0gcmVjdmxlbikgeworCQkvKiBXZSBkaWQgbm90IHJlYWQgYXMgbWFueSBieXRlcyBhcyB3ZSBhbnRpY2lwYXRlZCwgcmVzaXplIHRoZQorCQkgICBzdHJpbmcgaWYgcG9zc2libGUgYW5kIGJlIHN1Y2Nlc2Z1bC4gKi8KKwkJaWYgKF9QeVN0cmluZ19SZXNpemUoJmJ1Ziwgb3V0bGVuKSA8IDApCisJCQkvKiBPb3BzeSwgbm90IHNvIHN1Y2Nlc2Z1bCBhZnRlciBhbGwuICovCiAJCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAobiA8IDApIHsKLQkJCVB5X0RFQ1JFRihidWYpOwotCQkJcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOwotCQl9Ci0JCWlmIChuICE9IHJlYWRfbGVuZ3RoKSB7Ci0JCQlyZWFkX2J1ZiArPSBuOwotCQkJYnJlYWs7Ci0JCX0KKwl9CiAKLQkJcmVhZF9sZW5ndGggLT0gc2VnbWVudDsKLQkJcmVhZF9idWYgKz0gc2VnbWVudDsKLQl9Ci0JaWYgKF9QeVN0cmluZ19SZXNpemUoJmJ1ZiwgKHJlYWRfYnVmIC0gUHlTdHJpbmdfQXNTdHJpbmcoYnVmKSkpIDwgMCkKLQl7Ci0JICAgIHJldHVybiBOVUxMOwotCX0KLSNlbmRpZiAvKiAhX19WTVMgKi8KIAlyZXR1cm4gYnVmOwogfQogCkBAIC0yMjA2LDI5ICsyMjcwLDkwIEBACiB0aGUgcmVtb3RlIGVuZCBpcyBjbG9zZWQgYW5kIGFsbCBkYXRhIGlzIHJlYWQsIHJldHVybiB0aGUgZW1wdHkgc3RyaW5nLiIpOwogCiAKLS8qIHMucmVjdmZyb20obmJ5dGVzIFssZmxhZ3NdKSBtZXRob2QgKi8KKy8qIHMucmVjdl9idWYoYnVmZmVyLCBbbmJ5dGVzIFssZmxhZ3NdXSkgbWV0aG9kICovCiAKLXN0YXRpYyBQeU9iamVjdCAqCi1zb2NrX3JlY3Zmcm9tKFB5U29ja2V0U29ja09iamVjdCAqcywgUHlPYmplY3QgKmFyZ3MpCitzdGF0aWMgUHlPYmplY3QqCitzb2NrX3JlY3ZfYnVmKFB5U29ja2V0U29ja09iamVjdCAqcywgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQoreworCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiYnVmZmVyIiwgIm5ieXRlcyIsICJmbGFncyIsIDB9OworCisJaW50IHJlY3ZsZW4gPSAwLCBmbGFncyA9IDAsIHJlYWRsZW47CisJY2hhciAqYnVmOworCWludCBidWZsZW47CisKKwkvKiBHZXQgdGhlIGJ1ZmZlcidzIG1lbW9yeSAqLworCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJzI3xpaTpyZWN2Iiwga3dsaXN0LAorCQkJCQkgJmJ1ZiwgJmJ1ZmxlbiwgJnJlY3ZsZW4sICZmbGFncykpCisJCXJldHVybiBOVUxMOworCWFzc2VydChidWYgIT0gMCAmJiBidWZsZW4gPiAwKTsKKworCWlmIChyZWN2bGVuIDwgMCkgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKwkJCQkibmVnYXRpdmUgYnVmZmVyc2l6ZSBpbiByZWN2Iik7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAocmVjdmxlbiA9PSAwKSB7CisgICAgICAgICAgICAvKiBJZiBuYnl0ZXMgd2FzIG5vdCBzcGVjaWZpZWQsIHVzZSB0aGUgYnVmZmVyJ3MgbGVuZ3RoICovCisgICAgICAgICAgICByZWN2bGVuID0gYnVmbGVuOworCX0KKworCS8qIENoZWNrIGlmIHRoZSBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoICovCisJaWYgKGJ1ZmxlbiA8IHJlY3ZsZW4pIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisJCQkJImJ1ZmZlciB0b28gc21hbGwgZm9yIHJlcXVlc3RlZCBieXRlcyIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBDYWxsIHRoZSBndXRzICovCisJcmVhZGxlbiA9IHNvY2tfcmVjdl9ndXRzKHMsIGJ1ZiwgcmVjdmxlbiwgZmxhZ3MpOworCWlmIChyZWFkbGVuIDwgMCkgeworCQkvKiBSZXR1cm4gYW4gZXJyb3IuICovCisJCXJldHVybiBOVUxMOworCX0KKworCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuICBOb3RlIHRoYXQgd2UgZG8gbm90IGRvIGFueXRoaW5nCisJICAgc3BlY2lhbCBoZXJlIGluIHRoZSBjYXNlIHRoYXQgcmVhZGxlbiA8IHJlY3ZsZW4uICovCisJcmV0dXJuIFB5SW50X0Zyb21Mb25nKHJlYWRsZW4pOworfQorCitQeURvY19TVFJWQVIocmVjdl9idWZfZG9jLAorInJlY3ZfYnVmKGJ1ZmZlciwgW25ieXRlc1ssIGZsYWdzXV0pIC0+IG5ieXRlc19yZWFkXG5cCitcblwKK0EgdmVyc2lvbiBvZiByZWN2KCkgdGhhdCBzdG9yZXMgaXRzIGRhdGEgaW50byBhIGJ1ZmZlciByYXRoZXIgdGhhbiBjcmVhdGluZyBcblwKK2EgbmV3IHN0cmluZy4gIFJlY2VpdmUgdXAgdG8gYnVmZmVyc2l6ZSBieXRlcyBmcm9tIHRoZSBzb2NrZXQuICBJZiBidWZmZXJzaXplIFxuXAoraXMgbm90IHNwZWNpZmllZCAob3IgMCksIHJlY2VpdmUgdXAgdG8gdGhlIHNpemUgYXZhaWxhYmxlIGluIHRoZSBnaXZlbiBidWZmZXIuXG5cCitcblwKK1NlZSByZWN2KCkgZm9yIGRvY3VtZW50YXRpb24gYWJvdXQgdGhlIGZsYWdzLiIpOworCisKKy8qCisgKiBUaGlzIGlzIHRoZSBndXRzIG9mIHRoZSByZWN2KCkgYW5kIHJlY3ZfYnVmKCkgbWV0aG9kcywgd2hpY2ggcmVhZHMgaW50byBhCisgKiBjaGFyIGJ1ZmZlci4gIElmIHlvdSBoYXZlIGFueSBpbmMvZGVmIHJlZiB0byBkbyB0byB0aGUgb2JqZWN0cyB0aGF0IGNvbnRhaW4KKyAqIHRoZSBidWZmZXIsIGRvIGl0IGluIHRoZSBjYWxsZXIuICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcworICogc3VjY2VzZnVsbHkgcmVhZC4gIElmIHRoZXJlIHdhcyBhbiBlcnJvciwgaXQgcmV0dXJucyAtMS4gIE5vdGUgdGhhdCBpdCBpcworICogYWxzbyBwb3NzaWJsZSB0aGF0IHdlIHJldHVybiBhIG51bWJlciBvZiBieXRlcyBzbWFsbGVyIHRoYW4gdGhlIHJlcXVlc3QKKyAqIGJ5dGVzLgorICoKKyAqICdhZGRyJyBpcyBhIHJldHVybiB2YWx1ZSBmb3IgdGhlIGFkZHJlc3Mgb2JqZWN0LiAgTm90ZSB0aGF0IHlvdSBtdXN0IGRlY3JlZgorICogaXQgeW91cnNlbGYuCisgKi8KK3N0YXRpYyBpbnQKK3NvY2tfcmVjdmZyb21fZ3V0cyhQeVNvY2tldFNvY2tPYmplY3QgKnMsIGNoYXIqIGNidWYsIGludCBsZW4sIGludCBmbGFncywKKwkJICAgUHlPYmplY3QqKiBhZGRyKQogewogCXNvY2tfYWRkcl90IGFkZHJidWY7Ci0JUHlPYmplY3QgKmJ1ZiA9IE5VTEw7Ci0JUHlPYmplY3QgKmFkZHIgPSBOVUxMOwotCVB5T2JqZWN0ICpyZXQgPSBOVUxMOwotCWludCBsZW4sIG4gPSAwLCBmbGFncyA9IDAsIHRpbWVvdXQ7CisJaW50IG4gPSAwLCB0aW1lb3V0OwogCXNvY2tsZW5fdCBhZGRybGVuOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpfGk6cmVjdmZyb20iLCAmbGVuLCAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKKwkqYWRkciA9IE5VTEw7CiAKIAlpZiAoIWdldHNvY2thZGRybGVuKHMsICZhZGRybGVuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYnVmID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikgMCwgbGVuKTsKLQlpZiAoYnVmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gLTE7CiAKLQlpZiAoIUlTX1NFTEVDVEFCTEUocykpCi0JCXJldHVybiBzZWxlY3RfZXJyb3IoKTsKKwlpZiAoIUlTX1NFTEVDVEFCTEUocykpIHsKKwkJc2VsZWN0X2Vycm9yKCk7CisJCXJldHVybiAtMTsKKwl9CiAKIAlQeV9CRUdJTl9BTExPV19USFJFQURTCiAJbWVtc2V0KCZhZGRyYnVmLCAwLCBhZGRybGVuKTsKQEAgLTIyMzYsNDEgKzIzNjEsNzEgQEAKIAlpZiAoIXRpbWVvdXQpIHsKICNpZm5kZWYgTVNfV0lORE9XUwogI2lmIGRlZmluZWQoUFlPU19PUzIpICYmICFkZWZpbmVkKFBZQ0NfR0NDKQotCQluID0gcmVjdmZyb20ocy0+c29ja19mZCwgUHlTdHJpbmdfQVNfU1RSSU5HKGJ1ZiksIGxlbiwgZmxhZ3MsCisJCW4gPSByZWN2ZnJvbShzLT5zb2NrX2ZkLCBjYnVmLCBsZW4sIGZsYWdzLAogCQkJICAgICAoc3RydWN0IHNvY2thZGRyICopICZhZGRyYnVmLCAmYWRkcmxlbik7CiAjZWxzZQotCQluID0gcmVjdmZyb20ocy0+c29ja19mZCwgUHlTdHJpbmdfQVNfU1RSSU5HKGJ1ZiksIGxlbiwgZmxhZ3MsCisJCW4gPSByZWN2ZnJvbShzLT5zb2NrX2ZkLCBjYnVmLCBsZW4sIGZsYWdzLAogCQkJICAgICAodm9pZCAqKSAmYWRkcmJ1ZiwgJmFkZHJsZW4pOwogI2VuZGlmCiAjZWxzZQotCQluID0gcmVjdmZyb20ocy0+c29ja19mZCwgUHlTdHJpbmdfQVNfU1RSSU5HKGJ1ZiksIGxlbiwgZmxhZ3MsCisJCW4gPSByZWN2ZnJvbShzLT5zb2NrX2ZkLCBjYnVmLCBsZW4sIGZsYWdzLAogCQkJICAgICAoc3RydWN0IHNvY2thZGRyICopICZhZGRyYnVmLCAmYWRkcmxlbik7CiAjZW5kaWYKIAl9CiAJUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAogCWlmICh0aW1lb3V0KSB7Ci0JCVB5X0RFQ1JFRihidWYpOwogCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiAtMTsKIAl9CiAJaWYgKG4gPCAwKSB7Ci0JCVB5X0RFQ1JFRihidWYpOwotCQlyZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7CisJCXMtPmVycm9yaGFuZGxlcigpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKIAl9CiAKLQlpZiAobiAhPSBsZW4gJiYgX1B5U3RyaW5nX1Jlc2l6ZSgmYnVmLCBuKSA8IDApCisJaWYgKCEoKmFkZHIgPSBtYWtlc29ja2FkZHIocy0+c29ja19mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkcmJ1ZiwKKwkJCQkgICBhZGRybGVuLCBzLT5zb2NrX3Byb3RvKSkpCisJCXJldHVybiAtMTsKKworCXJldHVybiBuOworfQorCisvKiBzLnJlY3Zmcm9tKG5ieXRlcyBbLGZsYWdzXSkgbWV0aG9kICovCisKK3N0YXRpYyBQeU9iamVjdCAqCitzb2NrX3JlY3Zmcm9tKFB5U29ja2V0U29ja09iamVjdCAqcywgUHlPYmplY3QgKmFyZ3MpCit7CisJUHlPYmplY3QgKmJ1ZiA9IE5VTEw7CisJUHlPYmplY3QgKmFkZHIgPSBOVUxMOworCVB5T2JqZWN0ICpyZXQgPSBOVUxMOworCWludCByZWN2bGVuLCBvdXRsZW4sIGZsYWdzID0gMDsKKworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXxpOnJlY3Zmcm9tIiwgJnJlY3ZsZW4sICZmbGFncykpCiAJCXJldHVybiBOVUxMOwogCi0JaWYgKCEoYWRkciA9IG1ha2Vzb2NrYWRkcihzLT5zb2NrX2ZkLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyYnVmLAotCQkJCSAgYWRkcmxlbiwgcy0+c29ja19wcm90bykpKQorCWJ1ZiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopIDAsIHJlY3ZsZW4pOworCWlmIChidWYgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlvdXRsZW4gPSBzb2NrX3JlY3Zmcm9tX2d1dHMocywgUHlTdHJpbmdfQVNfU1RSSU5HKGJ1ZiksCisJCQkJICAgIHJlY3ZsZW4sIGZsYWdzLCAmYWRkcik7CisJaWYgKG91dGxlbiA8IDApIHsKIAkJZ290byBmaW5hbGx5OworCX0KKworCWlmIChvdXRsZW4gIT0gcmVjdmxlbikgeworCQkvKiBXZSBkaWQgbm90IHJlYWQgYXMgbWFueSBieXRlcyBhcyB3ZSBhbnRpY2lwYXRlZCwgcmVzaXplIHRoZQorCQkgICBzdHJpbmcgaWYgcG9zc2libGUgYW5kIGJlIHN1Y2Nlc2Z1bC4gKi8KKwkJaWYgKF9QeVN0cmluZ19SZXNpemUoJmJ1Ziwgb3V0bGVuKSA8IDApCisJCQkvKiBPb3BzeSwgbm90IHNvIHN1Y2Nlc2Z1bCBhZnRlciBhbGwuICovCisJCQlnb3RvIGZpbmFsbHk7CisJfQogCiAJcmV0ID0gUHlUdXBsZV9QYWNrKDIsIGJ1ZiwgYWRkcik7CiAKIGZpbmFsbHk6Ci0JUHlfWERFQ1JFRihhZGRyKTsKIAlQeV9YREVDUkVGKGJ1Zik7CisJUHlfWERFQ1JFRihhZGRyKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yMjc5LDYgKzI0MzQsNTcgQEAKIFxuXAogTGlrZSByZWN2KGJ1ZmZlcnNpemUsIGZsYWdzKSBidXQgYWxzbyByZXR1cm4gdGhlIHNlbmRlcidzIGFkZHJlc3MgaW5mby4iKTsKIAorCisvKiBzLnJlY3Zmcm9tX2J1ZihidWZmZXJbLCBuYnl0ZXMgWyxmbGFnc11dKSBtZXRob2QgKi8KKworc3RhdGljIFB5T2JqZWN0ICoKK3NvY2tfcmVjdmZyb21fYnVmKFB5U29ja2V0U29ja09iamVjdCAqcywgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0KiBrd2RzKQoreworCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiYnVmZmVyIiwgIm5ieXRlcyIsICJmbGFncyIsIDB9OworCisJaW50IHJlY3ZsZW4gPSAwLCBmbGFncyA9IDAsIHJlYWRsZW47CisJY2hhciAqYnVmOworCWludCBidWZsZW47CisKKwlQeU9iamVjdCAqYWRkciA9IE5VTEw7CisJUHlPYmplY3QgKnJldCA9IE5VTEw7CisKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAicyN8aWk6cmVjdmZyb20iLCBrd2xpc3QsCisJCQkJCSAmYnVmLCAmYnVmbGVuLCAmcmVjdmxlbiwgJmZsYWdzKSkKKwkJcmV0dXJuIE5VTEw7CisJYXNzZXJ0KGJ1ZiAhPSAwICYmIGJ1ZmxlbiA+IDApOworCisJaWYgKHJlY3ZsZW4gPCAwKSB7CisJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorCQkJCSJuZWdhdGl2ZSBidWZmZXJzaXplIGluIHJlY3YiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChyZWN2bGVuID09IDApIHsKKyAgICAgICAgICAgIC8qIElmIG5ieXRlcyB3YXMgbm90IHNwZWNpZmllZCwgdXNlIHRoZSBidWZmZXIncyBsZW5ndGggKi8KKyAgICAgICAgICAgIHJlY3ZsZW4gPSBidWZsZW47CisJfQorCisJcmVhZGxlbiA9IHNvY2tfcmVjdmZyb21fZ3V0cyhzLCBidWYsIHJlY3ZsZW4sIGZsYWdzLCAmYWRkcik7CisJaWYgKHJlYWRsZW4gPCAwKSB7CisJCS8qIFJldHVybiBhbiBlcnJvciAqLworCQlnb3RvIGZpbmFsbHk7CisJfQorCisJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBhbmQgdGhlIGFkZHJlc3MuICBOb3RlIHRoYXQgd2UgZG8KKwkgICBub3QgZG8gYW55dGhpbmcgc3BlY2lhbCBoZXJlIGluIHRoZSBjYXNlIHRoYXQgcmVhZGxlbiA8IHJlY3ZsZW4uICovCisJcmV0ID0gUHlUdXBsZV9QYWNrKDIsIFB5SW50X0Zyb21Mb25nKHJlYWRsZW4pLCBhZGRyKTsKKwkKK2ZpbmFsbHk6CisJUHlfWERFQ1JFRihhZGRyKTsKKwlyZXR1cm4gcmV0OworfQorCitQeURvY19TVFJWQVIocmVjdmZyb21fYnVmX2RvYywKKyJyZWN2ZnJvbV9idWYoYnVmZmVyWywgbmJ5dGVzWywgZmxhZ3NdXSkgLT4gKG5ieXRlcywgYWRkcmVzcyBpbmZvKVxuXAorXG5cCitMaWtlIHJlY3ZfYnVmKGJ1ZmZlclssIG5ieXRlc1ssIGZsYWdzXV0pIGJ1dCBhbHNvIHJldHVybiB0aGUgc2VuZGVyJ3MgYWRkcmVzcyBpbmZvLiIpOworCisKIC8qIHMuc2VuZChkYXRhIFssZmxhZ3NdKSBtZXRob2QgKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTI0NzMsNTkgKzI2NzksNjMgQEAKIC8qIExpc3Qgb2YgbWV0aG9kcyBmb3Igc29ja2V0IG9iamVjdHMgKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIHNvY2tfbWV0aG9kc1tdID0gewotCXsiYWNjZXB0IiwJKFB5Q0Z1bmN0aW9uKXNvY2tfYWNjZXB0LCBNRVRIX05PQVJHUywKLQkJCWFjY2VwdF9kb2N9LAotCXsiYmluZCIsCShQeUNGdW5jdGlvbilzb2NrX2JpbmQsIE1FVEhfTywKLQkJCWJpbmRfZG9jfSwKLQl7ImNsb3NlIiwJKFB5Q0Z1bmN0aW9uKXNvY2tfY2xvc2UsIE1FVEhfTk9BUkdTLAotCQkJY2xvc2VfZG9jfSwKLQl7ImNvbm5lY3QiLAkoUHlDRnVuY3Rpb24pc29ja19jb25uZWN0LCBNRVRIX08sCi0JCQljb25uZWN0X2RvY30sCi0JeyJjb25uZWN0X2V4IiwJKFB5Q0Z1bmN0aW9uKXNvY2tfY29ubmVjdF9leCwgTUVUSF9PLAotCQkJY29ubmVjdF9leF9kb2N9LAorCXsiYWNjZXB0IiwJICAoUHlDRnVuY3Rpb24pc29ja19hY2NlcHQsIE1FVEhfTk9BUkdTLAorCQkJICBhY2NlcHRfZG9jfSwKKwl7ImJpbmQiLAkgIChQeUNGdW5jdGlvbilzb2NrX2JpbmQsIE1FVEhfTywKKwkJCSAgYmluZF9kb2N9LAorCXsiY2xvc2UiLAkgIChQeUNGdW5jdGlvbilzb2NrX2Nsb3NlLCBNRVRIX05PQVJHUywKKwkJCSAgY2xvc2VfZG9jfSwKKwl7ImNvbm5lY3QiLAkgIChQeUNGdW5jdGlvbilzb2NrX2Nvbm5lY3QsIE1FVEhfTywKKwkJCSAgY29ubmVjdF9kb2N9LAorCXsiY29ubmVjdF9leCIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfY29ubmVjdF9leCwgTUVUSF9PLAorCQkJICBjb25uZWN0X2V4X2RvY30sCiAjaWZuZGVmIE5PX0RVUAotCXsiZHVwIiwJCShQeUNGdW5jdGlvbilzb2NrX2R1cCwgTUVUSF9OT0FSR1MsCi0JCQlkdXBfZG9jfSwKKwl7ImR1cCIsCQkgIChQeUNGdW5jdGlvbilzb2NrX2R1cCwgTUVUSF9OT0FSR1MsCisJCQkgIGR1cF9kb2N9LAogI2VuZGlmCi0JeyJmaWxlbm8iLAkoUHlDRnVuY3Rpb24pc29ja19maWxlbm8sIE1FVEhfTk9BUkdTLAotCQkJZmlsZW5vX2RvY30sCisJeyJmaWxlbm8iLAkgIChQeUNGdW5jdGlvbilzb2NrX2ZpbGVubywgTUVUSF9OT0FSR1MsCisJCQkgIGZpbGVub19kb2N9LAogI2lmZGVmIEhBVkVfR0VUUEVFUk5BTUUKLQl7ImdldHBlZXJuYW1lIiwJKFB5Q0Z1bmN0aW9uKXNvY2tfZ2V0cGVlcm5hbWUsCi0JCQlNRVRIX05PQVJHUywgZ2V0cGVlcm5hbWVfZG9jfSwKKwl7ImdldHBlZXJuYW1lIiwJICAoUHlDRnVuY3Rpb24pc29ja19nZXRwZWVybmFtZSwKKwkJCSAgTUVUSF9OT0FSR1MsIGdldHBlZXJuYW1lX2RvY30sCiAjZW5kaWYKLQl7ImdldHNvY2tuYW1lIiwJKFB5Q0Z1bmN0aW9uKXNvY2tfZ2V0c29ja25hbWUsCi0JCQlNRVRIX05PQVJHUywgZ2V0c29ja25hbWVfZG9jfSwKLQl7ImdldHNvY2tvcHQiLAkoUHlDRnVuY3Rpb24pc29ja19nZXRzb2Nrb3B0LCBNRVRIX1ZBUkFSR1MsCi0JCQlnZXRzb2Nrb3B0X2RvY30sCi0JeyJsaXN0ZW4iLAkoUHlDRnVuY3Rpb24pc29ja19saXN0ZW4sIE1FVEhfTywKLQkJCWxpc3Rlbl9kb2N9LAorCXsiZ2V0c29ja25hbWUiLAkgIChQeUNGdW5jdGlvbilzb2NrX2dldHNvY2tuYW1lLAorCQkJICBNRVRIX05PQVJHUywgZ2V0c29ja25hbWVfZG9jfSwKKwl7ImdldHNvY2tvcHQiLAkgIChQeUNGdW5jdGlvbilzb2NrX2dldHNvY2tvcHQsIE1FVEhfVkFSQVJHUywKKwkJCSAgZ2V0c29ja29wdF9kb2N9LAorCXsibGlzdGVuIiwJICAoUHlDRnVuY3Rpb24pc29ja19saXN0ZW4sIE1FVEhfTywKKwkJCSAgbGlzdGVuX2RvY30sCiAjaWZuZGVmIE5PX0RVUAotCXsibWFrZWZpbGUiLAkoUHlDRnVuY3Rpb24pc29ja19tYWtlZmlsZSwgTUVUSF9WQVJBUkdTLAotCQkJbWFrZWZpbGVfZG9jfSwKKwl7Im1ha2VmaWxlIiwJICAoUHlDRnVuY3Rpb24pc29ja19tYWtlZmlsZSwgTUVUSF9WQVJBUkdTLAorCQkJICBtYWtlZmlsZV9kb2N9LAogI2VuZGlmCi0JeyJyZWN2IiwJKFB5Q0Z1bmN0aW9uKXNvY2tfcmVjdiwgTUVUSF9WQVJBUkdTLAotCQkJcmVjdl9kb2N9LAotCXsicmVjdmZyb20iLAkoUHlDRnVuY3Rpb24pc29ja19yZWN2ZnJvbSwgTUVUSF9WQVJBUkdTLAotCQkJcmVjdmZyb21fZG9jfSwKLQl7InNlbmQiLAkoUHlDRnVuY3Rpb24pc29ja19zZW5kLCBNRVRIX1ZBUkFSR1MsCi0JCQlzZW5kX2RvY30sCi0JeyJzZW5kYWxsIiwJKFB5Q0Z1bmN0aW9uKXNvY2tfc2VuZGFsbCwgTUVUSF9WQVJBUkdTLAotCQkJc2VuZGFsbF9kb2N9LAotCXsic2VuZHRvIiwJKFB5Q0Z1bmN0aW9uKXNvY2tfc2VuZHRvLCBNRVRIX1ZBUkFSR1MsCi0JCQlzZW5kdG9fZG9jfSwKLQl7InNldGJsb2NraW5nIiwJKFB5Q0Z1bmN0aW9uKXNvY2tfc2V0YmxvY2tpbmcsIE1FVEhfTywKLQkJCXNldGJsb2NraW5nX2RvY30sCi0JeyJzZXR0aW1lb3V0IiwgKFB5Q0Z1bmN0aW9uKXNvY2tfc2V0dGltZW91dCwgTUVUSF9PLAotCQkJc2V0dGltZW91dF9kb2N9LAotCXsiZ2V0dGltZW91dCIsIChQeUNGdW5jdGlvbilzb2NrX2dldHRpbWVvdXQsIE1FVEhfTk9BUkdTLAotCQkJZ2V0dGltZW91dF9kb2N9LAotCXsic2V0c29ja29wdCIsCShQeUNGdW5jdGlvbilzb2NrX3NldHNvY2tvcHQsIE1FVEhfVkFSQVJHUywKLQkJCXNldHNvY2tvcHRfZG9jfSwKLQl7InNodXRkb3duIiwJKFB5Q0Z1bmN0aW9uKXNvY2tfc2h1dGRvd24sIE1FVEhfTywKLQkJCXNodXRkb3duX2RvY30sCisJeyJyZWN2IiwJICAoUHlDRnVuY3Rpb24pc29ja19yZWN2LCBNRVRIX1ZBUkFSR1MsCisJCQkgIHJlY3ZfZG9jfSwKKwl7InJlY3ZfYnVmIiwJICAoUHlDRnVuY3Rpb24pc29ja19yZWN2X2J1ZiwgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKKwkJCSAgcmVjdl9idWZfZG9jfSwKKwl7InJlY3Zmcm9tIiwJICAoUHlDRnVuY3Rpb24pc29ja19yZWN2ZnJvbSwgTUVUSF9WQVJBUkdTLAorCQkJICByZWN2ZnJvbV9kb2N9LAorCXsicmVjdmZyb21fYnVmIiwgIChQeUNGdW5jdGlvbilzb2NrX3JlY3Zmcm9tX2J1ZiwgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKKwkJCSAgcmVjdmZyb21fYnVmX2RvY30sCisJeyJzZW5kIiwJICAoUHlDRnVuY3Rpb24pc29ja19zZW5kLCBNRVRIX1ZBUkFSR1MsCisJCQkgIHNlbmRfZG9jfSwKKwl7InNlbmRhbGwiLAkgIChQeUNGdW5jdGlvbilzb2NrX3NlbmRhbGwsIE1FVEhfVkFSQVJHUywKKwkJCSAgc2VuZGFsbF9kb2N9LAorCXsic2VuZHRvIiwJICAoUHlDRnVuY3Rpb24pc29ja19zZW5kdG8sIE1FVEhfVkFSQVJHUywKKwkJCSAgc2VuZHRvX2RvY30sCisJeyJzZXRibG9ja2luZyIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfc2V0YmxvY2tpbmcsIE1FVEhfTywKKwkJCSAgc2V0YmxvY2tpbmdfZG9jfSwKKwl7InNldHRpbWVvdXQiLCAgICAoUHlDRnVuY3Rpb24pc29ja19zZXR0aW1lb3V0LCBNRVRIX08sCisJCQkgIHNldHRpbWVvdXRfZG9jfSwKKwl7ImdldHRpbWVvdXQiLCAgICAoUHlDRnVuY3Rpb24pc29ja19nZXR0aW1lb3V0LCBNRVRIX05PQVJHUywKKwkJCSAgZ2V0dGltZW91dF9kb2N9LAorCXsic2V0c29ja29wdCIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfc2V0c29ja29wdCwgTUVUSF9WQVJBUkdTLAorCQkJICBzZXRzb2Nrb3B0X2RvY30sCisJeyJzaHV0ZG93biIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfc2h1dGRvd24sIE1FVEhfTywKKwkJCSAgc2h1dGRvd25fZG9jfSwKICNpZmRlZiBSSVNDT1MKLQl7InNsZWVwdGFza3ciLAkoUHlDRnVuY3Rpb24pc29ja19zbGVlcHRhc2t3LCBNRVRIX08sCi0JIAkJc2xlZXB0YXNrd19kb2N9LAorCXsic2xlZXB0YXNrdyIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfc2xlZXB0YXNrdywgTUVUSF9PLAorCSAJCSAgc2xlZXB0YXNrd19kb2N9LAogI2VuZGlmCiAJe05VTEwsCQkJTlVMTH0JCS8qIHNlbnRpbmVsICovCiB9OwpAQCAtMzMzMyw3ICszNTQzLDkgQEAKICNlbmRpZgogI2lmZGVmIEhBVkVfSU5FVF9BVE9OCiAJc3RydWN0IGluX2FkZHIgYnVmOwotI2Vsc2UKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoSEFWRV9JTkVUX0FUT04pIHx8IGRlZmluZWQoVVNFX0lORVRfQVRPTl9XRUFLTElOSykKIAkvKiBIYXZlIHRvIHVzZSBpbmV0X2FkZHIoKSBpbnN0ZWFkICovCiAJdW5zaWduZWQgbG9uZyBwYWNrZWRfYWRkcjsKICNlbmRpZgpAQCAtMzM0NCw2ICszNTU2LDEwIEBACiAKIAogI2lmZGVmIEhBVkVfSU5FVF9BVE9OCisKKyNpZmRlZiBVU0VfSU5FVF9BVE9OX1dFQUtMSU5LCisgICAgaWYgKGluZXRfYXRvbiAhPSBOVUxMKSB7CisjZW5kaWYKIAlpZiAoaW5ldF9hdG9uKGlwX2FkZHIsICZidWYpKQogCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikoJmJ1ZiksCiAJCQkJCQkgIHNpemVvZihidWYpKTsKQEAgLTMzNTIsMTMgKzM1NjgsMjAgQEAKIAkJCSJpbGxlZ2FsIElQIGFkZHJlc3Mgc3RyaW5nIHBhc3NlZCB0byBpbmV0X2F0b24iKTsKIAlyZXR1cm4gTlVMTDsKIAotI2Vsc2UgLyogISBIQVZFX0lORVRfQVRPTiAqLworI2lmZGVmIFVTRV9JTkVUX0FUT05fV0VBS0xJTksKKyAgIH0gZWxzZSB7CisjZW5kaWYKKworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChIQVZFX0lORVRfQVRPTikgfHwgZGVmaW5lZChVU0VfSU5FVF9BVE9OX1dFQUtMSU5LKQorCiAJLyogc3BlY2lhbC1jYXNlIHRoaXMgYWRkcmVzcyBhcyBpbmV0X2FkZHIgbWlnaHQgcmV0dXJuIElOQUREUl9OT05FCiAJICogZm9yIHRoaXMgKi8KIAlpZiAoc3RyY21wKGlwX2FkZHIsICIyNTUuMjU1LjI1NS4yNTUiKSA9PSAwKSB7CiAJCXBhY2tlZF9hZGRyID0gMHhGRkZGRkZGRjsKIAl9IGVsc2UgewotCQorCiAJCXBhY2tlZF9hZGRyID0gaW5ldF9hZGRyKGlwX2FkZHIpOwogCiAJCWlmIChwYWNrZWRfYWRkciA9PSBJTkFERFJfTk9ORSkgewkvKiBpbnZhbGlkIGFkZHJlc3MgKi8KQEAgLTMzNjksNiArMzU5MiwxMSBAQAogCX0KIAlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikgJnBhY2tlZF9hZGRyLAogCQkJCQkgIHNpemVvZihwYWNrZWRfYWRkcikpOworCisjaWZkZWYgVVNFX0lORVRfQVRPTl9XRUFLTElOSworICAgfQorI2VuZGlmCisKICNlbmRpZgogfQogCkBAIC0zNDI4LDcgKzM2NTYsNyBAQAogCQkJCSJjYW4ndCB1c2UgQUZfSU5FVDYsIElQdjYgaXMgZGlzYWJsZWQiKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotI2VuZGlmIAorI2VuZGlmCiAKIAlyZXR2YWwgPSBpbmV0X3B0b24oYWYsIGlwLCBwYWNrZWQpOwogCWlmIChyZXR2YWwgPCAwKSB7CkBAIC0zNDUxLDcgKzM2NzksNyBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiB9Ci0JCisKIFB5RG9jX1NUUlZBUihpbmV0X250b3BfZG9jLAogImluZXRfbnRvcChhZiwgcGFja2VkX2lwKSAtPiBzdHJpbmcgZm9ybWF0dGVkIElQIGFkZHJlc3NcblwKIFxuXApAQCAtMzQ2OSw3ICszNjk3LDcgQEAKICNlbHNlCiAJY2hhciBpcFtJTkVUX0FERFJTVFJMRU4gKyAxXTsKICNlbmRpZgotCQorCiAJLyogR3VhcmFudGVlIE5VTC10ZXJtaW5hdGlvbiBmb3IgUHlTdHJpbmdfRnJvbVN0cmluZygpIGJlbG93ICovCiAJbWVtc2V0KCh2b2lkICopICZpcFswXSwgJ1wwJywgc2l6ZW9mKGlwKSk7CiAKQEAgLTM1NDcsNyArMzc3NSw3IEBACiAJfSBlbHNlIGlmIChQeVN0cmluZ19DaGVjayhob2JqKSkgewogCQlocHRyID0gUHlTdHJpbmdfQXNTdHJpbmcoaG9iaik7CiAJfSBlbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgCisJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAJCQkJImdldGFkZHJpbmZvKCkgYXJndW1lbnQgMSBtdXN0IGJlIHN0cmluZyBvciBOb25lIik7CiAJCXJldHVybiBOVUxMOwogCX0KZGlmZiAtLWdpdCBhL01vZHVsZXMvc3RydWN0bW9kdWxlLmMgYi9Nb2R1bGVzL3N0cnVjdG1vZHVsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzEzYzBjLi4wMDAwMDAwCi0tLSBhL01vZHVsZXMvc3RydWN0bW9kdWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkzICswLDAgQEAKLS8qIHN0cnVjdCBtb2R1bGUgLS0gcGFjayB2YWx1ZXMgaW50byBhbmQgKG91dCBvZikgc3RyaW5ncyAqLwotCi0vKiBOZXcgdmVyc2lvbiBzdXBwb3J0aW5nIGJ5dGUgb3JkZXIsIGFsaWdubWVudCBhbmQgc2l6ZSBvcHRpb25zLAotICAgY2hhcmFjdGVyIHN0cmluZ3MsIGFuZCB1bnNpZ25lZCBudW1iZXJzICovCi0KLSNpbmNsdWRlICJQeXRob24uaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotCi1QeURvY19TVFJWQVIoc3RydWN0X19kb2NfXywKLSJGdW5jdGlvbnMgdG8gY29udmVydCBiZXR3ZWVuIFB5dGhvbiB2YWx1ZXMgYW5kIEMgc3RydWN0cy5cblwKLVB5dGhvbiBzdHJpbmdzIGFyZSB1c2VkIHRvIGhvbGQgdGhlIGRhdGEgcmVwcmVzZW50aW5nIHRoZSBDIHN0cnVjdFxuXAotYW5kIGFsc28gYXMgZm9ybWF0IHN0cmluZ3MgdG8gZGVzY3JpYmUgdGhlIGxheW91dCBvZiBkYXRhIGluIHRoZSBDIHN0cnVjdC5cblwKLVxuXAotVGhlIG9wdGlvbmFsIGZpcnN0IGZvcm1hdCBjaGFyIGluZGljYXRlcyBieXRlIG9yZGVyLCBzaXplIGFuZCBhbGlnbm1lbnQ6XG5cCi0gQDogbmF0aXZlIG9yZGVyLCBzaXplICYgYWxpZ25tZW50IChkZWZhdWx0KVxuXAotID06IG5hdGl2ZSBvcmRlciwgc3RkLiBzaXplICYgYWxpZ25tZW50XG5cCi0gPDogbGl0dGxlLWVuZGlhbiwgc3RkLiBzaXplICYgYWxpZ25tZW50XG5cCi0gPjogYmlnLWVuZGlhbiwgc3RkLiBzaXplICYgYWxpZ25tZW50XG5cCi0gITogc2FtZSBhcyA+XG5cCi1cblwKLVRoZSByZW1haW5pbmcgY2hhcnMgaW5kaWNhdGUgdHlwZXMgb2YgYXJncyBhbmQgbXVzdCBtYXRjaCBleGFjdGx5O1xuXAotdGhlc2UgY2FuIGJlIHByZWNlZGVkIGJ5IGEgZGVjaW1hbCByZXBlYXQgY291bnQ6XG5cCi0geDogcGFkIGJ5dGUgKG5vIGRhdGEpOyBjOmNoYXI7IGI6c2lnbmVkIGJ5dGU7IEI6dW5zaWduZWQgYnl0ZTtcblwKLSBoOnNob3J0OyBIOnVuc2lnbmVkIHNob3J0OyBpOmludDsgSTp1bnNpZ25lZCBpbnQ7XG5cCi0gbDpsb25nOyBMOnVuc2lnbmVkIGxvbmc7IGY6ZmxvYXQ7IGQ6ZG91YmxlLlxuXAotU3BlY2lhbCBjYXNlcyAocHJlY2VkaW5nIGRlY2ltYWwgY291bnQgaW5kaWNhdGVzIGxlbmd0aCk6XG5cCi0gczpzdHJpbmcgKGFycmF5IG9mIGNoYXIpOyBwOiBwYXNjYWwgc3RyaW5nICh3aXRoIGNvdW50IGJ5dGUpLlxuXAotU3BlY2lhbCBjYXNlIChvbmx5IGF2YWlsYWJsZSBpbiBuYXRpdmUgZm9ybWF0KTpcblwKLSBQOmFuIGludGVnZXIgdHlwZSB0aGF0IGlzIHdpZGUgZW5vdWdoIHRvIGhvbGQgYSBwb2ludGVyLlxuXAotU3BlY2lhbCBjYXNlIChub3QgaW4gbmF0aXZlIG1vZGUgdW5sZXNzICdsb25nIGxvbmcnIGluIHBsYXRmb3JtIEMpOlxuXAotIHE6bG9uZyBsb25nOyBROnVuc2lnbmVkIGxvbmcgbG9uZ1xuXAotV2hpdGVzcGFjZSBiZXR3ZWVuIGZvcm1hdHMgaXMgaWdub3JlZC5cblwKLVxuXAotVGhlIHZhcmlhYmxlIHN0cnVjdC5lcnJvciBpcyBhbiBleGNlcHRpb24gcmFpc2VkIG9uIGVycm9ycy4iKTsKLQotCi0vKiBFeGNlcHRpb24gKi8KLQotc3RhdGljIFB5T2JqZWN0ICpTdHJ1Y3RFcnJvcjsKLQotCi0vKiBEZWZpbmUgdmFyaW91cyBzdHJ1Y3RzIHRvIGZpZ3VyZSBvdXQgdGhlIGFsaWdubWVudHMgb2YgdHlwZXMgKi8KLQotCi10eXBlZGVmIHN0cnVjdCB7IGNoYXIgYzsgc2hvcnQgeDsgfSBzdF9zaG9ydDsKLXR5cGVkZWYgc3RydWN0IHsgY2hhciBjOyBpbnQgeDsgfSBzdF9pbnQ7Ci10eXBlZGVmIHN0cnVjdCB7IGNoYXIgYzsgbG9uZyB4OyB9IHN0X2xvbmc7Ci10eXBlZGVmIHN0cnVjdCB7IGNoYXIgYzsgZmxvYXQgeDsgfSBzdF9mbG9hdDsKLXR5cGVkZWYgc3RydWN0IHsgY2hhciBjOyBkb3VibGUgeDsgfSBzdF9kb3VibGU7Ci10eXBlZGVmIHN0cnVjdCB7IGNoYXIgYzsgdm9pZCAqeDsgfSBzdF92b2lkX3A7Ci0KLSNkZWZpbmUgU0hPUlRfQUxJR04gKHNpemVvZihzdF9zaG9ydCkgLSBzaXplb2Yoc2hvcnQpKQotI2RlZmluZSBJTlRfQUxJR04gKHNpemVvZihzdF9pbnQpIC0gc2l6ZW9mKGludCkpCi0jZGVmaW5lIExPTkdfQUxJR04gKHNpemVvZihzdF9sb25nKSAtIHNpemVvZihsb25nKSkKLSNkZWZpbmUgRkxPQVRfQUxJR04gKHNpemVvZihzdF9mbG9hdCkgLSBzaXplb2YoZmxvYXQpKQotI2RlZmluZSBET1VCTEVfQUxJR04gKHNpemVvZihzdF9kb3VibGUpIC0gc2l6ZW9mKGRvdWJsZSkpCi0jZGVmaW5lIFZPSURfUF9BTElHTiAoc2l6ZW9mKHN0X3ZvaWRfcCkgLSBzaXplb2Yodm9pZCAqKSkKLQotLyogV2UgY2FuJ3Qgc3VwcG9ydCBxIGFuZCBRIGluIG5hdGl2ZSBtb2RlIHVubGVzcyB0aGUgY29tcGlsZXIgZG9lczsKLSAgIGluIHN0ZCBtb2RlLCB0aGV5J3JlIDggYnl0ZXMgb24gYWxsIHBsYXRmb3Jtcy4gKi8KLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotdHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIGM7IFBZX0xPTkdfTE9ORyB4OyB9IHNfbG9uZ19sb25nOwotI2RlZmluZSBMT05HX0xPTkdfQUxJR04gKHNpemVvZihzX2xvbmdfbG9uZykgLSBzaXplb2YoUFlfTE9OR19MT05HKSkKLSNlbmRpZgotCi0jZGVmaW5lIFNUUklOR0lGWSh4KSAgICAjeAotCi0jaWZkZWYgX19wb3dlcmMKLSNwcmFnbWEgb3B0aW9ucyBhbGlnbj1yZXNldAotI2VuZGlmCi0KLS8qIEhlbHBlciB0byBnZXQgYSBQeUxvbmdPYmplY3QgYnkgaG9vayBvciBieSBjcm9vay4gIENhbGxlciBzaG91bGQgZGVjcmVmLiAqLwotCi1zdGF0aWMgUHlPYmplY3QgKgotZ2V0X3B5bG9uZyhQeU9iamVjdCAqdikKLXsKLQlQeU51bWJlck1ldGhvZHMgKm07Ci0KLQlhc3NlcnQodiAhPSBOVUxMKTsKLQlpZiAoUHlJbnRfQ2hlY2sodikpCi0JCXJldHVybiBQeUxvbmdfRnJvbUxvbmcoUHlJbnRfQVNfTE9ORyh2KSk7Ci0JaWYgKFB5TG9uZ19DaGVjayh2KSkgewotCQlQeV9JTkNSRUYodik7Ci0JCXJldHVybiB2OwotCX0KLQltID0gdi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOwotCWlmIChtICE9IE5VTEwgJiYgbS0+bmJfbG9uZyAhPSBOVUxMKSB7Ci0JCXYgPSBtLT5uYl9sb25nKHYpOwotCQlpZiAodiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChQeUxvbmdfQ2hlY2sodikpCi0JCQlyZXR1cm4gdjsKLQkJUHlfREVDUkVGKHYpOwotCX0KLQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkiY2Fubm90IGNvbnZlcnQgYXJndW1lbnQgdG8gbG9uZyIpOwotCXJldHVybiBOVUxMOwotfQotCi0vKiBIZWxwZXIgcm91dGluZSB0byBnZXQgYSBQeXRob24gaW50ZWdlciBhbmQgcmFpc2UgdGhlIGFwcHJvcHJpYXRlIGVycm9yCi0gICBpZiBpdCBpc24ndCBvbmUgKi8KLQotc3RhdGljIGludAotZ2V0X2xvbmcoUHlPYmplY3QgKnYsIGxvbmcgKnApCi17Ci0JbG9uZyB4ID0gUHlJbnRfQXNMb25nKHYpOwotCWlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKLQkJCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkJInJlcXVpcmVkIGFyZ3VtZW50IGlzIG5vdCBhbiBpbnRlZ2VyIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JKnAgPSB4OwotCXJldHVybiAwOwotfQotCi0KLS8qIFNhbWUsIGJ1dCBoYW5kbGluZyB1bnNpZ25lZCBsb25nICovCi0KLXN0YXRpYyBpbnQKLWdldF91bG9uZyhQeU9iamVjdCAqdiwgdW5zaWduZWQgbG9uZyAqcCkKLXsKLQlpZiAoUHlMb25nX0NoZWNrKHYpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgeCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyh2KTsKLQkJaWYgKHggPT0gKHVuc2lnbmVkIGxvbmcpKC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCQkqcCA9IHg7Ci0JCXJldHVybiAwOwotCX0KLQllbHNlIHsKLQkJcmV0dXJuIGdldF9sb25nKHYsIChsb25nICopcCk7Ci0JfQotfQotCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLQotLyogU2FtZSwgYnV0IGhhbmRsaW5nIG5hdGl2ZSBsb25nIGxvbmcuICovCi0KLXN0YXRpYyBpbnQKLWdldF9sb25nbG9uZyhQeU9iamVjdCAqdiwgUFlfTE9OR19MT05HICpwKQotewotCVBZX0xPTkdfTE9ORyB4OwotCi0JdiA9IGdldF9weWxvbmcodik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWFzc2VydChQeUxvbmdfQ2hlY2sodikpOwotCXggPSBQeUxvbmdfQXNMb25nTG9uZyh2KTsKLQlQeV9ERUNSRUYodik7Ci0JaWYgKHggPT0gKFBZX0xPTkdfTE9ORyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gLTE7Ci0JKnAgPSB4OwotCXJldHVybiAwOwotfQotCi0vKiBTYW1lLCBidXQgaGFuZGxpbmcgbmF0aXZlIHVuc2lnbmVkIGxvbmcgbG9uZy4gKi8KLQotc3RhdGljIGludAotZ2V0X3Vsb25nbG9uZyhQeU9iamVjdCAqdiwgdW5zaWduZWQgUFlfTE9OR19MT05HICpwKQotewotCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyB4OwotCi0JdiA9IGdldF9weWxvbmcodik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWFzc2VydChQeUxvbmdfQ2hlY2sodikpOwotCXggPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nKHYpOwotCVB5X0RFQ1JFRih2KTsKLQlpZiAoeCA9PSAodW5zaWduZWQgUFlfTE9OR19MT05HKS0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiAtMTsKLQkqcCA9IHg7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgotCi0vKiBGbG9hdGluZyBwb2ludCBoZWxwZXJzICovCi0KLXN0YXRpYyBQeU9iamVjdCAqCi11bnBhY2tfZmxvYXQoY29uc3QgY2hhciAqcCwgIC8qIHN0YXJ0IG9mIDQtYnl0ZSBzdHJpbmcgKi8KLSAgICAgICAgICAgICBpbnQgbGUpCSAgICAgLyogdHJ1ZSBmb3IgbGl0dGxlLWVuZGlhbiwgZmFsc2UgZm9yIGJpZy1lbmRpYW4gKi8KLXsKLQlkb3VibGUgeDsKLQotCXggPSBfUHlGbG9hdF9VbnBhY2s0KCh1bnNpZ25lZCBjaGFyICopcCwgbGUpOwotCWlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh4KTsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLXVucGFja19kb3VibGUoY29uc3QgY2hhciAqcCwgIC8qIHN0YXJ0IG9mIDgtYnl0ZSBzdHJpbmcgKi8KLSAgICAgICAgICAgICAgaW50IGxlKSAgICAgICAgIC8qIHRydWUgZm9yIGxpdHRsZS1lbmRpYW4sIGZhbHNlIGZvciBiaWctZW5kaWFuICovCi17Ci0JZG91YmxlIHg7Ci0KLQl4ID0gX1B5RmxvYXRfVW5wYWNrOCgodW5zaWduZWQgY2hhciAqKXAsIGxlKTsKLQlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7Ci19Ci0KLQotLyogVGhlIHRyYW5zbGF0aW9uIGZ1bmN0aW9uIGZvciBlYWNoIGZvcm1hdCBjaGFyYWN0ZXIgaXMgdGFibGUgZHJpdmVuICovCi0KLXR5cGVkZWYgc3RydWN0IF9mb3JtYXRkZWYgewotCWNoYXIgZm9ybWF0OwotCWludCBzaXplOwotCWludCBhbGlnbm1lbnQ7Ci0JUHlPYmplY3QqICgqdW5wYWNrKShjb25zdCBjaGFyICosCi0JCQkgICAgY29uc3Qgc3RydWN0IF9mb3JtYXRkZWYgKik7Ci0JaW50ICgqcGFjaykoY2hhciAqLCBQeU9iamVjdCAqLAotCQkgICAgY29uc3Qgc3RydWN0IF9mb3JtYXRkZWYgKik7Ci19IGZvcm1hdGRlZjsKLQotLyogQSBsYXJnZSBudW1iZXIgb2Ygc21hbGwgcm91dGluZXMgZm9sbG93LCB3aXRoIG5hbWVzIG9mIHRoZSBmb3JtCi0KLQlbYmxuXVt1cF1fVFlQRQotCi0gICBbYmxuXSBkaXN0aWd1aXNoZXMgYW1vbmcgYmlnLWVuZGlhbiwgbGl0dGxlLWVuZGlhbiBhbmQgbmF0aXZlLgotICAgW3B1XSBkaXN0aWd1aXNoZXMgYmV0d2VlbiBwYWNrICh0byBzdHJ1Y3QpIGFuZCB1bnBhY2sgKGZyb20gc3RydWN0KS4KLSAgIFRZUEUgaXMgb25lIG9mIGNoYXIsIGJ5dGUsIHVieXRlLCBldGMuCi0qLwotCi0vKiBOYXRpdmUgbW9kZSByb3V0aW5lcy4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIE5PVEU6Ci0gICBJbiBhbGwgblt1cF1fPHR5cGU+IHJvdXRpbmVzIGhhbmRsaW5nIHR5cGVzIGxhcmdlciB0aGFuIDEgYnl0ZSwgdGhlcmUgaXMKLSAgICpubyogZ3VhcmFudGVlIHRoYXQgdGhlIHAgcG9pbnRlciBpcyBwcm9wZXJseSBhbGlnbmVkIGZvciBlYWNoIHR5cGUsCi0gICB0aGVyZWZvcmUgbWVtY3B5IGlzIGNhbGxlZC4gIEFuIGludGVybWVkaWF0ZSB2YXJpYWJsZSBpcyB1c2VkIHRvCi0gICBjb21wZW5zYXRlIGZvciBiaWctZW5kaWFuIGFyY2hpdGVjdHVyZXMuCi0gICBOb3JtYWxseSBib3RoIHRoZSBpbnRlcm1lZGlhdGUgdmFyaWFibGUgYW5kIHRoZSBtZW1jcHkgY2FsbCB3aWxsIGJlCi0gICBza2lwcGVkIGJ5IEMgb3B0aW1pc2F0aW9uIGluIGxpdHRsZS1lbmRpYW4gYXJjaGl0ZWN0dXJlcyAoZ2NjID49IDIuOTEKLSAgIGRvZXMgdGhpcykuICovCi0KLXN0YXRpYyBQeU9iamVjdCAqCi1udV9jaGFyKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocCwgMSk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1udV9ieXRlKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpICooc2lnbmVkIGNoYXIgKilwKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLW51X3VieXRlKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpICoodW5zaWduZWQgY2hhciAqKXApOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotbnVfc2hvcnQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCXNob3J0IHg7Ci0JbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpeCk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1udV91c2hvcnQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCXVuc2lnbmVkIHNob3J0IHg7Ci0JbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpeCk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1udV9pbnQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCWludCB4OwotCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotbnVfdWludChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JdW5zaWduZWQgaW50IHg7Ci0JbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKLQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKHVuc2lnbmVkIGxvbmcpeCk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1udV9sb25nKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlsb25nIHg7Ci0JbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoeCk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1udV91bG9uZyhjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JdW5zaWduZWQgbG9uZyB4OwotCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHgpOwotfQotCi0vKiBOYXRpdmUgbW9kZSBkb2Vzbid0IHN1cHBvcnQgcSBvciBRIHVubGVzcyB0aGUgcGxhdGZvcm0gQyBzdXBwb3J0cwotICAgbG9uZyBsb25nIChvciwgb24gV2luZG93cywgX19pbnQ2NCkuICovCi0KLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCi1zdGF0aWMgUHlPYmplY3QgKgotbnVfbG9uZ2xvbmcoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCVBZX0xPTkdfTE9ORyB4OwotCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoeCk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1udV91bG9uZ2xvbmcoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyB4OwotCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyh4KTsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyBQeU9iamVjdCAqCi1udV9mbG9hdChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JZmxvYXQgeDsKLQltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOwotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoKGRvdWJsZSl4KTsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLW51X2RvdWJsZShjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JZG91YmxlIHg7Ci0JbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotbnVfdm9pZF9wKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQl2b2lkICp4OwotCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVm9pZFB0cih4KTsKLX0KLQotc3RhdGljIGludAotbnBfYnl0ZShjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCWxvbmcgeDsKLQlpZiAoZ2V0X2xvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOwotCWlmICh4IDwgLTEyOCB8fCB4ID4gMTI3KXsKLQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCSJieXRlIGZvcm1hdCByZXF1aXJlcyAtMTI4PD1udW1iZXI8PTEyNyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCSpwID0gKGNoYXIpeDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbnBfdWJ5dGUoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlsb25nIHg7Ci0JaWYgKGdldF9sb25nKHYsICZ4KSA8IDApCi0JCXJldHVybiAtMTsKLQlpZiAoeCA8IDAgfHwgeCA+IDI1NSl7Ci0JCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkidWJ5dGUgZm9ybWF0IHJlcXVpcmVzIDA8PW51bWJlcjw9MjU1Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JKnAgPSAoY2hhcil4OwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1ucF9jaGFyKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JaWYgKCFQeVN0cmluZ19DaGVjayh2KSB8fCBQeVN0cmluZ19TaXplKHYpICE9IDEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCSJjaGFyIGZvcm1hdCByZXF1aXJlIHN0cmluZyBvZiBsZW5ndGggMSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCSpwID0gKlB5U3RyaW5nX0FzU3RyaW5nKHYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1ucF9zaG9ydChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCWxvbmcgeDsKLQlzaG9ydCB5OwotCWlmIChnZXRfbG9uZyh2LCAmeCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JaWYgKHggPCBTSFJUX01JTiB8fCB4ID4gU0hSVF9NQVgpewotCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkJInNob3J0IGZvcm1hdCByZXF1aXJlcyAiIFNUUklOR0lGWShTSFJUX01JTikKLQkJCQkiPD1udW1iZXI8PSIgU1RSSU5HSUZZKFNIUlRfTUFYKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JeSA9IChzaG9ydCl4OwotCW1lbWNweShwLCAoY2hhciAqKSZ5LCBzaXplb2YgeSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5wX3VzaG9ydChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCWxvbmcgeDsKLQl1bnNpZ25lZCBzaG9ydCB5OwotCWlmIChnZXRfbG9uZyh2LCAmeCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JaWYgKHggPCAwIHx8IHggPiBVU0hSVF9NQVgpewotCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkJInNob3J0IGZvcm1hdCByZXF1aXJlcyAwPD1udW1iZXI8PSIgU1RSSU5HSUZZKFVTSFJUX01BWCkpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXkgPSAodW5zaWduZWQgc2hvcnQpeDsKLQltZW1jcHkocCwgKGNoYXIgKikmeSwgc2l6ZW9mIHkpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1ucF9pbnQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlsb25nIHg7Ci0JaW50IHk7Ci0JaWYgKGdldF9sb25nKHYsICZ4KSA8IDApCi0JCXJldHVybiAtMTsKLQl5ID0gKGludCl4OwotCW1lbWNweShwLCAoY2hhciAqKSZ5LCBzaXplb2YgeSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5wX3VpbnQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQl1bnNpZ25lZCBsb25nIHg7Ci0JdW5zaWduZWQgaW50IHk7Ci0JaWYgKGdldF91bG9uZyh2LCAmeCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JeSA9ICh1bnNpZ25lZCBpbnQpeDsKLQltZW1jcHkocCwgKGNoYXIgKikmeSwgc2l6ZW9mIHkpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1ucF9sb25nKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JbG9uZyB4OwotCWlmIChnZXRfbG9uZyh2LCAmeCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JbWVtY3B5KHAsIChjaGFyICopJngsIHNpemVvZiB4KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbnBfdWxvbmcoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQl1bnNpZ25lZCBsb25nIHg7Ci0JaWYgKGdldF91bG9uZyh2LCAmeCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JbWVtY3B5KHAsIChjaGFyICopJngsIHNpemVvZiB4KTsKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIEhBVkVfTE9OR19MT05HCi0KLXN0YXRpYyBpbnQKLW5wX2xvbmdsb25nKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JUFlfTE9OR19MT05HIHg7Ci0JaWYgKGdldF9sb25nbG9uZyh2LCAmeCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JbWVtY3B5KHAsIChjaGFyICopJngsIHNpemVvZiB4KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbnBfdWxvbmdsb25nKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JdW5zaWduZWQgUFlfTE9OR19MT05HIHg7Ci0JaWYgKGdldF91bG9uZ2xvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOwotCW1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YgeCk7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludAotbnBfZmxvYXQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlmbG9hdCB4ID0gKGZsb2F0KVB5RmxvYXRfQXNEb3VibGUodik7Ci0JaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkJInJlcXVpcmVkIGFyZ3VtZW50IGlzIG5vdCBhIGZsb2F0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JbWVtY3B5KHAsIChjaGFyICopJngsIHNpemVvZiB4KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbnBfZG91YmxlKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOwotCWlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCSJyZXF1aXJlZCBhcmd1bWVudCBpcyBub3QgYSBmbG9hdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCW1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YoZG91YmxlKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW5wX3ZvaWRfcChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCXZvaWQgKng7Ci0KLQl2ID0gZ2V0X3B5bG9uZyh2KTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JYXNzZXJ0KFB5TG9uZ19DaGVjayh2KSk7Ci0JeCA9IFB5TG9uZ19Bc1ZvaWRQdHIodik7Ci0JUHlfREVDUkVGKHYpOwotCWlmICh4ID09IE5VTEwgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIC0xOwotCW1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YgeCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBmb3JtYXRkZWYgbmF0aXZlX3RhYmxlW10gPSB7Ci0Jeyd4JywJc2l6ZW9mKGNoYXIpLAkwLAkJTlVMTH0sCi0JeydiJywJc2l6ZW9mKGNoYXIpLAkwLAkJbnVfYnl0ZSwJbnBfYnl0ZX0sCi0JeydCJywJc2l6ZW9mKGNoYXIpLAkwLAkJbnVfdWJ5dGUsCW5wX3VieXRlfSwKLQl7J2MnLAlzaXplb2YoY2hhciksCTAsCQludV9jaGFyLAlucF9jaGFyfSwKLQl7J3MnLAlzaXplb2YoY2hhciksCTAsCQlOVUxMfSwKLQl7J3AnLAlzaXplb2YoY2hhciksCTAsCQlOVUxMfSwKLQl7J2gnLAlzaXplb2Yoc2hvcnQpLAlTSE9SVF9BTElHTiwJbnVfc2hvcnQsCW5wX3Nob3J0fSwKLQl7J0gnLAlzaXplb2Yoc2hvcnQpLAlTSE9SVF9BTElHTiwJbnVfdXNob3J0LAlucF91c2hvcnR9LAotCXsnaScsCXNpemVvZihpbnQpLAlJTlRfQUxJR04sCW51X2ludCwJCW5wX2ludH0sCi0JeydJJywJc2l6ZW9mKGludCksCUlOVF9BTElHTiwJbnVfdWludCwJbnBfdWludH0sCi0JeydsJywJc2l6ZW9mKGxvbmcpLAlMT05HX0FMSUdOLAludV9sb25nLAlucF9sb25nfSwKLQl7J0wnLAlzaXplb2YobG9uZyksCUxPTkdfQUxJR04sCW51X3Vsb25nLAlucF91bG9uZ30sCi0JeydmJywJc2l6ZW9mKGZsb2F0KSwJRkxPQVRfQUxJR04sCW51X2Zsb2F0LAlucF9mbG9hdH0sCi0JeydkJywJc2l6ZW9mKGRvdWJsZSksCURPVUJMRV9BTElHTiwJbnVfZG91YmxlLAlucF9kb3VibGV9LAotCXsnUCcsCXNpemVvZih2b2lkICopLAlWT0lEX1BfQUxJR04sCW51X3ZvaWRfcCwJbnBfdm9pZF9wfSwKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCXsncScsCXNpemVvZihQWV9MT05HX0xPTkcpLCBMT05HX0xPTkdfQUxJR04sIG51X2xvbmdsb25nLCBucF9sb25nbG9uZ30sCi0JeydRJywJc2l6ZW9mKFBZX0xPTkdfTE9ORyksIExPTkdfTE9OR19BTElHTiwgbnVfdWxvbmdsb25nLG5wX3Vsb25nbG9uZ30sCi0jZW5kaWYKLQl7MH0KLX07Ci0KLS8qIEJpZy1lbmRpYW4gcm91dGluZXMuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgUHlPYmplY3QgKgotYnVfaW50KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlsb25nIHggPSAwOwotCWludCBpID0gZi0+c2l6ZTsKLQlkbyB7Ci0JCXggPSAoeDw8OCkgfCAoKnArKyAmIDB4RkYpOwotCX0gd2hpbGUgKC0taSA+IDApOwotCS8qIEV4dGVuZCB0aGUgc2lnbiBiaXQuICovCi0JaWYgKFNJWkVPRl9MT05HID4gZi0+c2l6ZSkKLQkJeCB8PSAtKHggJiAoMUwgPDwgKDgqZi0+c2l6ZSAtIDEpKSk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotYnVfdWludChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JdW5zaWduZWQgbG9uZyB4ID0gMDsKLQlpbnQgaSA9IGYtPnNpemU7Ci0JZG8gewotCQl4ID0gKHg8PDgpIHwgKCpwKysgJiAweEZGKTsKLQl9IHdoaWxlICgtLWkgPiAwKTsKLQlpZiAoZi0+c2l6ZSA+PSA0KQotCQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoeCk7Ci0JZWxzZQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpeCk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1idV9sb25nbG9uZyhjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JcmV0dXJuIF9QeUxvbmdfRnJvbUJ5dGVBcnJheSgoY29uc3QgdW5zaWduZWQgY2hhciAqKXAsCi0JCQkJICAgICAgOCwKLQkJCQkgICAgICAwLCAvKiBsaXR0bGUtZW5kaWFuICovCi0JCQkJICAgICAgMSAgLyogc2lnbmVkICovKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLWJ1X3Vsb25nbG9uZyhjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JcmV0dXJuIF9QeUxvbmdfRnJvbUJ5dGVBcnJheSgoY29uc3QgdW5zaWduZWQgY2hhciAqKXAsCi0JCQkJICAgICAgOCwKLQkJCQkgICAgICAwLCAvKiBsaXR0bGUtZW5kaWFuICovCi0JCQkJICAgICAgMCAgLyogc2lnbmVkICovKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLWJ1X2Zsb2F0KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlyZXR1cm4gdW5wYWNrX2Zsb2F0KHAsIDApOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotYnVfZG91YmxlKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlyZXR1cm4gdW5wYWNrX2RvdWJsZShwLCAwKTsKLX0KLQotc3RhdGljIGludAotYnBfaW50KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JbG9uZyB4OwotCWludCBpOwotCWlmIChnZXRfbG9uZyh2LCAmeCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JaSA9IGYtPnNpemU7Ci0JZG8gewotCQlwWy0taV0gPSAoY2hhcil4OwotCQl4ID4+PSA4OwotCX0gd2hpbGUgKGkgPiAwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotYnBfdWludChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCXVuc2lnbmVkIGxvbmcgeDsKLQlpbnQgaTsKLQlpZiAoZ2V0X3Vsb25nKHYsICZ4KSA8IDApCi0JCXJldHVybiAtMTsKLQlpID0gZi0+c2l6ZTsKLQlkbyB7Ci0JCXBbLS1pXSA9IChjaGFyKXg7Ci0JCXggPj49IDg7Ci0JfSB3aGlsZSAoaSA+IDApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1icF9sb25nbG9uZyhjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCWludCByZXM7Ci0JdiA9IGdldF9weWxvbmcodik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCXJlcyA9IF9QeUxvbmdfQXNCeXRlQXJyYXkoKFB5TG9uZ09iamVjdCAqKXYsCi0JCQkgICAJICAodW5zaWduZWQgY2hhciAqKXAsCi0JCQkJICA4LAotCQkJCSAgMCwgLyogbGl0dGxlX2VuZGlhbiAqLwotCQkJCSAgMSAgLyogc2lnbmVkICovKTsKLQlQeV9ERUNSRUYodik7Ci0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGludAotYnBfdWxvbmdsb25nKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JaW50IHJlczsKLQl2ID0gZ2V0X3B5bG9uZyh2KTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JcmVzID0gX1B5TG9uZ19Bc0J5dGVBcnJheSgoUHlMb25nT2JqZWN0ICopdiwKLQkJCSAgIAkgICh1bnNpZ25lZCBjaGFyICopcCwKLQkJCQkgIDgsCi0JCQkJICAwLCAvKiBsaXR0bGVfZW5kaWFuICovCi0JCQkJICAwICAvKiBzaWduZWQgKi8pOwotCVB5X0RFQ1JFRih2KTsKLQlyZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgaW50Ci1icF9mbG9hdChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCWRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkicmVxdWlyZWQgYXJndW1lbnQgaXMgbm90IGEgZmxvYXQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gX1B5RmxvYXRfUGFjazQoeCwgKHVuc2lnbmVkIGNoYXIgKilwLCAwKTsKLX0KLQotc3RhdGljIGludAotYnBfZG91YmxlKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOwotCWlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCSJyZXF1aXJlZCBhcmd1bWVudCBpcyBub3QgYSBmbG9hdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBfUHlGbG9hdF9QYWNrOCh4LCAodW5zaWduZWQgY2hhciAqKXAsIDApOwotfQotCi1zdGF0aWMgZm9ybWF0ZGVmIGJpZ2VuZGlhbl90YWJsZVtdID0gewotCXsneCcsCTEsCQkwLAkJTlVMTH0sCi0JeydiJywJMSwJCTAsCQlidV9pbnQsCQlicF9pbnR9LAotCXsnQicsCTEsCQkwLAkJYnVfdWludCwJYnBfaW50fSwKLQl7J2MnLAkxLAkJMCwJCW51X2NoYXIsCW5wX2NoYXJ9LAotCXsncycsCTEsCQkwLAkJTlVMTH0sCi0JeydwJywJMSwJCTAsCQlOVUxMfSwKLQl7J2gnLAkyLAkJMCwJCWJ1X2ludCwJCWJwX2ludH0sCi0JeydIJywJMiwJCTAsCQlidV91aW50LAlicF91aW50fSwKLQl7J2knLAk0LAkJMCwJCWJ1X2ludCwJCWJwX2ludH0sCi0JeydJJywJNCwJCTAsCQlidV91aW50LAlicF91aW50fSwKLQl7J2wnLAk0LAkJMCwJCWJ1X2ludCwJCWJwX2ludH0sCi0JeydMJywJNCwJCTAsCQlidV91aW50LAlicF91aW50fSwKLQl7J3EnLAk4LAkJMCwJCWJ1X2xvbmdsb25nLAlicF9sb25nbG9uZ30sCi0JeydRJywJOCwJCTAsCQlidV91bG9uZ2xvbmcsCWJwX3Vsb25nbG9uZ30sCi0JeydmJywJNCwJCTAsCQlidV9mbG9hdCwJYnBfZmxvYXR9LAotCXsnZCcsCTgsCQkwLAkJYnVfZG91YmxlLAlicF9kb3VibGV9LAotCXswfQotfTsKLQotLyogTGl0dGxlLWVuZGlhbiByb3V0aW5lcy4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBQeU9iamVjdCAqCi1sdV9pbnQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCWxvbmcgeCA9IDA7Ci0JaW50IGkgPSBmLT5zaXplOwotCWRvIHsKLQkJeCA9ICh4PDw4KSB8IChwWy0taV0gJiAweEZGKTsKLQl9IHdoaWxlIChpID4gMCk7Ci0JLyogRXh0ZW5kIHRoZSBzaWduIGJpdC4gKi8KLQlpZiAoU0laRU9GX0xPTkcgPiBmLT5zaXplKQotCQl4IHw9IC0oeCAmICgxTCA8PCAoOCpmLT5zaXplIC0gMSkpKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoeCk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1sdV91aW50KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQl1bnNpZ25lZCBsb25nIHggPSAwOwotCWludCBpID0gZi0+c2l6ZTsKLQlkbyB7Ci0JCXggPSAoeDw8OCkgfCAocFstLWldICYgMHhGRik7Ci0JfSB3aGlsZSAoaSA+IDApOwotCWlmIChmLT5zaXplID49IDQpCi0JCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh4KTsKLQllbHNlCi0JCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl4KTsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICoKLWx1X2xvbmdsb25nKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlyZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KChjb25zdCB1bnNpZ25lZCBjaGFyICopcCwKLQkJCQkgICAgICA4LAotCQkJCSAgICAgIDEsIC8qIGxpdHRsZS1lbmRpYW4gKi8KLQkJCQkgICAgICAxICAvKiBzaWduZWQgKi8pOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotbHVfdWxvbmdsb25nKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlyZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KChjb25zdCB1bnNpZ25lZCBjaGFyICopcCwKLQkJCQkgICAgICA4LAotCQkJCSAgICAgIDEsIC8qIGxpdHRsZS1lbmRpYW4gKi8KLQkJCQkgICAgICAwICAvKiBzaWduZWQgKi8pOwotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotbHVfZmxvYXQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCXJldHVybiB1bnBhY2tfZmxvYXQocCwgMSk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1sdV9kb3VibGUoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCXJldHVybiB1bnBhY2tfZG91YmxlKHAsIDEpOwotfQotCi1zdGF0aWMgaW50Ci1scF9pbnQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlsb25nIHg7Ci0JaW50IGk7Ci0JaWYgKGdldF9sb25nKHYsICZ4KSA8IDApCi0JCXJldHVybiAtMTsKLQlpID0gZi0+c2l6ZTsKLQlkbyB7Ci0JCSpwKysgPSAoY2hhcil4OwotCQl4ID4+PSA4OwotCX0gd2hpbGUgKC0taSA+IDApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1scF91aW50KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JdW5zaWduZWQgbG9uZyB4OwotCWludCBpOwotCWlmIChnZXRfdWxvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOwotCWkgPSBmLT5zaXplOwotCWRvIHsKLQkJKnArKyA9IChjaGFyKXg7Ci0JCXggPj49IDg7Ci0JfSB3aGlsZSAoLS1pID4gMCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWxwX2xvbmdsb25nKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JaW50IHJlczsKLQl2ID0gZ2V0X3B5bG9uZyh2KTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JcmVzID0gX1B5TG9uZ19Bc0J5dGVBcnJheSgoUHlMb25nT2JqZWN0Kil2LAotCQkJICAgCSAgKHVuc2lnbmVkIGNoYXIgKilwLAotCQkJCSAgOCwKLQkJCQkgIDEsIC8qIGxpdHRsZV9lbmRpYW4gKi8KLQkJCQkgIDEgIC8qIHNpZ25lZCAqLyk7Ci0JUHlfREVDUkVGKHYpOwotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQKLWxwX3Vsb25nbG9uZyhjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCWludCByZXM7Ci0JdiA9IGdldF9weWxvbmcodik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCXJlcyA9IF9QeUxvbmdfQXNCeXRlQXJyYXkoKFB5TG9uZ09iamVjdCopdiwKLQkJCSAgIAkgICh1bnNpZ25lZCBjaGFyICopcCwKLQkJCQkgIDgsCi0JCQkJICAxLCAvKiBsaXR0bGVfZW5kaWFuICovCi0JCQkJICAwICAvKiBzaWduZWQgKi8pOwotCVB5X0RFQ1JFRih2KTsKLQlyZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgaW50Ci1scF9mbG9hdChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQotewotCWRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkicmVxdWlyZWQgYXJndW1lbnQgaXMgbm90IGEgZmxvYXQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gX1B5RmxvYXRfUGFjazQoeCwgKHVuc2lnbmVkIGNoYXIgKilwLCAxKTsKLX0KLQotc3RhdGljIGludAotbHBfZG91YmxlKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOwotCWlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCSJyZXF1aXJlZCBhcmd1bWVudCBpcyBub3QgYSBmbG9hdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBfUHlGbG9hdF9QYWNrOCh4LCAodW5zaWduZWQgY2hhciAqKXAsIDEpOwotfQotCi1zdGF0aWMgZm9ybWF0ZGVmIGxpbGVuZGlhbl90YWJsZVtdID0gewotCXsneCcsCTEsCQkwLAkJTlVMTH0sCi0JeydiJywJMSwJCTAsCQlsdV9pbnQsCQlscF9pbnR9LAotCXsnQicsCTEsCQkwLAkJbHVfdWludCwJbHBfaW50fSwKLQl7J2MnLAkxLAkJMCwJCW51X2NoYXIsCW5wX2NoYXJ9LAotCXsncycsCTEsCQkwLAkJTlVMTH0sCi0JeydwJywJMSwJCTAsCQlOVUxMfSwKLQl7J2gnLAkyLAkJMCwJCWx1X2ludCwJCWxwX2ludH0sCi0JeydIJywJMiwJCTAsCQlsdV91aW50LAlscF91aW50fSwKLQl7J2knLAk0LAkJMCwJCWx1X2ludCwJCWxwX2ludH0sCi0JeydJJywJNCwJCTAsCQlsdV91aW50LAlscF91aW50fSwKLQl7J2wnLAk0LAkJMCwJCWx1X2ludCwJCWxwX2ludH0sCi0JeydMJywJNCwJCTAsCQlsdV91aW50LAlscF91aW50fSwKLQl7J3EnLAk4LAkJMCwJCWx1X2xvbmdsb25nLAlscF9sb25nbG9uZ30sCi0JeydRJywJOCwJCTAsCQlsdV91bG9uZ2xvbmcsCWxwX3Vsb25nbG9uZ30sCi0JeydmJywJNCwJCTAsCQlsdV9mbG9hdCwJbHBfZmxvYXR9LAotCXsnZCcsCTgsCQkwLAkJbHVfZG91YmxlLAlscF9kb3VibGV9LAotCXswfQotfTsKLQotCi1zdGF0aWMgY29uc3QgZm9ybWF0ZGVmICoKLXdoaWNodGFibGUoY2hhciAqKnBmbXQpCi17Ci0JY29uc3QgY2hhciAqZm10ID0gKCpwZm10KSsrOyAvKiBNYXkgYmUgYmFja2VkIG91dCBvZiBsYXRlciAqLwotCXN3aXRjaCAoKmZtdCkgewotCWNhc2UgJzwnOgotCQlyZXR1cm4gbGlsZW5kaWFuX3RhYmxlOwotCWNhc2UgJz4nOgotCWNhc2UgJyEnOiAvKiBOZXR3b3JrIGJ5dGUgb3JkZXIgaXMgYmlnLWVuZGlhbiAqLwotCQlyZXR1cm4gYmlnZW5kaWFuX3RhYmxlOwotCWNhc2UgJz0nOiB7IC8qIEhvc3QgYnl0ZSBvcmRlciAtLSBkaWZmZXJlbnQgZnJvbSBuYXRpdmUgaW4gYWxpZ21lbnQhICovCi0JCWludCBuID0gMTsKLQkJY2hhciAqcCA9IChjaGFyICopICZuOwotCQlpZiAoKnAgPT0gMSkKLQkJCXJldHVybiBsaWxlbmRpYW5fdGFibGU7Ci0JCWVsc2UKLQkJCXJldHVybiBiaWdlbmRpYW5fdGFibGU7Ci0JfQotCWRlZmF1bHQ6Ci0JCS0tKnBmbXQ7IC8qIEJhY2sgb3V0IG9mIHBvaW50ZXIgaW5jcmVtZW50ICovCi0JCS8qIEZhbGwgdGhyb3VnaCAqLwotCWNhc2UgJ0AnOgotCQlyZXR1cm4gbmF0aXZlX3RhYmxlOwotCX0KLX0KLQotCi0vKiBHZXQgdGhlIHRhYmxlIGVudHJ5IGZvciBhIGZvcm1hdCBjb2RlICovCi0KLXN0YXRpYyBjb25zdCBmb3JtYXRkZWYgKgotZ2V0ZW50cnkoaW50IGMsIGNvbnN0IGZvcm1hdGRlZiAqZikKLXsKLQlmb3IgKDsgZi0+Zm9ybWF0ICE9ICdcMCc7IGYrKykgewotCQlpZiAoZi0+Zm9ybWF0ID09IGMpIHsKLQkJCXJldHVybiBmOwotCQl9Ci0JfQotCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwgImJhZCBjaGFyIGluIHN0cnVjdCBmb3JtYXQiKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotCi0vKiBBbGlnbiBhIHNpemUgYWNjb3JkaW5nIHRvIGEgZm9ybWF0IGNvZGUgKi8KLQotc3RhdGljIGludAotYWxpZ24oaW50IHNpemUsIGludCBjLCBjb25zdCBmb3JtYXRkZWYgKmUpCi17Ci0JaWYgKGUtPmZvcm1hdCA9PSBjKSB7Ci0JCWlmIChlLT5hbGlnbm1lbnQpIHsKLQkJCXNpemUgPSAoKHNpemUgKyBlLT5hbGlnbm1lbnQgLSAxKQotCQkJCS8gZS0+YWxpZ25tZW50KQotCQkJCSogZS0+YWxpZ25tZW50OwotCQl9Ci0JfQotCXJldHVybiBzaXplOwotfQotCi0KLS8qIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiBhIGZvcm1hdCBzdHJpbmcgKi8KLQotc3RhdGljIGludAotY2FsY3NpemUoY29uc3QgY2hhciAqZm10LCBjb25zdCBmb3JtYXRkZWYgKmYpCi17Ci0JY29uc3QgZm9ybWF0ZGVmICplOwotCWNvbnN0IGNoYXIgKnM7Ci0JY2hhciBjOwotCWludCBzaXplLCAgbnVtLCBpdGVtc2l6ZSwgeDsKLQotCXMgPSBmbXQ7Ci0Jc2l6ZSA9IDA7Ci0Jd2hpbGUgKChjID0gKnMrKykgIT0gJ1wwJykgewotCQlpZiAoaXNzcGFjZShQeV9DSEFSTUFTSyhjKSkpCi0JCQljb250aW51ZTsKLQkJaWYgKCcwJyA8PSBjICYmIGMgPD0gJzknKSB7Ci0JCQludW0gPSBjIC0gJzAnOwotCQkJd2hpbGUgKCcwJyA8PSAoYyA9ICpzKyspICYmIGMgPD0gJzknKSB7Ci0JCQkJeCA9IG51bSoxMCArIChjIC0gJzAnKTsKLQkJCQlpZiAoeC8xMCAhPSBudW0pIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKAotCQkJCQkJU3RydWN0RXJyb3IsCi0JCQkJCQkib3ZlcmZsb3cgaW4gaXRlbSBjb3VudCIpOwotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCW51bSA9IHg7Ci0JCQl9Ci0JCQlpZiAoYyA9PSAnXDAnKQotCQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UKLQkJCW51bSA9IDE7Ci0KLQkJZSA9IGdldGVudHJ5KGMsIGYpOwotCQlpZiAoZSA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlpdGVtc2l6ZSA9IGUtPnNpemU7Ci0JCXNpemUgPSBhbGlnbihzaXplLCBjLCBlKTsKLQkJeCA9IG51bSAqIGl0ZW1zaXplOwotCQlzaXplICs9IHg7Ci0JCWlmICh4L2l0ZW1zaXplICE9IG51bSB8fCBzaXplIDwgMCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCQkidG90YWwgc3RydWN0IHNpemUgdG9vIGxvbmciKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCXJldHVybiBzaXplOwotfQotCi0KLVB5RG9jX1NUUlZBUihjYWxjc2l6ZV9fZG9jX18sCi0iY2FsY3NpemUoZm10KSAtPiBpbnRcblwKLVJldHVybiBzaXplIG9mIEMgc3RydWN0IGRlc2NyaWJlZCBieSBmb3JtYXQgc3RyaW5nIGZtdC5cblwKLVNlZSBzdHJ1Y3QuX19kb2NfXyBmb3IgbW9yZSBvbiBmb3JtYXQgc3RyaW5ncy4iKTsKLQotc3RhdGljIFB5T2JqZWN0ICoKLXN0cnVjdF9jYWxjc2l6ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCi17Ci0JY2hhciAqZm10OwotCWNvbnN0IGZvcm1hdGRlZiAqZjsKLQlpbnQgc2l6ZTsKLQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpjYWxjc2l6ZSIsICZmbXQpKQotCQlyZXR1cm4gTlVMTDsKLQlmID0gd2hpY2h0YWJsZSgmZm10KTsKLQlzaXplID0gY2FsY3NpemUoZm10LCBmKTsKLQlpZiAoc2l6ZSA8IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylzaXplKTsKLX0KLQotCi1QeURvY19TVFJWQVIocGFja19fZG9jX18sCi0icGFjayhmbXQsIHYxLCB2MiwgLi4uKSAtPiBzdHJpbmdcblwKLVJldHVybiBzdHJpbmcgY29udGFpbmluZyB2YWx1ZXMgdjEsIHYyLCAuLi4gcGFja2VkIGFjY29yZGluZyB0byBmbXQuXG5cCi1TZWUgc3RydWN0Ll9fZG9jX18gZm9yIG1vcmUgb24gZm9ybWF0IHN0cmluZ3MuIik7Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1zdHJ1Y3RfcGFjayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCi17Ci0JY29uc3QgZm9ybWF0ZGVmICpmLCAqZTsKLQlQeU9iamVjdCAqZm9ybWF0LCAqcmVzdWx0LCAqdjsKLQljaGFyICpmbXQ7Ci0JaW50IHNpemUsIG51bTsKLQlQeV9zc2l6ZV90IGksIG47Ci0JY2hhciAqcywgKnJlcywgKnJlc3RhcnQsICpucmVzOwotCWNoYXIgYzsKLQotCWlmIChhcmdzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2soYXJncykgfHwKLQkgICAgKG4gPSBQeVR1cGxlX1NpemUoYXJncykpIDwgMSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkic3RydWN0LnBhY2sgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGFyZ3VtZW50Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlmb3JtYXQgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7Ci0JZm10ID0gUHlTdHJpbmdfQXNTdHJpbmcoZm9ybWF0KTsKLQlpZiAoIWZtdCkKLQkJcmV0dXJuIE5VTEw7Ci0JZiA9IHdoaWNodGFibGUoJmZtdCk7Ci0Jc2l6ZSA9IGNhbGNzaXplKGZtdCwgZik7Ci0JaWYgKHNpemUgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHNpemUpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlzID0gZm10OwotCWkgPSAxOwotCXJlcyA9IHJlc3RhcnQgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXN1bHQpOwotCi0Jd2hpbGUgKChjID0gKnMrKykgIT0gJ1wwJykgewotCQlpZiAoaXNzcGFjZShQeV9DSEFSTUFTSyhjKSkpCi0JCQljb250aW51ZTsKLQkJaWYgKCcwJyA8PSBjICYmIGMgPD0gJzknKSB7Ci0JCQludW0gPSBjIC0gJzAnOwotCQkJd2hpbGUgKCcwJyA8PSAoYyA9ICpzKyspICYmIGMgPD0gJzknKQotCQkJICAgICAgIG51bSA9IG51bSoxMCArIChjIC0gJzAnKTsKLQkJCWlmIChjID09ICdcMCcpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZQotCQkJbnVtID0gMTsKLQotCQllID0gZ2V0ZW50cnkoYywgZik7Ci0JCWlmIChlID09IE5VTEwpCi0JCQlnb3RvIGZhaWw7Ci0JCW5yZXMgPSByZXN0YXJ0ICsgYWxpZ24oKGludCkocmVzLXJlc3RhcnQpLCBjLCBlKTsKLQkJLyogRmlsbCBwYWRkIGJ5dGVzIHdpdGggemVyb3MgKi8KLQkJd2hpbGUgKHJlcyA8IG5yZXMpCi0JCQkqcmVzKysgPSAnXDAnOwotCQlpZiAobnVtID09IDAgJiYgYyAhPSAncycpCi0JCQljb250aW51ZTsKLQkJZG8gewotCQkJaWYgKGMgPT0gJ3gnKSB7Ci0JCQkJLyogZG9lc24ndCBjb25zdW1lIGFyZ3VtZW50cyAqLwotCQkJCW1lbXNldChyZXMsICdcMCcsIG51bSk7Ci0JCQkJcmVzICs9IG51bTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChpID49IG4pIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkJCSJpbnN1ZmZpY2llbnQgYXJndW1lbnRzIHRvIHBhY2siKTsKLQkJCQlnb3RvIGZhaWw7Ci0JCQkJfQotCQkJdiA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCBpKyspOwotCQkJaWYgKHYgPT0gTlVMTCkKLQkJCQlnb3RvIGZhaWw7Ci0JCQlpZiAoYyA9PSAncycpIHsKLQkJCQkvKiBudW0gaXMgc3RyaW5nIHNpemUsIG5vdCByZXBlYXQgY291bnQgKi8KLQkJCQlQeV9zc2l6ZV90IG47Ci0JCQkJaWYgKCFQeVN0cmluZ19DaGVjayh2KSkgewotCQkJCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkJCSAgImFyZ3VtZW50IGZvciAncycgbXVzdCBiZSBhIHN0cmluZyIpOwotCQkJCQlnb3RvIGZhaWw7Ci0JCQkJfQotCQkJCW4gPSBQeVN0cmluZ19TaXplKHYpOwotCQkJCWlmIChuID4gbnVtKQotCQkJCQluID0gbnVtOwotCQkJCWlmIChuID4gMCkKLQkJCQkJbWVtY3B5KHJlcywgUHlTdHJpbmdfQXNTdHJpbmcodiksIG4pOwotCQkJCWlmIChuIDwgbnVtKQotCQkJCQltZW1zZXQocmVzK24sICdcMCcsIG51bS1uKTsKLQkJCQlyZXMgKz0gbnVtOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZiAoYyA9PSAncCcpIHsKLQkJCQkvKiBudW0gaXMgc3RyaW5nIHNpemUgKyAxLAotCQkJCSAgIHRvIGZpdCBpbiB0aGUgY291bnQgYnl0ZSAqLwotCQkJCVB5X3NzaXplX3QgbjsKLQkJCQludW0tLTsgLyogbm93IG51bSBpcyBtYXggc3RyaW5nIHNpemUgKi8KLQkJCQlpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkJICAiYXJndW1lbnQgZm9yICdwJyBtdXN0IGJlIGEgc3RyaW5nIik7Ci0JCQkJCWdvdG8gZmFpbDsKLQkJCQl9Ci0JCQkJbiA9IFB5U3RyaW5nX1NpemUodik7Ci0JCQkJaWYgKG4gPiBudW0pCi0JCQkJCW4gPSBudW07Ci0JCQkJaWYgKG4gPiAwKQotCQkJCQltZW1jcHkocmVzKzEsIFB5U3RyaW5nX0FzU3RyaW5nKHYpLCBuKTsKLQkJCQlpZiAobiA8IG51bSkKLQkJCQkJLyogbm8gcmVhbCBuZWVkLCBqdXN0IHRvIGJlIG5pY2UgKi8KLQkJCQkJbWVtc2V0KHJlcysxK24sICdcMCcsIG51bS1uKTsKLQkJCQlpZiAobiA+IDI1NSkKLQkJCQkJbiA9IDI1NTsKLQkJCQkvKiBzdG9yZSB0aGUgbGVuZ3RoIGJ5dGUgKi8KLQkJCQkqcmVzKysgPSBQeV9TQUZFX0RPV05DQVNUKG4sIFB5X3NzaXplX3QsIHVuc2lnbmVkIGNoYXIpOwotCQkJCXJlcyArPSBudW07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoZS0+cGFjayhyZXMsIHYsIGUpIDwgMCkKLQkJCQkJZ290byBmYWlsOwotCQkJCXJlcyArPSBlLT5zaXplOwotCQkJfQotCQl9IHdoaWxlICgtLW51bSA+IDApOwotCX0KLQotCWlmIChpIDwgbikgewotCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkJInRvbyBtYW55IGFyZ3VtZW50cyBmb3IgcGFjayBmb3JtYXQiKTsKLQkJZ290byBmYWlsOwotCX0KLQotCXJldHVybiByZXN1bHQ7Ci0KLSBmYWlsOgotCVB5X0RFQ1JFRihyZXN1bHQpOwotCXJldHVybiBOVUxMOwotfQotCi0KLVB5RG9jX1NUUlZBUih1bnBhY2tfX2RvY19fLAotInVucGFjayhmbXQsIHN0cmluZykgLT4gKHYxLCB2MiwgLi4uKVxuXAotVW5wYWNrIHRoZSBzdHJpbmcsIGNvbnRhaW5pbmcgcGFja2VkIEMgc3RydWN0dXJlIGRhdGEsIGFjY29yZGluZ1xuXAotdG8gZm10LiAgUmVxdWlyZXMgbGVuKHN0cmluZyk9PWNhbGNzaXplKGZtdCkuXG5cCi1TZWUgc3RydWN0Ll9fZG9jX18gZm9yIG1vcmUgb24gZm9ybWF0IHN0cmluZ3MuIik7Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1zdHJ1Y3RfdW5wYWNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKLXsKLQljb25zdCBmb3JtYXRkZWYgKmYsICplOwotCWNoYXIgKnN0ciwgKnN0YXJ0LCAqZm10LCAqczsKLQljaGFyIGM7Ci0JaW50IGxlbiwgc2l6ZSwgbnVtOwotCVB5T2JqZWN0ICpyZXMsICp2OwotCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzcyM6dW5wYWNrIiwgJmZtdCwgJnN0YXJ0LCAmbGVuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZiA9IHdoaWNodGFibGUoJmZtdCk7Ci0Jc2l6ZSA9IGNhbGNzaXplKGZtdCwgZik7Ci0JaWYgKHNpemUgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoc2l6ZSAhPSBsZW4pIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCSJ1bnBhY2sgc3RyIHNpemUgZG9lcyBub3QgbWF0Y2ggZm9ybWF0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXMgPSBQeUxpc3RfTmV3KDApOwotCWlmIChyZXMgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc3RyID0gc3RhcnQ7Ci0JcyA9IGZtdDsKLQl3aGlsZSAoKGMgPSAqcysrKSAhPSAnXDAnKSB7Ci0JCWlmIChpc3NwYWNlKFB5X0NIQVJNQVNLKGMpKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoJzAnIDw9IGMgJiYgYyA8PSAnOScpIHsKLQkJCW51bSA9IGMgLSAnMCc7Ci0JCQl3aGlsZSAoJzAnIDw9IChjID0gKnMrKykgJiYgYyA8PSAnOScpCi0JCQkgICAgICAgbnVtID0gbnVtKjEwICsgKGMgLSAnMCcpOwotCQkJaWYgKGMgPT0gJ1wwJykKLQkJCQlicmVhazsKLQkJfQotCQllbHNlCi0JCQludW0gPSAxOwotCi0JCWUgPSBnZXRlbnRyeShjLCBmKTsKLQkJaWYgKGUgPT0gTlVMTCkKLQkJCWdvdG8gZmFpbDsKLQkJc3RyID0gc3RhcnQgKyBhbGlnbigoaW50KShzdHItc3RhcnQpLCBjLCBlKTsKLQkJaWYgKG51bSA9PSAwICYmIGMgIT0gJ3MnKQotCQkJY29udGludWU7Ci0KLQkJZG8gewotCQkJaWYgKGMgPT0gJ3gnKSB7Ci0JCQkJc3RyICs9IG51bTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjID09ICdzJykgewotCQkJCS8qIG51bSBpcyBzdHJpbmcgc2l6ZSwgbm90IHJlcGVhdCBjb3VudCAqLwotCQkJCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzdHIsIG51bSk7Ci0JCQkJaWYgKHYgPT0gTlVMTCkKLQkJCQkJZ290byBmYWlsOwotCQkJCXN0ciArPSBudW07Ci0JCQkJbnVtID0gMDsKLQkJCX0KLQkJCWVsc2UgaWYgKGMgPT0gJ3AnKSB7Ci0JCQkJLyogbnVtIGlzIHN0cmluZyBidWZmZXIgc2l6ZSwKLQkJCQkgICBub3QgcmVwZWF0IGNvdW50ICovCi0JCQkJaW50IG4gPSAqKHVuc2lnbmVkIGNoYXIqKXN0cjsKLQkJCQkvKiBmaXJzdCBieXRlICh1bnNpZ25lZCkgaXMgc3RyaW5nIHNpemUgKi8KLQkJCQlpZiAobiA+PSBudW0pCi0JCQkJCW4gPSBudW0tMTsKLQkJCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc3RyKzEsIG4pOwotCQkJCWlmICh2ID09IE5VTEwpCi0JCQkJCWdvdG8gZmFpbDsKLQkJCQlzdHIgKz0gbnVtOwotCQkJCW51bSA9IDA7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl2ID0gZS0+dW5wYWNrKHN0ciwgZSk7Ci0JCQkJaWYgKHYgPT0gTlVMTCkKLQkJCQkJZ290byBmYWlsOwotCQkJCXN0ciArPSBlLT5zaXplOwotCQkJfQotCQkJaWYgKHYgPT0gTlVMTCB8fCBQeUxpc3RfQXBwZW5kKHJlcywgdikgPCAwKQotCQkJCWdvdG8gZmFpbDsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJfSB3aGlsZSAoLS1udW0gPiAwKTsKLQl9Ci0KLQl2ID0gUHlMaXN0X0FzVHVwbGUocmVzKTsKLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gdjsKLQotIGZhaWw6Ci0JUHlfREVDUkVGKHJlcyk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLQotLyogTGlzdCBvZiBmdW5jdGlvbnMgKi8KLQotc3RhdGljIFB5TWV0aG9kRGVmIHN0cnVjdF9tZXRob2RzW10gPSB7Ci0JeyJjYWxjc2l6ZSIsCXN0cnVjdF9jYWxjc2l6ZSwJTUVUSF9WQVJBUkdTLCBjYWxjc2l6ZV9fZG9jX199LAotCXsicGFjayIsCXN0cnVjdF9wYWNrLAkJTUVUSF9WQVJBUkdTLCBwYWNrX19kb2NfX30sCi0JeyJ1bnBhY2siLAlzdHJ1Y3RfdW5wYWNrLAkJTUVUSF9WQVJBUkdTLCB1bnBhY2tfX2RvY19ffSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLwotfTsKLQotCi0vKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gKi8KLQotUHlNT0RJTklUX0ZVTkMKLWluaXRzdHJ1Y3Qodm9pZCkKLXsKLQlQeU9iamVjdCAqbTsKLQotCS8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLwotCW0gPSBQeV9Jbml0TW9kdWxlNCgic3RydWN0Iiwgc3RydWN0X21ldGhvZHMsIHN0cnVjdF9fZG9jX18sCi0JCQkgICAoUHlPYmplY3QqKU5VTEwsIFBZVEhPTl9BUElfVkVSU0lPTik7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KLQlpZiAoU3RydWN0RXJyb3IgPT0gTlVMTCkgewotCQlTdHJ1Y3RFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigic3RydWN0LmVycm9yIiwgTlVMTCwgTlVMTCk7Ci0JCWlmIChTdHJ1Y3RFcnJvciA9PSBOVUxMKQotCQkJcmV0dXJuOwotCX0KLQlQeV9JTkNSRUYoU3RydWN0RXJyb3IpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXJyb3IiLCBTdHJ1Y3RFcnJvcik7Ci19CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3RocmVhZG1vZHVsZS5jIGIvTW9kdWxlcy90aHJlYWRtb2R1bGUuYwppbmRleCA4MzMxM2RmLi45YWM5ODgxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3RocmVhZG1vZHVsZS5jCisrKyBiL01vZHVsZXMvdGhyZWFkbW9kdWxlLmMKQEAgLTk4LDEzICs5OCw2IEBACiBcblwKIFJldHVybiB3aGV0aGVyIHRoZSBsb2NrIGlzIGluIHRoZSBsb2NrZWQgc3RhdGUuIik7CiAKLXN0YXRpYyBQeU9iamVjdCAqCi1sb2NrX2NvbnRleHQobG9ja29iamVjdCAqc2VsZikKLXsKLQlQeV9JTkNSRUYoc2VsZik7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7Ci19Ci0KIHN0YXRpYyBQeU1ldGhvZERlZiBsb2NrX21ldGhvZHNbXSA9IHsKIAl7ImFjcXVpcmVfbG9jayIsIChQeUNGdW5jdGlvbilsb2NrX1B5VGhyZWFkX2FjcXVpcmVfbG9jaywgCiAJIE1FVEhfVkFSQVJHUywgYWNxdWlyZV9kb2N9LApAQCAtMTE4LDggKzExMSw2IEBACiAJIE1FVEhfTk9BUkdTLCBsb2NrZWRfZG9jfSwKIAl7ImxvY2tlZCIsICAgICAgIChQeUNGdW5jdGlvbilsb2NrX2xvY2tlZF9sb2NrLCAgCiAJIE1FVEhfTk9BUkdTLCBsb2NrZWRfZG9jfSwKLQl7Il9fY29udGV4dF9fIiwgIChQeUNGdW5jdGlvbilsb2NrX2NvbnRleHQsCi0JIE1FVEhfTk9BUkdTLCBQeURvY19TVFIoIl9fY29udGV4dF9fKCkgLT4gc2VsZi4iKX0sCiAJeyJfX2VudGVyX18iLCAgICAoUHlDRnVuY3Rpb24pbG9ja19QeVRocmVhZF9hY3F1aXJlX2xvY2ssCiAJIE1FVEhfVkFSQVJHUywgYWNxdWlyZV9kb2N9LAogCXsiX19leGl0X18iLCAgICAoUHlDRnVuY3Rpb24pbG9ja19QeVRocmVhZF9yZWxlYXNlX2xvY2ssCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3RpbWVtb2R1bGUuYyBiL01vZHVsZXMvdGltZW1vZHVsZS5jCmluZGV4IDA4ZDI4YTEuLmUwM2I3ZTEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvdGltZW1vZHVsZS5jCisrKyBiL01vZHVsZXMvdGltZW1vZHVsZS5jCkBAIC01LDYgKzUsMTggQEAKICNpbmNsdWRlICJzdHJ1Y3RzZXEuaCIKICNpbmNsdWRlICJ0aW1lZnVuY3MuaCIKIAorI2lmZGVmIF9fQVBQTEVfXworI2lmIGRlZmluZWQoSEFWRV9HRVRUSU1FT0ZEQVkpICYmIGRlZmluZWQoSEFWRV9GVElNRSkKKyAgLyoKKyAgICogZmxvYXR0aW1lIGZhbGxzIGJhY2sgdG8gZnRpbWUgd2hlbiBnZXR0dGltZW9mZGF5IGZhaWxzIGJlY2F1c2UgdGhlIGxhdHRlcgorICAgKiBtaWdodCBmYWlsIG9uIHNvbWUgcGxhdGZvcm1zLiBUaGlzIGZhbGxiYWNrIGlzIHVud2FudGVkIG9uIE1hY09TWCBiZWNhdXNlCisgICAqIHRoYXQgbWFrZXMgaXQgaW1wb3NzaWJsZSB0byB1c2UgYSBiaW5hcnkgYnVpbGQgb24gT1NYIDEwLjQgb24gZWFybGllcgorICAgKiByZWxlYXNlcyBvZiB0aGUgT1MuIFRoZXJlZm9yZSBjbGFpbSB3ZSBkb24ndCBzdXBwb3J0IGZ0aW1lLgorICAgKi8KKyMgdW5kZWYgSEFWRV9GVElNRQorI2VuZGlmCisjZW5kaWYKKwogI2luY2x1ZGUgPGN0eXBlLmg+CiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTUxLDExICs2MywxMCBAQAogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KICNlbmRpZiAvKiAhX19XQVRDT01DX18gfHwgX19RTlhfXyAqLwogCi0jaWYgZGVmaW5lZChNU19XSU5ET1dTKSAmJiAhZGVmaW5lZChNU19XSU42NCkgJiYgIWRlZmluZWQoX19CT1JMQU5EQ19fKQotLyogV2luMzIgaGFzIGJldHRlciBjbG9jayByZXBsYWNlbWVudAotICAgWFhYIFdpbjY0IGRvZXMgbm90IHlldCwgYnV0IG1pZ2h0IHdoZW4gdGhlIHBsYXRmb3JtIG1hdHVyZXMuICovCi0jdW5kZWYgSEFWRV9DTE9DSyAvKiBXZSBoYXZlIG91ciBvd24gdmVyc2lvbiBkb3duIGJlbG93ICovCi0jZW5kaWYgLyogTVNfV0lORE9XUyAmJiAhTVNfV0lONjQgKi8KKyNpZiBkZWZpbmVkKE1TX1dJTkRPV1MpICYmICFkZWZpbmVkKF9fQk9STEFORENfXykKKy8qIFdpbjMyIGhhcyBiZXR0ZXIgY2xvY2sgcmVwbGFjZW1lbnQ7IHdlIGhhdmUgb3VyIG93biB2ZXJzaW9uIGJlbG93LiAqLworI3VuZGVmIEhBVkVfQ0xPQ0sKKyNlbmRpZiAvKiBNU19XSU5ET1dTICYmICFkZWZpbmVkKF9fQk9STEFORENfXykgKi8KIAogI2lmIGRlZmluZWQoUFlPU19PUzIpCiAjZGVmaW5lIElOQ0xfRE9TCkBAIC0xNTAsNyArMTYxLDcgQEAKIH0KICNlbmRpZiAvKiBIQVZFX0NMT0NLICovCiAKLSNpZiBkZWZpbmVkKE1TX1dJTkRPV1MpICYmICFkZWZpbmVkKE1TX1dJTjY0KSAmJiAhZGVmaW5lZChfX0JPUkxBTkRDX18pCisjaWYgZGVmaW5lZChNU19XSU5ET1dTKSAmJiAhZGVmaW5lZChfX0JPUkxBTkRDX18pCiAvKiBEdWUgdG8gTWFyayBIYW1tb25kIGFuZCBUaW0gUGV0ZXJzICovCiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV9jbG9jayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCkBAIC0xNzksNyArMTkwLDcgQEAKIH0KIAogI2RlZmluZSBIQVZFX0NMT0NLIC8qIFNvIGl0IGdldHMgaW5jbHVkZWQgaW4gdGhlIG1ldGhvZHMgKi8KLSNlbmRpZiAvKiBNU19XSU5ET1dTICYmICFNU19XSU42NCAqLworI2VuZGlmIC8qIE1TX1dJTkRPV1MgJiYgIWRlZmluZWQoX19CT1JMQU5EQ19fKSAqLwogCiAjaWZkZWYgSEFWRV9DTE9DSwogUHlEb2NfU1RSVkFSKGNsb2NrX2RvYywKQEAgLTcwMSw3ICs3MTIsNyBAQAogI2lmZGVmIF9fQ1lHV0lOX18KIAl0enNldCgpOwogCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJ0aW1lem9uZSIsIF90aW1lem9uZSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImFsdHpvbmUiLCBfdGltZXpvbmUpOworCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJhbHR6b25lIiwgX3RpbWV6b25lLTM2MDApOwogCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJkYXlsaWdodCIsIF9kYXlsaWdodCk7CiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ0em5hbWUiLAogCQkJICAgUHlfQnVpbGRWYWx1ZSgiKHp6KSIsIF90em5hbWVbMF0sIF90em5hbWVbMV0pKTsKQEAgLTgwOSw3ICs4MjAsNyBAQAogCVNldENvbnNvbGVDdHJsSGFuZGxlciggUHlDdHJsSGFuZGxlciwgVFJVRSk7CiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwogCWlmICghaW5pdGlhbGl6ZWQpIHsKLQkJUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RydWN0VGltZVR5cGUsIAorCQlQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdHJ1Y3RUaW1lVHlwZSwKIAkJCQkJICAmc3RydWN0X3RpbWVfdHlwZV9kZXNjKTsKIAl9CiAJUHlfSU5DUkVGKCZTdHJ1Y3RUaW1lVHlwZSk7CkBAIC04NDIsNiArODUzLDcgQEAKIAkJCXJldHVybiAoZG91YmxlKXQudHZfc2VjICsgdC50dl91c2VjKjAuMDAwMDAxOwogI2VuZGlmIC8qICFHRVRUSU1FT0ZEQVlfTk9fVFogKi8KIAl9CisKICNlbmRpZiAvKiAhSEFWRV9HRVRUSU1FT0ZEQVkgKi8KIAl7CiAjaWYgZGVmaW5lZChIQVZFX0ZUSU1FKQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy91bmljb2RlZGF0YS5jIGIvTW9kdWxlcy91bmljb2RlZGF0YS5jCmluZGV4IDI5NzYxMWMuLjA2NjAzNTMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvdW5pY29kZWRhdGEuYworKysgYi9Nb2R1bGVzL3VuaWNvZGVkYXRhLmMKQEAgLTIwOSw3ICsyMDksNyBAQAogICAgICAgICBpZiAob2xkLT5jYXRlZ29yeV9jaGFuZ2VkID09IDApIHsKICAgICAgICAgICAgIC8qIHVuYXNzaWduZWQgKi8KICAgICAgICAgICAgIGhhdmVfb2xkID0gMTsKLSAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICByYyA9IC0xLjA7CiAgICAgICAgIH0gCiAgICAgICAgIGVsc2UgaWYgKG9sZC0+ZGVjaW1hbF9jaGFuZ2VkICE9IDB4RkYpIHsKICAgICAgICAgICAgIGhhdmVfb2xkID0gMTsKQEAgLTIxOSw3ICsyMTksNyBAQAogCiAgICAgaWYgKCFoYXZlX29sZCkKICAgICAgICAgcmMgPSBQeV9VTklDT0RFX1RPTlVNRVJJQygqUHlVbmljb2RlX0FTX1VOSUNPREUodikpOwotICAgIGlmIChyYyA8IDApIHsKKyAgICBpZiAocmMgPT0gLTEuMCkgewogCWlmIChkZWZvYmogPT0gTlVMTCkgewogCSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5vdCBhIG51bWVyaWMgY2hhcmFjdGVyIik7CiAJICAgIHJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy96bGlibW9kdWxlLmMgYi9Nb2R1bGVzL3psaWJtb2R1bGUuYwppbmRleCAzNWI4YzMyLi4wNmIwNjkwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3psaWJtb2R1bGUuYworKysgYi9Nb2R1bGVzL3psaWJtb2R1bGUuYwpAQCAtNjUzLDYgKzY1MywxMDggQEAKICAgICByZXR1cm4gUmV0VmFsOwogfQogCitQeURvY19TVFJWQVIoY29tcF9jb3B5X19kb2NfXywKKyJjb3B5KCkgLS0gUmV0dXJuIGEgY29weSBvZiB0aGUgY29tcHJlc3Npb24gb2JqZWN0LiIpOworCitzdGF0aWMgUHlPYmplY3QgKgorUHlabGliX2NvcHkoY29tcG9iamVjdCAqc2VsZikKK3sKKyAgICBjb21wb2JqZWN0ICpyZXR2YWwgPSBOVUxMOworICAgIGludCBlcnI7CisKKyAgICByZXR2YWwgPSBuZXdjb21wb2JqZWN0KCZDb21wdHlwZSk7CisgICAgaWYgKCFyZXR2YWwpIHJldHVybiBOVUxMOworCisgICAgLyogQ29weSB0aGUgenN0cmVhbSBzdGF0ZQorICAgICAqIFdlIHVzZSBFTlRFUl9aTElCIC8gTEVBVkVfWkxJQiB0byBtYWtlIHRoaXMgdGhyZWFkLXNhZmUKKyAgICAgKi8KKyAgICBFTlRFUl9aTElCCisgICAgZXJyID0gZGVmbGF0ZUNvcHkoJnJldHZhbC0+enN0LCAmc2VsZi0+enN0KTsKKyAgICBzd2l0Y2goZXJyKSB7CisgICAgY2FzZShaX09LKToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZShaX1NUUkVBTV9FUlJPUik6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiSW5jb25zaXN0ZW50IHN0cmVhbSBzdGF0ZSIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIGNhc2UoWl9NRU1fRVJST1IpOgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBjb21wcmVzc2lvbiBvYmplY3QiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBkZWZhdWx0OgorICAgICAgICB6bGliX2Vycm9yKHNlbGYtPnpzdCwgZXJyLCAid2hpbGUgY29weWluZyBjb21wcmVzc2lvbiBvYmplY3QiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBQeV9JTkNSRUYoc2VsZi0+dW51c2VkX2RhdGEpOworICAgIFB5X0lOQ1JFRihzZWxmLT51bmNvbnN1bWVkX3RhaWwpOworICAgIFB5X1hERUNSRUYocmV0dmFsLT51bnVzZWRfZGF0YSk7CisgICAgUHlfWERFQ1JFRihyZXR2YWwtPnVuY29uc3VtZWRfdGFpbCk7CisgICAgcmV0dmFsLT51bnVzZWRfZGF0YSA9IHNlbGYtPnVudXNlZF9kYXRhOworICAgIHJldHZhbC0+dW5jb25zdW1lZF90YWlsID0gc2VsZi0+dW5jb25zdW1lZF90YWlsOworCisgICAgLyogTWFyayBpdCBhcyBiZWluZyBpbml0aWFsaXplZCAqLworICAgIHJldHZhbC0+aXNfaW5pdGlhbGlzZWQgPSAxOworCisgICAgTEVBVkVfWkxJQgorICAgIHJldHVybiAoUHlPYmplY3QgKilyZXR2YWw7CisKK2Vycm9yOgorICAgIExFQVZFX1pMSUIKKyAgICBQeV9YREVDUkVGKHJldHZhbCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK1B5RG9jX1NUUlZBUihkZWNvbXBfY29weV9fZG9jX18sCisiY29weSgpIC0tIFJldHVybiBhIGNvcHkgb2YgdGhlIGRlY29tcHJlc3Npb24gb2JqZWN0LiIpOworCitzdGF0aWMgUHlPYmplY3QgKgorUHlabGliX3VuY29weShjb21wb2JqZWN0ICpzZWxmKQoreworICAgIGNvbXBvYmplY3QgKnJldHZhbCA9IE5VTEw7CisgICAgaW50IGVycjsKKworICAgIHJldHZhbCA9IG5ld2NvbXBvYmplY3QoJkRlY29tcHR5cGUpOworICAgIGlmICghcmV0dmFsKSByZXR1cm4gTlVMTDsKKworICAgIC8qIENvcHkgdGhlIHpzdHJlYW0gc3RhdGUKKyAgICAgKiBXZSB1c2UgRU5URVJfWkxJQiAvIExFQVZFX1pMSUIgdG8gbWFrZSB0aGlzIHRocmVhZC1zYWZlCisgICAgICovCisgICAgRU5URVJfWkxJQgorICAgIGVyciA9IGluZmxhdGVDb3B5KCZyZXR2YWwtPnpzdCwgJnNlbGYtPnpzdCk7CisgICAgc3dpdGNoKGVycikgeworICAgIGNhc2UoWl9PSyk6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UoWl9TVFJFQU1fRVJST1IpOgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIkluY29uc2lzdGVudCBzdHJlYW0gc3RhdGUiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBjYXNlKFpfTUVNX0VSUk9SKToKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgZGVjb21wcmVzc2lvbiBvYmplY3QiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBkZWZhdWx0OgorICAgICAgICB6bGliX2Vycm9yKHNlbGYtPnpzdCwgZXJyLCAid2hpbGUgY29weWluZyBkZWNvbXByZXNzaW9uIG9iamVjdCIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIFB5X0lOQ1JFRihzZWxmLT51bnVzZWRfZGF0YSk7CisgICAgUHlfSU5DUkVGKHNlbGYtPnVuY29uc3VtZWRfdGFpbCk7CisgICAgUHlfWERFQ1JFRihyZXR2YWwtPnVudXNlZF9kYXRhKTsKKyAgICBQeV9YREVDUkVGKHJldHZhbC0+dW5jb25zdW1lZF90YWlsKTsKKyAgICByZXR2YWwtPnVudXNlZF9kYXRhID0gc2VsZi0+dW51c2VkX2RhdGE7CisgICAgcmV0dmFsLT51bmNvbnN1bWVkX3RhaWwgPSBzZWxmLT51bmNvbnN1bWVkX3RhaWw7CisKKyAgICAvKiBNYXJrIGl0IGFzIGJlaW5nIGluaXRpYWxpemVkICovCisgICAgcmV0dmFsLT5pc19pbml0aWFsaXNlZCA9IDE7CisKKyAgICBMRUFWRV9aTElCCisgICAgcmV0dXJuIChQeU9iamVjdCAqKXJldHZhbDsKKworZXJyb3I6CisgICAgTEVBVkVfWkxJQgorICAgIFB5X1hERUNSRUYocmV0dmFsKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwogUHlEb2NfU1RSVkFSKGRlY29tcF9mbHVzaF9fZG9jX18sCiAiZmx1c2goIFtsZW5ndGhdICkgLS0gUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYW55IHJlbWFpbmluZ1xuIgogImRlY29tcHJlc3NlZCBkYXRhLiBsZW5ndGgsIGlmIGdpdmVuLCBpcyB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZVxuIgpAQCAtNzI1LDYgKzgyNyw4IEBACiAgICAgICAgICAgICAgICAgIGNvbXBfY29tcHJlc3NfX2RvY19ffSwKICAgICB7ImZsdXNoIiwgKGJpbmFyeWZ1bmMpUHlabGliX2ZsdXNoLCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgICAgICAgIGNvbXBfZmx1c2hfX2RvY19ffSwKKyAgICB7ImNvcHkiLCAgKFB5Q0Z1bmN0aW9uKVB5WmxpYl9jb3B5LCBNRVRIX05PQVJHUywKKyAgICAgICAgICAgICAgY29tcF9jb3B5X19kb2NfX30sCiAgICAge05VTEwsIE5VTEx9CiB9OwogCkBAIC03MzQsNiArODM4LDggQEAKICAgICAgICAgICAgICAgICAgICBkZWNvbXBfZGVjb21wcmVzc19fZG9jX199LAogICAgIHsiZmx1c2giLCAoYmluYXJ5ZnVuYylQeVpsaWJfdW5mbHVzaCwgTUVUSF9WQVJBUkdTLAogICAgICAgICAgICAgICBkZWNvbXBfZmx1c2hfX2RvY19ffSwKKyAgICB7ImNvcHkiLCAgKFB5Q0Z1bmN0aW9uKVB5WmxpYl91bmNvcHksIE1FVEhfTk9BUkdTLAorICAgICAgICAgICAgICBkZWNvbXBfY29weV9fZG9jX199LAogICAgIHtOVUxMLCBOVUxMfQogfTsKIAo=