ZGlmZiAtLWdpdCBhL2NwdS9sZW9uMy9NYWtlZmlsZSBiL2NwdS9sZW9uMy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODI1NDNkCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L2xlb24zL01ha2VmaWxlCkBAIC0wLDAgKzEsNTQgQEAKKyMKKyMgKEMpIENvcHlyaWdodCAyMDAzLTIwMDYKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworaW5jbHVkZSAkKFRPUERJUikvY29uZmlnLm1rCisKK0xJQgk9ICQob2JqKWxpYiQoQ1BVKS5hCisKK1NUQVJUCT0gc3RhcnQubworU09CSlMJPQorQ09CSlMJPSBjcHVfaW5pdC5vIHNlcmlhbC5vIGNwdS5vIGFtYmFwcC5vIGludGVycnVwdHMubyBwcm9tLm8gdXNiX3VoY2kubworCitTUkNTCTo9ICQoU1RBUlQ6Lm89LlMpICQoU09CSlM6Lm89LlMpICQoQ09CSlM6Lm89LmMpCitPQkpTCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNPQkpTKSAkKENPQkpTKSkKK1NUQVJUCTo9ICQoYWRkcHJlZml4ICQob2JqKSwkKFNUQVJUKSkKKworYWxsOgkkKG9iaikuZGVwZW5kICQoU1RBUlQpICQoTElCKQorCiskKExJQik6CSQoT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIGRlZmluZXMgJChvYmopLmRlcGVuZCB0YXJnZXQKK2luY2x1ZGUgJChTUkNUUkVFKS9ydWxlcy5taworCiskKFNUQVJUKTogJChTVEFSVDoubz0uUykKKwkkKENDKSAtRF9fQVNTRU1CTFlfXyAkKERCR0ZMQUdTKSAkKE9QVEZMQUdTKSAtRF9fS0VSTkVMX18gLURURVhUX0JBU0U9JChURVhUX0JBU0UpIFwKKwktSSQoVE9QRElSKS9pbmNsdWRlIC1mbm8tYnVpbHRpbiAtZmZyZWVzdGFuZGluZyAtbm9zdGRpbmMgLWlzeXN0ZW0gJChnY2NpbmNkaXIpIC1waXBlIFwKKwkkKFBMQVRGT1JNX0NQUEZMQUdTKSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIFwKKwktSSQoVE9QRElSKS9ib2FyZCAtYyAtbyAkKFNUQVJUKSAkKFNUQVJUOi5vPS5TKQorCitzaW5jbHVkZSAkKG9iaikuZGVwZW5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2NwdS9sZW9uMy9hbWJhcHAuYyBiL2NwdS9sZW9uMy9hbWJhcHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGZmMWEyCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L2xlb24zL2FtYmFwcC5jCkBAIC0wLDAgKzEsMzM5IEBACisvKiBHYWlzbGVyIEFNQkEgUGx1ZyZQbGF5IGJ1cyBzY2FubmluZy4gRnVuY3Rpb25zCisgKiBlbmRpbmcgb24gX25vbWVtIGlzIGludGVkZWQgdG8gYmUgdXNlZCBvbmx5IGR1cmluZworICogaW5pdGlhbGl6YXRpb24sIG9ubHkgcmVnaXN0ZXJzIGFyZSB1c2VkIChubyByYW0pLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNworICogRGFuaWVsIEhlbGxzdHJvbSwgR2Fpc2xlciBSZXNlYXJjaCwgZGFuaWVsQGdhaXNsZXIuY29tCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxhbWJhcHAuaD4KKworc3RhdGljIGludCBhbWJhcHBfYXBiX3NjYW4odW5zaWduZWQgaW50IHZlbmRvciwJLyogUGx1ZyZQbGF5IFZlbmRvciBJRCAqLworCQkJICAgdW5zaWduZWQgaW50IGRyaXZlciwJLyogUGx1ZyZQbGF5IERldmljZSBJRCAqLworCQkJICAgYW1iYXBwX2FwYmRldiAqIGRldiwJLyogUmVzdWx0KHMpIGlzIHBsYWNlZCBoZXJlICovCisJCQkgICBpbnQgaW5kZXgsCS8qIEluZGV4IG9mIGRldmljZSB0byBzdGFydCBjb3B5aW5nIFBsdWcmUGxheQorCQkJCQkgKiBpbmZvIGludG8gZGV2CisJCQkJCSAqLworCQkJICAgaW50IG1heF9jbnQJLyogTWF4aW1hbCBjb3VudCB0aGF0IGRldiBjYW4gaG9sZCwgaWYgZGV2CisJCQkJCSAqIGlzIE5VTEwgZnVuY3Rpb24gd2lsbCBzdG9wIHNjYW5uaW5nIGFmdGVyCisJCQkJCSAqIG1heF9jbnQgZGV2aWNlcyBhcmUgZm91bmQuCisJCQkJCSAqLworICAgICkKK3sKKwlpbnQgaSwgY250ID0gMDsKKwl1bnNpZ25lZCBpbnQgYXBibXN0X2Jhc2U7CisJYW1iYXBwX2FoYmRldiBhcGJtc3Q7CisJYXBiY3RybF9wcF9kZXYgKmFwYjsKKworCWlmIChtYXhfY250ID09IDApCisJCXJldHVybiAwOworCisJLyogR2V0IEFNQkEgQVBCIE1hc3RlciAqLworCWlmIChhbWJhcHBfYWhic2x2X2ZpcnN0KFZFTkRPUl9HQUlTTEVSLCBHQUlTTEVSX0FQQk1TVCwgJmFwYm1zdCkgIT0gMSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBHZXQgQVBCIENUUkwgUGx1ZyZQbGF5IGluZm8gYXJlYSAqLworCWFwYm1zdF9iYXNlID0gYXBibXN0LmFkZHJlc3NbMF0gJiBMRU9OM19JT19BUkVBOworCWFwYiA9IChhcGJjdHJsX3BwX2RldiAqKSAoYXBibXN0X2Jhc2UgfCBMRU9OM19DT05GX0FSRUEpOworCisJZm9yIChpID0gMDsgaSA8IExFT04zX0FQQl9TTEFWRVM7IGkrKykgeworCQlpZiAoKGFtYmFfdmVuZG9yKGFwYi0+Y29uZikgPT0gdmVuZG9yKSAmJgorCQkgICAgKGFtYmFfZGV2aWNlKGFwYi0+Y29uZikgPT0gZHJpdmVyKSAmJiAoKGluZGV4IDwgMCkKKwkJCQkJCQkgICB8fCAoaW5kZXgtLSA9PSAwKSkpIHsKKwkJCS8qIENvbnZlcnQgUGx1ZyZQbGF5IGluZm8gaW50byBhIG1vcmUgcmVhZGFibGUgZm9ybWF0ICovCisJCQljbnQrKzsKKwkJCWlmIChkZXYpIHsKKwkJCQlkZXYtPmlycSA9IGFtYmFfaXJxKGFwYi0+Y29uZik7CisJCQkJZGV2LT52ZXIgPSBhbWJhX3ZlcihhcGItPmNvbmYpOworCQkJCWRldi0+YWRkcmVzcyA9CisJCQkJICAgIChhcGJtc3RfYmFzZSB8CisJCQkJICAgICAoKChhcGItPgorCQkJCQliYXIgJiAweGZmZjAwMDAwKSA+PiAxMikpKSAmICgoKGFwYi0+CisJCQkJCQkJCQliYXIgJgorCQkJCQkJCQkJMHgwMDAwZmZmMCkKKwkJCQkJCQkJICAgICAgIDw8IDQpIHwKKwkJCQkJCQkJICAgICAgMHhmZmYwMDAwMCk7CisJCQkJZGV2Kys7CisJCQl9CisJCQkvKiBmb3VuZCBtYXggZGV2aWNlcz8gKi8KKwkJCWlmIChjbnQgPj0gbWF4X2NudCkKKwkJCQlyZXR1cm4gY250OworCQl9CisJCS8qIEdldCBuZXh0IFBsdWcmUGxheSBlbnRyeSAqLworCQlhcGIrKzsKKwl9CisJcmV0dXJuIGNudDsKK30KKwordW5zaWduZWQgaW50IGFtYmFwcF9hcGJfbmV4dF9ub21lbShyZWdpc3RlciB1bnNpZ25lZCBpbnQgdmVuZG9yLAkvKiBQbHVnJlBsYXkgVmVuZG9yIElEICovCisJCQkJICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGRyaXZlciwJLyogUGx1ZyZQbGF5IERldmljZSBJRCAqLworCQkJCSAgIHJlZ2lzdGVyIGludCBpbmRleCkKK3sKKwlyZWdpc3RlciBpbnQgaTsKKwlyZWdpc3RlciBhaGJjdHJsX3BwX2RldiAqYXBibXN0OworCXJlZ2lzdGVyIGFwYmN0cmxfcHBfZGV2ICphcGI7CisJcmVnaXN0ZXIgdW5zaWduZWQgaW50IGFwYm1zdF9iYXNlOworCisJLyogQVBCTVNUIGlzIGEgQUhCIFNsYXZlICovCisJYXBibXN0ID0gYW1iYXBwX2FoYl9uZXh0X25vbWVtKFZFTkRPUl9HQUlTTEVSLCBHQUlTTEVSX0FQQk1TVCwgMSwgMCk7CisJaWYgKCFhcGJtc3QpCisJCXJldHVybiAwOworCisJYXBibXN0X2Jhc2UgPSBhbWJhX21lbWJhcl9zdGFydChhcGJtc3QtPmJhcnNbMF0pOworCWlmIChhbWJhX21lbWJhcl90eXBlKGFwYm1zdC0+YmFyc1swXSkgPT0gQU1CQV9UWVBFX0FIQklPKQorCQlhcGJtc3RfYmFzZSA9IEFNQkFfVFlQRV9BSEJJT19BRERSKGFwYm1zdF9iYXNlKTsKKwlhcGJtc3RfYmFzZSAmPSBMRU9OM19JT19BUkVBOworCisJLyogRmluZCB0aGUgdmVuZG9yL2RyaXZlciBkZXZpY2Ugb24gdGhlIGZpcnN0IEFQQiBidXMgKi8KKwlhcGIgPSAoYXBiY3RybF9wcF9kZXYgKikgKGFwYm1zdF9iYXNlIHwgTEVPTjNfQ09ORl9BUkVBKTsKKworCWZvciAoaSA9IDA7IGkgPCBMRU9OM19BUEJfU0xBVkVTOyBpKyspIHsKKwkJaWYgKChhbWJhX3ZlbmRvcihhcGItPmNvbmYpID09IHZlbmRvcikgJiYKKwkJICAgIChhbWJhX2RldmljZShhcGItPmNvbmYpID09IGRyaXZlcikgJiYgKChpbmRleCA8IDApCisJCQkJCQkJICAgfHwgKGluZGV4LS0gPT0gMCkpKSB7CisJCQkvKiBDb252ZXJ0IFBsdWcmUGxheSBpbmZvIGluZm8gYSBtb3JlIHJlYWRhYmxlIGZvcm1hdCAqLworCQkJcmV0dXJuIChhcGJtc3RfYmFzZSB8ICgoKGFwYi0+YmFyICYgMHhmZmYwMDAwMCkgPj4gMTIpKSkKKwkJCSAgICAmICgoKGFwYi0+YmFyICYgMHgwMDAwZmZmMCkgPDwgNCkgfCAweGZmZjAwMDAwKTsKKwkJfQorCQkvKiBHZXQgbmV4dCBQbHVnJlBsYXkgZW50cnkgKi8KKwkJYXBiKys7CisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFQQiBTTEFWRVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgYW1iYXBwX2FwYl9jb3VudCh1bnNpZ25lZCBpbnQgdmVuZG9yLCB1bnNpZ25lZCBpbnQgZHJpdmVyKQoreworCXJldHVybiBhbWJhcHBfYXBiX3NjYW4odmVuZG9yLCBkcml2ZXIsIE5VTEwsIDAsIExFT04zX0FQQl9TTEFWRVMpOworfQorCitpbnQgYW1iYXBwX2FwYl9maXJzdCh1bnNpZ25lZCBpbnQgdmVuZG9yLAorCQkgICAgIHVuc2lnbmVkIGludCBkcml2ZXIsIGFtYmFwcF9hcGJkZXYgKiBkZXYpCit7CisJcmV0dXJuIGFtYmFwcF9hcGJfc2Nhbih2ZW5kb3IsIGRyaXZlciwgZGV2LCAwLCAxKTsKK30KKworaW50IGFtYmFwcF9hcGJfbmV4dCh1bnNpZ25lZCBpbnQgdmVuZG9yLAorCQkgICAgdW5zaWduZWQgaW50IGRyaXZlciwgYW1iYXBwX2FwYmRldiAqIGRldiwgaW50IGluZGV4KQoreworCXJldHVybiBhbWJhcHBfYXBiX3NjYW4odmVuZG9yLCBkcml2ZXIsIGRldiwgaW5kZXgsIDEpOworfQorCitpbnQgYW1iYXBwX2FwYnNfZmlyc3QodW5zaWduZWQgaW50IHZlbmRvciwKKwkJICAgICAgdW5zaWduZWQgaW50IGRyaXZlciwgYW1iYXBwX2FwYmRldiAqIGRldiwgaW50IG1heF9jbnQpCit7CisJcmV0dXJuIGFtYmFwcF9hcGJfc2Nhbih2ZW5kb3IsIGRyaXZlciwgZGV2LCAwLCBtYXhfY250KTsKK30KKworZW51bSB7CisJQUhCX1NDQU5fTUFTVEVSID0gMCwKKwlBSEJfU0NBTl9TTEFWRSA9IDEKK307CisKKy8qIFNjYW4gQU1CQSBQbHVnJlBsYXkgYnVzIGZvciBBTUJBIEFIQiBNYXN0ZXJzIG9yIEFIQiBTbGF2ZXMKKyAqIGZvciBhIGNlcnRhaW4gbWF0Y2hpbmcgVmVuZG9yIGFuZCBEZXZpY2UgSUQuCisgKgorICogUmV0dXJuIG51bWJlciBvZiBkZXZpY2VzIGZvdW5kLgorICoKKyAqIENvbXBhY3QgZWRpdGlvbi4uLgorICovCitzdGF0aWMgaW50IGFtYmFwcF9haGJfc2Nhbih1bnNpZ25lZCBpbnQgdmVuZG9yLAkvKiBQbHVnJlBsYXkgVmVuZG9yIElEICovCisJCQkgICB1bnNpZ25lZCBpbnQgZHJpdmVyLAkvKiBQbHVnJlBsYXkgRGV2aWNlIElEICovCisJCQkgICBhbWJhcHBfYWhiZGV2ICogZGV2LAkvKiBSZXN1bHQocykgaXMgcGxhY2VkIGhlcmUgKi8KKwkJCSAgIGludCBpbmRleCwJLyogSW5kZXggb2YgZGV2aWNlIHRvIHN0YXJ0IGNvcHlpbmcgUGx1ZyZQbGF5CisJCQkJCSAqIGluZm8gaW50byBkZXYKKwkJCQkJICovCisJCQkgICBpbnQgbWF4X2NudCwJLyogTWF4aW1hbCBjb3VudCB0aGF0IGRldiBjYW4gaG9sZCwgaWYgZGV2CisJCQkJCSAqIGlzIE5VTEwgZnVuY3Rpb24gd2lsbCBzdG9wIHNjYW5uaW5nIGFmdGVyCisJCQkJCSAqIG1heF9jbnQgZGV2aWNlcyBhcmUgZm91bmQuCisJCQkJCSAqLworCQkJICAgaW50IHR5cGUJLyogU2VsZWN0ZXMgd2hhdCB0eXBlIG9mIGRldmljZXMgdG8gc2Nhbi4KKwkJCQkJICogMD1BSEIgTWFzdGVycworCQkJCQkgKiAxPUFIQiBTbGF2ZXMKKwkJCQkJICovCisgICAgKQoreworCWludCBpLCBqLCBjbnQgPSAwLCBtYXhfcHBfZGV2czsKKwl1bnNpZ25lZCBpbnQgYWRkcjsKKwlhaGJjdHJsX2luZm8gKmluZm8gPSAoYWhiY3RybF9pbmZvICopIChMRU9OM19JT19BUkVBIHwgTEVPTjNfQ09ORl9BUkVBKTsKKwlhaGJjdHJsX3BwX2RldiAqYWhiOworCisJaWYgKG1heF9jbnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAodHlwZSA9PSAwKSB7CisJCW1heF9wcF9kZXZzID0gTEVPTjNfQUhCX01BU1RFUlM7CisJCWFoYiA9IGluZm8tPm1hc3RlcnM7CisJfSBlbHNlIHsKKwkJbWF4X3BwX2RldnMgPSBMRU9OM19BSEJfU0xBVkVTOworCQlhaGIgPSBpbmZvLT5zbGF2ZXM7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1heF9wcF9kZXZzOyBpKyspIHsKKwkJaWYgKChhbWJhX3ZlbmRvcihhaGItPmNvbmYpID09IHZlbmRvcikgJiYKKwkJICAgIChhbWJhX2RldmljZShhaGItPmNvbmYpID09IGRyaXZlcikgJiYKKwkJICAgICgoaW5kZXggPCAwKSB8fCAoaW5kZXgtLSA9PSAwKSkpIHsKKwkJCS8qIENvbnZlcnQgUGx1ZyZQbGF5IGluZm8gaW5mbyBhIG1vcmUgcmVhZGFibGUgZm9ybWF0ICovCisJCQljbnQrKzsKKwkJCWlmIChkZXYpIHsKKwkJCQlkZXYtPmlycSA9IGFtYmFfaXJxKGFoYi0+Y29uZik7CisJCQkJZGV2LT52ZXIgPSBhbWJhX3ZlcihhaGItPmNvbmYpOworCQkJCWRldi0+dXNlcmRlZlswXSA9IGFoYi0+dXNlcmRlZlswXTsKKwkJCQlkZXYtPnVzZXJkZWZbMV0gPSBhaGItPnVzZXJkZWZbMV07CisJCQkJZGV2LT51c2VyZGVmWzJdID0gYWhiLT51c2VyZGVmWzJdOworCQkJCWZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKwkJCQkJYWRkciA9IGFtYmFfbWVtYmFyX3N0YXJ0KGFoYi0+YmFyc1tqXSk7CisJCQkJCWlmIChhbWJhX21lbWJhcl90eXBlKGFoYi0+YmFyc1tqXSkgPT0KKwkJCQkJICAgIEFNQkFfVFlQRV9BSEJJTykKKwkJCQkJCWFkZHIgPQorCQkJCQkJICAgIEFNQkFfVFlQRV9BSEJJT19BRERSKGFkZHIpOworCQkJCQlkZXYtPmFkZHJlc3Nbal0gPSBhZGRyOworCQkJCX0KKwkJCQlkZXYrKzsKKwkJCX0KKwkJCS8qIGZvdW5kIG1heCBkZXZpY2VzPyAqLworCQkJaWYgKGNudCA+PSBtYXhfY250KQorCQkJCXJldHVybiBjbnQ7CisJCX0KKwkJLyogR2V0IG5leHQgUGx1ZyZQbGF5IGVudHJ5ICovCisJCWFoYisrOworCX0KKwlyZXR1cm4gY250OworfQorCit1bnNpZ25lZCBpbnQgYW1iYXBwX2FoYl9nZXRfaW5mbyhhaGJjdHJsX3BwX2RldiAqIGFoYiwgaW50IGluZm8pCit7CisJcmVnaXN0ZXIgdW5zaWduZWQgaW50IHJldDsKKworCWlmICghYWhiKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoaW5mbykgeworCWRlZmF1bHQ6CisJCWluZm8gPSAwOworCWNhc2UgMDoKKwljYXNlIDE6CisJY2FzZSAyOgorCWNhc2UgMzoKKwkJLyogR2V0IEFkZHJlc3MgZnJvbSBQblAgSW5mbyAqLworCQlyZXQgPSBhbWJhX21lbWJhcl9zdGFydChhaGItPmJhcnNbaW5mb10pOworCQlpZiAoYW1iYV9tZW1iYXJfdHlwZShhaGItPmJhcnNbaW5mb10pID09IEFNQkFfVFlQRV9BSEJJTykKKwkJCXJldCA9IEFNQkFfVFlQRV9BSEJJT19BRERSKHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworCit9CisKK2FoYmN0cmxfcHBfZGV2ICphbWJhcHBfYWhiX25leHRfbm9tZW0ocmVnaXN0ZXIgdW5zaWduZWQgaW50IHZlbmRvciwJLyogUGx1ZyZQbGF5IFZlbmRvciBJRCAqLworCQkJCSAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBkcml2ZXIsCS8qIFBsdWcmUGxheSBEZXZpY2UgSUQgKi8KKwkJCQkgICAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgb3B0cywJLyogMT1zbGF2ZSwgMD1tYXN0ZXIgKi8KKwkJCQkgICAgICByZWdpc3RlciBpbnQgaW5kZXgpCit7CisJcmVnaXN0ZXIgYWhiY3RybF9wcF9kZXYgKmFoYjsKKwlyZWdpc3RlciBhaGJjdHJsX2luZm8gKmluZm8gPQorCSAgICAoYWhiY3RybF9pbmZvICopIChMRU9OM19JT19BUkVBIHwgTEVPTjNfQ09ORl9BUkVBKTsKKwlyZWdpc3RlciBpbnQgaTsKKwlyZWdpc3RlciBpbnQgbWF4X3BwX2RldnM7CisKKwlpZiAob3B0cyA9PSAwKSB7CisJCW1heF9wcF9kZXZzID0gTEVPTjNfQUhCX01BU1RFUlM7CisJCWFoYiA9IGluZm8tPm1hc3RlcnM7CisJfSBlbHNlIHsKKwkJbWF4X3BwX2RldnMgPSBMRU9OM19BSEJfU0xBVkVTOworCQlhaGIgPSBpbmZvLT5zbGF2ZXM7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1heF9wcF9kZXZzOyBpKyspIHsKKwkJaWYgKChhbWJhX3ZlbmRvcihhaGItPmNvbmYpID09IHZlbmRvcikgJiYKKwkJICAgIChhbWJhX2RldmljZShhaGItPmNvbmYpID09IGRyaXZlcikgJiYKKwkJICAgICgoaW5kZXggPCAwKSB8fCAoaW5kZXgtLSA9PSAwKSkpIHsKKwkJCS8qIENvbnZlcnQgUGx1ZyZQbGF5IGluZm8gaW5mbyBhIG1vcmUgcmVhZGFibGUgZm9ybWF0ICovCisJCQlyZXR1cm4gYWhiOworCQl9CisJCS8qIEdldCBuZXh0IFBsdWcmUGxheSBlbnRyeSAqLworCQlhaGIrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUhCIE1BU1RFUlMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGFtYmFwcF9haGJtc3RfY291bnQodW5zaWduZWQgaW50IHZlbmRvciwgdW5zaWduZWQgaW50IGRyaXZlcikKK3sKKwkvKiBHZXQgbnVtYmVyIG9mIGRldmljZXMgb2YgdGhpcyB2ZW5kb3ImZGV2aWNlIElEICovCisJcmV0dXJuIGFtYmFwcF9haGJfc2Nhbih2ZW5kb3IsIGRyaXZlciwgTlVMTCwgMCwgTEVPTjNfQUhCX01BU1RFUlMsCisJCQkgICAgICAgQUhCX1NDQU5fTUFTVEVSKTsKK30KKworaW50IGFtYmFwcF9haGJtc3RfZmlyc3QodW5zaWduZWQgaW50IHZlbmRvciwgdW5zaWduZWQgaW50IGRyaXZlciwKKwkJCWFtYmFwcF9haGJkZXYgKiBkZXYpCit7CisJLyogZmluZCBmaXJzdCBkZXZpY2Ugb2YgdGhpcyAqLworCXJldHVybiBhbWJhcHBfYWhiX3NjYW4odmVuZG9yLCBkcml2ZXIsIGRldiwgMCwgMSwgQUhCX1NDQU5fTUFTVEVSKTsKK30KKworaW50IGFtYmFwcF9haGJtc3RfbmV4dCh1bnNpZ25lZCBpbnQgdmVuZG9yLAorCQkgICAgICAgdW5zaWduZWQgaW50IGRyaXZlciwgYW1iYXBwX2FoYmRldiAqIGRldiwgaW50IGluZGV4KQoreworCS8qIGZpbmQgZmlyc3QgZGV2aWNlIG9mIHRoaXMgKi8KKwlyZXR1cm4gYW1iYXBwX2FoYl9zY2FuKHZlbmRvciwgZHJpdmVyLCBkZXYsIGluZGV4LCAxLCBBSEJfU0NBTl9NQVNURVIpOworfQorCitpbnQgYW1iYXBwX2FoYm1zdHNfZmlyc3QodW5zaWduZWQgaW50IHZlbmRvciwKKwkJCSB1bnNpZ25lZCBpbnQgZHJpdmVyLCBhbWJhcHBfYWhiZGV2ICogZGV2LCBpbnQgbWF4X2NudCkKK3sKKwkvKiBmaW5kIGZpcnN0IGRldmljZSBvZiB0aGlzICovCisJcmV0dXJuIGFtYmFwcF9haGJfc2Nhbih2ZW5kb3IsIGRyaXZlciwgZGV2LCAwLCBtYXhfY250LAorCQkJICAgICAgIEFIQl9TQ0FOX01BU1RFUik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUhCIFNMQVZFUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgYW1iYXBwX2FoYnNsdl9jb3VudCh1bnNpZ25lZCBpbnQgdmVuZG9yLCB1bnNpZ25lZCBpbnQgZHJpdmVyKQoreworCS8qIEdldCBudW1iZXIgb2YgZGV2aWNlcyBvZiB0aGlzIHZlbmRvciZkZXZpY2UgSUQgKi8KKwlyZXR1cm4gYW1iYXBwX2FoYl9zY2FuKHZlbmRvciwgZHJpdmVyLCBOVUxMLCAwLCBMRU9OM19BSEJfU0xBVkVTLAorCQkJICAgICAgIEFIQl9TQ0FOX1NMQVZFKTsKK30KKworaW50IGFtYmFwcF9haGJzbHZfZmlyc3QodW5zaWduZWQgaW50IHZlbmRvciwgdW5zaWduZWQgaW50IGRyaXZlciwKKwkJCWFtYmFwcF9haGJkZXYgKiBkZXYpCit7CisJLyogZmluZCBmaXJzdCBkZXZpY2Ugb2YgdGhpcyAqLworCXJldHVybiBhbWJhcHBfYWhiX3NjYW4odmVuZG9yLCBkcml2ZXIsIGRldiwgMCwgMSwgQUhCX1NDQU5fU0xBVkUpOworfQorCitpbnQgYW1iYXBwX2FoYnNsdl9uZXh0KHVuc2lnbmVkIGludCB2ZW5kb3IsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgZHJpdmVyLCBhbWJhcHBfYWhiZGV2ICogZGV2LCBpbnQgaW5kZXgpCit7CisJLyogZmluZCBmaXJzdCBkZXZpY2Ugb2YgdGhpcyAqLworCXJldHVybiBhbWJhcHBfYWhiX3NjYW4odmVuZG9yLCBkcml2ZXIsIGRldiwgaW5kZXgsIDEsIEFIQl9TQ0FOX1NMQVZFKTsKK30KKworaW50IGFtYmFwcF9haGJzbHZzX2ZpcnN0KHVuc2lnbmVkIGludCB2ZW5kb3IsCisJCQkgdW5zaWduZWQgaW50IGRyaXZlciwgYW1iYXBwX2FoYmRldiAqIGRldiwgaW50IG1heF9jbnQpCit7CisJLyogZmluZCBmaXJzdCBkZXZpY2Ugb2YgdGhpcyAqLworCXJldHVybiBhbWJhcHBfYWhiX3NjYW4odmVuZG9yLCBkcml2ZXIsIGRldiwgMCwgbWF4X2NudCwgQUhCX1NDQU5fU0xBVkUpOworfQpkaWZmIC0tZ2l0IGEvY3B1L2xlb24zL2NvbmZpZy5tayBiL2NwdS9sZW9uMy9jb25maWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBiMjI0YQotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9sZW9uMy9jb25maWcubWsKQEAgLTAsMCArMSwyNiBAQAorIworIyAoQykgQ29weXJpZ2h0IDIwMDMKKyMgV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyMKKyMgU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyMgcHJvamVjdC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorIyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyMgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworUExBVEZPUk1fUkVMRkxBR1MgKz0gLWZQSUMKKworUExBVEZPUk1fQ1BQRkxBR1MgKz0gLURDT05GSUdfTEVPTgpkaWZmIC0tZ2l0IGEvY3B1L2xlb24zL2NwdS5jIGIvY3B1L2xlb24zL2NwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNmEyMTAKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvbGVvbjMvY3B1LmMKQEAgLTAsMCArMSw2NyBAQAorLyogQ1BVIHNwZWNpZmljIGNvZGUgZm9yIHRoZSBMRU9OMyBDUFUKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDcKKyAqIERhbmllbCBIZWxsc3Ryb20sIEdhaXNsZXIgUmVzZWFyY2gsIGRhbmllbEBnYWlzbGVyLmNvbQorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDx3YXRjaGRvZy5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKK2V4dGVybiB2b2lkIF9yZXNldF9yZWxvYyh2b2lkKTsKKworaW50IGNoZWNrY3B1KHZvaWQpCit7CisJLyogY2hlY2sgTEVPTiB2ZXJzaW9uIGhlcmUgKi8KKwlwcmludGYoIkNQVTogTEVPTjNcbiIpOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgY3B1X3Jlc2V0KHZvaWQpCit7CisJLyogSW50ZXJydXB0cyBvZmYgKi8KKwlkaXNhYmxlX2ludGVycnVwdHMoKTsKKworCS8qIGp1bXAgdG8gcmVzdGFydCBpbiBmbGFzaCAqLworCV9yZXNldF9yZWxvYygpOworfQorCitpbnQgZG9fcmVzZXQoY21kX3RibF90ICogY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWNwdV9yZXNldCgpOworCisJcmV0dXJuIDE7CisKK30KKwordTY0IGZsYXNoX3JlYWQ2NCh2b2lkICphZGRyKQoreworCXJldHVybiBfX3Jhd19yZWFkcShhZGRyKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvY3B1L2xlb24zL2NwdV9pbml0LmMgYi9jcHUvbGVvbjMvY3B1X2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmU3ZDRiCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L2xlb24zL2NwdV9pbml0LmMKQEAgLTAsMCArMSwyNTQgQEAKKy8qIEluaXRpYWxpemVzIENQVSBhbmQgYmFzaWMgaGFyZHdhcmUgc3VjaCBhcyBtZW1vcnkKKyAqIGNvbnRyb2xsZXJzLCBJUlEgY29udHJvbGxlciBhbmQgc3lzdGVtIHRpbWVyIDAuCisgKgorICogKEMpIENvcHlyaWdodCAyMDA3CisgKiBEYW5pZWwgSGVsbHN0cm9tLCBHYWlzbGVyIFJlc2VhcmNoLCBkYW5pZWxAZ2Fpc2xlci5jb20KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9hc2kuaD4KKyNpbmNsdWRlIDxhc20vbGVvbi5oPgorI2luY2x1ZGUgPGFtYmFwcC5oPgorCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKK0RFQ0xBUkVfR0xPQkFMX0RBVEFfUFRSOworCisvKiByZXNldCBDUFUgKGp1bXAgdG8gMCwgd2l0aG91dCByZXNldCkgKi8KK3ZvaWQgc3RhcnQodm9pZCk7CisKKy8qIGZpbmQgJiBpbml0aWFsaXplIHRoZSBtZW1vcnkgY29udHJvbGxlciAqLworaW50IGluaXRfbWVtb3J5X2N0cmwodm9pZCk7CisKK2FtYmFwcF9kZXZfaXJxbXAgKmlycW1wID0gTlVMTDsKK2FtYmFwcF9kZXZfbWN0cmwgbWVtY3RybDsKK2FtYmFwcF9kZXZfZ3B0aW1lciAqZ3B0aW1lciA9IE5VTEw7Cit1bnNpZ25lZCBpbnQgZ3B0aW1lcl9pcnEgPSAwOworaW50IGxlb24zX3Nub29waW5nX2F2YWlsID0gMDsKKworc3RydWN0IHsKKwlnZF90IGdkX2FyZWE7CisJYmRfdCBiZDsKK30gZ2xvYmFsX2RhdGE7CisKKy8qCisgKiBCcmVhdGggc29tZSBsaWZlIGludG8gdGhlIENQVS4uLgorICoKKyAqIFNldCB1cCB0aGUgbWVtb3J5IG1hcCwKKyAqIGluaXRpYWxpemUgYSBidW5jaCBvZiByZWdpc3RlcnMuCisgKgorICogUnVuIGZyb20gRkxBU0gvUFJPTToKKyAqICAtIHVudGlsIG1lbW9yeSBjb250cm9sbGVyIGlzIHNldCB1cCwgb25seSByZWdpc3RlcnMgYXZhaWFibGUKKyAqICAtIG5vIGdsb2JhbCB2YXJpYWJsZXMgYXZhaWxhYmxlIGZvciB3cml0aW5nCisgKiAgLSBjb25zdGFudHMgYXZhaWFibGUKKyAqLworCit2b2lkIGNwdV9pbml0X2Yodm9pZCkKK3sKKwkvKiB0aGVzZSB2YXJhaWFibGUgbXVzdCBub3QgYmUgaW5pdGlhbGl6ZWQgKi8KKwlhbWJhcHBfZGV2X2lycW1wICppcnFtcDsKKwlhbWJhcHBfYXBiZGV2IGFwYmRldjsKKwlyZWdpc3RlciB1bnNpZ25lZCBpbnQgYXBibXN0OworCisJLyogZmluZCBBTUJBIEFQQiBNYXN0ZXIgKi8KKwlhcGJtc3QgPSAodW5zaWduZWQgaW50KQorCSAgICBhbWJhcHBfYWhiX25leHRfbm9tZW0oVkVORE9SX0dBSVNMRVIsIEdBSVNMRVJfQVBCTVNULCAxLCAwKTsKKwlpZiAoIWFwYm1zdCkgeworCQkvKgorCQkgKiBubyBBSEIvQVBCIGJyaWRnZSwgc29tZXRoaW5nIGlzIHdyb25nCisJCSAqID09PiBqdW1wIHRvIHN0YXJ0IChvciBoYW5nKQorCQkgKi8KKwkJd2hpbGUgKDEpIDsKKwl9CisJLyogSW5pdCBtZW1vcnkgY29udHJvbGxlciAqLworCWlmIChpbml0X21lbW9yeV9jdHJsKCkpIHsKKwkJd2hpbGUgKDEpIDsKKwl9CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEZyb20gaGVyZSB3ZSBjYW4gdXNlIHRoZSBtYWluIG1lbW9yeSBhbmQgdGhlIHN0YWNrLgorCSAqLworCisJLyogRmluZCBBTUJBIEFQQiBJUlFNUCBDb250cm9sbGVyICovCisJaWYgKGFtYmFwcF9hcGJfZmlyc3QoVkVORE9SX0dBSVNMRVIsIEdBSVNMRVJfSVJRTVAsICZhcGJkZXYpICE9IDEpIHsKKwkJLyogbm8gSVJRIGNvbnRyb2xsZXIsIHNvbWV0aGluZyBpcyB3cm9uZworCQkgKiA9PT4ganVtcCB0byBzdGFydCAob3IgaGFuZykKKwkJICovCisJCXdoaWxlICgxKSA7CisJfQorCWlycW1wID0gKGFtYmFwcF9kZXZfaXJxbXAgKikgYXBiZGV2LmFkZHJlc3M7CisKKwkvKiBpbml0aWFsaXplIHRoZSBJUlFNUCAqLworCWlycW1wLT5pbGV2ZWwgPSAweGY7CS8qIGFsbCBJUlEgb2ZmICovCisJaXJxbXAtPmlmb3JjZSA9IDA7CisJaXJxbXAtPmlwZW5kID0gMDsKKwlpcnFtcC0+aWNsZWFyID0gMHhmZmZlOwkvKiBjbGVhciBhbGwgb2xkIHBlbmRpbmcgaW50ZXJydXB0cyAqLworCWlycW1wLT5jcHVfbWFza1swXSA9IDA7CS8qIG1hc2sgYWxsIElSUXMgb24gQ1BVIDAgKi8KKwlpcnFtcC0+Y3B1X2ZvcmNlWzBdID0gMDsJLyogbm8gZm9yY2UgSVJRIG9uIENQVSAwICovCisKKwkvKiBjYWNoZSAqLworfQorCit2b2lkIGNwdV9pbml0X2YyKHZvaWQpCit7CisKK30KKworLyoKKyAqIGluaXRpYWxpemUgaGlnaGVyIGxldmVsIHBhcnRzIG9mIENQVSBsaWtlIHRpbWUgYmFzZSBhbmQgdGltZXJzCisgKi8KK2ludCBjcHVfaW5pdF9yKHZvaWQpCit7CisJYW1iYXBwX2FwYmRldiBhcGJkZXY7CisKKwkvKgorCSAqIEZpbmQgQU1CQSBBUEIgSVJRTVAgQ29udHJvbGxlciwKKwkgKiBXaGVuIHdlIGNvbWUgc28gZmFyIHdlIGtub3cgdGhlcmUgaXMgYSBJUlFNUCBhdmFpbGFibGUKKwkgKi8KKwlhbWJhcHBfYXBiX2ZpcnN0KFZFTkRPUl9HQUlTTEVSLCBHQUlTTEVSX0lSUU1QLCAmYXBiZGV2KTsKKwlpcnFtcCA9IChhbWJhcHBfZGV2X2lycW1wICopIGFwYmRldi5hZGRyZXNzOworCisJLyogdGltZXIgKi8KKwlpZiAoYW1iYXBwX2FwYl9maXJzdChWRU5ET1JfR0FJU0xFUiwgR0FJU0xFUl9HUFRJTUVSLCAmYXBiZGV2KSAhPSAxKSB7CisJCXByaW50ZigiY3B1X2luaXRfcjogZ3B0aW1lciBub3QgZm91bmQhXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWdwdGltZXIgPSAoYW1iYXBwX2Rldl9ncHRpbWVyICopIGFwYmRldi5hZGRyZXNzOworCWdwdGltZXJfaXJxID0gYXBiZGV2LmlycTsKKworCS8qIGluaXRpYWxpemUgcHJlc2NhbGVyIGNvbW1vbiB0byBhbGwgdGltZXJzIHRvIDFNSHogKi8KKwlncHRpbWVyLT5zY2FsYXIgPSBncHRpbWVyLT5zY2FsYXJfcmVsb2FkID0KKwkgICAgKCgoQ09ORklHX1NZU19DTEtfRlJFUSAvIDEwMDApICsgNTAwKSAvIDEwMDApIC0gMTsKKworCXJldHVybiAoMCk7Cit9CisKKy8qIGZpbmQgJiBzZXR1cCBtZW1vcnkgY29udHJvbGxlciAqLworaW50IGluaXRfbWVtb3J5X2N0cmwoKQoreworCXJlZ2lzdGVyIGFtYmFwcF9kZXZfbWN0cmwgKm1jdHJsOworCXJlZ2lzdGVyIGFtYmFwcF9kZXZfc2RjdHJsICpzZGN0cmw7CisJcmVnaXN0ZXIgYW1iYXBwX2Rldl9kZHJzcGEgKmRkcnNwYTsKKwlyZWdpc3RlciBhbWJhcHBfZGV2X2RkcjJzcGEgKmRkcjJzcGE7CisJcmVnaXN0ZXIgYWhiY3RybF9wcF9kZXYgKmFoYjsKKwlyZWdpc3RlciB1bnNpZ25lZCBpbnQgYmFzZTsKKwlyZWdpc3RlciBpbnQgbm90X2ZvdW5kX21jdHJsID0gLTE7CisKKwkvKiBmaW5kIEVTQSBNZW1vcnkgY29udHJvbGxlciAqLworCWJhc2UgPSBhbWJhcHBfYXBiX25leHRfbm9tZW0oVkVORE9SX0VTQSwgRVNBX01DVFJMLCAwKTsKKwlpZiAoYmFzZSkgeworCQltY3RybCA9IChhbWJhcHBfZGV2X21jdHJsICopIGJhc2U7CisKKwkJLyogY29uZmlnIE1DVFJMIG1lbW9yeSBjb250cm9sbGVyICovCisJCW1jdHJsLT5tY2ZnMSA9IENGR19HUkxJQl9NRU1DRkcxIHwgKG1jdHJsLT5tY2ZnMSAmIDB4MzAwKTsKKwkJbWN0cmwtPm1jZmcyID0gQ0ZHX0dSTElCX01FTUNGRzI7CisJCW1jdHJsLT5tY2ZnMyA9IENGR19HUkxJQl9NRU1DRkczOworCQlub3RfZm91bmRfbWN0cmwgPSAwOworCX0KKworCS8qIGZpbmQgR2Fpc2xlciBGYXVsdCBUb2xlcmFudCBNZW1vcnkgY29udHJvbGxlciAqLworCWJhc2UgPSBhbWJhcHBfYXBiX25leHRfbm9tZW0oVkVORE9SX0dBSVNMRVIsIEdBSVNMRVJfRlRNQ1RSTCwgMCk7CisJaWYgKGJhc2UpIHsKKwkJbWN0cmwgPSAoYW1iYXBwX2Rldl9tY3RybCAqKSBiYXNlOworCisJCS8qIGNvbmZpZyBNQ1RSTCBtZW1vcnkgY29udHJvbGxlciAqLworCQltY3RybC0+bWNmZzEgPSBDRkdfR1JMSUJfRlRfTUVNQ0ZHMSB8IChtY3RybC0+bWNmZzEgJiAweDMwMCk7CisJCW1jdHJsLT5tY2ZnMiA9IENGR19HUkxJQl9GVF9NRU1DRkcyOworCQltY3RybC0+bWNmZzMgPSBDRkdfR1JMSUJfRlRfTUVNQ0ZHMzsKKwkJbm90X2ZvdW5kX21jdHJsID0gMDsKKwl9CisKKwkvKiBmaW5kIFNEUkFNIGNvbnRyb2xsZXIgKi8KKwliYXNlID0gYW1iYXBwX2FwYl9uZXh0X25vbWVtKFZFTkRPUl9HQUlTTEVSLCBHQUlTTEVSX1NEQ1RSTCwgMCk7CisJaWYgKGJhc2UpIHsKKwkJc2RjdHJsID0gKGFtYmFwcF9kZXZfc2RjdHJsICopIGJhc2U7CisKKwkJLyogY29uZmlnIG1lbW9yeSBjb250cm9sbGVyICovCisJCXNkY3RybC0+c2RjZmcgPSBDRkdfR1JMSUJfU0RSQU07CisJCW5vdF9mb3VuZF9tY3RybCA9IDA7CisJfQorCisJYWhiID0gYW1iYXBwX2FoYl9uZXh0X25vbWVtKFZFTkRPUl9HQUlTTEVSLCBHQUlTTEVSX0REUjJTUEEsIDEsIDApOworCWlmIChhaGIpIHsKKwkJZGRyMnNwYSA9IChhbWJhcHBfZGV2X2RkcjJzcGEgKikgYW1iYXBwX2FoYl9nZXRfaW5mbyhhaGIsIDEpOworCisJCS8qIENvbmZpZyBERFIyIG1lbW9yeSBjb250cm9sbGVyICovCisJCWRkcjJzcGEtPmNmZzEgPSBDRkdfR1JMSUJfRERSMl9DRkcxOworCQlkZHIyc3BhLT5jZmczID0gQ0ZHX0dSTElCX0REUjJfQ0ZHMzsKKwkJbm90X2ZvdW5kX21jdHJsID0gMDsKKwl9CisKKwlhaGIgPSBhbWJhcHBfYWhiX25leHRfbm9tZW0oVkVORE9SX0dBSVNMRVIsIEdBSVNMRVJfRERSU1BBLCAxLCAwKTsKKwlpZiAoYWhiKSB7CisJCWRkcnNwYSA9IChhbWJhcHBfZGV2X2RkcnNwYSAqKSBhbWJhcHBfYWhiX2dldF9pbmZvKGFoYiwgMSk7CisKKwkJLyogQ29uZmlnIEREUiBtZW1vcnkgY29udHJvbGxlciAqLworCQlkZHJzcGEtPmN0cmwgPSBDRkdfR1JMSUJfRERSX0NGRzsKKwkJbm90X2ZvdW5kX21jdHJsID0gMDsKKwl9CisKKwkvKiBmYWlsZWQgdG8gZmluZCBhbnkgbWVtb3J5IGNvbnRyb2xsZXIgKi8KKwlyZXR1cm4gbm90X2ZvdW5kX21jdHJsOworfQorCisvKiBVc2VzIFRpbWVyIDAgdG8gZ2V0IGFjY3VyYXRlCisgKiBwYXVzZXMuIE1heCAyIHJhaXNlZCB0byAzMiB0aWNrcworICoKKyAqLwordm9pZCBjcHVfd2FpdF90aWNrcyh1bnNpZ25lZCBsb25nIHRpY2tzKQoreworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBnZXRfdGltZXIoMCk7CisJd2hpbGUgKGdldF90aW1lcihzdGFydCkgPCB0aWNrcykgOworfQorCisvKiBpbml0aWF0ZSBhbmQgc2V0dXAgdGltZXIwIGludGVycnVwdCB0byAxTUh6CisgKiBSZXR1cm4gaXJxIG51bWJlciBmb3IgdGltZXIgaW50IG9yIGEgbmVnYXRpdmUgbnVtYmVyIGZvcgorICogZGVhbGluZyB3aXRoIHNlbGYKKyAqLworaW50IHRpbWVyX2ludGVycnVwdF9pbml0X2NwdSh2b2lkKQoreworCS8qIDFtcyB0aWNrcyAqLworCWdwdGltZXItPmVbMF0udmFsID0gMDsKKwlncHRpbWVyLT5lWzBdLnJsZCA9IDk5OTsJLyogKCgoMTAwMDAwMCAvIDEwMCkgLSAxKSkgKi8KKwlncHRpbWVyLT5lWzBdLmN0cmwgPQorCSAgICAoTEVPTjNfR1BUSU1FUl9FTiB8CisJICAgICBMRU9OM19HUFRJTUVSX1JMIHwgTEVPTjNfR1BUSU1FUl9MRCB8IExFT04zX0dQVElNRVJfSVJRRU4pOworCisJcmV0dXJuIGdwdGltZXJfaXJxOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCBmb3IgU0hPUlQgZGVsYXlzIG9ubHkuCisgKi8KK3Vuc2lnbmVkIGxvbmcgY3B1X3VzZWMydGlja3ModW5zaWduZWQgbG9uZyB1c2VjKQoreworCS8qIHRpbWVyIHNldCB0byAxa0h6ID09PiAxIGNsayB0aWNrID0gMSBtc2VjICovCisJaWYgKHVzZWMgPCAxMDAwKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gKHVzZWMgLyAxMDAwKTsKK30KKwordW5zaWduZWQgbG9uZyBjcHVfdGlja3MydXNlYyh1bnNpZ25lZCBsb25nIHRpY2tzKQoreworCS8qIDF0aWNrID0gMXVzZWMgKi8KKwlyZXR1cm4gdGlja3MgKiAxMDAwOworfQpkaWZmIC0tZ2l0IGEvY3B1L2xlb24zL2ludGVycnVwdHMuYyBiL2NwdS9sZW9uMy9pbnRlcnJ1cHRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY5MjYzMgotLS0gL2Rldi9udWxsCisrKyBiL2NwdS9sZW9uMy9pbnRlcnJ1cHRzLmMKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDcKKyAqIERhbmllbCBIZWxsc3Ryb20sIEdhaXNsZXIgUmVzZWFyY2gsIGRhbmllbEBnYWlzbGVyLmNvbQorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwNgorICogRGV0bGV2IFp1bmRlbCwgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgZHp1QGRlbnguZGUKKyAqCisgKiAoQykgQ29weXJpZ2h0IC0yMDAzCisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMQorICogSm9zaCBIdWJlciA8aHViZXJAbWNseC5jb20+LCBNaXNzaW9uIENyaXRpY2FsIExpbnV4LCBJbmMuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGFzbS9zdGFjay5oPgorI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxjb21tYW5kLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL2xlb24uaD4KKyNpbmNsdWRlIDxhbWJhcHAuaD4KKworLyogMTUgbm9ybWFsIGlycXMgYW5kIGEgbm9uIG1hc2thYmxlIGludGVycnVwdCAqLworI2RlZmluZSBOUl9JUlFTIDE1CisKK3N0cnVjdCBpcnFfYWN0aW9uIHsKKwlpbnRlcnJ1cHRfaGFuZGxlcl90ICpoYW5kbGVyOworCXZvaWQgKmFyZzsKKwl1bnNpZ25lZCBpbnQgY291bnQ7Cit9OworCitleHRlcm4gYW1iYXBwX2Rldl9pcnFtcCAqaXJxbXA7CitleHRlcm4gYW1iYXBwX2Rldl9ncHRpbWVyICpncHRpbWVyOworCitzdGF0aWMgc3RydWN0IGlycV9hY3Rpb24gaXJxX2hhbmRsZXJzW05SX0lSUVNdID0geyB7MH0sIH07CitzdGF0aWMgaW50IHNwdXJpb3VzX2lycV9jbnQgPSAwOworc3RhdGljIGludCBzcHVyaW91c19pcnEgPSAwOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpcnFtcF9nZXRfaXJxbWFzayh1bnNpZ25lZCBpbnQgaXJxKQoreworCWlmICgoaXJxIDwgMCkgfHwgKGlycSA+PSBOUl9JUlFTKSkgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlyZXR1cm4gKDEgPDwgaXJxKTsKKwl9CisKK30KKworc3RhdGljIHZvaWQgbGVvbjNfaWNfZGlzYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCBtYXNrLCBwaWw7CisJaWYgKCFpcnFtcCkKKwkJcmV0dXJuOworCisJcGlsID0gaW50TG9jaygpOworCisJLyogZ2V0IG1hc2sgb2YgaW50ZXJydXB0ICovCisJbWFzayA9IGlycW1wX2dldF9pcnFtYXNrKGlycSk7CisKKwkvKiBzZXQgaW50IGxldmVsICovCisJaXJxbXAtPmNwdV9tYXNrWzBdID0gU1BBUkNfTk9DQUNIRV9SRUFEKCZpcnFtcC0+Y3B1X21hc2tbMF0pICYgKH5tYXNrKTsKKworCWludFVubG9jayhwaWwpOworfQorCitzdGF0aWMgdm9pZCBsZW9uM19pY19lbmFibGUodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzaywgcGlsOworCWlmICghaXJxbXApCisJCXJldHVybjsKKworCXBpbCA9IGludExvY2soKTsKKworCS8qIGdldCBtYXNrIG9mIGludGVycnVwdCAqLworCW1hc2sgPSBpcnFtcF9nZXRfaXJxbWFzayhpcnEpOworCisJLyogc2V0IGludCBsZXZlbCAqLworCWlycW1wLT5jcHVfbWFza1swXSA9IFNQQVJDX05PQ0FDSEVfUkVBRCgmaXJxbXAtPmNwdV9tYXNrWzBdKSB8IG1hc2s7CisKKwlpbnRVbmxvY2socGlsKTsKKworfQorCit2b2lkIGhhbmRsZXJfaXJxKGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmIChpcnFfaGFuZGxlcnNbaXJxXS5oYW5kbGVyKSB7CisJCWlmICgoKHVuc2lnbmVkIGludClpcnFfaGFuZGxlcnNbaXJxXS5oYW5kbGVyID4gQ0ZHX1JBTV9FTkQpIHx8CisJCSAgICAoKHVuc2lnbmVkIGludClpcnFfaGFuZGxlcnNbaXJxXS5oYW5kbGVyIDwgQ0ZHX1JBTV9CQVNFKQorCQkgICAgKSB7CisJCQlwcmludGYoImhhbmRsZXJfaXJxOiBiYWQgaGFuZGxlcjogJXgsIGlycSBudW1iZXIgJWRcbiIsCisJCQkgICAgICAgKHVuc2lnbmVkIGludClpcnFfaGFuZGxlcnNbaXJxXS5oYW5kbGVyLCBpcnEpOworCQkJcmV0dXJuOworCQl9CisJCWlycV9oYW5kbGVyc1tpcnFdLmhhbmRsZXIoaXJxX2hhbmRsZXJzW2lycV0uYXJnKTsKKwkJaXJxX2hhbmRsZXJzW2lycV0uY291bnQrKzsKKwl9IGVsc2UgeworCQlzcHVyaW91c19pcnFfY250Kys7CisJCXNwdXJpb3VzX2lycSA9IGlycTsKKwl9Cit9CisKK3ZvaWQgbGVvbjNfZm9yY2VfaW50KGludCBpcnEpCit7CisJaWYgKCFpcnFtcCB8fCAoaXJxID49IE5SX0lSUVMpIHx8IChpcnEgPCAwKSkKKwkJcmV0dXJuOworCXByaW50ZigiRm9yY2luZyBpbnRlcnJ1cHQgJWRcbiIsIGlycSk7CisKKwlpcnFtcC0+aWZvcmNlID0gU1BBUkNfTk9DQUNIRV9SRUFEKCZpcnFtcC0+aWZvcmNlKSB8ICgxIDw8IGlycSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgaW50ZXJydXB0X2luaXRfY3B1KHZvaWQpCit7CisKKwlyZXR1cm4gKDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSGFuZGxlIFRpbWVyIDAgSVJRICovCit2b2lkIHRpbWVyX2ludGVycnVwdF9jcHUodm9pZCAqYXJnKQoreworCWdwdGltZXItPmVbMF0uY3RybCA9IChMRU9OM19HUFRJTUVSX0VOIHwKKwkJCSAgICAgIExFT04zX0dQVElNRVJfUkwgfAorCQkJICAgICAgTEVPTjNfR1BUSU1FUl9MRCB8IExFT04zX0dQVElNRVJfSVJRRU4pOworCS8qIG5vdGhpbmcgdG8gZG8gaGVyZSAqLworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBJbnN0YWxsIGFuZCBmcmVlIGEgaW50ZXJydXB0IGhhbmRsZXIuCisgKi8KKwordm9pZCBpcnFfaW5zdGFsbF9oYW5kbGVyKGludCBpcnEsIGludGVycnVwdF9oYW5kbGVyX3QgKiBoYW5kbGVyLCB2b2lkICphcmcpCit7CisJaWYgKGlycSA8IDAgfHwgaXJxID49IE5SX0lSUVMpIHsKKwkJcHJpbnRmKCJpcnFfaW5zdGFsbF9oYW5kbGVyOiBiYWQgaXJxIG51bWJlciAlZFxuIiwgaXJxKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpcnFfaGFuZGxlcnNbaXJxXS5oYW5kbGVyICE9IE5VTEwpCisJCXByaW50ZigiaXJxX2luc3RhbGxfaGFuZGxlcjogMHglMDhseCByZXBsYWNpbmcgMHglMDhseFxuIiwKKwkJICAgICAgICh1bG9uZykgaGFuZGxlciwgKHVsb25nKSBpcnFfaGFuZGxlcnNbaXJxXS5oYW5kbGVyKTsKKworCWlmICgoKHVuc2lnbmVkIGludCloYW5kbGVyID4gQ0ZHX1JBTV9FTkQpIHx8CisJICAgICgodW5zaWduZWQgaW50KWhhbmRsZXIgPCBDRkdfUkFNX0JBU0UpCisJICAgICkgeworCQlwcmludGYoImlycV9pbnN0YWxsX2hhbmRsZXI6IGJhZCBoYW5kbGVyOiAleCwgaXJxIG51bWJlciAlZFxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBpbnQpaGFuZGxlciwgaXJxKTsKKwkJcmV0dXJuOworCX0KKwlpcnFfaGFuZGxlcnNbaXJxXS5oYW5kbGVyID0gaGFuZGxlcjsKKwlpcnFfaGFuZGxlcnNbaXJxXS5hcmcgPSBhcmc7CisKKwkvKiBlbmFibGUgaXJxIG9uIElSUU1QIGhhcmR3YXJlICovCisJbGVvbjNfaWNfZW5hYmxlKGlycSk7CisKK30KKwordm9pZCBpcnFfZnJlZV9oYW5kbGVyKGludCBpcnEpCit7CisJaWYgKGlycSA8IDAgfHwgaXJxID49IE5SX0lSUVMpIHsKKwkJcHJpbnRmKCJpcnFfZnJlZV9oYW5kbGVyOiBiYWQgaXJxIG51bWJlciAlZFxuIiwgaXJxKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGRpc2FibGUgaXJxIG9uIElSUU1QIGhhcmR3YXJlICovCisJbGVvbjNfaWNfZGlzYWJsZShpcnEpOworCisJaXJxX2hhbmRsZXJzW2lycV0uaGFuZGxlciA9IE5VTEw7CisJaXJxX2hhbmRsZXJzW2lycV0uYXJnID0gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfSVJRKQordm9pZCBkb19pcnFpbmZvKGNtZF90YmxfdCAqIGNtZHRwLCBiZF90ICogYmQsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBpcnE7CisJdW5zaWduZWQgaW50IHBpbCA9IGdldF9waWwoKTsKKwlwcmludGYoIlBJTCBsZXZlbDogJXVcblxyIiwgcGlsKTsKKwlwcmludGYoIlNwdXJpb3VzIElSUTogJXUsIGxhc3QgdW5rbm93biBJUlE6ICVkXG4iLAorCSAgICAgICBzcHVyaW91c19pcnFfY250LCBzcHVyaW91c19pcnEpOworCisJcHV0cygiXG5JbnRlcnJ1cHQtSW5mb3JtYXRpb246XG4iICJOciAgUm91dGluZSAgIEFyZyAgICAgICBDb3VudFxuIik7CisKKwlmb3IgKGlycSA9IDA7IGlycSA8IE5SX0lSUVM7IGlycSsrKSB7CisJCWlmIChpcnFfaGFuZGxlcnNbaXJxXS5oYW5kbGVyICE9IE5VTEwpIHsKKwkJCXByaW50ZigiJTAyZCAgJTA4bHggICUwOGx4ICAlbGRcbiIsIGlycSwKKwkJCSAgICAgICAodW5zaWduZWQgaW50KWlycV9oYW5kbGVyc1tpcnFdLmhhbmRsZXIsCisJCQkgICAgICAgKHVuc2lnbmVkIGludClpcnFfaGFuZGxlcnNbaXJxXS5hcmcsCisJCQkgICAgICAgaXJxX2hhbmRsZXJzW2lycV0uY291bnQpOworCQl9CisJfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jcHUvbGVvbjMvcHJvbS5jIGIvY3B1L2xlb24zL3Byb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmEyZDA0Ci0tLSAvZGV2L251bGwKKysrIGIvY3B1L2xlb24zL3Byb20uYwpAQCAtMCwwICsxLDEwNzggQEAKKy8qIHByb20uYyAtIGVtdWxhdGVzIGEgc3BhcmMgdjAgUFJPTSBmb3IgdGhlIGxpbnV4IGtlcm5lbC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgS29ucmFkIEVpc2VsZSA8ZWlzZWxla2RAd2ViLmRlPgorICogQ29weXJpZ2h0IChDKSAyMDA0IFN0ZWZhbiBIb2xzdCA8bWFpbEBzLWhvbHN0LmRlPgorICogQ29weXJpZ2h0IChDKSAyMDA3IERhbmllbCBIZWxsc3Ryb20gPGRhbmllbEBnYWlzbGVyLmNvbT4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL21hY2hpbmVzLmg+CisjaW5jbHVkZSA8YXNtL3NybW11Lmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbGVvbi5oPgorI2luY2x1ZGUgPGFtYmFwcC5oPgorCisjaW5jbHVkZSA8Y29uZmlnLmg+CisvKgorI2RlZmluZSBQUklOVF9ST01fVkVDCisqLworZXh0ZXJuIHN0cnVjdCBsaW51eF9yb212ZWMgKmtlcm5lbF9hcmdfcHJvbXZlYzsKK2V4dGVybiBhbWJhcHBfZGV2X2FwYnVhcnQgKmxlb24zX2FwYnVhcnQ7CisKKyNkZWZpbmUgUFJPTV9QR1QgX19hdHRyaWJ1dGVfXyAoKF9fc2VjdGlvbl9fICgiLnByb20ucGd0IikpKQorI2RlZmluZSBQUk9NX1RFWFQgX19hdHRyaWJ1dGVfXyAoKF9fc2VjdGlvbl9fICgiLnByb20udGV4dCIpKSkKKyNkZWZpbmUgUFJPTV9EQVRBIF9fYXR0cmlidXRlX18gKChfX3NlY3Rpb25fXyAoIi5wcm9tLmRhdGEiKSkpCisKK2FtYmFwcF9kZXZfZ3B0aW1lciAqZ3B0aW1lcjsKKworLyogZm9yIF9fdmEgKi8KK2V4dGVybiBpbnQgX19wcm9tX3N0YXJ0OworI2RlZmluZSBQQUdFX09GRlNFVCAweGYwMDAwMDAwCisjZGVmaW5lIHBoeXNfYmFzZSBDRkdfU0RSQU1fQkFTRQorI2RlZmluZSBQUk9NX09GRlMgODE5MgorI2RlZmluZSBQUk9NX1NJWkVfTUFTSyAoUFJPTV9PRkZTLTEpCisjZGVmaW5lIF9fdmEoeCkgKCBcCisJKHZvaWQgKikoICgodW5zaWduZWQgbG9uZykoeCkpLVBST01fT0ZGUysgXAorCShDRkdfUFJPTV9PRkZTRVQtcGh5c19iYXNlKStQQUdFX09GRlNFVC1URVhUX0JBU0UgKSBcCisJKQorI2RlZmluZSBfX3BoeSh4KSAoKHZvaWQgKikoKCh1bnNpZ25lZCBsb25nKSh4KSktUFJPTV9PRkZTK0NGR19QUk9NX09GRlNFVC1URVhUX0JBU0UpKQorCitzdHJ1Y3QgcHJvcGVydHkgeworCWNoYXIgKm5hbWU7CisJY2hhciAqdmFsdWU7CisJaW50IGxlbmd0aDsKK307CisKK3N0cnVjdCBub2RlIHsKKwlpbnQgbGV2ZWw7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wZXJ0aWVzOworfTsKKworc3RhdGljIHZvaWQgbGVvbl9yZWJvb3QoY2hhciAqYmNvbW1hbmQpOworc3RhdGljIHZvaWQgbGVvbl9oYWx0KHZvaWQpOworc3RhdGljIGludCBsZW9uX25icHV0Y2hhcihpbnQgYyk7CitzdGF0aWMgaW50IGxlb25fbmJnZXRjaGFyKHZvaWQpOworCitzdGF0aWMgaW50IG5vX25leHRub2RlKGludCBub2RlKTsKK3N0YXRpYyBpbnQgbm9fY2hpbGQoaW50IG5vZGUpOworc3RhdGljIGludCBub19wcm9wbGVuKGludCBub2RlLCBjaGFyICpuYW1lKTsKK3N0YXRpYyBpbnQgbm9fZ2V0cHJvcChpbnQgbm9kZSwgY2hhciAqbmFtZSwgY2hhciAqdmFsdWUpOworc3RhdGljIGludCBub19zZXRwcm9wKGludCBub2RlLCBjaGFyICpuYW1lLCBjaGFyICp2YWx1ZSwgaW50IGxlbik7CitzdGF0aWMgY2hhciAqbm9fbmV4dHByb3AoaW50IG5vZGUsIGNoYXIgKm5hbWUpOworCitzdGF0aWMgc3RydWN0IHByb3BlcnR5IFBST01fVEVYVCAqZmluZF9wcm9wZXJ0eShpbnQgbm9kZSwgY2hhciAqbmFtZSk7CitzdGF0aWMgaW50IFBST01fVEVYVCBsZW9uX3N0cmNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpOworc3RhdGljIHZvaWQgKlBST01fVEVYVCBsZW9uX21lbWNweSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKTsKK3N0YXRpYyB2b2lkIFBST01fVEVYVCBsZW9uX3JlYm9vdF9waHlzaWNhbChjaGFyICpiY29tbWFuZCk7CisKK3ZvaWQgX19pbmxpbmVfXyBsZW9uX2ZsdXNoX2NhY2hlX2FsbCh2b2lkKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKCIgZmx1c2ggIik7CisgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygic3RhICUlZzAsIFslJWcwXSAlMFxuXHQiOjoiaSIoQVNJX0RGTFVTSCk6Im1lbW9yeSIpOworfQorCit2b2lkIF9faW5saW5lX18gbGVvbl9mbHVzaF90bGJfYWxsKHZvaWQpCit7CisJbGVvbl9mbHVzaF9jYWNoZV9hbGwoKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3RhICUlZzAsIFslMF0gJTFcblx0Ijo6InIiKDB4NDAwKSwKKwkJCSAgICAgImkiKEFTSV9NTVVGTFVTSCk6Im1lbW9yeSIpOworfQorCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGN0eF90YWJsZVsyNTZdOworCXVuc2lnbmVkIGludCBwZ2RfdGFibGVbMjU2XTsKK30gc3BhcmNfc3JtbXVfc2V0dXA7CisKK3NwYXJjX3NybW11X3NldHVwIHNybW11X3RhYmxlcyBQUk9NX1BHVCA9IHsKKwl7MH0sCisJezB4MWUsCisJIDB4MTAwMDFlLAorCSAweDIwMDAxZSwKKwkgMHgzMDAwMWUsCisJIDB4NDAwMDFlLAorCSAweDUwMDAxZSwKKwkgMHg2MDAwMWUsCisJIDB4NzAwMDFlLAorCSAweDgwMDAxZSwKKwkgMHg5MDAwMWUsCisJIDB4YTAwMDFlLAorCSAweGIwMDAxZSwKKwkgMHhjMDAwMWUsCisJIDB4ZDAwMDFlLAorCSAweGUwMDAxZSwKKwkgMHhmMDAwMWUsCisJIDB4MTAwMDAxZSwKKwkgMHgxMTAwMDFlLAorCSAweDEyMDAwMWUsCisJIDB4MTMwMDAxZSwKKwkgMHgxNDAwMDFlLAorCSAweDE1MDAwMWUsCisJIDB4MTYwMDAxZSwKKwkgMHgxNzAwMDFlLAorCSAweDE4MDAwMWUsCisJIDB4MTkwMDAxZSwKKwkgMHgxYTAwMDFlLAorCSAweDFiMDAwMWUsCisJIDB4MWMwMDAxZSwKKwkgMHgxZDAwMDFlLAorCSAweDFlMDAwMWUsCisJIDB4MWYwMDAxZSwKKwkgMHgyMDAwMDFlLAorCSAweDIxMDAwMWUsCisJIDB4MjIwMDAxZSwKKwkgMHgyMzAwMDFlLAorCSAweDI0MDAwMWUsCisJIDB4MjUwMDAxZSwKKwkgMHgyNjAwMDFlLAorCSAweDI3MDAwMWUsCisJIDB4MjgwMDAxZSwKKwkgMHgyOTAwMDFlLAorCSAweDJhMDAwMWUsCisJIDB4MmIwMDAxZSwKKwkgMHgyYzAwMDFlLAorCSAweDJkMDAwMWUsCisJIDB4MmUwMDAxZSwKKwkgMHgyZjAwMDFlLAorCSAweDMwMDAwMWUsCisJIDB4MzEwMDAxZSwKKwkgMHgzMjAwMDFlLAorCSAweDMzMDAwMWUsCisJIDB4MzQwMDAxZSwKKwkgMHgzNTAwMDFlLAorCSAweDM2MDAwMWUsCisJIDB4MzcwMDAxZSwKKwkgMHgzODAwMDFlLAorCSAweDM5MDAwMWUsCisJIDB4M2EwMDAxZSwKKwkgMHgzYjAwMDFlLAorCSAweDNjMDAwMWUsCisJIDB4M2QwMDAxZSwKKwkgMHgzZTAwMDFlLAorCSAweDNmMDAwMWUsCisJIDB4NDAwMDAxZSwKKwkgMHg0MTAwMDFlLAorCSAweDQyMDAwMWUsCisJIDB4NDMwMDAxZSwKKwkgMHg0NDAwMDFlLAorCSAweDQ1MDAwMWUsCisJIDB4NDYwMDAxZSwKKwkgMHg0NzAwMDFlLAorCSAweDQ4MDAwMWUsCisJIDB4NDkwMDAxZSwKKwkgMHg0YTAwMDFlLAorCSAweDRiMDAwMWUsCisJIDB4NGMwMDAxZSwKKwkgMHg0ZDAwMDFlLAorCSAweDRlMDAwMWUsCisJIDB4NGYwMDAxZSwKKwkgMHg1MDAwMDFlLAorCSAweDUxMDAwMWUsCisJIDB4NTIwMDAxZSwKKwkgMHg1MzAwMDFlLAorCSAweDU0MDAwMWUsCisJIDB4NTUwMDAxZSwKKwkgMHg1NjAwMDFlLAorCSAweDU3MDAwMWUsCisJIDB4NTgwMDAxZSwKKwkgMHg1OTAwMDFlLAorCSAweDVhMDAwMWUsCisJIDB4NWIwMDAxZSwKKwkgMHg1YzAwMDFlLAorCSAweDVkMDAwMWUsCisJIDB4NWUwMDAxZSwKKwkgMHg1ZjAwMDFlLAorCSAweDYwMDAwMWUsCisJIDB4NjEwMDAxZSwKKwkgMHg2MjAwMDFlLAorCSAweDYzMDAwMWUsCisJIDB4NjQwMDAxZSwKKwkgMHg2NTAwMDFlLAorCSAweDY2MDAwMWUsCisJIDB4NjcwMDAxZSwKKwkgMHg2ODAwMDFlLAorCSAweDY5MDAwMWUsCisJIDB4NmEwMDAxZSwKKwkgMHg2YjAwMDFlLAorCSAweDZjMDAwMWUsCisJIDB4NmQwMDAxZSwKKwkgMHg2ZTAwMDFlLAorCSAweDZmMDAwMWUsCisJIDB4NzAwMDAxZSwKKwkgMHg3MTAwMDFlLAorCSAweDcyMDAwMWUsCisJIDB4NzMwMDAxZSwKKwkgMHg3NDAwMDFlLAorCSAweDc1MDAwMWUsCisJIDB4NzYwMDAxZSwKKwkgMHg3NzAwMDFlLAorCSAweDc4MDAwMWUsCisJIDB4NzkwMDAxZSwKKwkgMHg3YTAwMDFlLAorCSAweDdiMDAwMWUsCisJIDB4N2MwMDAxZSwKKwkgMHg3ZDAwMDFlLAorCSAweDdlMDAwMWUsCisJIDB4N2YwMDAxZSwKKwkgMHg4MDAwMDFlLAorCSAweDgxMDAwMWUsCisJIDB4ODIwMDAxZSwKKwkgMHg4MzAwMDFlLAorCSAweDg0MDAwMWUsCisJIDB4ODUwMDAxZSwKKwkgMHg4NjAwMDFlLAorCSAweDg3MDAwMWUsCisJIDB4ODgwMDAxZSwKKwkgMHg4OTAwMDFlLAorCSAweDhhMDAwMWUsCisJIDB4OGIwMDAxZSwKKwkgMHg4YzAwMDFlLAorCSAweDhkMDAwMWUsCisJIDB4OGUwMDAxZSwKKwkgMHg4ZjAwMDFlLAorCSAweDkwMDAwMWUsCisJIDB4OTEwMDAxZSwKKwkgMHg5MjAwMDFlLAorCSAweDkzMDAwMWUsCisJIDB4OTQwMDAxZSwKKwkgMHg5NTAwMDFlLAorCSAweDk2MDAwMWUsCisJIDB4OTcwMDAxZSwKKwkgMHg5ODAwMDFlLAorCSAweDk5MDAwMWUsCisJIDB4OWEwMDAxZSwKKwkgMHg5YjAwMDFlLAorCSAweDljMDAwMWUsCisJIDB4OWQwMDAxZSwKKwkgMHg5ZTAwMDFlLAorCSAweDlmMDAwMWUsCisJIDB4YTAwMDAxZSwKKwkgMHhhMTAwMDFlLAorCSAweGEyMDAwMWUsCisJIDB4YTMwMDAxZSwKKwkgMHhhNDAwMDFlLAorCSAweGE1MDAwMWUsCisJIDB4YTYwMDAxZSwKKwkgMHhhNzAwMDFlLAorCSAweGE4MDAwMWUsCisJIDB4YTkwMDAxZSwKKwkgMHhhYTAwMDFlLAorCSAweGFiMDAwMWUsCisJIDB4YWMwMDAxZSwKKwkgMHhhZDAwMDFlLAorCSAweGFlMDAwMWUsCisJIDB4YWYwMDAxZSwKKwkgMHhiMDAwMDFlLAorCSAweGIxMDAwMWUsCisJIDB4YjIwMDAxZSwKKwkgMHhiMzAwMDFlLAorCSAweGI0MDAwMWUsCisJIDB4YjUwMDAxZSwKKwkgMHhiNjAwMDFlLAorCSAweGI3MDAwMWUsCisJIDB4YjgwMDAxZSwKKwkgMHhiOTAwMDFlLAorCSAweGJhMDAwMWUsCisJIDB4YmIwMDAxZSwKKwkgMHhiYzAwMDFlLAorCSAweGJkMDAwMWUsCisJIDB4YmUwMDAxZSwKKwkgMHhiZjAwMDFlLAorCSAweGMwMDAwMWUsCisJIDB4YzEwMDAxZSwKKwkgMHhjMjAwMDFlLAorCSAweGMzMDAwMWUsCisJIDB4YzQwMDAxZSwKKwkgMHhjNTAwMDFlLAorCSAweGM2MDAwMWUsCisJIDB4YzcwMDAxZSwKKwkgMHhjODAwMDFlLAorCSAweGM5MDAwMWUsCisJIDB4Y2EwMDAxZSwKKwkgMHhjYjAwMDFlLAorCSAweGNjMDAwMWUsCisJIDB4Y2QwMDAxZSwKKwkgMHhjZTAwMDFlLAorCSAweGNmMDAwMWUsCisJIDB4ZDAwMDAxZSwKKwkgMHhkMTAwMDFlLAorCSAweGQyMDAwMWUsCisJIDB4ZDMwMDAxZSwKKwkgMHhkNDAwMDFlLAorCSAweGQ1MDAwMWUsCisJIDB4ZDYwMDAxZSwKKwkgMHhkNzAwMDFlLAorCSAweGQ4MDAwMWUsCisJIDB4ZDkwMDAxZSwKKwkgMHhkYTAwMDFlLAorCSAweGRiMDAwMWUsCisJIDB4ZGMwMDAxZSwKKwkgMHhkZDAwMDFlLAorCSAweGRlMDAwMWUsCisJIDB4ZGYwMDAxZSwKKwkgMHhlMDAwMDFlLAorCSAweGUxMDAwMWUsCisJIDB4ZTIwMDAxZSwKKwkgMHhlMzAwMDFlLAorCSAweGU0MDAwMWUsCisJIDB4ZTUwMDAxZSwKKwkgMHhlNjAwMDFlLAorCSAweGU3MDAwMWUsCisJIDB4ZTgwMDAxZSwKKwkgMHhlOTAwMDFlLAorCSAweGVhMDAwMWUsCisJIDB4ZWIwMDAxZSwKKwkgMHhlYzAwMDFlLAorCSAweGVkMDAwMWUsCisJIDB4ZWUwMDAxZSwKKwkgMHhlZjAwMDFlLAorCSAweDQwMDAwMWUJCS8qIGRlZmF1bHQgKi8KKwkgfQorfTsKKworLyogYSBzZWxmIGNvbnRhaW5lZCBwcm9tIGluZm8gc3RydWN0dXJlICovCitzdHJ1Y3QgbGVvbl9yZWxvY19mdW5jIHsKKwlzdHJ1Y3QgcHJvcGVydHkgKigqZmluZF9wcm9wZXJ0eSkgKGludCBub2RlLCBjaGFyICpuYW1lKTsKKwlpbnQgKCpzdHJjbXApIChjaGFyICpzMSwgY2hhciAqczIpOworCXZvaWQgKigqbWVtY3B5KSAodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgbik7CisJdm9pZCAoKnJlYm9vdF9waHlzaWNhbCkgKGNoYXIgKmNtZCk7CisJYW1iYXBwX2Rldl9hcGJ1YXJ0ICpsZW9uM19hcGJ1YXJ0OworfTsKKworc3RydWN0IGxlb25fcHJvbV9pbmZvIHsKKwlpbnQgZnJlcV9raHo7CisJaW50IGxlb25fbmN0eDsKKwlpbnQgbWlkc1szMl07CisJaW50IGJhdWRyYXRlc1syXTsKKwlzdHJ1Y3QgbGVvbl9yZWxvY19mdW5jIHJlbG9jX2Z1bmNzOworCXN0cnVjdCBwcm9wZXJ0eSByb290X3Byb3BlcnRpZXNbNF07CisJc3RydWN0IHByb3BlcnR5IGNwdV9wcm9wZXJ0aWVzWzddOworI3VuZGVmICBDUFVFTlRSWQorI2RlZmluZSBDUFVFTlRSWShpZHgpIHN0cnVjdCBwcm9wZXJ0eSBjcHVfcHJvcGVydGllcyMjaWR4WzRdCisJIENQVUVOVFJZKDEpOworCSBDUFVFTlRSWSgyKTsKKwkgQ1BVRU5UUlkoMyk7CisJIENQVUVOVFJZKDQpOworCSBDUFVFTlRSWSg1KTsKKwkgQ1BVRU5UUlkoNik7CisJIENQVUVOVFJZKDcpOworCSBDUFVFTlRSWSg4KTsKKwkgQ1BVRU5UUlkoOSk7CisJIENQVUVOVFJZKDEwKTsKKwkgQ1BVRU5UUlkoMTEpOworCSBDUFVFTlRSWSgxMik7CisJIENQVUVOVFJZKDEzKTsKKwkgQ1BVRU5UUlkoMTQpOworCSBDUFVFTlRSWSgxNSk7CisJIENQVUVOVFJZKDE2KTsKKwkgQ1BVRU5UUlkoMTcpOworCSBDUFVFTlRSWSgxOCk7CisJIENQVUVOVFJZKDE5KTsKKwkgQ1BVRU5UUlkoMjApOworCSBDUFVFTlRSWSgyMSk7CisJIENQVUVOVFJZKDIyKTsKKwkgQ1BVRU5UUlkoMjMpOworCSBDUFVFTlRSWSgyNCk7CisJIENQVUVOVFJZKDI1KTsKKwkgQ1BVRU5UUlkoMjYpOworCSBDUFVFTlRSWSgyNyk7CisJIENQVUVOVFJZKDI4KTsKKwkgQ1BVRU5UUlkoMjkpOworCSBDUFVFTlRSWSgzMCk7CisJIENQVUVOVFJZKDMxKTsKKwlzdHJ1Y3QgaWRwcm9tIGlkcHJvbTsKKwlzdHJ1Y3QgbGludXhfbm9kZW9wcyBub2Rlb3BzOworCXN0cnVjdCBsaW51eF9tbGlzdF92MCAqdG90cGh5c19wOworCXN0cnVjdCBsaW51eF9tbGlzdF92MCB0b3RwaHlzOworCXN0cnVjdCBsaW51eF9tbGlzdF92MCAqYXZhaWxfcDsKKwlzdHJ1Y3QgbGludXhfbWxpc3RfdjAgYXZhaWw7CisJc3RydWN0IGxpbnV4X21saXN0X3YwICpwcm9tbWFwX3A7CisJdm9pZCAoKnN5bmNob29rKSAodm9pZCk7CisJc3RydWN0IGxpbnV4X2FyZ3VtZW50c192MCAqYm9vdGFyZ3NfcDsKKwlzdHJ1Y3QgbGludXhfYXJndW1lbnRzX3YwIGJvb3RhcmdzOworCXN0cnVjdCBsaW51eF9yb212ZWMgcm9tdmVjOworCXN0cnVjdCBub2RlIG5vZGVzWzM1XTsKKwljaGFyIHNfZGV2aWNlX3R5cGVbMTJdOworCWNoYXIgc19jcHVbNF07CisJY2hhciBzX21pZFs0XTsKKwljaGFyIHNfaWRwcm9tWzddOworCWNoYXIgc19jb21wYXRhYmlsaXR5WzE0XTsKKwljaGFyIHNfbGVvbjJbNl07CisJY2hhciBzX21tdV9uY3R4WzldOworCWNoYXIgc19mcmVxdWVuY3lbMTZdOworCWNoYXIgc191YXJ0MV9iYXVkWzExXTsKKwljaGFyIHNfdWFydDJfYmF1ZFsxMV07CisJY2hhciBhcmdbMjU2XTsKK307CisKKy8qIHN0YXRpYyBwcm9tIGluZm8gKi8KK3N0YXRpYyBzdHJ1Y3QgbGVvbl9wcm9tX2luZm8gUFJPTV9EQVRBIHNwaSA9IHsKKwlDT05GSUdfU1lTX0NMS19GUkVRIC8gMTAwMCwKKwkyNTYsCisJeworI3VuZGVmCUNQVUVOVFJZCisjZGVmaW5lCUNQVUVOVFJZKGlkeCkgaWR4CisJIENQVUVOVFJZKDApLAorCSBDUFVFTlRSWSgxKSwKKwkgQ1BVRU5UUlkoMiksCisJIENQVUVOVFJZKDMpLAorCSBDUFVFTlRSWSg0KSwKKwkgQ1BVRU5UUlkoNSksCisJIENQVUVOVFJZKDYpLAorCSBDUFVFTlRSWSg3KSwKKwkgQ1BVRU5UUlkoOCksCisJIENQVUVOVFJZKDkpLAorCSBDUFVFTlRSWSgxMCksCisJIENQVUVOVFJZKDExKSwKKwkgQ1BVRU5UUlkoMTIpLAorCSBDUFVFTlRSWSgxMyksCisJIENQVUVOVFJZKDE0KSwKKwkgQ1BVRU5UUlkoMTUpLAorCSBDUFVFTlRSWSgxNiksCisJIENQVUVOVFJZKDE3KSwKKwkgQ1BVRU5UUlkoMTgpLAorCSBDUFVFTlRSWSgxOSksCisJIENQVUVOVFJZKDIwKSwKKwkgQ1BVRU5UUlkoMjEpLAorCSBDUFVFTlRSWSgyMiksCisJIENQVUVOVFJZKDIzKSwKKwkgQ1BVRU5UUlkoMjQpLAorCSBDUFVFTlRSWSgyNSksCisJIENQVUVOVFJZKDI2KSwKKwkgQ1BVRU5UUlkoMjcpLAorCSBDUFVFTlRSWSgyOCksCisJIENQVUVOVFJZKDI5KSwKKwkgQ1BVRU5UUlkoMzApLAorCSAzMX0sCisJezM4NDAwLCAzODQwMH0sCisJeworCSBfX3ZhKGZpbmRfcHJvcGVydHkpLAorCSBfX3ZhKGxlb25fc3RyY21wKSwKKwkgX192YShsZW9uX21lbWNweSksCisJIF9fcGh5KGxlb25fcmVib290X3BoeXNpY2FsKSwKKwkgfSwKKwl7CisJIHtfX3ZhKHNwaS5zX2RldmljZV90eXBlKSwgX192YShzcGkuc19pZHByb20pLCA0fSwKKwkge19fdmEoc3BpLnNfaWRwcm9tKSwgKGNoYXIgKilfX3ZhKCZzcGkuaWRwcm9tKSwgc2l6ZW9mKHN0cnVjdCBpZHByb20pfSwKKwkge19fdmEoc3BpLnNfY29tcGF0YWJpbGl0eSksIF9fdmEoc3BpLnNfbGVvbjIpLCA1fSwKKwkge05VTEwsIE5VTEwsIC0xfQorCSB9LAorCXsKKwkge19fdmEoc3BpLnNfZGV2aWNlX3R5cGUpLCBfX3ZhKHNwaS5zX2NwdSksIDR9LAorCSB7X192YShzcGkuc19taWQpLCBfX3ZhKCZzcGkubWlkc1swXSksIDR9LAorCSB7X192YShzcGkuc19tbXVfbmN0eCksIChjaGFyICopX192YSgmc3BpLmxlb25fbmN0eCksIDR9LAorCSB7X192YShzcGkuc19mcmVxdWVuY3kpLCAoY2hhciAqKV9fdmEoJnNwaS5mcmVxX2toeiksIDR9LAorCSB7X192YShzcGkuc191YXJ0MV9iYXVkKSwgKGNoYXIgKilfX3ZhKCZzcGkuYmF1ZHJhdGVzWzBdKSwgNH0sCisJIHtfX3ZhKHNwaS5zX3VhcnQyX2JhdWQpLCAoY2hhciAqKV9fdmEoJnNwaS5iYXVkcmF0ZXNbMV0pLCA0fSwKKwkge05VTEwsIE5VTEwsIC0xfQorCSB9LAorI3VuZGVmICBDUFVFTlRSWQorI2RlZmluZSBDUFVFTlRSWShpZHgpIFwKKwl7IC8qIGNwdV9wcm9wZXJ0aWVzICovCQkJCQkJXAorCQl7X192YShzcGkuc19kZXZpY2VfdHlwZSksIF9fdmEoc3BpLnNfY3B1KSwgNH0sCQlcCisJCXtfX3ZhKHNwaS5zX21pZCksIF9fdmEoJnNwaS5taWRzW2lkeF0pLCA0fSwJCQlcCisJCXtfX3ZhKHNwaS5zX2ZyZXF1ZW5jeSksIChjaGFyICopX192YSgmc3BpLmZyZXFfa2h6KSwgNH0sCVwKKwkJe05VTEwsIE5VTEwsIC0xfQkJCQkJCVwKKwl9CisJQ1BVRU5UUlkoMSksCisJQ1BVRU5UUlkoMiksCisJQ1BVRU5UUlkoMyksCisJQ1BVRU5UUlkoNCksCisJQ1BVRU5UUlkoNSksCisJQ1BVRU5UUlkoNiksCisJQ1BVRU5UUlkoNyksCisJQ1BVRU5UUlkoOCksCisJQ1BVRU5UUlkoOSksCisJQ1BVRU5UUlkoMTApLAorCUNQVUVOVFJZKDExKSwKKwlDUFVFTlRSWSgxMiksCisJQ1BVRU5UUlkoMTMpLAorCUNQVUVOVFJZKDE0KSwKKwlDUFVFTlRSWSgxNSksCisJQ1BVRU5UUlkoMTYpLAorCUNQVUVOVFJZKDE3KSwKKwlDUFVFTlRSWSgxOCksCisJQ1BVRU5UUlkoMTkpLAorCUNQVUVOVFJZKDIwKSwKKwlDUFVFTlRSWSgyMSksCisJQ1BVRU5UUlkoMjIpLAorCUNQVUVOVFJZKDIzKSwKKwlDUFVFTlRSWSgyNCksCisJQ1BVRU5UUlkoMjUpLAorCUNQVUVOVFJZKDI2KSwKKwlDUFVFTlRSWSgyNyksCisJQ1BVRU5UUlkoMjgpLAorCUNQVUVOVFJZKDI5KSwKKwlDUFVFTlRSWSgzMCksCisJQ1BVRU5UUlkoMzEpLAorCXsKKwkgMHgwMSwJCQkvKiBmb3JtYXQgKi8KKwkgTV9MRU9OMiB8IE1fTEVPTjJfU09DLAkvKiBtYWNoaW5lIHR5cGUgKi8KKwkgezAsIDAsIDAsIDAsIDAsIDB9LAkvKiBldGggKi8KKwkgMCwJCQkvKiBkYXRlICovCisJIDAsCQkJLyogc2VybnVtICovCisJIDAsCQkJLyogY2hlY2tzdW0gKi8KKwkgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9CS8qIHJlc2VydmVkICovCisJIH0sCisJeworCSBfX3ZhKG5vX25leHRub2RlKSwKKwkgX192YShub19jaGlsZCksCisJIF9fdmEobm9fcHJvcGxlbiksCisJIF9fdmEobm9fZ2V0cHJvcCksCisJIF9fdmEobm9fc2V0cHJvcCksCisJIF9fdmEobm9fbmV4dHByb3ApCisJIH0sCisJX192YSgmc3BpLnRvdHBoeXMpLAorCXsKKwkgTlVMTCwKKwkgKGNoYXIgKilDRkdfU0RSQU1fQkFTRSwKKwkgMCwKKwkgfSwKKwlfX3ZhKCZzcGkuYXZhaWwpLAorCXsKKwkgTlVMTCwKKwkgKGNoYXIgKilDRkdfU0RSQU1fQkFTRSwKKwkgMCwKKwkgfSwKKwlOVUxMLAkJCS8qIHByb21tYXBfcCAqLworCU5VTEwsCisJX192YSgmc3BpLmJvb3RhcmdzKSwKKwl7CisJIHtOVUxMLCBfX3ZhKHNwaS5hcmcpLCBOVUxMIC8qLi4uICovIH0sCisJIC8qLi4uICovCisJIH0sCisJeworCSAwLAorCSAwLAkJCS8qIHN1bjRjIHYwIHByb20gKi8KKwkgMCwgMCwKKwkge19fdmEoJnNwaS50b3RwaHlzX3ApLCBfX3ZhKCZzcGkucHJvbW1hcF9wKSwgX192YSgmc3BpLmF2YWlsX3ApfSwKKwkgX192YSgmc3BpLm5vZGVvcHMpLAorCSBOVUxMLCB7TlVMTCAvKiAuLi4gKi8gfSwKKwkgTlVMTCwgTlVMTCwKKwkgTlVMTCwgTlVMTCwJCS8qIHB2X2dldGNoYXIsIHB2X3B1dGNoYXIgKi8KKwkgX192YShsZW9uX25iZ2V0Y2hhciksIF9fdmEobGVvbl9uYnB1dGNoYXIpLAorCSBOVUxMLAorCSBfX3ZhKGxlb25fcmVib290KSwKKwkgTlVMTCwKKwkgTlVMTCwKKwkgTlVMTCwKKwkgX192YShsZW9uX2hhbHQpLAorCSBfX3ZhKCZzcGkuc3luY2hvb2spLAorCSB7TlVMTH0sCisJIF9fdmEoJnNwaS5ib290YXJnc19wKQorCSAvKi4uLiAqLworCSB9LAorCXsKKwkgezAsIF9fdmEoc3BpLnJvb3RfcHJvcGVydGllcyArIDMpIC8qIE5VTEwsIE5VTEwsIC0xICovIH0sCisJIHswLCBfX3ZhKHNwaS5yb290X3Byb3BlcnRpZXMpfSwKKwkgLyogY3B1IDAsIG11c3QgYmUgc3BpLm5vZGVzWzJdIHNlZSBsZW9uX3Byb21faW5pdCgpICovCisJIHsxLCBfX3ZhKHNwaS5jcHVfcHJvcGVydGllcyl9LAorCisjdW5kZWYgIENQVUVOVFJZCisjZGVmaW5lIENQVUVOVFJZKGlkeCkgXAorCSAgezEsIF9fdmEoc3BpLmNwdV9wcm9wZXJ0aWVzIyNpZHgpIH0JLyogY3B1IDxpZHg+ICovCisJIENQVUVOVFJZKDEpLAorCSBDUFVFTlRSWSgyKSwKKwkgQ1BVRU5UUlkoMyksCisJIENQVUVOVFJZKDQpLAorCSBDUFVFTlRSWSg1KSwKKwkgQ1BVRU5UUlkoNiksCisJIENQVUVOVFJZKDcpLAorCSBDUFVFTlRSWSg4KSwKKwkgQ1BVRU5UUlkoOSksCisJIENQVUVOVFJZKDEwKSwKKwkgQ1BVRU5UUlkoMTEpLAorCSBDUFVFTlRSWSgxMiksCisJIENQVUVOVFJZKDEzKSwKKwkgQ1BVRU5UUlkoMTQpLAorCSBDUFVFTlRSWSgxNSksCisJIENQVUVOVFJZKDE2KSwKKwkgQ1BVRU5UUlkoMTcpLAorCSBDUFVFTlRSWSgxOCksCisJIENQVUVOVFJZKDE5KSwKKwkgQ1BVRU5UUlkoMjApLAorCSBDUFVFTlRSWSgyMSksCisJIENQVUVOVFJZKDIyKSwKKwkgQ1BVRU5UUlkoMjMpLAorCSBDUFVFTlRSWSgyNCksCisJIENQVUVOVFJZKDI1KSwKKwkgQ1BVRU5UUlkoMjYpLAorCSBDUFVFTlRSWSgyNyksCisJIENQVUVOVFJZKDI4KSwKKwkgQ1BVRU5UUlkoMjkpLAorCSBDUFVFTlRSWSgzMCksCisJIENQVUVOVFJZKDMxKSwKKwkgey0xLCBfX3ZhKHNwaS5yb290X3Byb3BlcnRpZXMgKyAzKSAvKiBOVUxMLCBOVUxMLCAtMSAqLyB9CisJIH0sCisJImRldmljZV90eXBlIiwKKwkiY3B1IiwKKwkibWlkIiwKKwkiaWRwcm9tIiwKKwkiY29tcGF0YWJpbGl0eSIsCisJImxlb24yIiwKKwkibW11LW5jdHgiLAorCSJjbG9jay1mcmVxdWVuY3kiLAorCSJ1YXJ0MV9iYXVkIiwKKwkidWFydDJfYmF1ZCIsCisJQ09ORklHX0RFRkFVTFRfS0VSTkVMX0NPTU1BTkRfTElORQorfTsKKworLyogZnJvbSBhcmNoL3NwYXJjL2tlcm5lbC9zZXR1cC5jICovCisjZGVmaW5lIFJBTURJU0tfTE9BRF9GTEFHIDB4NDAwMAorZXh0ZXJuIHVuc2lnbmVkIHNob3J0IHJvb3RfZmxhZ3M7CitleHRlcm4gdW5zaWduZWQgc2hvcnQgcm9vdF9kZXY7CitleHRlcm4gdW5zaWduZWQgc2hvcnQgcmFtX2ZsYWdzOworZXh0ZXJuIHVuc2lnbmVkIGludCBzcGFyY19yYW1kaXNrX2ltYWdlOworZXh0ZXJuIHVuc2lnbmVkIGludCBzcGFyY19yYW1kaXNrX3NpemU7CitleHRlcm4gaW50IHJvb3RfbW91bnRmbGFnczsKKworZXh0ZXJuIGNoYXIgaW5pdHJkX2VuZCwgaW5pdHJkX3N0YXJ0OworCisvKiBSZWJvb3QgdGhlIENQVSA9IGp1bXAgdG8gYmVnaW5uaW5nIG9mIGZsYXNoIGFnYWluLgorICoKKyAqIE1ha2Ugc3VyZSB0aGF0IGFsbCBmdW5jdGlvbiBhcmUgaW5saW5lZCBoZXJlLgorICovCitzdGF0aWMgdm9pZCBQUk9NX1RFWFQgbGVvbl9yZWJvb3QoY2hhciAqYmNvbW1hbmQpCit7CisJcmVnaXN0ZXIgY2hhciAqYXJnID0gYmNvbW1hbmQ7CisJdm9pZCBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKSAoKnJlYm9vdF9waHlzaWNhbCkgKGNoYXIgKmNtZCk7CisKKwkvKiBnZXQgcGh5c2ljYWwgYWRkcmVzcyAqLworCXN0cnVjdCBsZW9uX3Byb21faW5mbyAqcHNwaSA9CisJICAgICh2b2lkICopKENGR19QUk9NX09GRlNFVCArIHNpemVvZihzcm1tdV90YWJsZXMpKTsKKworCXVuc2lnbmVkIGludCAqc3JtbXVfY3R4X3RhYmxlOworCisJLyogVHVybiBvZiBJbnRlcnJ1cHRzICovCisJc2V0X3BpbCgweGYpOworCisJLyogU2V0IGtlcm5lbCdzIGNvbnRleHQsIGNvbnRleHQgemVybyAqLworCXNybW11X3NldF9jb250ZXh0KDApOworCisJLyogR2V0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIE1NVSBzaHV0ZG93biByb3V0aW5lICovCisJcmVib290X3BoeXNpY2FsID0gKHZvaWQgKikKKwkgICAgU1BBUkNfQllQQVNTX1JFQUQoJnBzcGktPnJlbG9jX2Z1bmNzLnJlYm9vdF9waHlzaWNhbCk7CisKKwkvKiBOb3cgdGhhdCB3ZSBrbm93IHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbgorCSAqIHdlIGNhbiBtYWtlIHRoZSBNTVUgYWxsb3cganVtcGluZyB0byBpdC4KKwkgKi8KKwlzcm1tdV9jdHhfdGFibGUgPSAodW5zaWduZWQgaW50ICopc3JtbXVfZ2V0X2N0YWJsZV9wdHIoKTsKKworCXNybW11X2N0eF90YWJsZSA9ICh1bnNpZ25lZCBpbnQgKilTUEFSQ19CWVBBU1NfUkVBRChzcm1tdV9jdHhfdGFibGUpOworCisJLyogZ2V0IHBoeXNpY2FsIGFkZHJlc3Mgb2Yga2VybmVsJ3MgY29udGV4dCB0YWJsZSAoYXNzdW1lIHB0ZCkgKi8KKwlzcm1tdV9jdHhfdGFibGUgPSAodW5zaWduZWQgaW50ICopCisJICAgICgoKHVuc2lnbmVkIGludClzcm1tdV9jdHhfdGFibGUgJiAweGZmZmZmZmZjKSA8PCA0KTsKKworCS8qIGVuYWJsZSBhY2Nlc3MgdG8gcGh5c2ljYWwgYWRkcmVzcyBvZiBNTVUgc2h1dGRvd24gZnVuY3Rpb24gKi8KKwlTUEFSQ19CWVBBU1NfV1JJVEUoJnNybW11X2N0eF90YWJsZQorCQkJICAgWygodW5zaWduZWQgaW50KXJlYm9vdF9waHlzaWNhbCkgPj4gMjRdLAorCQkJICAgKCgodW5zaWduZWQgaW50KXJlYm9vdF9waHlzaWNhbCAmIDB4ZmYwMDAwMDApID4+IDQpIHwKKwkJCSAgIDB4MWUpOworCisJLyogZmx1c2ggVExCIGNhY2hlICovCisJbGVvbl9mbHVzaF90bGJfYWxsKCk7CisKKwkvKiBmbGFzaCBpbnN0cnVjdGlvbiAmIGRhdGEgY2FjaGUgKi8KKwlzcGFyY19pY2FjaGVfZmx1c2hfYWxsKCk7CisJc3BhcmNfZGNhY2hlX2ZsdXNoX2FsbCgpOworCisJLyoganVtcCB0byBwaHlzaWNhbCBhZGRyZXNzIGZ1bmN0aW9uCisJICogc28gdGhhdCB3aGVuIHRoZSBNTVUgaXMgZGlzYWJsZWQKKwkgKiB3ZSBjYW4gY29udGludWUgdG8gZXhlY3V0ZQorCSAqLworCXJlYm9vdF9waHlzaWNhbChhcmcpOworfQorCitzdGF0aWMgdm9pZCBQUk9NX1RFWFQgbGVvbl9yZWJvb3RfcGh5c2ljYWwoY2hhciAqYmNvbW1hbmQpCit7CisJdm9pZCBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKSAoKnJlc2V0KSAodm9pZCk7CisKKwkvKiBUdXJuIG9mZiBNTVUgKi8KKwlzcm1tdV9zZXRfbW11cmVnKDApOworCisJLyogSGFyZGNvZGVkIHN0YXJ0IGFkZHJlc3MgKi8KKwlyZXNldCA9IENGR19NT05JVE9SX0JBU0U7CisKKwkvKiBmbHVzaCBkYXRhIGNhY2hlICovCisJc3BhcmNfZGNhY2hlX2ZsdXNoX2FsbCgpOworCisJLyogZmx1c2ggaW5zdHJ1Y3Rpb24gY2FjaGUgKi8KKwlzcGFyY19pY2FjaGVfZmx1c2hfYWxsKCk7CisKKwkvKiBKdW1wIHRvIHN0YXJ0IGluIEZsYXNoICovCisJcmVzZXQoKTsKK30KKworc3RhdGljIHZvaWQgUFJPTV9URVhUIGxlb25faGFsdCh2b2lkKQoreworCXdoaWxlICgxKSA7Cit9CisKKy8qIGdldCBzaW5nbGUgY2hhciwgZG9uJ3QgY2FyZSBmb3IgYmxvY2tpbmcqLworc3RhdGljIGludCBQUk9NX1RFWFQgbGVvbl9uYmdldGNoYXIodm9pZCkKK3sKKwlyZXR1cm4gLTE7Cit9CisKKy8qIHB1dCBzaW5nbGUgY2hhciwgZG9uJ3QgY2FyZSBmb3IgYmxvY2tpbmcqLworc3RhdGljIGludCBQUk9NX1RFWFQgbGVvbl9uYnB1dGNoYXIoaW50IGMpCit7CisJYW1iYXBwX2Rldl9hcGJ1YXJ0ICp1YXJ0OworCisJLyogZ2V0IHBoeXNpY2FsIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgbGVvbl9wcm9tX2luZm8gKnBzcGkgPQorCSAgICAodm9pZCAqKShDRkdfUFJPTV9PRkZTRVQgKyBzaXplb2Yoc3JtbXVfdGFibGVzKSk7CisKKwl1YXJ0ID0gKGFtYmFwcF9kZXZfYXBidWFydCAqKQorCSAgICBTUEFSQ19CWVBBU1NfUkVBRCgmcHNwaS0+cmVsb2NfZnVuY3MubGVvbjNfYXBidWFydCk7CisKKwkvKiBubyBVQVJUPyAqLworCWlmICghdWFydCkKKwkJcmV0dXJuIDA7CisKKwkvKioqKiogcHV0IGNoYXIgaW4gYnVmZmVyLi4uICoqKioqKioqKioqCisJICogTWFrZSBzdXJlIGFsbCBmdW5jdGlvbnMgYXJlIGlubGluZSEgKgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwkvKiBXYWl0IGZvciBsYXN0IGNoYXJhY3RlciB0byBnby4gKi8KKwl3aGlsZSAoIShTUEFSQ19CWVBBU1NfUkVBRCgmdWFydC0+c3RhdHVzKQorCQkgJiBMRU9OX1JFR19VQVJUX1NUQVRVU19USEUpKSA7CisKKwkvKiBTZW5kIGRhdGEgKi8KKwlTUEFSQ19CWVBBU1NfV1JJVEUoJnVhcnQtPmRhdGEsIGMpOworCisJLyogV2FpdCBmb3IgZGF0YSB0byBiZSBzZW50ICovCisJd2hpbGUgKCEoU1BBUkNfQllQQVNTX1JFQUQoJnVhcnQtPnN0YXR1cykKKwkJICYgTEVPTl9SRUdfVUFSVF9TVEFUVVNfVFNFKSkgOworCisJcmV0dXJuIDA7Cit9CisKKy8qIG5vZGUgb3BzICovCisKKy8qI2RlZmluZSBub2RlcyAoKHN0cnVjdCBub2RlICopX192YSgmcHNwaS0+bm9kZXMpKSovCisjZGVmaW5lIG5vZGVzICgoc3RydWN0IG5vZGUgKikocHNwaS0+bm9kZXMpKQorCitzdGF0aWMgaW50IFBST01fVEVYVCBub19uZXh0bm9kZShpbnQgbm9kZSkKK3sKKwkvKiBnZXQgcGh5c2ljYWwgYWRkcmVzcyAqLworCXN0cnVjdCBsZW9uX3Byb21faW5mbyAqcHNwaSA9CisJICAgICh2b2lkICopKENGR19QUk9NX09GRlNFVCArIHNpemVvZihzcm1tdV90YWJsZXMpKTsKKworCS8qIGNvbnZlcnQgaW50byB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlwc3BpID0gKHN0cnVjdCBsZW9uX3Byb21faW5mbyAqKQorCSAgICAoKCh1bnNpZ25lZCBpbnQpcHNwaSAmIDB4MGZmZmZmZmYpIHwgUEFHRV9PRkZTRVQpOworCisJaWYgKG5vZGVzW25vZGVdLmxldmVsID09IG5vZGVzW25vZGUgKyAxXS5sZXZlbCkKKwkJcmV0dXJuIG5vZGUgKyAxOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBQUk9NX1RFWFQgbm9fY2hpbGQoaW50IG5vZGUpCit7CisJLyogZ2V0IHBoeXNpY2FsIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgbGVvbl9wcm9tX2luZm8gKnBzcGkgPSAoc3RydWN0IGxlb25fcHJvbV9pbmZvICopCisJICAgIChDRkdfUFJPTV9PRkZTRVQgKyBzaXplb2Yoc3JtbXVfdGFibGVzKSk7CisKKwkvKiBjb252ZXJ0IGludG8gdmlydHVhbCBhZGRyZXNzICovCisJcHNwaSA9IChzdHJ1Y3QgbGVvbl9wcm9tX2luZm8gKikKKwkgICAgKCgodW5zaWduZWQgaW50KXBzcGkgJiAweDBmZmZmZmZmKSB8IFBBR0VfT0ZGU0VUKTsKKworCWlmIChub2Rlc1tub2RlXS5sZXZlbCA9PSBub2Rlc1tub2RlICsgMV0ubGV2ZWwgLSAxKQorCQlyZXR1cm4gbm9kZSArIDE7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgc3RydWN0IHByb3BlcnR5IFBST01fVEVYVCAqZmluZF9wcm9wZXJ0eShpbnQgbm9kZSwgY2hhciAqbmFtZSkKK3sKKwkvKiBnZXQgcGh5c2ljYWwgYWRkcmVzcyAqLworCXN0cnVjdCBsZW9uX3Byb21faW5mbyAqcHNwaSA9IChzdHJ1Y3QgbGVvbl9wcm9tX2luZm8gKikKKwkgICAgKENGR19QUk9NX09GRlNFVCArIHNpemVvZihzcm1tdV90YWJsZXMpKTsKKworCS8qIGNvbnZlcnQgaW50byB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlwc3BpID0gKHN0cnVjdCBsZW9uX3Byb21faW5mbyAqKQorCSAgICAoKCh1bnNpZ25lZCBpbnQpcHNwaSAmIDB4MGZmZmZmZmYpIHwgUEFHRV9PRkZTRVQpOworCisJc3RydWN0IHByb3BlcnR5ICpwcm9wID0gJm5vZGVzW25vZGVdLnByb3BlcnRpZXNbMF07CisJd2hpbGUgKHByb3AgJiYgcHJvcC0+bmFtZSkgeworCQlpZiAocHNwaS0+cmVsb2NfZnVuY3Muc3RyY21wKHByb3AtPm5hbWUsIG5hbWUpID09IDApCisJCQlyZXR1cm4gcHJvcDsKKwkJcHJvcCsrOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBQUk9NX1RFWFQgbm9fcHJvcGxlbihpbnQgbm9kZSwgY2hhciAqbmFtZSkKK3sKKwkvKiBnZXQgcGh5c2ljYWwgYWRkcmVzcyAqLworCXN0cnVjdCBsZW9uX3Byb21faW5mbyAqcHNwaSA9IChzdHJ1Y3QgbGVvbl9wcm9tX2luZm8gKikKKwkgICAgKENGR19QUk9NX09GRlNFVCArIHNpemVvZihzcm1tdV90YWJsZXMpKTsKKworCS8qIGNvbnZlcnQgaW50byB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlwc3BpID0gKHN0cnVjdCBsZW9uX3Byb21faW5mbyAqKQorCSAgICAoKCh1bnNpZ25lZCBpbnQpcHNwaSAmIDB4MGZmZmZmZmYpIHwgUEFHRV9PRkZTRVQpOworCisJc3RydWN0IHByb3BlcnR5ICpwcm9wID0gcHNwaS0+cmVsb2NfZnVuY3MuZmluZF9wcm9wZXJ0eShub2RlLCBuYW1lKTsKKwlpZiAocHJvcCkKKwkJcmV0dXJuIHByb3AtPmxlbmd0aDsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgUFJPTV9URVhUIG5vX2dldHByb3AoaW50IG5vZGUsIGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlKQoreworCS8qIGdldCBwaHlzaWNhbCBhZGRyZXNzICovCisJc3RydWN0IGxlb25fcHJvbV9pbmZvICpwc3BpID0gKHN0cnVjdCBsZW9uX3Byb21faW5mbyAqKQorCSAgICAoQ0ZHX1BST01fT0ZGU0VUICsgc2l6ZW9mKHNybW11X3RhYmxlcykpOworCisJLyogY29udmVydCBpbnRvIHZpcnR1YWwgYWRkcmVzcyAqLworCXBzcGkgPSAoc3RydWN0IGxlb25fcHJvbV9pbmZvICopCisJICAgICgoKHVuc2lnbmVkIGludClwc3BpICYgMHgwZmZmZmZmZikgfCBQQUdFX09GRlNFVCk7CisKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSBwc3BpLT5yZWxvY19mdW5jcy5maW5kX3Byb3BlcnR5KG5vZGUsIG5hbWUpOworCWlmIChwcm9wKSB7CisJCXBzcGktPnJlbG9jX2Z1bmNzLm1lbWNweSh2YWx1ZSwgcHJvcC0+dmFsdWUsIHByb3AtPmxlbmd0aCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgUFJPTV9URVhUIG5vX3NldHByb3AoaW50IG5vZGUsIGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlLCBpbnQgbGVuKQoreworCXJldHVybiAtMTsKK30KKworc3RhdGljIGNoYXIgUFJPTV9URVhUICpub19uZXh0cHJvcChpbnQgbm9kZSwgY2hhciAqbmFtZSkKK3sKKwkvKiBnZXQgcGh5c2ljYWwgYWRkcmVzcyAqLworCXN0cnVjdCBsZW9uX3Byb21faW5mbyAqcHNwaSA9IChzdHJ1Y3QgbGVvbl9wcm9tX2luZm8gKikKKwkgICAgKENGR19QUk9NX09GRlNFVCArIHNpemVvZihzcm1tdV90YWJsZXMpKTsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisKKwkvKiBjb252ZXJ0IGludG8gdmlydHVhbCBhZGRyZXNzICovCisJcHNwaSA9IChzdHJ1Y3QgbGVvbl9wcm9tX2luZm8gKikKKwkgICAgKCgodW5zaWduZWQgaW50KXBzcGkgJiAweDBmZmZmZmZmKSB8IFBBR0VfT0ZGU0VUKTsKKworCWlmICghbmFtZSB8fCAhbmFtZVswXSkKKwkJcmV0dXJuIG5vZGVzW25vZGVdLnByb3BlcnRpZXNbMF0ubmFtZTsKKworCXByb3AgPSBwc3BpLT5yZWxvY19mdW5jcy5maW5kX3Byb3BlcnR5KG5vZGUsIG5hbWUpOworCWlmIChwcm9wKQorCQlyZXR1cm4gcHJvcFsxXS5uYW1lOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IFBST01fVEVYVCBsZW9uX3N0cmNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCit7CisJcmVnaXN0ZXIgY2hhciByZXN1bHQ7CisKKwl3aGlsZSAoMSkgeworCQlyZXN1bHQgPSAqczEgLSAqczI7CisJCWlmIChyZXN1bHQgfHwgISpzMSkKKwkJCWJyZWFrOworCQlzMisrOworCQlzMSsrOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkICpQUk9NX1RFWFQgbGVvbl9tZW1jcHkodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbikKK3sKKwljaGFyICpkc3QgPSAoY2hhciAqKWRlc3QsICpzb3VyY2UgPSAoY2hhciAqKXNyYzsKKworCXdoaWxlIChuLS0pIHsKKwkJKmRzdCA9ICpzb3VyY2U7CisJCWRzdCsrOworCQlzb3VyY2UrKzsKKwl9CisJcmV0dXJuIGRlc3Q7Cit9CisKKyNkZWZpbmUgR0VUUkVHU1Aoc3ApIF9fYXNtX18gX192b2xhdGlsZV9fKCJtb3YgJSVzcCwgJTAiIDogIj1yIiAoc3ApKQorCit2b2lkIGxlb25fcHJvbV9pbml0KHN0cnVjdCBsZW9uX3Byb21faW5mbyAqcHNwaSkKK3sKKwl1bnNpZ25lZCBsb25nIGk7CisJdW5zaWduZWQgY2hhciBja3N1bSwgKnB0cjsKKwljaGFyICphZGRyX3N0ciwgKmVuZDsKKwl1bnNpZ25lZCBsb25nIHNwOworCUdFVFJFR1NQKHNwKTsKKworCXBzcGktPmZyZXFfa2h6ID0gQ09ORklHX1NZU19DTEtfRlJFUSAvIDEwMDA7CisKKwkvKiBTZXQgQXZhaWxhYmxlIG1haW4gbWVtb3J5IHNpemUgKi8KKwlwc3BpLT50b3RwaHlzLm51bV9ieXRlcyA9IENGR19QUk9NX09GRlNFVCAtIENGR19TRFJBTV9CQVNFOworCXBzcGktPmF2YWlsLm51bV9ieXRlcyA9IHBzcGktPnRvdHBoeXMubnVtX2J5dGVzOworCisJLyogU2V0IHRoZSBwb2ludGVyIHRvIHRoZSBDb25zb2xlIFVBUlQgaW4gcm9tdmVjICovCisJcHNwaS0+cmVsb2NfZnVuY3MubGVvbjNfYXBidWFydCA9IGxlb24zX2FwYnVhcnQ7CisKKwl7CisJCWludCBqID0gMTsKKyNpZmRlZiBDT05GSUdfU01QCisJCWFtYmFwcF9kZXZfaXJxbXAgKmI7CisJCWIgPSAoYW1iYXBwX2Rldl9pcnFtcCAqKSBsZW9uM19nZXRhcGJiYXNlKFZFTkRPUl9HQUlTTEVSLAorCQkJCQkJCSAgR0FJU0xFUl9JUlFNUCk7CisJCWlmIChiKSB7CisJCQlqID0gMSArICgoTEVPTjNfQllQQVNTX0xPQURfUEEoJihiLT5tcHN0YXR1cykpCisJCQkJICA+PiBMRU9OM19JUlFNUFNUQVRVU19DUFVOUikgJiAweGYpOworCQl9CisjZW5kaWYKKyN1bmRlZiBub2RlcworCQlwc3BpLT5ub2Rlc1syICsgal0ubGV2ZWwgPSAtMTsKKwkJcHNwaS0+bm9kZXNbMiArIGpdLnByb3BlcnRpZXMgPSBfX3ZhKHNwaS5yb290X3Byb3BlcnRpZXMgKyAzKTsKKwl9CisKKwkvKiBTZXQgRXRoZXJuZXQgTUFDIGFkZHJlc3MgZnJvbSBlbnZpcm9ubWVudCAqLworCWlmICgoYWRkcl9zdHIgPSBnZXRlbnYoImV0aGFkZHIiKSkgIT0gTlVMTCkgeworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCQlwc3BpLT5pZHByb20uaWRfZXRoYWRkcltpXSA9IGFkZHJfc3RyID8KKwkJCSAgICBzaW1wbGVfc3RydG91bChhZGRyX3N0ciwgJmVuZCwgMTYpIDogMDsKKwkJCWlmIChhZGRyX3N0cikgeworCQkJCWFkZHJfc3RyID0gKCplbmQpID8gZW5kICsgMSA6IGVuZDsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCS8qIEhXIEFkZHJlc3Mgbm90IGZvdW5kIGluIGVudmlyb25tZW50LAorCQkgKiBTZXQgZGVmYXVsdCBIVyBhZGRyZXNzCisJCSAqLworCQlwc3BpLT5pZHByb20uaWRfZXRoYWRkclswXSA9IDA7CisJCXBzcGktPmlkcHJvbS5pZF9ldGhhZGRyWzFdID0gMDsKKwkJcHNwaS0+aWRwcm9tLmlkX2V0aGFkZHJbMl0gPSAwOworCQlwc3BpLT5pZHByb20uaWRfZXRoYWRkclszXSA9IDA7CisJCXBzcGktPmlkcHJvbS5pZF9ldGhhZGRyWzRdID0gMDsKKwkJcHNwaS0+aWRwcm9tLmlkX2V0aGFkZHJbNV0gPSAwOworCX0KKworCXB0ciA9ICh1bnNpZ25lZCBjaGFyICopJnBzcGktPmlkcHJvbTsKKwlmb3IgKGkgPSBja3N1bSA9IDA7IGkgPD0gMHgwRTsgaSsrKQorCQlja3N1bSBePSAqcHRyKys7CisJcHNwaS0+aWRwcm9tLmlkX2Nrc3VtID0gY2tzdW07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY2FjaGUodW5zaWduZWQgbG9uZyByZWd2YWwpCit7CisJYXNtIHZvbGF0aWxlICgic3RhICUwLCBbJSVnMF0gJTFcblx0Ijo6ICJyIiAocmVndmFsKSwgImkiKDIpOiJtZW1vcnkiKTsKK30KKworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGJzc19zdGFydCwgYnNzX2VuZDsKKworLyogbWFyayBhcyBzZWN0aW9uIC5pbWcubWFpbi50ZXh0LCB0byBiZSByZWZlcmVuY2VkIGluIGxpbmtlciBzY3JpcHQgKi8KK2ludCBwcm9tX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgbGVvbl9wcm9tX2luZm8gKnBzcGkgPSAodm9pZCAqKQorCSAgICAoKCgodW5zaWduZWQgaW50KSZzcGkpICYgUFJPTV9TSVpFX01BU0spICsgQ0ZHX1BST01fT0ZGU0VUKTsKKworCS8qIGRpc2FibGUgbW11ICovCisJc3JtbXVfc2V0X21tdXJlZygweDAwMDAwMDAwKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiZmx1c2hcblx0Iik7CisKKwkvKiBpbml0IHByb20gaW5mbyBzdHJ1Y3QgKi8KKwlsZW9uX3Byb21faW5pdChwc3BpKTsKKworCWtlcm5lbF9hcmdfcHJvbXZlYyA9ICZwc3BpLT5yb212ZWM7CisjaWZkZWYgUFJJTlRfUk9NX1ZFQworCXByaW50ZigiS2VybmVsIHJvbSB2ZWM6IDB4JWx4XG4iLCAodW5zaWduZWQgaW50KSgmcHNwaS0+cm9tdmVjKSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyogQ29weSBjdXJyZW50IGtlcm5lbCBib290IGFyZ3VtZW50IHRvIFJPTXZlYyAqLwordm9pZCBwcmVwYXJlX2Jvb3RhcmdzKGNoYXIgKmJvb3RhcmdzKQoreworCXN0cnVjdCBsZW9uX3Byb21faW5mbyAqcHNwaTsKKwljaGFyICpzcmMsICpkc3Q7CisJaW50IGxlZnQ7CisKKwkvKiBpZiBubyBib290YXJncyBzZXQsIHNraXAgY29weWluZyA9PT4gZGVmYXVsdCBib290bGluZSAqLworCWlmIChib290YXJncyAmJiAoKmJvb3RhcmdzICE9ICdcMCcpKSB7CisJCXBzcGkgPSAodm9pZCAqKSgoKCh1bnNpZ25lZCBpbnQpJnNwaSkgJiBQUk9NX1NJWkVfTUFTSykgKworCQkJCUNGR19QUk9NX09GRlNFVCk7CisJCXNyYyA9IGJvb3RhcmdzOworCQlkc3QgPSAmcHNwaS0+YXJnWzBdOworCQlsZWZ0ID0gMjU1OwkvKiBtYXggbGVuICovCisJCXdoaWxlICgqc3JjICYmIGxlZnQgPiAwKSB7CisJCQkqZHN0KysgPSAqc3JjKys7CisJCQlsZWZ0LS07CisJCX0KKwkJLyogdGVybWluYXRlIGtlcm5lbCBjb21tYW5kIGxpbmUgc3RyaW5nICovCisJCSpkc3QgPSAwOworCX0KK30KKwordm9pZCBzcm1tdV9pbml0X2NwdSh1bnNpZ25lZCBpbnQgZW50cnkpCit7CisJc3BhcmNfc3JtbXVfc2V0dXAgKnBzcm1tdV90YWJsZXMgPSAodm9pZCAqKQorCSAgICAoKCgodW5zaWduZWQgaW50KSZzcm1tdV90YWJsZXMpICYgUFJPTV9TSVpFX01BU0spICsKKwkgICAgIENGR19QUk9NX09GRlNFVCk7CisKKwkvKiBNYWtlIGNvbnRleHQgMCAoa2VybmVsJ3MgY29udGV4dCkgcG9pbnQKKwkgKiB0byBvdXIgcHJlcGFyZWQgbWVtb3J5IG1hcHBpbmcKKwkgKi8KKyNkZWZpbmUgUFREIDEKKwlwc3JtbXVfdGFibGVzLT5jdHhfdGFibGVbMF0gPQorCSAgICAoKHVuc2lnbmVkIGludCkmcHNybW11X3RhYmxlcy0+cGdkX3RhYmxlWzB4MDBdKSA+PiA0IHwgUFREOworCisJLyogU2V0IHZpcnR1YWwga2VybmVsIGFkZHJlc3MgMHhmMDAwMDAwMAorCSAqIHRvIFNSQU0vU0RSQU0gYWRkcmVzcy4KKwkgKiBNYWtlIGl0IFJFQUQvV1JJVEUvRVhFQyB0byBTdXBlclVzZXIKKwkgKi8KKyNkZWZpbmUgUFRFIDIKKyNkZWZpbmUgQUNDX1NVX0FMTCAweDFjCisJcHNybW11X3RhYmxlcy0+cGdkX3RhYmxlWzB4ZjBdID0KKwkgICAgKENGR19TRFJBTV9CQVNFID4+IDQpIHwgQUNDX1NVX0FMTCB8IFBURTsKKwlwc3JtbXVfdGFibGVzLT5wZ2RfdGFibGVbMHhmMV0gPQorCSAgICAoKENGR19TRFJBTV9CQVNFICsgMHgxMDAwMDAwKSA+PiA0KSB8IEFDQ19TVV9BTEwgfCBQVEU7CisJcHNybW11X3RhYmxlcy0+cGdkX3RhYmxlWzB4ZjJdID0KKwkgICAgKChDRkdfU0RSQU1fQkFTRSArIDB4MjAwMDAwMCkgPj4gNCkgfCBBQ0NfU1VfQUxMIHwgUFRFOworCXBzcm1tdV90YWJsZXMtPnBnZF90YWJsZVsweGYzXSA9CisJICAgICgoQ0ZHX1NEUkFNX0JBU0UgKyAweDMwMDAwMDApID4+IDQpIHwgQUNDX1NVX0FMTCB8IFBURTsKKwlwc3JtbXVfdGFibGVzLT5wZ2RfdGFibGVbMHhmNF0gPQorCSAgICAoKENGR19TRFJBTV9CQVNFICsgMHg0MDAwMDAwKSA+PiA0KSB8IEFDQ19TVV9BTEwgfCBQVEU7CisJcHNybW11X3RhYmxlcy0+cGdkX3RhYmxlWzB4ZjVdID0KKwkgICAgKChDRkdfU0RSQU1fQkFTRSArIDB4NTAwMDAwMCkgPj4gNCkgfCBBQ0NfU1VfQUxMIHwgUFRFOworCXBzcm1tdV90YWJsZXMtPnBnZF90YWJsZVsweGY2XSA9CisJICAgICgoQ0ZHX1NEUkFNX0JBU0UgKyAweDYwMDAwMDApID4+IDQpIHwgQUNDX1NVX0FMTCB8IFBURTsKKwlwc3JtbXVfdGFibGVzLT5wZ2RfdGFibGVbMHhmN10gPQorCSAgICAoKENGR19TRFJBTV9CQVNFICsgMHg3MDAwMDAwKSA+PiA0KSB8IEFDQ19TVV9BTEwgfCBQVEU7CisKKwkvKiBjb252ZXJ0IHJvbSB2ZWMgcG9pbnRlciB0byB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlrZXJuZWxfYXJnX3Byb212ZWMgPSAoc3RydWN0IGxpbnV4X3JvbXZlYyAqKQorCSAgICAoKCh1bnNpZ25lZCBpbnQpa2VybmVsX2FyZ19wcm9tdmVjICYgMHgwZmZmZmZmZikgfCAweGYwMDAwMDAwKTsKKworCS8qIFNldCBDb250ZXh0IHBvaW50ZXIgdG8gcG9pbnQgdG8gY29udGV4dCB0YWJsZQorCSAqIDI1NiBjb250ZXh0cyBzdXBwb3J0ZWQuCisJICovCisJc3JtbXVfc2V0X2N0YWJsZV9wdHIoKHVuc2lnbmVkIGludCkmcHNybW11X3RhYmxlcy0+Y3R4X3RhYmxlWzBdKTsKKworCS8qIFNldCBrZXJuZWwncyBjb250ZXh0LCBjb250ZXh0IHplcm8gKi8KKwlzcm1tdV9zZXRfY29udGV4dCgwKTsKKworCS8qIEludmFsaWRhdGUgYWxsIENhY2hlICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18oImZsdXNoXG5cdCIpOworCisJc3JtbXVfc2V0X21tdXJlZygweDAwMDAwMDAxKTsKKwlsZW9uX2ZsdXNoX3RsYl9hbGwoKTsKKwlsZW9uX2ZsdXNoX2NhY2hlX2FsbCgpOworfQpkaWZmIC0tZ2l0IGEvY3B1L2xlb24zL3NlcmlhbC5jIGIvY3B1L2xlb24zL3NlcmlhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZDVjZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvbGVvbjMvc2VyaWFsLmMKQEAgLTAsMCArMSwxMzkgQEAKKy8qIEdSTElCIEFQQlVBUlQgU2VyaWFsIGNvbnRyb2xsZXIgZHJpdmVyCisgKgorICogKEMpIENvcHlyaWdodCAyMDA3CisgKiBEYW5pZWwgSGVsbHN0cm9tLCBHYWlzbGVyIFJlc2VhcmNoLCBkYW5pZWxAZ2Fpc2xlci5jb20uCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2xlb24uaD4KKyNpbmNsdWRlIDxhbWJhcHAuaD4KKworREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CisKKy8qIEZvcmNlIGNhY2hlIG1pc3MgZWFjaCB0aW1lIGEgc2VyaWFsIGNvbnRyb2xsZXIgcmVnIGlzIHJlYWQgKi8KKyNkZWZpbmUgQ0FDSEVfQllQQVNTIDEKKworI2lmZGVmIENBQ0hFX0JZUEFTUworI2RlZmluZSBSRUFEX0JZVEUodmFyKSAgU1BBUkNfTk9DQUNIRV9SRUFEX0JZVEUoKHVuc2lnbmVkIGludCkmKHZhcikpCisjZGVmaW5lIFJFQURfSFdPUkQodmFyKSBTUEFSQ19OT0NBQ0hFX1JFQURfSFdPUkQoKHVuc2lnbmVkIGludCkmKHZhcikpCisjZGVmaW5lIFJFQURfV09SRCh2YXIpICBTUEFSQ19OT0NBQ0hFX1JFQUQoKHVuc2lnbmVkIGludCkmKHZhcikpCisjZGVmaW5lIFJFQURfRFdPUkQodmFyKSBTUEFSQ19OT0NBQ0hFX1JFQURfRFdPUkQoKHVuc2lnbmVkIGludCkmKHZhcikpCisjZW5kaWYKKworYW1iYXBwX2Rldl9hcGJ1YXJ0ICpsZW9uM19hcGJ1YXJ0ID0gTlVMTDsKKworaW50IHNlcmlhbF9pbml0KHZvaWQpCit7CisJYW1iYXBwX2FwYmRldiBhcGJkZXY7CisJdW5zaWduZWQgaW50IHRtcDsKKworCS8qIGZpbmQgVUFSVCAqLworCWlmIChhbWJhcHBfYXBiX2ZpcnN0KFZFTkRPUl9HQUlTTEVSLCBHQUlTTEVSX0FQQlVBUlQsICZhcGJkZXYpID09IDEpIHsKKworCQlsZW9uM19hcGJ1YXJ0ID0gKGFtYmFwcF9kZXZfYXBidWFydCAqKSBhcGJkZXYuYWRkcmVzczsKKworCQkvKiBmb3VuZCBhcGJ1YXJ0LCBsZXQncyBpbml0Li4uCisJCSAqCisJCSAqIFNldCBzY2FsZXIgLyBiYXVkIHJhdGUKKwkJICoKKwkJICogUmVjZWl2ZXIgJiB0cmFuc21pdHRlciBlbmFibGUKKwkJICovCisJCWxlb24zX2FwYnVhcnQtPnNjYWxlciA9IENGR19HUkxJQl9BUEJVQVJUX1NDQUxFUjsKKworCQkvKiBMZXQgYml0IDExIGJlIHVuY2hhbmdlZCAoZGVidWcgYml0IGZvciBHUk1PTikgKi8KKwkJdG1wID0gUkVBRF9XT1JEKGxlb24zX2FwYnVhcnQtPmN0cmwpOworCisJCWxlb24zX2FwYnVhcnQtPmN0cmwgPSAoKHRtcCAmIExFT05fUkVHX1VBUlRfQ1RSTF9EQkcpIHwKKwkJCQkgICAgICAgTEVPTl9SRUdfVUFSVF9DVFJMX1JFIHwKKwkJCQkgICAgICAgTEVPTl9SRUdfVUFSVF9DVFJMX1RFKTsKKworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC0xOwkJLyogZGlkbid0IGZpbmQgaGFyZHdhcmUgKi8KK30KKwordm9pZCBzZXJpYWxfcHV0Yyhjb25zdCBjaGFyIGMpCit7CisJaWYgKGMgPT0gJ1xuJykKKwkJc2VyaWFsX3B1dGNfcmF3KCdccicpOworCisJc2VyaWFsX3B1dGNfcmF3KGMpOworfQorCit2b2lkIHNlcmlhbF9wdXRjX3Jhdyhjb25zdCBjaGFyIGMpCit7CisJaWYgKCFsZW9uM19hcGJ1YXJ0KQorCQlyZXR1cm47CisKKwkvKiBXYWl0IGZvciBsYXN0IGNoYXJhY3RlciB0byBnby4gKi8KKwl3aGlsZSAoIShSRUFEX1dPUkQobGVvbjNfYXBidWFydC0+c3RhdHVzKSAmIExFT05fUkVHX1VBUlRfU1RBVFVTX1RIRSkpIDsKKworCS8qIFNlbmQgZGF0YSAqLworCWxlb24zX2FwYnVhcnQtPmRhdGEgPSBjOworCisjaWZkZWYgTEVPTl9ERUJVRworCS8qIFdhaXQgZm9yIGRhdGEgdG8gYmUgc2VudCAqLworCXdoaWxlICghKFJFQURfV09SRChsZW9uM19hcGJ1YXJ0LT5zdGF0dXMpICYgTEVPTl9SRUdfVUFSVF9TVEFUVVNfVFNFKSkgOworI2VuZGlmCit9CisKK3ZvaWQgc2VyaWFsX3B1dHMoY29uc3QgY2hhciAqcykKK3sKKwl3aGlsZSAoKnMpIHsKKwkJc2VyaWFsX3B1dGMoKnMrKyk7CisJfQorfQorCitpbnQgc2VyaWFsX2dldGModm9pZCkKK3sKKwlpZiAoIWxlb24zX2FwYnVhcnQpCisJCXJldHVybiAwOworCisJLyogV2FpdCBmb3IgYSBjaGFyYWN0ZXIgdG8gYXJyaXZlLiAqLworCXdoaWxlICghKFJFQURfV09SRChsZW9uM19hcGJ1YXJ0LT5zdGF0dXMpICYgTEVPTl9SRUdfVUFSVF9TVEFUVVNfRFIpKSA7CisKKwkvKiByZWFkIGRhdGEgKi8KKwlyZXR1cm4gUkVBRF9XT1JEKGxlb24zX2FwYnVhcnQtPmRhdGEpOworfQorCitpbnQgc2VyaWFsX3RzdGModm9pZCkKK3sKKwlpZiAobGVvbjNfYXBidWFydCkKKwkJcmV0dXJuIChSRUFEX1dPUkQobGVvbjNfYXBidWFydC0+c3RhdHVzKSAmCisJCQlMRU9OX1JFR19VQVJUX1NUQVRVU19EUik7CisJcmV0dXJuIDA7Cit9CisKKy8qIHNldCBiYXVkIHJhdGUgZm9yIHVhcnQgKi8KK3ZvaWQgc2VyaWFsX3NldGJyZyh2b2lkKQoreworCS8qIHVwZGF0ZSBiYXVkIHJhdGUgc2V0dGluZ3MsIHJlYWQgaXQgZnJvbSBnZC0+YmF1ZHJhdGUgKi8KKwl1bnNpZ25lZCBpbnQgc2NhbGVyOworCWlmIChsZW9uM19hcGJ1YXJ0ICYmIChnZC0+YmF1ZHJhdGUgPiAwKSkgeworCQlzY2FsZXIgPQorCQkgICAgKCgoQ09ORklHX1NZU19DTEtfRlJFUSAqIDEwKSAvIChnZC0+YmF1ZHJhdGUgKiA4KSkgLQorCQkgICAgIDUpIC8gMTA7CisJCWxlb24zX2FwYnVhcnQtPnNjYWxlciA9IHNjYWxlcjsKKwl9CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvY3B1L2xlb24zL3N0YXJ0LlMgYi9jcHUvbGVvbjMvc3RhcnQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDdmN2U4Ci0tLSAvZGV2L251bGwKKysrIGIvY3B1L2xlb24zL3N0YXJ0LlMKQEAgLTAsMCArMSw2MTYgQEAKKy8qIFRoaXMgaXMgd2hlcmUgdGhlIFNQQVJDL0xFT04zIHN0YXJ0cworICogQ29weXJpZ2h0IChDKSAyMDA3LAorICogRGFuaWVsIEhlbGxzdHJvbSwgZGFuaWVsQGdhaXNsZXIuY29tCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9hc21tYWNyby5oPgorI2luY2x1ZGUgPGFzbS93aW5tYWNyby5oPgorI2luY2x1ZGUgPGFzbS9wc3IuaD4KKyNpbmNsdWRlIDxhc20vc3RhY2suaD4KKyNpbmNsdWRlIDxhc20vbGVvbi5oPgorI2luY2x1ZGUgPHZlcnNpb24uaD4KKworLyogRW50cnkgZm9yIHRyYXBzIHdoaWNoIGp1bXAgdG8gYSBwcm9ncmFtbWVyLXNwZWNpZmllZCB0cmFwIGhhbmRsZXIuICAqLworI2RlZmluZSBUUkFQUihIKSAgXAorCXdyIAklZzAsIDB4ZmUwLCAlcHNyOyBcCisJbW92IAklZzAsICV0YnI7IFwKKwliYSAJKEgpOyBcCisJbW92IAklZzAsICV3aW07CisKKyNkZWZpbmUgVFJBUChIKSBcCisJbW92CSVwc3IsICVsMDsgXAorCWJhCShIKTsgXAorCW5vcDsgbm9wOworCisjZGVmaW5lIFRSQVBJKGlsZXZlbCkgXAorCW1vdiAJaWxldmVsLCAlbDc7IFwKKwltb3YgCSVwc3IsICVsMDsgXAorCWIgCV9pcnFfZW50cnk7IFwKKwltb3YgCSV3aW0sICVsMworCisvKiBVbmV4Y3BlY3RlZCB0cmFwIHdpbGwgaGFsdCB0aGUgcHJvY2Vzc29yIGJ5IGZvcmNpbmcgaXQgdG8gZXJyb3Igc3RhdGUgKi8KKyN1bmRlZiBCQURfVFJBUAorI2RlZmluZSBCQURfVFJBUCB0YSAwOyBub3A7IG5vcDsgbm9wOworCisvKiBTb2Z0d2FyZSB0cmFwLiBUcmVhdCBhcyBCQURfVFJBUCBmb3IgdGhlIHRpbWUgYmVpbmcuLi4gKi8KKyNkZWZpbmUgU09GVF9UUkFQIFRSQVAoX2h3ZXJyKQorCisjZGVmaW5lIFBTUl9JTklUICAgMHgxRkMwCS8qIERpc2FibGUgdHJhcHMsIHNldCBzIGFuZCBwcyAqLworI2RlZmluZSBXSU1fSU5JVCAgIDIKKworLyogQWxsIHRyYXBzIGxvdy1sZXZlbCBjb2RlIGhlcmUgbXVzdCBlbmQgd2l0aCB0aGlzIG1hY3JvLiAqLworI2RlZmluZSBSRVNUT1JFX0FMTCBiIHJldF90cmFwX2VudHJ5OyBjbHIgJWw2OworCisjZGVmaW5lIFdSSVRFX1BBVVNFIG5vcDtub3A7bm9wCisKK1dJTkRPV1NJWkUgPSAoMTYgKiA0KQorQVJHUFVTSFNJWkUgPSAoNiAqIDQpCitBUkdQVVNIID0gKFdJTkRPV1NJWkUgKyA0KQorTUlORlJBTUUgPSAoV0lORE9XU0laRSArIEFSR1BVU0hTSVpFICsgNCkKKworLyogTnVtYmVyIG9mIHJlZ2lzdGVyIHdpbmRvd3MgKi8KKyNpZm5kZWYgQ0ZHX1NQQVJDX05XSU5ET1dTCisjZXJyb3IgTXVzdCBkZWZpbmUgbnVtYmVyIG9mIFNQQVJDIHJlZ2lzdGVyIHdpbmRvd3MsIGRlZmF1bHQgaXMgOAorI2VuZGlmCisKKyNkZWZpbmUgU1RBQ0tfQUxJR04JOAorI2RlZmluZSBTQShYKQkoKChYKSsoU1RBQ0tfQUxJR04tMSkpICYgfihTVEFDS19BTElHTi0xKSkKKworCS5zZWN0aW9uICIuc3RhcnQiLCAiYXgiCisJLmdsb2JsIAlfc3RhcnQsIHN0YXJ0LCBfdHJhcF90YWJsZQorCS5nbG9ibCAgX2lycV9lbnRyeSwgbm1pX3RyYXAKKwkuZ2xvYmwgIF9yZXNldF9yZWxvYworCisvKiBhdCBhZGRyZXNzIDAKKyAqIEhhcmR3YXJlIHRyYXBzCisgKi8KK3N0YXJ0OgorX3N0YXJ0OgorX3RyYXBfdGFibGU6CisJVFJBUFIoX2hhcmRyZXNldCk7CQkhIDAwIHJlc2V0IHRyYXAKKwlCQURfVFJBUDsJCQkhIDAxIGluc3RydWN0aW9uX2FjY2Vzc19leGNlcHRpb24KKwlCQURfVFJBUDsJCQkhIDAyIGlsbGVnYWxfaW5zdHJ1Y3Rpb24KKwlCQURfVFJBUDsJCQkhIDAzIHByaXZlbGVnZWRfaW5zdHJ1Y3Rpb24KKwlCQURfVFJBUDsJCQkhIDA0IGZwX2Rpc2FibGVkCisJVFJBUChfd2luZG93X292ZXJmbG93KTsJCSEgMDUgd2luZG93X292ZXJmbG93CisJVFJBUChfd2luZG93X3VuZGVyZmxvdyk7CSEgMDYgd2luZG93X3VuZGVyZmxvdworCUJBRF9UUkFQOwkJCSEgMDcgTWVtb3J5IEFkZHJlc3MgTm90IEFsaWduZWQKKwlCQURfVFJBUDsJCQkhIDA4IEZsb2F0aW5nIFBvaW50IEV4Y2VwdGlvbgorCUJBRF9UUkFQOwkJCSEgMDkgRGF0YSBNaXNzIEV4Y2VwdGlvbgorCUJBRF9UUkFQOwkJCSEgMGEgVGFnZ2VkIEluc3RydWN0aW9uIE92cmZsdworCUJBRF9UUkFQOwkJCSEgMGIgV2F0Y2hwb2ludCBEZXRlY3RlZAorCUJBRF9UUkFQOwkJCSEgMGMKKwlCQURfVFJBUDsJCQkhIDBkCisJQkFEX1RSQVA7CQkJISAwZQorCUJBRF9UUkFQOwkJCSEgMGYKKwlCQURfVFJBUDsJCQkhIDEwCisJVFJBUEkoMSk7CQkJISAxMSBJUlEgbGV2ZWwgMQorCVRSQVBJKDIpOwkJCSEgMTIgSVJRIGxldmVsIDIKKwlUUkFQSSgzKTsJCQkhIDEzIElSUSBsZXZlbCAzCisJVFJBUEkoNCk7CQkJISAxNCBJUlEgbGV2ZWwgNAorCVRSQVBJKDUpOwkJCSEgMTUgSVJRIGxldmVsIDUKKwlUUkFQSSg2KTsJCQkhIDE2IElSUSBsZXZlbCA2CisJVFJBUEkoNyk7CQkJISAxNyBJUlEgbGV2ZWwgNworCVRSQVBJKDgpOwkJCSEgMTggSVJRIGxldmVsIDgKKwlUUkFQSSg5KTsJCQkhIDE5IElSUSBsZXZlbCA5CisJVFJBUEkoMTApOwkJCSEgMWEgSVJRIGxldmVsIDEwCisJVFJBUEkoMTEpOwkJCSEgMWIgSVJRIGxldmVsIDExCisJVFJBUEkoMTIpOwkJCSEgMWMgSVJRIGxldmVsIDEyCisJVFJBUEkoMTMpOwkJCSEgMWQgSVJRIGxldmVsIDEzCisJVFJBUEkoMTQpOwkJCSEgMWUgSVJRIGxldmVsIDE0CisJVFJBUChfbm1pX3RyYXApOwkJISAxZiBJUlEgbGV2ZWwgMTUgLworCSAgICAgICAgICAgICAgICAJCSEgTk1JIChub24gbWFza2FibGUgaW50ZXJydXB0KQorCUJBRF9UUkFQOwkJCSEgMjAgcl9yZWdpc3Rlcl9hY2Nlc3NfZXJyb3IKKwlCQURfVFJBUDsJCQkhIDIxIGluc3RydWN0aW9uIGFjY2VzcyBlcnJvcgorCUJBRF9UUkFQOwkJCSEgMjIKKwlCQURfVFJBUDsJCQkhIDIzCisJQkFEX1RSQVA7CQkJISAyNCBjby1wcm9jZXNzb3IgZGlzYWJsZWQKKwlCQURfVFJBUDsJCQkhIDI1IHVuaXBsZW1lbnRlZCBGTFVTSAorCUJBRF9UUkFQOwkJCSEgMjYKKwlCQURfVFJBUDsJCQkhIDI3CisJQkFEX1RSQVA7CQkJISAyOCBjby1wcm9jZXNzb3IgZXhjZXB0aW9uCisJQkFEX1RSQVA7CQkJISAyOSBkYXRhIGFjY2VzcyBlcnJvcgorCUJBRF9UUkFQOwkJCSEgMmEgZGl2aXNpb24gYnkgemVybworCUJBRF9UUkFQOwkJCSEgMmIgZGF0YSBzdG9yZSBlcnJvcgorCUJBRF9UUkFQOwkJCSEgMmMgZGF0YSBhY2Nlc3MgTU1VIG1pc3MKKwlCQURfVFJBUDsJCQkhIDJkCisJQkFEX1RSQVA7CQkJISAyZQorCUJBRF9UUkFQOwkJCSEgMmYKKwlCQURfVFJBUDsgQkFEX1RSQVA7IEJBRF9UUkFQOyBCQURfVFJBUDsgISAzMC0zMworCUJBRF9UUkFQOyBCQURfVFJBUDsgQkFEX1RSQVA7IEJBRF9UUkFQOyAhIDM0LTM3CisJQkFEX1RSQVA7IEJBRF9UUkFQOyBCQURfVFJBUDsgQkFEX1RSQVA7ICEgMzgtM2IKKwlCQURfVFJBUDsgQkFEX1RSQVA7IEJBRF9UUkFQOyBCQURfVFJBUDsgISAzYy0zZgorCUJBRF9UUkFQOyBCQURfVFJBUDsgQkFEX1RSQVA7IEJBRF9UUkFQOyAhIDQwLTQzCisJQkFEX1RSQVA7IEJBRF9UUkFQOyBCQURfVFJBUDsgQkFEX1RSQVA7ICEgNDQtNDcKKwlCQURfVFJBUDsgQkFEX1RSQVA7IEJBRF9UUkFQOyBCQURfVFJBUDsgISA0OC00YgorCUJBRF9UUkFQOyBCQURfVFJBUDsgQkFEX1RSQVA7IEJBRF9UUkFQOyAhIDRjLTRmCisJQkFEX1RSQVA7IEJBRF9UUkFQOyBCQURfVFJBUDsgQkFEX1RSQVA7ICEgNTAtNTMKKwlCQURfVFJBUDsgQkFEX1RSQVA7IEJBRF9UUkFQOyBCQURfVFJBUDsgISA1NC01NworCUJBRF9UUkFQOyBCQURfVFJBUDsgQkFEX1RSQVA7IEJBRF9UUkFQOyAhIDU4LTViCisJQkFEX1RSQVA7IEJBRF9UUkFQOyBCQURfVFJBUDsgQkFEX1RSQVA7ICEgNWMtNWYKKworCS8qIGltcGxlbWVudGFpb24gZGVwZW5kZW50ICovCisJQkFEX1RSQVA7IEJBRF9UUkFQOyBCQURfVFJBUDsgQkFEX1RSQVA7ICEgNjAtNjMKKwlCQURfVFJBUDsgQkFEX1RSQVA7IEJBRF9UUkFQOyBCQURfVFJBUDsgISA2NC02NworCUJBRF9UUkFQOyBCQURfVFJBUDsgQkFEX1RSQVA7IEJBRF9UUkFQOyAhIDY4LTZiCisJQkFEX1RSQVA7IEJBRF9UUkFQOyBCQURfVFJBUDsgQkFEX1RSQVA7ICEgNmMtNmYKKwlCQURfVFJBUDsgQkFEX1RSQVA7IEJBRF9UUkFQOyBCQURfVFJBUDsgISA3MC03MworCUJBRF9UUkFQOyBCQURfVFJBUDsgQkFEX1RSQVA7IEJBRF9UUkFQOyAhIDc0LTc3CisJQkFEX1RSQVA7IEJBRF9UUkFQOyBCQURfVFJBUDsgQkFEX1RSQVA7ICEgNzgtN2IKKwlCQURfVFJBUDsgQkFEX1RSQVA7IEJBRF9UUkFQOyBCQURfVFJBUDsgISA3Yy03ZgorCisJLyogU29mdHdhcmUgdHJhcHMsIG5vdCBoYW5kbGVkICovCisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIDgwLTgzCisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIDg0LTg3CisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIDg4LThiCisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIDhjLThmCisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIDkwLTkzCisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIDk0LTk3CisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIDk4LTliCisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIDljLTlmCisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIGEwLWEzCisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIGE0LWE3CisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIGE4LWFiCisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIGFjLWFmCisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIGIwLWIzCisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIGI0LWI3CisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIGI4LWJiCisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIGJjLWJmCisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIGMwLWMzCisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIGM0LWM3CisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIGM4LWNiCisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIGNjLWNmCisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIGQwLWQzCisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIGQ0LWQ3CisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIGQ4LWRiCisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIGRjLWRmCisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIGUwLWUzCisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIGU0LWU3CisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIGU4LWViCisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIGVjLWVmCisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIGYwLWYzCisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIGY0LWY3CisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIGY4LWZiCisJU09GVF9UUkFQOyBTT0ZUX1RSQVA7IFNPRlRfVFJBUDsgU09GVF9UUkFQOwkhIGZjLWZmCisvKgorICogVmVyc2lvbiBzdHJpbmcKKyAqLworCisJLmRhdGEKKwkuZXh0ZXJuIGxlb24zX3Nub29waW5nX2F2YWlsCisJLmdsb2JsCXZlcnNpb25fc3RyaW5nCit2ZXJzaW9uX3N0cmluZzoKKwkuYXNjaWkgVV9CT09UX1ZFUlNJT04KKwkuYXNjaWkgIiAoIiwgX19EQVRFX18sICIgLSAiLCBfX1RJTUVfXywgIikiCisJLmFzY2lpIENPTkZJR19JREVOVF9TVFJJTkcsICJcMCIKKworCS5zZWN0aW9uCSIudGV4dCIKKwkuYWxpZ24gNAorCitfaGFyZHJlc2V0OgorMTAwMDoKKwlmbHVzaAorCisJLyogRW5hYmxlIEkvRC1DYWNoZSBhbmQgU25vb3BpbmcgKi8KKwlzZXQJMHgwMDgxMDAwZiwgJWcyCisJc3RhCSVnMiwgWyVnMF0gMgorCisJbW92CSVnMCwgJXkKKwljbHIJJWcxCisJY2xyCSVnMgorCWNscgklZzMKKwljbHIJJWc0CisJY2xyCSVnNQorCWNscgklZzYKKwljbHIJJWc3CisKKwltb3YJJWFzcjE3LCAlZzMKKwlhbmQJJWczLCAweDFmLCAlZzMKK2NsZWFyX3dpbmRvdzoKKwltb3YJJWcwLCAlbDAKKwltb3YJJWcwLCAlbDEKKwltb3YJJWcwLCAlbDIKKwltb3YJJWcwLCAlbDMKKwltb3YJJWcwLCAlbDQKKwltb3YJJWcwLCAlbDUKKwltb3YJJWcwLCAlbDYKKwltb3YJJWcwLCAlbDcKKwltb3YJJWcwLCAlbzAKKwltb3YJJWcwLCAlbzEKKwltb3YJJWcwLCAlbzIKKwltb3YJJWcwLCAlbzMKKwltb3YJJWcwLCAlbzQKKwltb3YJJWcwLCAlbzUKKwltb3YJJWcwLCAlbzYKKwltb3YJJWcwLCAlbzcKKwlzdWJjYwklZzMsIDEsICVnMworCWJnZQljbGVhcl93aW5kb3cKKwlzYXZlCisKK3dpbmluaXQ6CisJc2V0CVdJTV9JTklULCAlZzMKKwltb3YJJWczLCAld2ltCisKK3N0YWNrcDoKKwlzZXQJQ0ZHX0lOSVRfU1BfT0ZGU0VULCAlZnAKKwlhbmRuCSVmcCwgMHgwZiwgJWZwCisJc3ViCSVmcCwgNjQsICVzcAorCitjcHVfaW5pdF91bnJlbG9jOgorCWNhbGwJY3B1X2luaXRfZgorCW5vcAorCisvKiB1biByZWxvY2F0ZWQgc3RhcnQgYWRkcmVzcyBvZiBtb25pdG9yICovCisjZGVmaW5lIFRFWFRfU1RBUlQgX3RleHQKKworLyogdW4gcmVsb2NhdGVkIGVuZCBhZGRyZXNzIG9mIG1vbml0b3IgKi8KKyNkZWZpbmUgREFUQV9FTkQgX19pbml0X2VuZAorCityZWxvYzoKKwlzZXQJVEVYVF9TVEFSVCwlZzIKKwlzZXQJREFUQV9FTkQsJWczCisJc2V0CUNGR19SRUxPQ19NT05JVE9SX0JBU0UsJWc0CityZWxvY19sb29wOgorCWxkZAlbJWcyXSwlbDAKKwlsZGQJWyVnMis4XSwlbDIKKwlzdGQJJWwwLFslZzRdCisJc3RkCSVsMixbJWc0KzhdCisJaW5jCTE2LCVnMgorCXN1YmNjCSVnMywlZzIsJWcwCisJYm5lCXJlbG9jX2xvb3AKKwlpbmMJMTYsJWc0CisKKwljbHIJJWwwCisJY2xyCSVsMQorCWNscgklbDIKKwljbHIJJWwzCisJY2xyCSVnMgorCisvKiByZWdpc3RlciBnNCBjb250YWluIGFkZHJlc3MgdG8gc3RhcnQKKyAqIFRoaXMgbWVhbnMgdGhhdCBCU1MgbXVzdCBiZSBkaXJlY3RseSBhZnRlciBkYXRhIGFuZCBjb2RlIHNlZ21lbnRzCisgKgorICogZzMgaXMgbGVuZ3RoIG9mIGJzcyA9IChfX2Jzc19lbmQtX19ic3Nfc3RhcnQpCisgKgorICovCisKK2Nscl9ic3M6CisvKiBjbGVhciBic3MgYXJlYSAodGhlIHJlbG9jYXRlZCkgKi8KKwlzZXQJX19ic3Nfc3RhcnQsJWcyCisJc2V0CV9fYnNzX2VuZCwlZzMKKwlzdWIJJWczLCVnMiwlZzMKKwlhZGQJJWczLCVnNCwlZzMKKwljbHIJJWcxCS8qIHN0ZCAlZzAgdXNlcyBnMCBhbmQgZzEgKi8KKy8qIGNsZWFyaW5nIDE2Ynl0ZSBhIHRpbWUgPT0+IGxpbmtlciBzY3JpcHQgbmVlZCB0byBhbGlnbiB0byAxNiBieXRlIG9mZnNldCAqLworY2xyX2Jzc18xNjoKKwlzdGQJJWcwLFslZzRdCisJc3RkCSVnMCxbJWc0KzhdCisJaW5jCTE2LCVnNAorCWNtcAklZzMsJWc0CisJYm5lCWNscl9ic3NfMTYKKwlub3AKKworLyogYWRkIG9mZnNldHMgdG8gR09UIHRhYmxlICovCitmaXh1cF9nb3Q6CisJc2V0CV9fZ290X3N0YXJ0LCVnNAorCXNldAlfX2dvdF9lbmQsJWczCisvKgorICogbmV3IGdvdCBvZmZzZXQgPSAob2xkIEdPVC1QVFIgKHJlYWQgd2l0aCBsZCkgLQorICogICBDRkdfUkVMT0NfTU9OSVRPUl9CQVNFKGZyb20gZGVmaW5lKSApICsKKyAqICAgRGVzdGluYXRpb24gQWRkcmVzcyAoZnJvbSBkZWZpbmUpCisgKi8KKwlzZXQJQ0ZHX1JFTE9DX01PTklUT1JfQkFTRSwlZzIKKwlzZXQJVEVYVF9TVEFSVCwgJWcxCisJYWRkCSVnNCwlZzIsJWc0CisJc3ViCSVnNCwlZzEsJWc0CisJYWRkCSVnMywlZzIsJWczCisJc3ViCSVnMywlZzEsJWczCisJc3ViCSVnMiwlZzEsJWcyCSEgcHJlcGFyZSByZWdpc3RlciB3aXRoIChuZXcgYmFzZSBhZGRyZXNzKSAtCisJCQkJISAgKG9sZCBiYXNlIGFkZHJlc3MpCitnb3RfbG9vcDoKKwlsZAlbJWc0XSwlbDAJISBsb2FkIG9sZCBHT1QtUFRSCisJYWRkCSVsMCwlZzIsJWwwCSEgaW5jcmVhc2Ugd2l0aCAobmV3IGJhc2UgYWRkcmVzcykgLQorCQkJCSEgIChvbGQgYmFzZSkKKwlzdAklbDAsWyVnNF0KKwlpbmMJNCwlZzQKKwljbXAJJWczLCVnNAorCWJuZQlnb3RfbG9vcAorCW5vcAorCitwcm9tX3JlbG9jYXRlOgorCXNldAlfX3Byb21fc3RhcnQsICVnMgorCXNldAlfX3Byb21fZW5kLCAlZzMKKwlzZXQJQ0ZHX1BST01fT0ZGU0VULCAlZzQKKworcHJvbV9yZWxvY2F0ZV9sb29wOgorCWxkZAlbJWcyXSwlbDAKKwlsZGQJWyVnMis4XSwlbDIKKwlzdGQJJWwwLFslZzRdCisJc3RkCSVsMixbJWc0KzhdCisJaW5jCTE2LCVnMgorCXN1YmNjCSVnMywlZzIsJWcwCisJYm5lCXByb21fcmVsb2NhdGVfbG9vcAorCWluYwkxNiwlZzQKKworLyogVHJhcCB0YWJsZSBoYXMgYmVlbiBtb3ZlZCwgbGV0cyB0ZWxsIENQVSBhYm91dAorICogdGhlIG5ldyB0cmFwIHRhYmxlIGFkZHJlc3MKKyAqLworCisJc2V0CUNGR19SRUxPQ19NT05JVE9SX0JBU0UsICVnMgorCXdyCSVnMCwgJWcyLCAldGJyCisJbm9wCisJbm9wCisJbm9wCisJCisvKiBJZiBDQUNIRSBzbm9vcGluZyBpcyBhdmFpbGFibGUgaW4gaGFyZHdhcmUgdGhlIAorICogdmFyaWFibGUgbGVvbjNfc25vb3BpbmdfYXZhaWwgd2lsbCBiZSBzZXQgdG8KKyAqIDB4ODAwMDAwIGVsc2UgMC4KKyAqLworc25vb3BfZGV0ZWN0OgorCXNldGhpCSVoaSgweDAwODAwMDAwKSwgJW8wCisJbGRhCVslZzBdIDIsICVvMQorCWFuZAklbzAsICVvMSwgJW8wCisJc2V0aGkJJWhpKGxlb24zX3Nub29waW5nX2F2YWlsK0NGR19SRUxPQ19NT05JVE9SX0JBU0UtVEVYVF9CQVNFKSwgJW8xCisJc3QJJW8wLCBbJWxvKGxlb24zX3Nub29waW5nX2F2YWlsK0NGR19SRUxPQ19NT05JVE9SX0JBU0UtVEVYVF9CQVNFKSslbzFdCisKKy8qCWNhbGwJcmVsb2NhdGUqLworCW5vcAorLyogQ2FsbCByZWxvY2F0ZWQgaW5pdCBmdW5jdGlvbnMgKi8KK2p1bXA6CisJc2V0CWNwdV9pbml0X2YyLCVvMQorCXNldAlDRkdfUkVMT0NfTU9OSVRPUl9CQVNFLCVvMgorCWFkZAklbzEsJW8yLCVvMQorCXN1YgklbzEsJWcxLCVvMQorCWNhbGwJJW8xCisJY2xyCSVvMAorCisJc2V0CWJvYXJkX2luaXRfZiwlbzEKKwlzZXQJQ0ZHX1JFTE9DX01PTklUT1JfQkFTRSwlbzIKKwlhZGQJJW8xLCVvMiwlbzEKKwlzdWIJJW8xLCVnMSwlbzEKKwljYWxsCSVvMQorCWNscgklbzAKKworZGVhZDoJdGEgMAkJCQkhIGlmIGNhbGwgcmV0dXJucy4uLgorCW5vcAorCisvKiBJbnRlcnJ1cHQgaGFuZGxlciBjYWxsZXIsCisgKiByZWcgTDc6IGludGVycnVwdCBudW1iZXIKKyAqIHJlZyBMMDogcHNyIGFmdGVyIGludGVycnVwdAorICogcmVnIEwxOiBQQworICogcmVnIEwyOiBuZXh0IFBDCisgKiByZWcgTDM6IHdpbQorICovCitfaXJxX2VudHJ5OgorCVNBVkVfQUxMCisKKwlvcgklbDAsIFBTUl9QSUwsICVnMgorCXdyCSVnMiwgMHgwLCAlcHNyCisJV1JJVEVfUEFVU0UKKwl3cgklZzIsIFBTUl9FVCwgJXBzcgorCVdSSVRFX1BBVVNFCisJbW92CSVsNywgJW8wCQkhIGlycSBsZXZlbAorCXNldAloYW5kbGVyX2lycSwgJW8xCisJc2V0CShDRkdfUkVMT0NfTU9OSVRPUl9CQVNFLVRFWFRfQkFTRSksICVvMgorCWFkZAklbzEsICVvMiwgJW8xCisJY2FsbAklbzEKKwlhZGQJJXNwLCBTRl9SRUdTX1NaLCAlbzEJISBwdF9yZWdzIHB0cgorCW9yCSVsMCwgUFNSX1BJTCwgJWcyCSEgcmVzdG9yZSBQSUwgYWZ0ZXIgaGFuZGxlcl9pcnEKKwl3cgklZzIsIFBTUl9FVCwgJXBzcgkhIGtlZXAgRVQgdXAKKwlXUklURV9QQVVTRQorCisJUkVTVE9SRV9BTEwKKworIVdpbmRvdyBvdmVyZmxvdyB0cmFwIGhhbmRsZXIuCisJLmdsb2JhbCBfd2luZG93X292ZXJmbG93CisKK193aW5kb3dfb3ZlcmZsb3c6CisKKwltb3YJJXdpbSwgJWwzCQkhIENhbGN1bGF0ZSBuZXh0IFdJTQorCW1vdgklZzEsICVsNworCXNybAklbDMsIDEsICVnMQorCXNsbAklbDMsIChDRkdfU1BBUkNfTldJTkRPV1MtMSkgLCAlbDQKKwlvcgklbDQsICVnMSwgJWcxCisKKwlzYXZlCQkJCSEgR2V0IGludG8gd2luZG93IHRvIGJlIHNhdmVkLgorCW1vdgklZzEsICV3aW0KKwlub3A7CisJbm9wOworCW5vcAorCXN0CSVsMCwgWyVzcCArIDBdOworCXN0CSVsMSwgWyVzcCArIDRdOworCXN0CSVsMiwgWyVzcCArIDhdOworCXN0CSVsMywgWyVzcCArIDEyXTsKKwlzdAklbDQsIFslc3AgKyAxNl07CisJc3QJJWw1LCBbJXNwICsgMjBdOworCXN0CSVsNiwgWyVzcCArIDI0XTsKKwlzdAklbDcsIFslc3AgKyAyOF07CisJc3QJJWkwLCBbJXNwICsgMzJdOworCXN0CSVpMSwgWyVzcCArIDM2XTsKKwlzdAklaTIsIFslc3AgKyA0MF07CisJc3QJJWkzLCBbJXNwICsgNDRdOworCXN0CSVpNCwgWyVzcCArIDQ4XTsKKwlzdAklaTUsIFslc3AgKyA1Ml07CisJc3QJJWk2LCBbJXNwICsgNTZdOworCXN0CSVpNywgWyVzcCArIDYwXTsKKwlyZXN0b3JlCQkJCSEgR28gYmFjayB0byB0cmFwIHdpbmRvdy4KKwltb3YJJWw3LCAlZzEKKwlqbXAJJWwxCQkJISBSZS1leGVjdXRlIHNhdmUuCisJcmV0dAklbDIKKworLyogV2luZG93IHVuZGVyZmxvdyB0cmFwIGhhbmRsZXIuICAqLworCisJLmdsb2JhbCAgX3dpbmRvd191bmRlcmZsb3cKKworX3dpbmRvd191bmRlcmZsb3c6CisKKwltb3YgICV3aW0sICVsMwkJCSEgQ2FsY3VsYXRlIG5leHQgV0lNCisJc2xsICAlbDMsIDEsICVsNAorCXNybCAgJWwzLCAoQ0ZHX1NQQVJDX05XSU5ET1dTLTEpLCAlbDUKKwlvciAgICVsNSwgJWw0LCAlbDUKKwltb3YgICVsNSwgJXdpbQorCW5vcDsgbm9wOyBub3AKKwlyZXN0b3JlCQkJCSEgVHdvIHJlc3RvcmVzIHRvIGdldCBpbnRvIHRoZQorCXJlc3RvcmUJCQkJISB3aW5kb3cgdG8gcmVzdG9yZQorCWxkCVslc3AgKyAwXSwgJWwwOyAJISBSZXN0b3JlIHdpbmRvdyBmcm9tIHRoZSBzdGFjaworCWxkCVslc3AgKyA0XSwgJWwxOworCWxkCVslc3AgKyA4XSwgJWwyOworCWxkCVslc3AgKyAxMl0sICVsMzsKKwlsZAlbJXNwICsgMTZdLCAlbDQ7CisJbGQJWyVzcCArIDIwXSwgJWw1OworCWxkCVslc3AgKyAyNF0sICVsNjsKKwlsZAlbJXNwICsgMjhdLCAlbDc7CisJbGQJWyVzcCArIDMyXSwgJWkwOworCWxkCVslc3AgKyAzNl0sICVpMTsKKwlsZAlbJXNwICsgNDBdLCAlaTI7CisJbGQJWyVzcCArIDQ0XSwgJWkzOworCWxkCVslc3AgKyA0OF0sICVpNDsKKwlsZAlbJXNwICsgNTJdLCAlaTU7CisJbGQJWyVzcCArIDU2XSwgJWk2OworCWxkCVslc3AgKyA2MF0sICVpNzsKKwlzYXZlCQkJCSEgR2V0IGJhY2sgdG8gdGhlIHRyYXAgd2luZG93LgorCXNhdmUKKwlqbXAJJWwxCQkJISBSZS1leGVjdXRlIHJlc3RvcmUuCisJcmV0dAklbDIKKworCXJldGwKKworX25taV90cmFwOgorCW5vcAorCWptcCAlbDEKKwlyZXR0ICVsMgorCitfaHdlcnI6CisJdGEgMAorCW5vcAorCW5vcAorCWIgX2h3ZXJyIAkJCSEgbG9vcCBpbmZpbml0ZQorCW5vcAorCisvKiBSZWdpc3RlcnMgdG8gbm90IHRvdWNoIGF0IGFsbC4gKi8KKyNkZWZpbmUgdF9wc3IgICAgICBsMCAvKiBTZXQgYnkgY2FsbGVyICovCisjZGVmaW5lIHRfcGMgICAgICAgbDEgLyogU2V0IGJ5IGNhbGxlciAqLworI2RlZmluZSB0X25wYyAgICAgIGwyIC8qIFNldCBieSBjYWxsZXIgKi8KKyNkZWZpbmUgdF93aW0gICAgICBsMyAvKiBTZXQgYnkgY2FsbGVyICovCisjZGVmaW5lIHRfdHdpbm1hc2sgbDQgLyogU2V0IGF0IGJlZ2lubmluZyBvZiB0aGlzIGVudHJ5IHJvdXRpbmUuICovCisjZGVmaW5lIHRfa3N0YWNrICAgbDUgLyogU2V0IHJpZ2h0IGJlZm9yZSBwdF9yZWdzIGZyYW1lIGlzIGJ1aWx0ICovCisjZGVmaW5lIHRfcmV0cGMgICAgbDYgLyogSWYgeW91IGNoYW5nZSB0aGlzLCBjaGFuZ2Ugd2lubWFjcm8uaCBoZWFkZXIgZmlsZSAqLworI2RlZmluZSB0X3N5c3RhYmxlIGw3IC8qIE5ldmVyIHRvdWNoIHRoaXMsIGNvdWxkIGJlIHRoZSBzeXNjYWxsIHRhYmxlIHB0ci4gKi8KKyNkZWZpbmUgY3VycHRyICAgICBnNiAvKiBTZXQgYWZ0ZXIgcHRfcmVncyBmcmFtZSBpcyBidWlsdCAqLworCit0cmFwX3NldHVwOgorLyogYnVpbGQgYSBwdF9yZWdzIHRyYXAgZnJhbWUuICovCisJc3ViCSVmcCwgKFNGX1JFR1NfU1ogKyBQVF9SRUdTX1NaKSwgJXRfa3N0YWNrCisJUFRfU1RPUkVfQUxMKHRfa3N0YWNrLCB0X3BzciwgdF9wYywgdF9ucGMsIGcyKQorCisJLyogU2VlIGlmIHdlIGFyZSBpbiB0aGUgdHJhcCB3aW5kb3cuICovCisJbW92CTEsICV0X3R3aW5tYXNrCisJc2xsCSV0X3R3aW5tYXNrLCAldF9wc3IsICV0X3R3aW5tYXNrICEgdF90d2lubWFzayA9ICgxIDw8IHBzcikKKwlhbmRjYwkldF90d2lubWFzaywgJXRfd2ltLCAlZzAKKwliZXEJMWYJCSEgaW4gdHJhcCB3aW5kb3csIGNsZWFuIHVwCisJbm9wCisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBTcGlsbCAsIGFkanVzdCAld2ltIGFuZCBnby4KKwkgKi8KKwlzcmwJJXRfd2ltLCAweDEsICVnMgkJISBiZWdpbiBjb21wdXRhdGlvbiBvZiBuZXcgJXdpbQorCisJc2V0CShDRkdfU1BBUkNfTldJTkRPV1MtMSksICVnMwkhTldJTkRPV1MtMQorCisJc2xsCSV0X3dpbSwgJWczLCAldF93aW0JISBOV0lORE9XUy0xCisJb3IJJXRfd2ltLCAlZzIsICVnMgorCWFuZAklZzIsIDB4ZmYsICVnMgorCisJc2F2ZQklZzAsICVnMCwgJWcwICAgICAgICAgICAhIGdldCBpbiB3aW5kb3cgdG8gYmUgc2F2ZWQKKworCS8qIFNldCBuZXcgJXdpbSB2YWx1ZSAqLworCXdyCSVnMiwgMHgwLCAld2ltCisKKwkvKiBTYXZlIHRoZSBrZXJuZWwgd2luZG93IG9udG8gdGhlIGNvcnJlc3BvbmRpbmcgc3RhY2suICovCisJUldfU1RPUkUoc3ApCisKKwlyZXN0b3JlCSVnMCwgJWcwLCAlZzAKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisxOgorCS8qIFRyYXAgZnJvbSBrZXJuZWwgd2l0aCBhIHdpbmRvdyBhdmFpbGFibGUuCisJICogSnVzdCBkbyBpdC4uLgorCSAqLworCWptcGwJJXRfcmV0cGMgKyAweDgsICVnMAkhIHJldHVybiB0byBjYWxsZXIKKwkgbW92CSV0X2tzdGFjaywgJXNwCQkhIGp1bXAgb250byBuZXcgc3RhY2sKKworI2RlZmluZSB0d2luX3RtcDEgbDQKKyNkZWZpbmUgZ2xvYl90bXAgIGc0CisjZGVmaW5lIGN1cnB0ciAgICBnNgorcmV0X3RyYXBfZW50cnk6CisJd3IJJXRfcHNyLCAweDAsICVwc3IgICAgICAgISBlbmFibGUgbmVzdGluZyBhZ2FpbiwgY2xlYXIgRVQKKworCS8qIFdpbGwgdGhlIHJldHQgbGFuZCB1cyBpbiB0aGUgaW52YWxpZCB3aW5kb3c/ICovCisJbW92CTIsICVnMQorCXNsbAklZzEsICV0X3BzciwgJWcxCisKKwlzZXQJQ0ZHX1NQQVJDX05XSU5ET1dTLCAlZzIJIU5XSU5ET1dTCisKKwlzcmwJJWcxLCAlZzIsICVnMgorCW9yCSVnMSwgJWcyLCAlZzEKKwlyZAkld2ltLCAlZzIKKwlhbmRjYwklZzIsICVnMSwgJWcwCisJYmUJMWYJCSEgTm9wZSwganVzdCByZXR1cm4gZnJvbSB0aGUgdHJhcAorCSBzbGwJJWcyLCAweDEsICVnMQorCisJLyogV2UgaGF2ZSB0byBncmFiIGEgd2luZG93IGJlZm9yZSByZXR1cm5pbmcuICovCisJc2V0CShDRkdfU1BBUkNfTldJTkRPV1MtMSksICVnMwkhTldJTkRPV1MtMQorCisJc3JsCSVnMiwgJWczLCAgJWcyCisJb3IJJWcxLCAlZzIsICVnMQorCWFuZAklZzEsIDB4ZmYsICVnMQorCisJd3IJJWcxLCAweDAsICV3aW0KKworCS8qIEdycnIsIG1ha2Ugc3VyZSB3ZSBsb2FkIGZyb20gdGhlIHJpZ2h0ICVzcC4uLiAqLworCVBUX0xPQURfQUxMKHNwLCB0X3BzciwgdF9wYywgdF9ucGMsIGcxKQorCisJcmVzdG9yZQklZzAsICVnMCwgJWcwCisJUldfTE9BRChzcCkKKwliCTJmCisJc2F2ZQklZzAsICVnMCwgJWcwCisKKwkvKiBSZWxvYWQgdGhlIGVudGlyZSBmcmFtZSBpbiBjYXNlIHRoaXMgaXMgZnJvbSBhCisJICoga2VybmVsIHN5c3RlbSBjYWxsIG9yIHdoYXRldmVyLi4uCisJICovCisxOgorCVBUX0xPQURfQUxMKHNwLCB0X3BzciwgdF9wYywgdF9ucGMsIGcxKQorMjoKKwl3cgkldF9wc3IsIDB4MCwgJXBzcgorCW5vcDsKKwlub3A7CisJbm9wCisKKwlqbXAJJXRfcGMKKwlyZXR0CSV0X25wYworCisvKiBUaGlzIGlzIGNhbGxlZCBmcm9tIHJlbG9jYXRlZCBDLWNvZGUuCisgKiBJdCByZXNldHMgdGhlIHN5c3RlbSBieSBqdW1waW5nIHRvIF9zdGFydAorICovCitfcmVzZXRfcmVsb2M6CisJc2V0CXN0YXJ0LCAlbDAKKwljYWxsCSVsMAorCW5vcApkaWZmIC0tZ2l0IGEvY3B1L2xlb24zL3VzYl91aGNpLmMgYi9jcHUvbGVvbjMvdXNiX3VoY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTEwYmViCi0tLSAvZGV2L251bGwKKysrIGIvY3B1L2xlb24zL3VzYl91aGNpLmMKQEAgLTAsMCArMSwxMzEzIEBACisvKgorICogUGFydCBvZiB0aGlzIGNvZGUgaGFzIGJlZW4gZGVyaXZlZCBmcm9tIGxpbnV4OgorICogVW5pdmVyc2FsIEhvc3QgQ29udHJvbGxlciBJbnRlcmZhY2UgZHJpdmVyIGZvciBVU0IgKHRha2UgSUkpLgorICoKKyAqIChjKSAxOTk5LTIwMDEgR2VvcmcgQWNoZXIsIGFjaGVyQGluLnR1bS5kZSAoZXhlY3V0aXZlIHNsYXZlKSAoYmFzZSBndWl0YXIpCisgKiAgICAgICAgICAgICAgIERldGkgRmxpZWdsLCBkZXRpQGZsaWVnbC5kZSAoZXhlY3V0aXZlIHNsYXZlKSAobGVhZCB2b2ljZSkKKyAqICAgICAgICAgICAgICAgVGhvbWFzIFNhaWxlciwgc2FpbGVyQGlmZS5lZS5ldGh6LmNoIChjaGllZiBjb25zdWx0YW50KSAoY2hlZXIgbGVhZGVyKQorICogICAgICAgICAgICAgICBSb21hbiBXZWlzc2dhZXJiZXIsIHdlaXNzZ0B2aWVubmEuYXQgKHZpcnQgcm9vdCBodWIpIChzdHVkaW8gcG9ydGVyKQorICogKGMpIDIwMDAgICAgICBZZ2dkcmFzaWwgQ29tcHV0aW5nLCBJbmMuIChwb3J0IG9mIG5ldyBQQ0kgaW50ZXJmYWNlIHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgZnJvbSB1c2Itb2hjaS5jIGJ5IEFkYW0gUmljaHRlciwgYWRhbUB5Z2dkcmFzaWwuY29tKS4KKyAqIChDKSAyMDAwICAgICAgRGF2aWQgQnJvd25lbGwsIGRhdmlkLWJAcGFjYmVsbC5uZXQgKHVzYi1vaGNpLmMpCisgKgorICogSFctaW5pdGFsaXphdGlvbiBiYXNlZCBvbiBtYXRlcmlhbCBvZgorICoKKyAqIChDKSBDb3B5cmlnaHQgMTk5OSBMaW51cyBUb3J2YWxkcworICogKEMpIENvcHlyaWdodCAxOTk5IEpvaGFubmVzIEVyZGZlbHQKKyAqIChDKSBDb3B5cmlnaHQgMTk5OSBSYW5keSBEdW5sYXAKKyAqIChDKSBDb3B5cmlnaHQgMTk5OSBHcmVnb3J5IFAuIFNtaXRoCisgKgorICoKKyAqIEFkYXB0ZWQgZm9yIFUtQm9vdDoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMSBEZW5pcyBQZXRlciwgTVBMIEFHIFN3aXR6ZXJsYW5kCisgKiAoQykgQ29weXJpZ2h0IDIwMDgsIERhbmllbCBIZWxsc3Ry9m0sIGRhbmllbEBnYWlzbGVyLmNvbQorICogICAgIEFkZGVkIEFNQkEgUGx1ZyZQbGF5IGRldGVjdGlvbiBvZiBHUlVTQiwgbW9kaWZpZWQgaW50ZXJydXB0IGhhbmRsZXIuCisgKiAgICAgQWRkZWQgY2FjaGUgZmx1c2hlcyB3aGVyZSBuZWVkZWQuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICoKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSG93IGl0IHdvcmtzOgorICogLS0tLS0tLS0tLS0tLQorICogVGhlIGZyYW1lbGlzdCAvIFRyYW5zZmVyIGRlc2NyaXB0b3IgLyBRdWV1ZSBIZWFkcyBhcmUgc2ltaWxhciBsaWtlCisgKiBpbiB0aGUgbGludXggdXNiX3VoY2kuYy4KKyAqCisgKiBEdXJpbmcgaW5pdGlhbGl6YXRpb24sIHRoZSBmb2xsb3dpbmcgc2tlbGV0b24gaXMgYWxsb2NhdGVkIGluIGluaXRfc2tlbDoKKyAqCisgKiAgICAgICAgIGZyYW1lc3BlY2lmaWMgICAgICAgICAgIHwgICAgICAgICAgIGNvbW1vbiBjaGFpbgorICoKKyAqIGZyYW1lbGlzdFtdCisgKiBbICAwIF0tLS0tLT4gVEQgLS0tLS0tLS0tXAorICogWyAgMSBdLS0tLS0+IFREIC0tLS0tLS0tLS0+IFREIC0tLS0tLT4gUUggLS0tLS0tLT4gUUggLS0tLS0tLT4gUUggLS0tPiBOVUxMCisgKiAgIC4uLiAgICAgICAgVEQgLS0tLS0tLS0tLworICogWzEwMjNdLS0tLS0+IFREIC0tLS0tLS0tLworICoKKyAqICAgICAgICAgICAgICBeXiAgICAgICAgICAgICBeXiAgICAgICAgIF5eICAgICAgICAgIF5eICAgICAgICAgIF5eCisgKiAgICAgICAgICAgICAgNyBURHMgZm9yICAgICAgMSBURCBmb3IgICBTdGFydCBvZiAgICBTdGFydCBvZiAgICBFbmQgQ2hhaW4KKyAqICAgICAgICAgICAgICBJTlQgKDItMTI4bXMpICAxbXMtSU5UICAgIENUUkwgQ2hhaW4gIEJVTEsgQ2hhaW4KKyAqCisgKgorICogU2luY2UgdGhpcyBpcyBhIGJvb3Rsb2FkZXIsIHRoZSBpc29jaHJvbm91cyB0cmFuc2ZlciBkZXNjcmlwdG9yIGhhdmUgYmVlbiByZW1vdmVkLgorICoKKyAqIEludGVycnVwdCBUcmFuc2ZlcnMuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRm9yIEludGVydXB0IHRyYW5zZmVycyBVU0JfTUFYX1RFTVBfSU5UX1REIFRyYW5zZmVyIGRlc2NyaXB0b3IgYXJlIGF2YWlsYWJsZS4gVGhleQorICogd2lsbCBiZSBpbnNlcnRlZCBhZnRlciB0aGUgYXBwcm9wcmlhdGUgKGRlcGVuZGluZyB0aGUgaW50ZXJ2YWwgc2V0dGluZykgc2tlbGV0b24gVEQuCisgKiBJZiBhbiBpbnRlcnJ1cHQgaGFzIGJlZW4gZGV0ZWN0ZWQgdGhlIGRldi0+aXJxaGFuZGxlciBpcyBjYWxsZWQuIFRoZSBzdGF0dXMgYW5kIG51bWJlcgorICogb2YgdHJhbnNmZXJlZCBieXRlcyBpcyBzdG9yZWQgaW4gZGV2LT5pcnFfc3RhdHVzIHJlc3AuIGRldi0+aXJxX2FjdF9sZW4uIElmIHRoZQorICogZGV2LT5pcnFoYW5kbGVyIHJldHVybnMgMCwgdGhlIGludGVycnVwdCBURCBpcyByZW1vdmVkIGFuZCBkaXNhYmxlZC4gSWYgYW4gMSBpcyByZXR1cm5lZCwKKyAqIHRoZSBpbnRlcnJ1cHQgVEQgd2lsbCBiZSByZWFjdGl2YXRlZC4KKyAqCisgKiBDb250cm9sIFRyYW5zZmVycworICogLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvbnRyb2wgVHJhbnNmZXJzIGFyZSBpc3N1ZWQgYnkgZmlsbGluZyB0aGUgdG1wX3RkIHdpdGggdGhlIGFwcHJvcHJpYXRlIGRhdGEgYW5kIGNvbm5lY3QKKyAqIHRoZW0gdG8gdGhlIHFoX2NudHJsIHF1ZXVlIGhlYWRlci4gQmVmb3JlIG90aGVyIGNvbnRyb2wvYnVsayB0cmFuc2ZlcnMgY2FuIGJlIGlzc3VlZCwKKyAqIHRoZSBwcm9ncmFtbSBoYXMgdG8gd2FpdCBmb3IgY29tcGxldGlvbi4gVGhpcyBkb2VzIG5vdCBhbGxvd3MgYXN5bmNocm9ub3VzIGRhdGEgdHJhbnNmZXIuCisgKgorICogQnVsayBUcmFuc2ZlcnMKKyAqIC0tLS0tLS0tLS0tLS0tCisgKiBCdWxrIFRyYW5zZmVycyBhcmUgaXNzdWVkIGJ5IGZpbGxpbmcgdGhlIHRtcF90ZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBkYXRhIGFuZCBjb25uZWN0CisgKiB0aGVtIHRvIHRoZSBxaF9idWxrIHF1ZXVlIGhlYWRlci4gQmVmb3JlIG90aGVyIGNvbnRyb2wvYnVsayB0cmFuc2ZlcnMgY2FuIGJlIGlzc3VlZCwKKyAqIHRoZSBwcm9ncmFtbSBoYXMgdG8gd2FpdCBmb3IgY29tcGxldGlvbi4gVGhpcyBkb2VzIG5vdCBhbGxvd3MgYXN5bmNocm9ub3VzIGRhdGEgdHJhbnNmZXIuCisgKgorICoKKyAqLworCisjaW5jbHVkZSA8Y29tbW9uLmg+CisjaW5jbHVkZSA8YW1iYXBwLmg+CisjaW5jbHVkZSA8YXNtL2xlb24uaD4KKyNpbmNsdWRlIDxhc20vbGVvbjMuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKyNpZmRlZiBDT05GSUdfVVNCX1VIQ0kKKworI2luY2x1ZGUgPHVzYi5oPgorI2luY2x1ZGUgInVzYl91aGNpLmgiCisKKyNkZWZpbmUgVVNCX01BWF9URU1QX1REICAgICAgMTI4CS8qIG51bWJlciBvZiB0ZW1wb3JhcnkgVERzIGZvciBidWxrIGFuZCBjb250cm9sIHRyYW5zZmVycyAqLworI2RlZmluZSBVU0JfTUFYX1RFTVBfSU5UX1REICAzMgkvKiBudW1iZXIgb2YgdGVtcG9yYXJ5IFREcyBmb3IgSW50ZXJydXB0IHRyYW5zZmVycyAqLworCitleHRlcm4gaW50IGxlb24zX3Nub29waW5nX2F2YWlsOworLyoKKyNkZWZpbmUgb3V0MTZyKGFkZHJlc3MsZGF0YSkgKCoodW5zaWduZWQgc2hvcnQgKikoYWRkcmVzcykgPSBcCisgKHVuc2lnbmVkIHNob3J0KSggXAorICgoKHVuc2lnbmVkIHNob3J0KShkYXRhKSYweGZmKTw8OCkgfCBcCisgKCgodW5zaWduZWQgc2hvcnQpKGRhdGEpJjB4ZmYwMCk+PjgpIFwKKyApKQorICovCisjZGVmaW5lIG91dDE2cihhZGRyZXNzLGRhdGEpIF9vdXQxNnIoKHVuc2lnbmVkIGludCkoYWRkcmVzcyksICh1bnNpZ25lZCBzaG9ydCkoZGF0YSkpCit2b2lkIF9vdXQxNnIodW5zaWduZWQgaW50IGFkZHJlc3MsIHVuc2lnbmVkIHNob3J0IGRhdGEpCit7CisJdW5zaWduZWQgc2hvcnQgdmFsID0gKHVuc2lnbmVkIHNob3J0KSgoKCh1bnNpZ25lZCBzaG9ydCkoZGF0YSkgJiAweGZmKQorCQkJCQkgICAgICAgPDwgOCkgfCAoKCh1bnNpZ25lZCBzaG9ydCkoZGF0YSkKKwkJCQkJCQkgJiAweGZmMDApID4+IDgpKTsKKyNpZmRlZiBVSENJX0RFQlVHX1JFR1MKKwlwcmludGYoIm91dDE2cigweCVseCwweCUwNHggPSAweCUwNHgpXG4iLCBhZGRyZXNzLCB2YWwsIGRhdGEpOworI2VuZGlmCisJKih1bnNpZ25lZCBzaG9ydCAqKShhZGRyZXNzKSA9IHZhbDsKK30KKworI2RlZmluZSBvdXQzMnIoYWRkcmVzcyxkYXRhKSBfb3V0MzJyKCh1bnNpZ25lZCBpbnQpKGFkZHJlc3MpLCAodW5zaWduZWQgaW50KShkYXRhKSkKK3ZvaWQgX291dDMycih1bnNpZ25lZCBpbnQgYWRkcmVzcywgdW5zaWduZWQgaW50IGRhdGEpCit7CisJdW5zaWduZWQgaW50IHZhbCA9ICh1bnNpZ25lZCBpbnQpKCgoKHVuc2lnbmVkIGludCkoZGF0YSkgJiAweDAwMDAwMGZmKQorCQkJCQkgICA8PCAyNCkgfCAoKCh1bnNpZ25lZCBpbnQpKGRhdGEpICYKKwkJCQkJCSAgICAgIDB4MDAwMGZmMDApIDw8IDgpIHwKKwkJCQkJICAoKCh1bnNpZ25lZCBpbnQpKGRhdGEpICYgMHgwMGZmMDAwMCkKKwkJCQkJICAgPj4gOCkgfCAoKCh1bnNpZ25lZCBpbnQpKGRhdGEpICYKKwkJCQkJCSAgICAgMHhmZjAwMDAwMCkgPj4gMjQpKTsKKyNpZmRlZiBVSENJX0RFQlVHX1JFR1MKKwlwcmludGYoIm91dDMycigweCVseCwweCVseCA9IDB4JWx4KVxuIiwgYWRkcmVzcywgdmFsLCBkYXRhKTsKKyNlbmRpZgorCSoodW5zaWduZWQgaW50ICopYWRkcmVzcyA9IHZhbDsKK30KKworI2RlZmluZSBpbjE2cihhZGRyZXNzKSBfaW4xNnIoKHVuc2lnbmVkIGludCkoYWRkcmVzcykpCit1bnNpZ25lZCBzaG9ydCBfaW4xNnIodW5zaWduZWQgaW50IGFkZHJlc3MpCit7CisJdW5zaWduZWQgc2hvcnQgdmFsID0gc3BhcmNfbG9hZF9yZWdfY2FjaGVtaXNzX3dvcmQoYWRkcmVzcyk7CisJdmFsID0gKCh2YWwgPDwgOCkgJiAweGZmMDApIHwgKCh2YWwgPj4gOCkgJiAweGZmKTsKKyNpZmRlZiBVSENJX0RFQlVHX1JFR1MKKwlwcmludGYoImluMTZyKDB4JWx4KTogMHglMDR4XG4iLCBhZGRyZXNzLCB2YWwpOworI2VuZGlmCisJcmV0dXJuIHZhbDsKK30KKworI2RlZmluZSBpbjMycihhZGRyZXNzKSBfaW4zMnIoKHVuc2lnbmVkIGludCkoYWRkcmVzcykpCit1bnNpZ25lZCBpbnQgX2luMzJyKHVuc2lnbmVkIGludCBhZGRyZXNzKQoreworCXVuc2lnbmVkIGludCB2YWwgPSBzcGFyY19sb2FkX3JlZ19jYWNoZW1pc3MoYWRkcmVzcyk7CisJdmFsID0KKwkgICAgKCh2YWwgPDwgMjQpICYgMHhmZjAwMDAwMCkgfCAoKHZhbCA8PCA4KSAmIDB4ZmYwMDAwKSB8ICgodmFsID4+IDgpICYKKwkJCQkJCQkJICAgIDB4ZmYwMCkgfAorCSAgICAoKHZhbCA+PiAyNCkgJiAweGZmKTsKKyNpZmRlZiBVSENJX0RFQlVHX1JFR1MKKwlwcmludGYoImluMzJyKDB4JWx4KTogMHglMDh4XG4iLCBhZGRyZXNzLCB2YWwpOworI2VuZGlmCisJcmV0dXJuIHZhbDsKK30KKworI2RlZmluZSBSRUFEMzIoYWRkcmVzcykgc3BhcmNfbG9hZF9yZWdfY2FjaGVtaXNzKCh1bnNpZ25lZCBpbnQpKGFkZHJlc3MpKQorCisvKiNkZWZpbmUgVVNCX1VIQ0lfREVCVUcqLworI3VuZGVmIFVTQl9VSENJX0RFQlVHCisKK3ZvaWQgdXNiX3Nob3dfdGQoaW50IG1heCk7CisjaWZkZWYJVVNCX1VIQ0lfREVCVUcKK3ZvaWQgZ3J1c2Jfc2hvd19yZWdzKHZvaWQpOworI2RlZmluZQlVU0JfVUhDSV9QUklOVEYoZm10LGFyZ3MuLi4pCXByaW50ZiAoZm10ICwjI2FyZ3MpCisjZWxzZQorI2RlZmluZSBVU0JfVUhDSV9QUklOVEYoZm10LGFyZ3MuLi4pCisjZW5kaWYKKworc3RhdGljIGludCBncnVzYl9pcnEgPSAtMTsJLyogaXJxIHZlY3RvciwgaWYgLTEgdWhjaSBpcyBzdG9wcGVkIC8gcmVzZXRlZCAqLwordW5zaWduZWQgaW50IHVzYl9iYXNlX2FkZHI7CS8qIGJhc2UgYWRkcmVzcyAqLworCitzdGF0aWMgdWhjaV90ZF90IHRkX2ludFs4XSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKTsJLyogSW50ZXJydXB0IFRyYW5zZmVyIGRlc2NyaXB0b3JzICovCitzdGF0aWMgdWhjaV9xaF90IHFoX2NudHJsIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDE2KSkpOwkvKiBjb250cm9sIFF1ZXVlIEhlYWQgKi8KK3N0YXRpYyB1aGNpX3FoX3QgcWhfYnVsayBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKTsJLyogIGJ1bGsgUXVldWUgSGVhZCAqLworc3RhdGljIHVoY2lfcWhfdCBxaF9lbmQgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSk7CS8qIGVuZCBRdWV1ZSBIZWFkICovCitzdGF0aWMgdWhjaV90ZF90IHRkX2xhc3QgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSk7CS8qIGxhc3QgVEQgKGxpbmtlZCB3aXRoIGVuZCBjaGFpbikgKi8KKworLyogdGVtcG9yYXJ5IHRkcyAqLworc3RhdGljIHVoY2lfdGRfdCB0bXBfdGRbVVNCX01BWF9URU1QX1REXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKTsJLyogdGVtcG9yYXJ5IGJ1bGsvY29udHJvbCB0ZCdzICAqLworc3RhdGljIHVoY2lfdGRfdCB0bXBfaW50X3RkW1VTQl9NQVhfVEVNUF9JTlRfVERdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDE2KSkpOwkvKiB0ZW1wb3JhcnkgaW50ZXJydXB0IHRkJ3MgICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZyYW1lbGlzdFsxMDI0XSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgweDEwMDApKSk7CS8qIGZyYW1lIGxpc3QgKi8KKworc3RhdGljIHN0cnVjdCB2aXJ0X3Jvb3RfaHViIHJoOwkvKiBzdHJ1Y3QgZm9yIHJvb3QgaHViICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzb21lIGZvcndhcmQgZGVjbGVyYXRpb24KKyAqLworaW50IHVoY2lfc3VibWl0X3JoX21zZyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsCisJCSAgICAgICB2b2lkICpidWZmZXIsIGludCB0cmFuc2Zlcl9sZW4sCisJCSAgICAgICBzdHJ1Y3QgZGV2cmVxdWVzdCAqc2V0dXApOworCisvKiBmaWxsIGEgdGQgd2l0aCB0aGUgYXBwcm9wcm9pYXRlIGRhdGEuIExpbmssIHN0YXR1cywgaW5mbyBhbmQgYnVmZmVyCisgKiBhcmUgdXNlZCBieSB0aGUgVVNCIGNvbnRyb2xsZXIgaXRzZWxmZXMsIGRldiBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZQorICogImNvbm5lY3RlZCIgZGV2aWNlCisgKi8KK3ZvaWQgdXNiX2ZpbGxfdGQodWhjaV90ZF90ICogdGQsIHVuc2lnbmVkIGxvbmcgbGluaywgdW5zaWduZWQgbG9uZyBzdGF0dXMsCisJCSB1bnNpZ25lZCBsb25nIGluZm8sIHVuc2lnbmVkIGxvbmcgYnVmZmVyLCB1bnNpZ25lZCBsb25nIGRldikKK3sKKwl0ZC0+bGluayA9IHN3YXBfMzIobGluayk7CisJdGQtPnN0YXR1cyA9IHN3YXBfMzIoc3RhdHVzKTsKKwlpZiAoKGluZm8gJiBVSENJX1BJRCkgPT0gMCkKKwkJaW5mbyB8PSBVU0JfUElEX09VVDsKKwl0ZC0+aW5mbyA9IHN3YXBfMzIoaW5mbyk7CisJdGQtPmJ1ZmZlciA9IHN3YXBfMzIoYnVmZmVyKTsKKwl0ZC0+ZGV2X3B0ciA9IGRldjsKK30KKworLyogZmlsbCBhIHFoIHdpdGggdGhlIGFwcHJvcHJvaWF0ZSBkYXRhLiBIZWFkIGFuZCBlbGVtZW50IGFyZSB1c2VkIGJ5IHRoZSBVU0IgY29udHJvbGxlcgorICogaXRzZWxmZXMuIEFzIHNvb24gYXMgYSB2YWxpZCBkZXZfcHRyIGlzIGZpbGxlZCwgYSB0ZCBjaGFpbiBpcyBjb25uZWN0ZWQgdG8gdGhlIHFoLgorICogUGxlYXNlIG5vdGUsIHRoYXQgYWZ0ZXIgY29tcGxldGlvbiBvZiB0aGUgdGQgY2hhaW4sIHRoZSBlbnRyeSBlbGVtZW50IGlzIHJlbW92ZWQgLworICogbWFya2VkIGludmFsaWQgYnkgdGhlIFVTQiBjb250cm9sbGVyLgorICovCit2b2lkIHVzYl9maWxsX3FoKHVoY2lfcWhfdCAqIHFoLCB1bnNpZ25lZCBsb25nIGhlYWQsIHVuc2lnbmVkIGxvbmcgZWxlbWVudCkKK3sKKwlxaC0+aGVhZCA9IHN3YXBfMzIoaGVhZCk7CisJcWgtPmVsZW1lbnQgPSBzd2FwXzMyKGVsZW1lbnQpOworCXFoLT5kZXZfcHRyID0gMEw7Cit9CisKKy8qIGdldCB0aGUgc3RhdHVzIG9mIGEgdGQtPnN0YXR1cworICovCit1bnNpZ25lZCBsb25nIHVzYl91aGNpX3RkX3N0YXQodW5zaWduZWQgbG9uZyBzdGF0dXMpCit7CisJdW5zaWduZWQgbG9uZyByZXN1bHQgPSAwOworCXJlc3VsdCB8PSAoc3RhdHVzICYgVERfQ1RSTF9OQUspID8gVVNCX1NUX05BS19SRUMgOiAwOworCXJlc3VsdCB8PSAoc3RhdHVzICYgVERfQ1RSTF9TVEFMTEVEKSA/IFVTQl9TVF9TVEFMTEVEIDogMDsKKwlyZXN1bHQgfD0gKHN0YXR1cyAmIFREX0NUUkxfREJVRkVSUikgPyBVU0JfU1RfQlVGX0VSUiA6IDA7CisJcmVzdWx0IHw9IChzdGF0dXMgJiBURF9DVFJMX0JBQkJMRSkgPyBVU0JfU1RfQkFCQkxFX0RFVCA6IDA7CisJcmVzdWx0IHw9IChzdGF0dXMgJiBURF9DVFJMX0NSQ1RJTUVPKSA/IFVTQl9TVF9DUkNfRVJSIDogMDsKKwlyZXN1bHQgfD0gKHN0YXR1cyAmIFREX0NUUkxfQklUU1RVRkYpID8gVVNCX1NUX0JJVF9FUlIgOiAwOworCXJlc3VsdCB8PSAoc3RhdHVzICYgVERfQ1RSTF9BQ1RJVkUpID8gVVNCX1NUX05PVF9QUk9DIDogMDsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBnZXQgdGhlIHN0YXR1cyBhbmQgdGhlIHRyYW5zZmVyZWQgbGVuIG9mIGEgdGQgY2hhaW4uCisgKiBjYWxsZWQgZnJvbSB0aGUgY29tcGxldGlvbiBoYW5kbGVyCisgKi8KK2ludCB1c2JfZ2V0X3RkX3N0YXR1cyh1aGNpX3RkX3QgKiB0ZCwgc3RydWN0IHVzYl9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIHRlbXAsIGluZm87CisJdW5zaWduZWQgbG9uZyBzdGF0OworCXVoY2lfdGRfdCAqbXl0ZCA9IHRkOworCisJaWYgKGRldi0+ZGV2bnVtID09IHJoLmRldm51bSkKKwkJcmV0dXJuIDA7CisJZGV2LT5hY3RfbGVuID0gMDsKKwlzdGF0ID0gMDsKKwlkbyB7CisJCXRlbXAgPSBzd2FwXzMyKCh1bnNpZ25lZCBsb25nKVJFQUQzMigmbXl0ZC0+c3RhdHVzKSk7CisJCXN0YXQgPSB1c2JfdWhjaV90ZF9zdGF0KHRlbXApOworCQlpbmZvID0gc3dhcF8zMigodW5zaWduZWQgbG9uZylSRUFEMzIoJm15dGQtPmluZm8pKTsKKwkJaWYgKCgoaW5mbyAmIDB4ZmYpICE9IFVTQl9QSURfU0VUVVApICYmICgoKGluZm8gPj4gMjEpICYgMHg3ZmYpICE9IDB4N2ZmKSAmJiAodGVtcCAmIDB4N0ZGKSAhPSAweDdmZikgewkvKiBpZiBub3Qgc2V0dXAgYW5kIG5vdCBudWxsIGRhdGEgcGFjayAqLworCQkJZGV2LT5hY3RfbGVuICs9ICh0ZW1wICYgMHg3RkYpICsgMTsJLyogdGhlIHRyYW5zZmVyZWQgbGVuIGlzIGFjdF9sZW4gKyAxICovCisJCX0KKwkJaWYgKHN0YXQpIHsJLyogc3RhdHVzIG5vIG9rICovCisJCQlkZXYtPnN0YXR1cyA9IHN0YXQ7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJdGVtcCA9IHN3YXBfMzIoKHVuc2lnbmVkIGxvbmcpUkVBRDMyKCZteXRkLT5saW5rKSk7CisJCW15dGQgPSAodWhjaV90ZF90ICopICh0ZW1wICYgMHhmZmZmZmZmMCk7CisJfSB3aGlsZSAoKHRlbXAgJiAweDEpID09IDApOwkvKiBwcm9jZXNzIGFsbCBURHMgKi8KKwlkZXYtPnN0YXR1cyA9IHN0YXQ7CisJcmV0dXJuIDA7CQkvKiBPayAqLworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIExPVyBMRVZFTCBTVFVGRgorICogICAgICAgICAgYXNzZW1ibGVzIFFIcyB1bmQgVERzIGZvciBjb250cm9sLCBidWxrIGFuZCBpc28KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgZHVtbXkodm9pZCkKK3sKKwlVU0JfVUhDSV9QUklOVEYoIkRVTU1ZXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyogU3VibWl0cyBhIGNvbnRyb2wgbWVzc2FnZS4gVGhhdCBpcyBhIFNldHVwLCBEYXRhIGFuZCBTdGF0dXMgdHJhbnNmZXIuCisgKiBSb3V0aW5lIGRvZXMgbm90IHdhaXQgZm9yIGNvbXBsZXRpb24uCisgKi8KK2ludCBzdWJtaXRfY29udHJvbF9tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsCisJCSAgICAgICBpbnQgdHJhbnNmZXJfbGVuLCBzdHJ1Y3QgZGV2cmVxdWVzdCAqc2V0dXApCit7CisJdW5zaWduZWQgbG9uZyBkZXN0aW5hdGlvbiwgc3RhdHVzOworCWludCBtYXhzemUgPSB1c2JfbWF4cGFja2V0KGRldiwgcGlwZSk7CisJdW5zaWduZWQgbG9uZyBkYXRhcHRyOworCWludCBsZW47CisJaW50IHBrdHN6ZTsKKwlpbnQgaSA9IDA7CisKKwlpZiAoIW1heHN6ZSkgeworCQlVU0JfVUhDSV9QUklOVEYKKwkJICAgICgidWhjaV9zdWJtaXRfY29udHJvbF91cmI6IHBpcGVzaXplIGZvciBwaXBlICVseCBpcyB6ZXJvXG4iLAorCQkgICAgIHBpcGUpOworCQlyZXR1cm4gLTE7CisJfQorCWlmICgoKHBpcGUgPj4gOCkgJiAweDdmKSA9PSByaC5kZXZudW0pIHsKKwkJLyogdGhpcyBpcyB0aGUgcm9vdCBodWIgLT4gcmVkaXJlY3QgaXQgKi8KKwkJcmV0dXJuIHVoY2lfc3VibWl0X3JoX21zZyhkZXYsIHBpcGUsIGJ1ZmZlciwgdHJhbnNmZXJfbGVuLAorCQkJCQkgIHNldHVwKTsKKwl9CisJVVNCX1VIQ0lfUFJJTlRGKCJ1aGNpX3N1Ym1pdF9jb250cm9sIHN0YXJ0IGxlbiAleCwgbWF4c2l6ZSAleFxuIiwKKwkJCXRyYW5zZmVyX2xlbiwgbWF4c3plKTsKKwkvKiBUaGUgInBpcGUiIHRoaW5nIGNvbnRhaW5zIHRoZSBkZXN0aW5hdGlvbiBpbiBiaXRzIDgtLTE4ICovCisJZGVzdGluYXRpb24gPSAocGlwZSAmIFBJUEVfREVWRVBfTUFTSykgfCBVU0JfUElEX1NFVFVQOwkvKiBTZXR1cCBzdGFnZSAqLworCS8qIDMgZXJyb3JzICovCisJc3RhdHVzID0gKHBpcGUgJiBURF9DVFJMX0xTKSB8IFREX0NUUkxfQUNUSVZFIHwgKDMgPDwgMjcpOworCS8qICh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVNCX0RJU0FCTEVfU1BEID8gMCA6IFREX0NUUkxfU1BEKTsgKi8KKwkvKiAgQnVpbGQgdGhlIFREIGZvciB0aGUgY29udHJvbCByZXF1ZXN0LCB0cnkgZm9yZXZlciwgOCBieXRlcyBvZiBkYXRhICovCisJdXNiX2ZpbGxfdGQoJnRtcF90ZFtpXSwgVUhDSV9QVFJfVEVSTSwgc3RhdHVzLCBkZXN0aW5hdGlvbiB8ICg3IDw8IDIxKSwKKwkJICAgICh1bnNpZ25lZCBsb25nKXNldHVwLCAodW5zaWduZWQgbG9uZylkZXYpOworI2lmZGVmIERFQlVHX0VYVFJBCisJeworCQljaGFyICpzcCA9IChjaGFyICopc2V0dXA7CisJCXByaW50ZigiU0VUVVAgdG8gcGlwZSAlbHg6ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4XG4iLCBwaXBlLAorCQkgICAgICAgc3BbMF0sIHNwWzFdLCBzcFsyXSwgc3BbM10sIHNwWzRdLCBzcFs1XSwgc3BbNl0sIHNwWzddKTsKKwl9CisjZW5kaWYKKwlkYXRhcHRyID0gKHVuc2lnbmVkIGxvbmcpYnVmZmVyOworCWxlbiA9IHRyYW5zZmVyX2xlbjsKKworCS8qIElmIGRpcmVjdGlvbiBpcyAic2VuZCIsIGNoYW5nZSB0aGUgZnJhbWUgZnJvbSBTRVRVUCAoMHgyRCkKKwkgICB0byBPVVQgKDB4RTEpLiBFbHNlIGNoYW5nZSBpdCBmcm9tIFNFVFVQIHRvIElOICgweDY5KS4gKi8KKwlkZXN0aW5hdGlvbiA9CisJICAgIChwaXBlICYgUElQRV9ERVZFUF9NQVNLKSB8ICgocGlwZSAmIFVTQl9ESVJfSU4pID09CisJCQkJCTAgPyBVU0JfUElEX09VVCA6IFVTQl9QSURfSU4pOworCXdoaWxlIChsZW4gPiAwKSB7CisJCS8qIGRhdGEgc3RhZ2UgKi8KKwkJcGt0c3plID0gbGVuOworCQlpKys7CisJCWlmIChwa3RzemUgPiBtYXhzemUpCisJCQlwa3RzemUgPSBtYXhzemU7CisJCWRlc3RpbmF0aW9uIF49IDEgPDwgVERfVE9LRU5fVE9HR0xFOwkvKiB0b2dnbGUgREFUQTAvMSAqLworCQl1c2JfZmlsbF90ZCgmdG1wX3RkW2ldLCBVSENJX1BUUl9URVJNLCBzdGF0dXMsIGRlc3RpbmF0aW9uIHwgKChwa3RzemUgLSAxKSA8PCAyMSksIGRhdGFwdHIsICh1bnNpZ25lZCBsb25nKWRldik7CS8qIFN0YXR1cywgcGt0c3plIGJ5dGVzIG9mIGRhdGEgKi8KKwkJdG1wX3RkW2kgLSAxXS5saW5rID0gc3dhcF8zMigodW5zaWduZWQgbG9uZykmdG1wX3RkW2ldKTsKKworCQlkYXRhcHRyICs9IHBrdHN6ZTsKKwkJbGVuIC09IHBrdHN6ZTsKKwl9CisKKwkvKiAgQnVpbGQgdGhlIGZpbmFsIFREIGZvciBjb250cm9sIHN0YXR1cyAqLworCS8qIEl0J3Mgb25seSBJTiBpZiB0aGUgcGlwZSBpcyBvdXQgQU5EIHdlIGFyZW4ndCBleHBlY3RpbmcgZGF0YSAqLworCisJZGVzdGluYXRpb24gJj0gflVIQ0lfUElEOworCWlmICgoKHBpcGUgJiBVU0JfRElSX0lOKSA9PSAwKSB8fCAodHJhbnNmZXJfbGVuID09IDApKQorCQlkZXN0aW5hdGlvbiB8PSBVU0JfUElEX0lOOworCWVsc2UKKwkJZGVzdGluYXRpb24gfD0gVVNCX1BJRF9PVVQ7CisJZGVzdGluYXRpb24gfD0gMSA8PCBURF9UT0tFTl9UT0dHTEU7CS8qIEVuZCBpbiBEYXRhMSAqLworCWkrKzsKKwlzdGF0dXMgJj0gflREX0NUUkxfU1BEOworCS8qIG5vIGxpbWl0IG9uIGVycm9ycyBvbiBmaW5hbCBwYWNrZXQgLCAwIGJ5dGVzIG9mIGRhdGEgKi8KKwl1c2JfZmlsbF90ZCgmdG1wX3RkW2ldLCBVSENJX1BUUl9URVJNLCBzdGF0dXMgfCBURF9DVFJMX0lPQywKKwkJICAgIGRlc3RpbmF0aW9uIHwgKFVIQ0lfTlVMTF9EQVRBX1NJWkUgPDwgMjEpLCAwLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpZGV2KTsKKwl0bXBfdGRbaSAtIDFdLmxpbmsgPSBzd2FwXzMyKCh1bnNpZ25lZCBsb25nKSZ0bXBfdGRbaV0pOwkvKiBxdWV1ZSBzdGF0dXMgdGQgKi8KKwkvKiB1c2Jfc2hvd190ZChpKzEpOyAqLworCVVTQl9VSENJX1BSSU5URigidWhjaV9zdWJtaXRfY29udHJvbCBlbmQgKCVkIHRtcF90ZHMgdXNlZClcbiIsIGkpOworCS8qIGZpcnN0IG1hcmsgdGhlIGNvbnRyb2wgUUggZWxlbWVudCB0ZXJtaW5hdGVkICovCisJcWhfY250cmwuZWxlbWVudCA9IDB4ZmZmZmZmZmZMOworCS8qIHNldCBxaCBhY3RpdmUgKi8KKwlxaF9jbnRybC5kZXZfcHRyID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCS8qIGZpbGwgaW4gdG1wX3RkX2NoYWluICovCisJZHVtbXkoKTsKKwlxaF9jbnRybC5lbGVtZW50ID0gc3dhcF8zMigodW5zaWduZWQgbG9uZykmdG1wX3RkWzBdKTsKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQcmVwYXJlIFREcyBmb3IgYnVsayB0cmFuc2ZlcnMuCisgKi8KK2ludCBzdWJtaXRfYnVsa19tc2coc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwaXBlLCB2b2lkICpidWZmZXIsCisJCSAgICBpbnQgdHJhbnNmZXJfbGVuKQoreworCXVuc2lnbmVkIGxvbmcgZGVzdGluYXRpb24sIHN0YXR1cywgaW5mbzsKKwl1bnNpZ25lZCBsb25nIGRhdGFwdHI7CisJaW50IG1heHN6ZSA9IHVzYl9tYXhwYWNrZXQoZGV2LCBwaXBlKTsKKwlpbnQgbGVuOworCWludCBpID0gMDsKKworCWlmICh0cmFuc2Zlcl9sZW4gPCAwKSB7CisJCXByaW50ZigiTmVnYXRpdmUgdHJhbnNmZXIgbGVuZ3RoIGluIHN1Ym1pdF9idWxrXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoIW1heHN6ZSkKKwkJcmV0dXJuIC0xOworCS8qIFRoZSAicGlwZSIgdGhpbmcgY29udGFpbnMgdGhlIGRlc3RpbmF0aW9uIGluIGJpdHMgOC0tMTguICovCisJZGVzdGluYXRpb24gPSAocGlwZSAmIFBJUEVfREVWRVBfTUFTSykgfCB1c2JfcGFja2V0aWQocGlwZSk7CisJLyogMyBlcnJvcnMgKi8KKwlzdGF0dXMgPSAocGlwZSAmIFREX0NUUkxfTFMpIHwgVERfQ1RSTF9BQ1RJVkUgfCAoMyA8PCAyNyk7CisJLyogICAgICAoKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVU0JfRElTQUJMRV9TUEQpID8gMCA6IFREX0NUUkxfU1BEKSB8ICgzIDw8IDI3KTsgKi8KKwkvKiBCdWlsZCB0aGUgVERzIGZvciB0aGUgYnVsayByZXF1ZXN0ICovCisJbGVuID0gdHJhbnNmZXJfbGVuOworCWRhdGFwdHIgPSAodW5zaWduZWQgbG9uZylidWZmZXI7CisJZG8geworCQlpbnQgcGt0c3plID0gbGVuOworCQlpZiAocGt0c3plID4gbWF4c3plKQorCQkJcGt0c3plID0gbWF4c3plOworCQkvKiBwa3RzemUgYnl0ZXMgb2YgZGF0YSAgKi8KKwkJaW5mbyA9CisJCSAgICBkZXN0aW5hdGlvbiB8ICgoKHBrdHN6ZSAtIDEpICYgVUhDSV9OVUxMX0RBVEFfU0laRSkgPDwgMjEpIHwKKwkJICAgICh1c2JfZ2V0dG9nZ2xlCisJCSAgICAgKGRldiwgdXNiX3BpcGVlbmRwb2ludChwaXBlKSwKKwkJICAgICAgdXNiX3BpcGVvdXQocGlwZSkpIDw8IFREX1RPS0VOX1RPR0dMRSk7CisKKwkJaWYgKChsZW4gLSBwa3RzemUpID09IDApCisJCQlzdGF0dXMgfD0gVERfQ1RSTF9JT0M7CS8qIGxhc3Qgb25lIGdlbmVyYXRlcyBJTlQgKi8KKworCQl1c2JfZmlsbF90ZCgmdG1wX3RkW2ldLCBVSENJX1BUUl9URVJNLCBzdGF0dXMsIGluZm8sIGRhdGFwdHIsICh1bnNpZ25lZCBsb25nKWRldik7CS8qIFN0YXR1cywgcGt0c3plIGJ5dGVzIG9mIGRhdGEgKi8KKwkJaWYgKGkgPiAwKQorCQkJdG1wX3RkW2kgLSAxXS5saW5rID0gc3dhcF8zMigodW5zaWduZWQgbG9uZykmdG1wX3RkW2ldKTsKKwkJaSsrOworCQlkYXRhcHRyICs9IHBrdHN6ZTsKKwkJbGVuIC09IHBrdHN6ZTsKKwkJdXNiX2RvdG9nZ2xlKGRldiwgdXNiX3BpcGVlbmRwb2ludChwaXBlKSwgdXNiX3BpcGVvdXQocGlwZSkpOworCX0gd2hpbGUgKGxlbiA+IDApOworCS8qIGZpcnN0IG1hcmsgdGhlIGJ1bGsgUUggZWxlbWVudCB0ZXJtaW5hdGVkICovCisJcWhfYnVsay5lbGVtZW50ID0gMHhmZmZmZmZmZkw7CisJLyogc2V0IHFoIGFjdGl2ZSAqLworCXFoX2J1bGsuZGV2X3B0ciA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwkvKiBmaWxsIGluIHRtcF90ZF9jaGFpbiAqLworCXFoX2J1bGsuZWxlbWVudCA9IHN3YXBfMzIoKHVuc2lnbmVkIGxvbmcpJnRtcF90ZFswXSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHNlYXJjaCBhIGZyZWUgaW50ZXJydXB0IHRkCisgKi8KK3VoY2lfdGRfdCAqdWhjaV9hbGxvY19pbnRfdGQodm9pZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgVVNCX01BWF9URU1QX0lOVF9URDsgaSsrKSB7CisJCWlmICh0bXBfaW50X3RkW2ldLmRldl9wdHIgPT0gMCkJLyogbm8gZGV2aWNlIGFzc2lnbmVkIC0+IGZyZWUgVEQgKi8KKwkJCXJldHVybiAmdG1wX2ludF90ZFtpXTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogc3VibWl0cyBVU0IgaW50ZXJydXB0IChpZS4gcG9sbGluZyA7LSkKKyAqLworaW50IHN1Ym1pdF9pbnRfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqYnVmZmVyLAorCQkgICBpbnQgdHJhbnNmZXJfbGVuLCBpbnQgaW50ZXJ2YWwpCit7CisJaW50IG5pbnQsIG47CisJdW5zaWduZWQgbG9uZyBzdGF0dXMsIGRlc3RpbmF0aW9uOworCXVuc2lnbmVkIGxvbmcgaW5mbywgdG1wOworCXVoY2lfdGRfdCAqbXl0ZDsKKwlpZiAoaW50ZXJ2YWwgPCAwIHx8IGludGVydmFsID49IDI1NikKKwkJcmV0dXJuIC0xOworCisJaWYgKGludGVydmFsID09IDApCisJCW5pbnQgPSAwOworCWVsc2UgeworCQlmb3IgKG5pbnQgPSAwLCBuID0gMTsgbmludCA8PSA4OyBuaW50KyssIG4gKz0gbikgewkvKiByb3VuZCBpbnRlcnZhbCBkb3duIHRvIDJebiAqLworCQkJaWYgKGludGVydmFsIDwgbikgeworCQkJCWludGVydmFsID0gbiAvIDI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJbmludC0tOworCX0KKworCVVTQl9VSENJX1BSSU5URigiUm91bmRlZCBpbnRlcnZhbCB0byAlaSwgY2hhaW4gICVpXG4iLCBpbnRlcnZhbCwgbmludCk7CisJbXl0ZCA9IHVoY2lfYWxsb2NfaW50X3RkKCk7CisJaWYgKG15dGQgPT0gTlVMTCkgeworCQlwcmludGYoIk5vIGZyZWUgSU5UIFREcyBmb3VuZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisJc3RhdHVzID0gKHBpcGUgJiBURF9DVFJMX0xTKSB8IFREX0NUUkxfQUNUSVZFIHwgVERfQ1RSTF9JT0MgfCAoMyA8PCAyNyk7CisvKgkJKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVU0JfRElTQUJMRV9TUEQgPyAwIDogVERfQ1RSTF9TUEQpIHwgKDMgPDwgMjcpOworKi8KKworCWRlc3RpbmF0aW9uID0KKwkgICAgKHBpcGUgJiBQSVBFX0RFVkVQX01BU0spIHwgdXNiX3BhY2tldGlkKHBpcGUpIHwKKwkgICAgKCgodHJhbnNmZXJfbGVuIC0gMSkgJiAweDdmZikgPDwgMjEpOworCisJaW5mbyA9CisJICAgIGRlc3RpbmF0aW9uIHwKKwkgICAgKHVzYl9nZXR0b2dnbGUoZGV2LCB1c2JfcGlwZWVuZHBvaW50KHBpcGUpLCB1c2JfcGlwZW91dChwaXBlKSkgPDwKKwkgICAgIFREX1RPS0VOX1RPR0dMRSk7CisJdG1wID0gc3dhcF8zMih0ZF9pbnRbbmludF0ubGluayk7CisJdXNiX2ZpbGxfdGQobXl0ZCwgdG1wLCBzdGF0dXMsIGluZm8sICh1bnNpZ25lZCBsb25nKWJ1ZmZlciwKKwkJICAgICh1bnNpZ25lZCBsb25nKWRldik7CisJLyogTGluayBpdCAqLworCXRtcCA9IHN3YXBfMzIoKHVuc2lnbmVkIGxvbmcpbXl0ZCk7CisJdGRfaW50W25pbnRdLmxpbmsgPSB0bXA7CisKKwl1c2JfZG90b2dnbGUoZGV2LCB1c2JfcGlwZWVuZHBvaW50KHBpcGUpLCB1c2JfcGlwZW91dChwaXBlKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExvdyBMZXZlbCBmdW5jdGlvbnMKKyAqLworCit2b2lkIHJlc2V0X2hjKHZvaWQpCit7CisKKwkvKiBHbG9iYWwgcmVzZXQgZm9yIDEwMG1zICovCisJb3V0MTZyKHVzYl9iYXNlX2FkZHIgKyBVU0JQT1JUU0MxLCAweDAyMDQpOworCW91dDE2cih1c2JfYmFzZV9hZGRyICsgVVNCUE9SVFNDMiwgMHgwMjA0KTsKKwlvdXQxNnIodXNiX2Jhc2VfYWRkciArIFVTQkNNRCwgVVNCQ01EX0dSRVNFVCB8IFVTQkNNRF9SUyk7CisJLyogVHVybiBvZmYgYWxsIGludGVycnVwdHMgKi8KKwlvdXQxNnIodXNiX2Jhc2VfYWRkciArIFVTQklOVFIsIDApOworCXdhaXRfbXMoNTApOworCW91dDE2cih1c2JfYmFzZV9hZGRyICsgVVNCQ01ELCAwKTsKKwl3YWl0X21zKDEwKTsKK30KKwordm9pZCBzdGFydF9oYyh2b2lkKQoreworCWludCB0aW1lb3V0ID0gMTAwMDsKKworCXdoaWxlIChpbjE2cih1c2JfYmFzZV9hZGRyICsgVVNCQ01EKSAmIFVTQkNNRF9IQ1JFU0VUKSB7CisJCWlmICghLS10aW1lb3V0KSB7CisJCQlwcmludGYoIlVTQkNNRF9IQ1JFU0VUIHRpbWVkIG91dCFcbiIpOworCQkJYnJlYWs7CisJCX0KKwl9CisJLyogVHVybiBvbiBhbGwgaW50ZXJydXB0cyAqLworCW91dDE2cih1c2JfYmFzZV9hZGRyICsgVVNCSU5UUiwKKwkgICAgICAgVVNCSU5UUl9USU1FT1VUIHwgVVNCSU5UUl9SRVNVTUUgfCBVU0JJTlRSX0lPQyB8IFVTQklOVFJfU1ApOworCS8qIFN0YXJ0IGF0IGZyYW1lIDAgKi8KKwlvdXQxNnIodXNiX2Jhc2VfYWRkciArIFVTQkZSTlVNLCAwKTsKKwkvKiBzZXQgRnJhbWVidWZmZXIgYmFzZSBhZGRyZXNzICovCisJb3V0MzJyKHVzYl9iYXNlX2FkZHIgKyBVU0JGTEJBU0VBREQsICh1bnNpZ25lZCBsb25nKSZmcmFtZWxpc3QpOworCS8qIFJ1biBhbmQgbWFyayBpdCBjb25maWd1cmVkIHdpdGggYSA2NC1ieXRlIG1heCBwYWNrZXQgKi8KKwlvdXQxNnIodXNiX2Jhc2VfYWRkciArIFVTQkNNRCwgVVNCQ01EX1JTIHwgVVNCQ01EX0NGIHwgVVNCQ01EX01BWFApOworfQorCisvKiBJbml0aWFsaXplIHRoZSBza2VsZXRvbgorICovCit2b2lkIHVzYl9pbml0X3NrZWwodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRlbXA7CisJaW50IG47CisKKwlmb3IgKG4gPSAwOyBuIDwgVVNCX01BWF9URU1QX0lOVF9URDsgbisrKQorCQl0bXBfaW50X3RkW25dLmRldl9wdHIgPSAwTDsJLyogbm8gZGV2aWNlcyBjb25uZWN0ZWQgKi8KKwkvKiBsYXN0IHRkICovCisJdXNiX2ZpbGxfdGQoJnRkX2xhc3QsIFVIQ0lfUFRSX1RFUk0sIFREX0NUUkxfSU9DLCBVU0JfUElEX09VVCwgMCwgMEwpOworCS8qIHVzYl9maWxsX3RkKCZ0ZF9sYXN0LFVIQ0lfUFRSX1RFUk0sMCwwLDApOyAqLworCS8qIEVuZCBRdWV1ZSBIZWFkZXIgKi8KKwl1c2JfZmlsbF9xaCgmcWhfZW5kLCBVSENJX1BUUl9URVJNLCAodW5zaWduZWQgbG9uZykmdGRfbGFzdCk7CisJLyogQnVsayBRdWV1ZSBIZWFkZXIgKi8KKwl0ZW1wID0gKHVuc2lnbmVkIGxvbmcpJnFoX2VuZDsKKwl1c2JfZmlsbF9xaCgmcWhfYnVsaywgdGVtcCB8IFVIQ0lfUFRSX1FILCBVSENJX1BUUl9URVJNKTsKKwkvKiBDb250cm9sIFF1ZXVlIEhlYWRlciAqLworCXRlbXAgPSAodW5zaWduZWQgbG9uZykmcWhfYnVsazsKKwl1c2JfZmlsbF9xaCgmcWhfY250cmwsIHRlbXAgfCBVSENJX1BUUl9RSCwgVUhDSV9QVFJfVEVSTSk7CisJLyogMW1zIEludGVycnVwdCB0ZCAqLworCXRlbXAgPSAodW5zaWduZWQgbG9uZykmcWhfY250cmw7CisJdXNiX2ZpbGxfdGQoJnRkX2ludFswXSwgdGVtcCB8IFVIQ0lfUFRSX1FILCAwLCBVU0JfUElEX09VVCwgMCwgMEwpOworCXRlbXAgPSAodW5zaWduZWQgbG9uZykmdGRfaW50WzBdOworCWZvciAobiA9IDE7IG4gPCA4OyBuKyspCisJCXVzYl9maWxsX3RkKCZ0ZF9pbnRbbl0sIHRlbXAsIDAsIFVTQl9QSURfT1VULCAwLCAwTCk7CisJZm9yIChuID0gMDsgbiA8IDEwMjQ7IG4rKykgeworCQkvKiBsaW5rIGFsbCBmcmFtZWxpc3QgcG9pbnRlcnMgdG8gb25lIG9mIHRoZSBpbnRlcnJ1cHRzICovCisJCWludCBtLCBvOworCQlpZiAoKG4gJiAxMjcpID09IDEyNykKKwkJCWZyYW1lbGlzdFtuXSA9IHN3YXBfMzIoKHVuc2lnbmVkIGxvbmcpJnRkX2ludFswXSk7CisJCWVsc2UKKwkJCWZvciAobyA9IDEsIG0gPSAyOyBtIDw9IDEyODsgbysrLCBtICs9IG0pCisJCQkJaWYgKChuICYgKG0gLSAxKSkgPT0gKChtIC0gMSkgLyAyKSkKKwkJCQkJZnJhbWVsaXN0W25dID0KKwkJCQkJICAgIHN3YXBfMzIoKHVuc2lnbmVkIGxvbmcpJnRkX2ludFtvXSk7CisKKwl9Cit9CisKKy8qIGNoZWNrIHRoZSBjb21tb24gc2tlbGV0b24gZm9yIGNvbXBsZXRlZCB0cmFuc2ZlcnMsIGFuZCB1cGRhdGUgdGhlIHN0YXR1cworICogb2YgdGhlICJjb25uZWN0ZWQiIGRldmljZS4gQ2FsbGVkIGZyb20gdGhlIElSUSByb3V0aW5lLgorICovCit2b2lkIHVzYl9jaGVja19za2VsKHZvaWQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKKwkvKiBzdGFydCB3aXRoIHRoZSBjb250cm9sIHFoICovCisJaWYgKHFoX2NudHJsLmRldl9wdHIgIT0gMCkgewkvKiBpdCdzIGEgZGV2aWNlIGFzc2lnbmVkIGNoZWNrIGlmIHRoaXMgY2F1c2VkIElSUSAqLworCQlkZXYgPSAoc3RydWN0IHVzYl9kZXZpY2UgKilxaF9jbnRybC5kZXZfcHRyOworCQkvKiBGbHVzaCBjYWNoZSBub3cgdGhhdCBoYXJkd2FyZSB1cGRhdGVkIERBVEEgYW5kIFREcy9RSHMgKi8KKwkJaWYgKCFsZW9uM19zbm9vcGluZ19hdmFpbCkKKwkJCXNwYXJjX2RjYWNoZV9mbHVzaF9hbGwoKTsKKwkJdXNiX2dldF90ZF9zdGF0dXMoJnRtcF90ZFswXSwgZGV2KTsJLyogdXBkYXRlIHN0YXR1cyAqLworCQlpZiAoIShkZXYtPnN0YXR1cyAmIFVTQl9TVF9OT1RfUFJPQykpIHsJLyogaXMgbm90IGFjdGl2ZSBhbnltb3JlLCBkaXNjb25uZWN0IGRldmljZXMgKi8KKwkJCXFoX2NudHJsLmRldl9wdHIgPSAwOworCQl9CisJfQorCS8qIG5vdyBwcm9jZXNzIHRoZSBidWxrICovCisJaWYgKHFoX2J1bGsuZGV2X3B0ciAhPSAwKSB7CS8qIGl0J3MgYSBkZXZpY2UgYXNzaWduZWQgY2hlY2sgaWYgdGhpcyBjYXVzZWQgSVJRICovCisJCWRldiA9IChzdHJ1Y3QgdXNiX2RldmljZSAqKXFoX2J1bGsuZGV2X3B0cjsKKwkJLyogRmx1c2ggY2FjaGUgbm93IHRoYXQgaGFyZHdhcmUgdXBkYXRlZCBEQVRBIGFuZCBURHMvUUhzICovCisJCWlmICghbGVvbjNfc25vb3BpbmdfYXZhaWwpCisJCQlzcGFyY19kY2FjaGVfZmx1c2hfYWxsKCk7CisJCXVzYl9nZXRfdGRfc3RhdHVzKCZ0bXBfdGRbMF0sIGRldik7CS8qIHVwZGF0ZSBzdGF0dXMgKi8KKwkJaWYgKCEoZGV2LT5zdGF0dXMgJiBVU0JfU1RfTk9UX1BST0MpKSB7CS8qIGlzIG5vdCBhY3RpdmUgYW55bW9yZSwgZGlzY29ubmVjdCBkZXZpY2VzICovCisJCQlxaF9idWxrLmRldl9wdHIgPSAwOworCQl9CisJfQorfQorCisvKiBjaGVjayB0aGUgaW50ZXJydXB0IGNoYWluLCB1YmRhdGUgdGhlIHN0YXR1cyBvZiB0aGUgYXBwcm9wcmlhdGUgZGV2aWNlLAorICogY2FsbCB0aGUgYXBwcm9wcmlhdGUgaXJxaGFuZGxlciBhbmQgcmVhY3RpdmF0ZSB0aGUgVEQgaWYgdGhlIGlycWhhbmRsZXIKKyAqIHJldHVybnMgd2l0aCAxCisgKi8KK3ZvaWQgdXNiX2NoZWNrX2ludF9jaGFpbih2b2lkKQoreworCWludCBpLCByZXM7CisJdW5zaWduZWQgbG9uZyBsaW5rLCBzdGF0dXM7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKKwl1aGNpX3RkX3QgKnRkLCAqcHJldnRkOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlwcmV2dGQgPSAmdGRfaW50W2ldOwkvKiB0aGUgZmlyc3QgcHJldmlvdXMgdGQgaXMgdGhlIHNrZWxldG9uIHRkICovCisJCWxpbmsgPSBzd2FwXzMyKFJFQUQzMigmdGRfaW50W2ldLmxpbmspKSAmIDB4ZmZmZmZmZjA7CS8qIG5leHQgaW4gY2hhaW4gKi8KKwkJdGQgPSAodWhjaV90ZF90ICopIGxpbms7CS8qIGFzc2lnbiBpdCAqLworCQkvKiBhbGwgaW50ZXJydXB0IFREcyBhcmUgZmluYWxseSBsaW5rZWQgdG8gdGhlIHRkX2ludFswXS4KKwkJICogc28gd2UgcHJvY2VzcyBhbGwgdW50aWwgd2UgZmluZCB0aGUgdGRfaW50WzBdLgorCQkgKiBpZiBpbnQwIGNoYWluIHBvaW50cyB0byBhIFFILCB3ZSdyZSBhbHNvIGRvbmUKKwkJICovCisJCXdoaWxlICgoKGkgPiAwKSAmJiAobGluayAhPSAodW5zaWduZWQgbG9uZykmdGRfaW50WzBdKSkgfHwKKwkJICAgICAgICgoaSA9PSAwKQorCQkJJiYgIShzd2FwXzMyKFJFQUQzMigmdGQtPmxpbmspKSAmIFVIQ0lfUFRSX1FIKSkpIHsKKwkJCS8qIGNoZWNrIGlmIGEgZGV2aWNlIGlzIGFzc2lnbmVkIHdpdGggdGhpcyB0ZCAqLworCQkJc3RhdHVzID0gc3dhcF8zMihSRUFEMzIoJnRkLT5zdGF0dXMpKTsKKwkJCWlmICgodGQtPmRldl9wdHIgIT0gMEwpICYmICEoc3RhdHVzICYgVERfQ1RSTF9BQ1RJVkUpKSB7CisJCQkJLyogdGQgaXMgbm90IGFjdGl2ZSBhbmQgYSBkZXZpY2UgaXMgYXNzaWduZWQgLT4gY2FsbCBpcnFoYW5kbGVyICovCisJCQkJZGV2ID0gKHN0cnVjdCB1c2JfZGV2aWNlICopdGQtPmRldl9wdHI7CisJCQkJZGV2LT5pcnFfYWN0X2xlbiA9ICgoc3RhdHVzICYgMHg3RkYpID09IDB4N0ZGKSA/IDAgOiAoc3RhdHVzICYgMHg3RkYpICsgMTsJLyogdHJhbnNmZXJlZCBsZW5ndGggKi8KKwkJCQlkZXYtPmlycV9zdGF0dXMgPSB1c2JfdWhjaV90ZF9zdGF0KHN0YXR1cyk7CS8qIGdldCBzdGF0dXMgKi8KKwkJCQlyZXMgPSBkZXYtPmlycV9oYW5kbGUoZGV2KTsJLyogY2FsbCBpcnFoYW5kbGVyICovCisJCQkJaWYgKHJlcyA9PSAxKSB7CisJCQkJCS8qIHJlYWN0aXZhdGUgKi8KKwkJCQkJc3RhdHVzIHw9IFREX0NUUkxfQUNUSVZFOworCQkJCQl0ZC0+c3RhdHVzID0gc3dhcF8zMihzdGF0dXMpOworCQkJCQlwcmV2dGQgPSB0ZDsJLyogcHJldmlvdXMgdGQgPSB0aGlzIHRkICovCisJCQkJfSBlbHNlIHsKKwkJCQkJcHJldnRkLT5saW5rID0gUkVBRDMyKCZ0ZC0+bGluayk7CS8qIGxpbmsgcHJldmlvdXMgdGQgZGlyZWN0bHkgdG8gdGhlIG5leCB0ZCAtPiB1bmxpbmtlZCAqLworCQkJCQkvKiByZW1vdmUgZGV2aWNlIHBvaW50ZXIgKi8KKwkJCQkJdGQtPmRldl9wdHIgPSAwTDsKKwkJCQl9CisJCQl9CS8qIGlmIHdlIGNhbGwgdGhlIGlycSBoYW5kbGVyICovCisJCQlsaW5rID0gc3dhcF8zMihSRUFEMzIoJnRkLT5saW5rKSkgJiAweGZmZmZmZmYwOwkvKiBuZXh0IGluIGNoYWluICovCisJCQl0ZCA9ICh1aGNpX3RkX3QgKikgbGluazsJLyogYXNzaWduIGl0ICovCisJCX0JCS8qIHByb2Nlc3MgYWxsIHRkIGluIHRoaXMgaW50IGNoYWluICovCisJfQkJCS8qIG5leHQgaW50ZXJydXB0IGNoYWluICovCit9CisKKy8qIHVzYiBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLgorICovCit2b2lkIGhhbmRsZV91c2JfaW50ZXJydXB0KHZvaWQpCit7CisJdW5zaWduZWQgc2hvcnQgc3RhdHVzOworCXN0YXRpYyBpbnQgZXJyb3IgPSAwOworCisJLyoKKwkgKiBSZWFkIHRoZSBpbnRlcnJ1cHQgc3RhdHVzLCBhbmQgd3JpdGUgaXQgYmFjayB0byBjbGVhciB0aGUKKwkgKiBpbnRlcnJ1cHQgY2F1c2UKKwkgKi8KKworCXN0YXR1cyA9IGluMTZyKHVzYl9iYXNlX2FkZHIgKyBVU0JTVFMpOworCisJaWYgKCFzdGF0dXMpCQkvKiBzaGFyZWQgaW50ZXJydXB0LCBub3QgbWluZSAqLworCQlyZXR1cm47CisJaWYgKHN0YXR1cyAhPSAxKSB7CisJCS8qIHJlbW92ZSBob3N0IGNvbnRyb2xsZXIgaGFsdGVkIHN0YXRlICovCisJCWlmICgoc3RhdHVzICYgKFVTQlNUU19IQ1BFIHwgVVNCU1RTX0hDSCkpID09CisJCSAgICAoVVNCU1RTX0hDUEUgfCBVU0JTVFNfSENIKSkgeworCQkJLyogU3RvcCBkdWUgdG8gYnVnIGluIGRyaXZlciwgb3IgaGFyZHdhcmUgKi8KKwkJCW91dDE2cih1c2JfYmFzZV9hZGRyICsgVVNCU1RTLCBzdGF0dXMpOworCQkJb3V0MTZyKHVzYl9iYXNlX2FkZHIgKyBVU0JDTUQsCisJCQkgICAgICAgVVNCQ01EX0hDUkVTRVQgfCBVU0JDTURfR1JFU0VUKTsKKwkJCXByaW50ZgorCQkJICAgICgiR1JVU0I6IEhXIGRldGVjdGVkIGVycm9yKHMpIGluIFVTQiBEZXNjcmlwdG9ycyAoU1RTOiAweCV4KVxuIiwKKwkJCSAgICAgc3RhdHVzKTsKKwkJCXVzYl9zaG93X3RkKDgpOworCQkJcmV0dXJuOworCQl9IGVsc2UgaWYgKChzdGF0dXMgJiAweDIwKQorCQkJICAgJiYgKChpbjE2cih1c2JfYmFzZV9hZGRyICsgVVNCQ01EKSAmIFVTQkNNRF9SUykgPT0KKwkJCSAgICAgICAwKSkgeworCQkJaWYgKGVycm9yIDwgMTApIHsKKwkJCQlvdXQxNnIodXNiX2Jhc2VfYWRkciArIFVTQkNNRCwKKwkJCQkgICAgICAgVVNCQ01EX1JTIHwgaW4xNnIodXNiX2Jhc2VfYWRkciArCisJCQkJCQkJIFVTQkNNRCkpOworCQkJCWVycm9yKys7CisJCQl9CisJCX0gZWxzZQorCQkJZXJyb3IgPSAwOworCX0KKwl1c2JfY2hlY2tfaW50X2NoYWluKCk7CS8qIGNhbGwgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBpbnQgdGRzICovCisJdXNiX2NoZWNrX3NrZWwoKTsJLyogY2FsbCBjb21wbGV0aW9uIGhhbmRsZXIgZm9yIGNvbW1vbiB0cmFuc2ZlciByb3V0aW5lcyAqLworCW91dDE2cih1c2JfYmFzZV9hZGRyICsgVVNCU1RTLCBzdGF0dXMpOworfQorCisvKiBpbml0IHVoY2kKKyAqLworaW50IHVzYl9sb3dsZXZlbF9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgY2hhciB0ZW1wOworCWFtYmFwcF9haGJkZXYgYWhiZGV2OworCisJLyogRmluZCBHUlVTQiBjb3JlIHVzaW5nIEFNQkEgUGx1ZyZQbGF5IGluZm9ybWF0aW9uICovCisJaWYgKGFtYmFwcF9haGJzbHZfZmlyc3QoVkVORE9SX0dBSVNMRVIsIEdBSVNMRVJfVUhDSSwgJmFoYmRldikgIT0gMSkgeworCQlwcmludGYoIlVTQiBVSENJOiBGYWlsZWQgdG8gZmluZCBHUlVTQiBjb250cm9sbGVyXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwl1c2JfYmFzZV9hZGRyID0gYWhiZGV2LmFkZHJlc3NbMF07CisJZ3J1c2JfaXJxID0gYWhiZGV2LmlycTsKKwkvKgorCSAgIHVzYl9iYXNlX2FkZHIgPSAweGZmZmEwMDAwOworCSAgIGdydXNiX2lycSA9IDEwOworCSAqLworI2lmZGVmIFVTQl9VSENJX0RFQlVHCisJZ3J1c2Jfc2hvd19yZWdzKCk7CisjZW5kaWYKKwltZW1zZXQodGRfaW50LCAwLCBzaXplb2YodGRfaW50KSk7CisJbWVtc2V0KHRtcF90ZCwgMCwgc2l6ZW9mKHRtcF90ZCkpOworCW1lbXNldCh0bXBfaW50X3RkLCAwLCBzaXplb2YodG1wX2ludF90ZCkpOworCW1lbXNldCgmcWhfY250cmwsIDAsIHNpemVvZihxaF9jbnRybCkpOworCW1lbXNldCgmcWhfZW5kLCAwLCBzaXplb2YocWhfZW5kKSk7CisJbWVtc2V0KCZ0ZF9sYXN0LCAwLCBzaXplb2YodGRfbGFzdCkpOworCisJaXJxX2ZyZWVfaGFuZGxlcihncnVzYl9pcnEpOworCVVTQl9VSENJX1BSSU5URigiR1JVU0I6IGF0IDB4JWx4IGlycSAlZFxuIiwgdXNiX2Jhc2VfYWRkciwgZ3J1c2JfaXJxKTsKKwlyaC5kZXZudW0gPSAwOworCXVzYl9pbml0X3NrZWwoKTsKKwlyZXNldF9oYygpOworCXN0YXJ0X2hjKCk7CisJaXJxX2luc3RhbGxfaGFuZGxlcihncnVzYl9pcnEsCisJCQkgICAgKGludGVycnVwdF9oYW5kbGVyX3QgKikgaGFuZGxlX3VzYl9pbnRlcnJ1cHQsIE5VTEwpOworCXJldHVybiAwOworfQorCisvKiBzdG9wIHVoY2kKKyAqLworaW50IHVzYl9sb3dsZXZlbF9zdG9wKHZvaWQpCit7CisJaWYgKGdydXNiX2lycSA9PSAtMSkKKwkJcmV0dXJuIDE7CisJaXJxX2ZyZWVfaGFuZGxlcihncnVzYl9pcnEpOworCXJlc2V0X2hjKCk7CisJZ3J1c2JfaXJxID0gLTE7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWaXJ0dWFsIFJvb3QgSHViCisgKiBTaW5jZSB0aGUgdWhjaSBkb2VzIG5vdCBoYXZlIGEgcmVhbCBIVUIsIHdlIHNpbXVsYXRlIG9uZSA7LSkKKyAqLworI3VuZGVmCVVTQl9SSF9ERUJVRworCisjaWZkZWYJVVNCX1JIX0RFQlVHCisjZGVmaW5lCVVTQl9SSF9QUklOVEYoZm10LGFyZ3MuLi4pCXByaW50ZiAoZm10ICwjI2FyZ3MpCitzdGF0aWMgdm9pZCB1c2JfZGlzcGxheV93VmFsdWUodW5zaWduZWQgc2hvcnQgd1ZhbHVlLCB1bnNpZ25lZCBzaG9ydCB3SW5kZXgpOworc3RhdGljIHZvaWQgdXNiX2Rpc3BsYXlfUmVxKHVuc2lnbmVkIHNob3J0IHJlcSk7CisjZWxzZQorI2RlZmluZSBVU0JfUkhfUFJJTlRGKGZtdCxhcmdzLi4uKQorc3RhdGljIHZvaWQgdXNiX2Rpc3BsYXlfd1ZhbHVlKHVuc2lnbmVkIHNob3J0IHdWYWx1ZSwgdW5zaWduZWQgc2hvcnQgd0luZGV4KQoreworfQorc3RhdGljIHZvaWQgdXNiX2Rpc3BsYXlfUmVxKHVuc2lnbmVkIHNob3J0IHJlcSkKK3sKK30KKyNlbmRpZgorCitzdGF0aWMgdW5zaWduZWQgY2hhciByb290X2h1Yl9kZXZfZGVzW10gPSB7CisJMHgxMiwJCQkvKiAgX191OCAgYkxlbmd0aDsgKi8KKwkweDAxLAkJCS8qICBfX3U4ICBiRGVzY3JpcHRvclR5cGU7IERldmljZSAqLworCTB4MDAsCQkJLyogIF9fdTE2IGJjZFVTQjsgdjEuMCAqLworCTB4MDEsCisJMHgwOSwJCQkvKiAgX191OCAgYkRldmljZUNsYXNzOyBIVUJfQ0xBU1NDT0RFICovCisJMHgwMCwJCQkvKiAgX191OCAgYkRldmljZVN1YkNsYXNzOyAqLworCTB4MDAsCQkJLyogIF9fdTggIGJEZXZpY2VQcm90b2NvbDsgKi8KKwkweDA4LAkJCS8qICBfX3U4ICBiTWF4UGFja2V0U2l6ZTA7IDggQnl0ZXMgKi8KKwkweDAwLAkJCS8qICBfX3UxNiBpZFZlbmRvcjsgKi8KKwkweDAwLAorCTB4MDAsCQkJLyogIF9fdTE2IGlkUHJvZHVjdDsgKi8KKwkweDAwLAorCTB4MDAsCQkJLyogIF9fdTE2IGJjZERldmljZTsgKi8KKwkweDAwLAorCTB4MDEsCQkJLyogIF9fdTggIGlNYW51ZmFjdHVyZXI7ICovCisJMHgwMCwJCQkvKiAgX191OCAgaVByb2R1Y3Q7ICovCisJMHgwMCwJCQkvKiAgX191OCAgaVNlcmlhbE51bWJlcjsgKi8KKwkweDAxCQkJLyogIF9fdTggIGJOdW1Db25maWd1cmF0aW9uczsgKi8KK307CisKKy8qIENvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgcm9vdF9odWJfY29uZmlnX2Rlc1tdID0geworCTB4MDksCQkJLyogIF9fdTggIGJMZW5ndGg7ICovCisJMHgwMiwJCQkvKiAgX191OCAgYkRlc2NyaXB0b3JUeXBlOyBDb25maWd1cmF0aW9uICovCisJMHgxOSwJCQkvKiAgX191MTYgd1RvdGFsTGVuZ3RoOyAqLworCTB4MDAsCisJMHgwMSwJCQkvKiAgX191OCAgYk51bUludGVyZmFjZXM7ICovCisJMHgwMSwJCQkvKiAgX191OCAgYkNvbmZpZ3VyYXRpb25WYWx1ZTsgKi8KKwkweDAwLAkJCS8qICBfX3U4ICBpQ29uZmlndXJhdGlvbjsgKi8KKwkweDQwLAkJCS8qICBfX3U4ICBibUF0dHJpYnV0ZXM7CisJCQkJICAgQml0IDc6IEJ1cy1wb3dlcmVkLCA2OiBTZWxmLXBvd2VyZWQsIDUgUmVtb3RlLXdha3d1cCwgNC4uMDogcmVzdmQgKi8KKwkweDAwLAkJCS8qICBfX3U4ICBNYXhQb3dlcjsgKi8KKworCS8qIGludGVyZmFjZSAqLworCTB4MDksCQkJLyogIF9fdTggIGlmX2JMZW5ndGg7ICovCisJMHgwNCwJCQkvKiAgX191OCAgaWZfYkRlc2NyaXB0b3JUeXBlOyBJbnRlcmZhY2UgKi8KKwkweDAwLAkJCS8qICBfX3U4ICBpZl9iSW50ZXJmYWNlTnVtYmVyOyAqLworCTB4MDAsCQkJLyogIF9fdTggIGlmX2JBbHRlcm5hdGVTZXR0aW5nOyAqLworCTB4MDEsCQkJLyogIF9fdTggIGlmX2JOdW1FbmRwb2ludHM7ICovCisJMHgwOSwJCQkvKiAgX191OCAgaWZfYkludGVyZmFjZUNsYXNzOyBIVUJfQ0xBU1NDT0RFICovCisJMHgwMCwJCQkvKiAgX191OCAgaWZfYkludGVyZmFjZVN1YkNsYXNzOyAqLworCTB4MDAsCQkJLyogIF9fdTggIGlmX2JJbnRlcmZhY2VQcm90b2NvbDsgKi8KKwkweDAwLAkJCS8qICBfX3U4ICBpZl9pSW50ZXJmYWNlOyAqLworCisJLyogZW5kcG9pbnQgKi8KKwkweDA3LAkJCS8qICBfX3U4ICBlcF9iTGVuZ3RoOyAqLworCTB4MDUsCQkJLyogIF9fdTggIGVwX2JEZXNjcmlwdG9yVHlwZTsgRW5kcG9pbnQgKi8KKwkweDgxLAkJCS8qICBfX3U4ICBlcF9iRW5kcG9pbnRBZGRyZXNzOyBJTiBFbmRwb2ludCAxICovCisJMHgwMywJCQkvKiAgX191OCAgZXBfYm1BdHRyaWJ1dGVzOyBJbnRlcnJ1cHQgKi8KKwkweDA4LAkJCS8qICBfX3UxNiBlcF93TWF4UGFja2V0U2l6ZTsgOCBCeXRlcyAqLworCTB4MDAsCisJMHhmZgkJCS8qICBfX3U4ICBlcF9iSW50ZXJ2YWw7IDI1NSBtcyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcm9vdF9odWJfaHViX2Rlc1tdID0geworCTB4MDksCQkJLyogIF9fdTggIGJMZW5ndGg7ICovCisJMHgyOSwJCQkvKiAgX191OCAgYkRlc2NyaXB0b3JUeXBlOyBIdWItZGVzY3JpcHRvciAqLworCTB4MDIsCQkJLyogIF9fdTggIGJOYnJQb3J0czsgKi8KKwkweDAwLAkJCS8qIF9fdTE2ICB3SHViQ2hhcmFjdGVyaXN0aWNzOyAqLworCTB4MDAsCisJMHgwMSwJCQkvKiAgX191OCAgYlB3ck9uMnB3ckdvb2Q7IDJtcyAqLworCTB4MDAsCQkJLyogIF9fdTggIGJIdWJDb250ckN1cnJlbnQ7IDAgbUEgKi8KKwkweDAwLAkJCS8qICBfX3U4ICBEZXZpY2VSZW1vdmFibGU7ICoqKiA3IFBvcnRzIG1heCAqKiogKi8KKwkweGZmCQkJLyogIF9fdTggIFBvcnRQd3JDdHJsTWFzazsgKioqIDcgcG9ydHMgbWF4ICoqKiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcm9vdF9odWJfc3RyX2luZGV4MFtdID0geworCTB4MDQsCQkJLyogIF9fdTggIGJMZW5ndGg7ICovCisJMHgwMywJCQkvKiAgX191OCAgYkRlc2NyaXB0b3JUeXBlOyBTdHJpbmctZGVzY3JpcHRvciAqLworCTB4MDksCQkJLyogIF9fdTggIGxhbmcgSUQgKi8KKwkweDA0LAkJCS8qICBfX3U4ICBsYW5nIElEICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciByb290X2h1Yl9zdHJfaW5kZXgxW10gPSB7CisJMjgsCQkJLyogIF9fdTggIGJMZW5ndGg7ICovCisJMHgwMywJCQkvKiAgX191OCAgYkRlc2NyaXB0b3JUeXBlOyBTdHJpbmctZGVzY3JpcHRvciAqLworCSdVJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknSCcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ0MnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSdJJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknICcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ1InLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSdvJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknbycsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ3QnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkvKiAgX191OCAgVW5pY29kZSAqLworCScgJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwknSCcsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KKwkwLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJJ3UnLAkJCS8qICBfX3U4ICBVbmljb2RlICovCisJMCwJCQkvKiAgX191OCAgVW5pY29kZSAqLworCSdiJywJCQkvKiAgX191OCAgVW5pY29kZSAqLworCTAsCQkJLyogIF9fdTggIFVuaWNvZGUgKi8KK307CisKKy8qCisgKiBSb290IEh1YiBDb250cm9sIFBpcGUgKGludGVycnVwdCBQaXBlcyBhcmUgbm90IHN1cHBvcnRlZCkKKyAqLworCitpbnQgdWhjaV9zdWJtaXRfcmhfbXNnKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgcGlwZSwgdm9pZCAqYnVmZmVyLAorCQkgICAgICAgaW50IHRyYW5zZmVyX2xlbiwgc3RydWN0IGRldnJlcXVlc3QgKmNtZCkKK3sKKwl2b2lkICpkYXRhID0gYnVmZmVyOworCWludCBsZW5pID0gdHJhbnNmZXJfbGVuOworCWludCBsZW4gPSAwOworCWludCBzdGF0dXMgPSAwOworCWludCBzdGF0ID0gMDsKKwlpbnQgaTsKKworCXVuc2lnbmVkIHNob3J0IGNzdGF0dXM7CisKKwl1bnNpZ25lZCBzaG9ydCBibVJUeXBlX2JSZXE7CisJdW5zaWduZWQgc2hvcnQgd1ZhbHVlOworCXVuc2lnbmVkIHNob3J0IHdJbmRleDsKKwl1bnNpZ25lZCBzaG9ydCB3TGVuZ3RoOworCisJaWYgKChwaXBlICYgUElQRV9JTlRFUlJVUFQpID09IFBJUEVfSU5URVJSVVBUKSB7CisJCXByaW50ZigiUm9vdC1IdWIgc3VibWl0IElSUTogTk9UIGltcGxlbWVudGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWJtUlR5cGVfYlJlcSA9IGNtZC0+cmVxdWVzdHR5cGUgfCBjbWQtPnJlcXVlc3QgPDwgODsKKwl3VmFsdWUgPSBzd2FwXzE2KGNtZC0+dmFsdWUpOworCXdJbmRleCA9IHN3YXBfMTYoY21kLT5pbmRleCk7CisJd0xlbmd0aCA9IHN3YXBfMTYoY21kLT5sZW5ndGgpOworCXVzYl9kaXNwbGF5X1JlcShibVJUeXBlX2JSZXEpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXJoLmNfcF9yW2ldID0gMDsKKwlVU0JfUkhfUFJJTlRGKCJSb290LUh1YjogYWRyOiAlMnggY21kKCUxeCk6ICUwMnglMDJ4ICUwNHggJTA0eCAlMDR4XG4iLAorCQkgICAgICBkZXYtPmRldm51bSwgOCwgY21kLT5yZXF1ZXN0dHlwZSwgY21kLT5yZXF1ZXN0LCB3VmFsdWUsCisJCSAgICAgIHdJbmRleCwgd0xlbmd0aCk7CisKKwlzd2l0Y2ggKGJtUlR5cGVfYlJlcSkgeworCQkvKiBSZXF1ZXN0IERlc3RpbmF0aW9uOgorCQkgICB3aXRob3V0IGZsYWdzOiBEZXZpY2UsCisJCSAgIFJIX0lOVEVSRkFDRTogaW50ZXJmYWNlLAorCQkgICBSSF9FTkRQT0lOVDogZW5kcG9pbnQsCisJCSAgIFJIX0NMQVNTIG1lYW5zIEhVQiBoZXJlLAorCQkgICBSSF9PVEhFUiB8IFJIX0NMQVNTICBhbG1vc3QgZXZlciBtZWFucyBIVUJfUE9SVCBoZXJlCisJCSAqLworCisJY2FzZSBSSF9HRVRfU1RBVFVTOgorCQkqKHVuc2lnbmVkIHNob3J0ICopZGF0YSA9IHN3YXBfMTYoMSk7CisJCWxlbiA9IDI7CisJCWJyZWFrOworCWNhc2UgUkhfR0VUX1NUQVRVUyB8IFJIX0lOVEVSRkFDRToKKwkJKih1bnNpZ25lZCBzaG9ydCAqKWRhdGEgPSBzd2FwXzE2KDApOworCQlsZW4gPSAyOworCQlicmVhazsKKwljYXNlIFJIX0dFVF9TVEFUVVMgfCBSSF9FTkRQT0lOVDoKKwkJKih1bnNpZ25lZCBzaG9ydCAqKWRhdGEgPSBzd2FwXzE2KDApOworCQlsZW4gPSAyOworCQlicmVhazsKKwljYXNlIFJIX0dFVF9TVEFUVVMgfCBSSF9DTEFTUzoKKwkJKih1bnNpZ25lZCBsb25nICopZGF0YSA9IHN3YXBfMzIoMCk7CisJCWxlbiA9IDQ7CisJCWJyZWFrOwkJLyogaHViIHBvd2VyICoqICovCisJY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKKworCQlzdGF0dXMgPSBpbjE2cih1c2JfYmFzZV9hZGRyICsgVVNCUE9SVFNDMSArIDIgKiAod0luZGV4IC0gMSkpOworCQljc3RhdHVzID0gKChzdGF0dXMgJiBVU0JQT1JUU0NfQ1NDKSA+PiAoMSAtIDApKSB8CisJCSAgICAoKHN0YXR1cyAmIFVTQlBPUlRTQ19QRUMpID4+ICgzIC0gMSkpIHwKKwkJICAgIChyaC5jX3Bfclt3SW5kZXggLSAxXSA8PCAoMCArIDQpKTsKKwkJc3RhdHVzID0gKHN0YXR1cyAmIFVTQlBPUlRTQ19DQ1MpIHwgKChzdGF0dXMgJiBVU0JQT1JUU0NfUEUpID4+ICgyIC0gMSkpIHwgKChzdGF0dXMgJiBVU0JQT1JUU0NfU1VTUCkgPj4gKDEyIC0gMikpIHwgKChzdGF0dXMgJiBVU0JQT1JUU0NfUFIpID4+ICg5IC0gNCkpIHwgKDEgPDwgOCkgfAkvKiBwb3dlciBvbiAqKiAqLworCQkgICAgKChzdGF0dXMgJiBVU0JQT1JUU0NfTFNEQSkgPDwgKC04ICsgOSkpOworCisJCSoodW5zaWduZWQgc2hvcnQgKilkYXRhID0gc3dhcF8xNihzdGF0dXMpOworCQkqKHVuc2lnbmVkIHNob3J0ICopKGRhdGEgKyAyKSA9IHN3YXBfMTYoY3N0YXR1cyk7CisJCWxlbiA9IDQ7CisJCWJyZWFrOworCWNhc2UgUkhfQ0xFQVJfRkVBVFVSRSB8IFJIX0VORFBPSU5UOgorCQlzd2l0Y2ggKHdWYWx1ZSkgeworCQljYXNlIChSSF9FTkRQT0lOVF9TVEFMTCk6CisJCQlsZW4gPSAwOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFJIX0NMRUFSX0ZFQVRVUkUgfCBSSF9DTEFTUzoKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJY2FzZSAoUkhfQ19IVUJfT1ZFUl9DVVJSRU5UKToKKwkJCWxlbiA9IDA7CS8qIGh1YiBwb3dlciBvdmVyIGN1cnJlbnQgKiogKi8KKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSSF9DTEVBUl9GRUFUVVJFIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKKwkJdXNiX2Rpc3BsYXlfd1ZhbHVlKHdWYWx1ZSwgd0luZGV4KTsKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJY2FzZSAoUkhfUE9SVF9FTkFCTEUpOgorCQkJc3RhdHVzID0KKwkJCSAgICBpbjE2cih1c2JfYmFzZV9hZGRyICsgVVNCUE9SVFNDMSArCisJCQkJICAyICogKHdJbmRleCAtIDEpKTsKKwkJCXN0YXR1cyA9IChzdGF0dXMgJiAweGZmZjUpICYgflVTQlBPUlRTQ19QRTsKKwkJCW91dDE2cih1c2JfYmFzZV9hZGRyICsgVVNCUE9SVFNDMSArIDIgKiAod0luZGV4IC0gMSksCisJCQkgICAgICAgc3RhdHVzKTsKKwkJCWxlbiA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAoUkhfUE9SVF9TVVNQRU5EKToKKwkJCXN0YXR1cyA9CisJCQkgICAgaW4xNnIodXNiX2Jhc2VfYWRkciArIFVTQlBPUlRTQzEgKworCQkJCSAgMiAqICh3SW5kZXggLSAxKSk7CisJCQlzdGF0dXMgPSAoc3RhdHVzICYgMHhmZmY1KSAmIH5VU0JQT1JUU0NfU1VTUDsKKwkJCW91dDE2cih1c2JfYmFzZV9hZGRyICsgVVNCUE9SVFNDMSArIDIgKiAod0luZGV4IC0gMSksCisJCQkgICAgICAgc3RhdHVzKTsKKwkJCWxlbiA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAoUkhfUE9SVF9QT1dFUik6CisJCQlsZW4gPSAwOwkvKiBwb3J0IHBvd2VyICoqICovCisJCQlicmVhazsKKwkJY2FzZSAoUkhfQ19QT1JUX0NPTk5FQ1RJT04pOgorCQkJc3RhdHVzID0KKwkJCSAgICBpbjE2cih1c2JfYmFzZV9hZGRyICsgVVNCUE9SVFNDMSArCisJCQkJICAyICogKHdJbmRleCAtIDEpKTsKKwkJCXN0YXR1cyA9IChzdGF0dXMgJiAweGZmZjUpIHwgVVNCUE9SVFNDX0NTQzsKKwkJCW91dDE2cih1c2JfYmFzZV9hZGRyICsgVVNCUE9SVFNDMSArIDIgKiAod0luZGV4IC0gMSksCisJCQkgICAgICAgc3RhdHVzKTsKKwkJCWxlbiA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAoUkhfQ19QT1JUX0VOQUJMRSk6CisJCQlzdGF0dXMgPQorCQkJICAgIGluMTZyKHVzYl9iYXNlX2FkZHIgKyBVU0JQT1JUU0MxICsKKwkJCQkgIDIgKiAod0luZGV4IC0gMSkpOworCQkJc3RhdHVzID0gKHN0YXR1cyAmIDB4ZmZmNSkgfCBVU0JQT1JUU0NfUEVDOworCQkJb3V0MTZyKHVzYl9iYXNlX2FkZHIgKyBVU0JQT1JUU0MxICsgMiAqICh3SW5kZXggLSAxKSwKKwkJCSAgICAgICBzdGF0dXMpOworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCQljYXNlIChSSF9DX1BPUlRfU1VTUEVORCk6CisvKioqIFdSX1JIX1BPUlRTVEFUKFJIX1BTX1BTU0MpOyAqLworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCQljYXNlIChSSF9DX1BPUlRfT1ZFUl9DVVJSRU5UKToKKwkJCWxlbiA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAoUkhfQ19QT1JUX1JFU0VUKToKKwkJCXJoLmNfcF9yW3dJbmRleCAtIDFdID0gMDsKKwkJCWxlbiA9IDA7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIFJIX1NFVF9GRUFUVVJFIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKKwkJdXNiX2Rpc3BsYXlfd1ZhbHVlKHdWYWx1ZSwgd0luZGV4KTsKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJY2FzZSAoUkhfUE9SVF9TVVNQRU5EKToKKwkJCXN0YXR1cyA9CisJCQkgICAgaW4xNnIodXNiX2Jhc2VfYWRkciArIFVTQlBPUlRTQzEgKworCQkJCSAgMiAqICh3SW5kZXggLSAxKSk7CisJCQlzdGF0dXMgPSAoc3RhdHVzICYgMHhmZmY1KSB8IFVTQlBPUlRTQ19TVVNQOworCQkJb3V0MTZyKHVzYl9iYXNlX2FkZHIgKyBVU0JQT1JUU0MxICsgMiAqICh3SW5kZXggLSAxKSwKKwkJCSAgICAgICBzdGF0dXMpOworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCQljYXNlIChSSF9QT1JUX1JFU0VUKToKKwkJCXN0YXR1cyA9CisJCQkgICAgaW4xNnIodXNiX2Jhc2VfYWRkciArIFVTQlBPUlRTQzEgKworCQkJCSAgMiAqICh3SW5kZXggLSAxKSk7CisJCQlzdGF0dXMgPSAoc3RhdHVzICYgMHhmZmY1KSB8IFVTQlBPUlRTQ19QUjsKKwkJCW91dDE2cih1c2JfYmFzZV9hZGRyICsgVVNCUE9SVFNDMSArIDIgKiAod0luZGV4IC0gMSksCisJCQkgICAgICAgc3RhdHVzKTsKKwkJCXdhaXRfbXMoMTApOworCQkJc3RhdHVzID0gKHN0YXR1cyAmIDB4ZmZmNSkgJiB+VVNCUE9SVFNDX1BSOworCQkJb3V0MTZyKHVzYl9iYXNlX2FkZHIgKyBVU0JQT1JUU0MxICsgMiAqICh3SW5kZXggLSAxKSwKKwkJCSAgICAgICBzdGF0dXMpOworCQkJdWRlbGF5KDEwKTsKKwkJCXN0YXR1cyA9IChzdGF0dXMgJiAweGZmZjUpIHwgVVNCUE9SVFNDX1BFOworCQkJb3V0MTZyKHVzYl9iYXNlX2FkZHIgKyBVU0JQT1JUU0MxICsgMiAqICh3SW5kZXggLSAxKSwKKwkJCSAgICAgICBzdGF0dXMpOworCQkJd2FpdF9tcygxMCk7CisJCQlzdGF0dXMgPSAoc3RhdHVzICYgMHhmZmY1KSB8IDB4YTsKKwkJCW91dDE2cih1c2JfYmFzZV9hZGRyICsgVVNCUE9SVFNDMSArIDIgKiAod0luZGV4IC0gMSksCisJCQkgICAgICAgc3RhdHVzKTsKKwkJCWxlbiA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAoUkhfUE9SVF9QT1dFUik6CisJCQlsZW4gPSAwOwkvKiBwb3J0IHBvd2VyICoqICovCisJCQlicmVhazsKKwkJY2FzZSAoUkhfUE9SVF9FTkFCTEUpOgorCQkJc3RhdHVzID0KKwkJCSAgICBpbjE2cih1c2JfYmFzZV9hZGRyICsgVVNCUE9SVFNDMSArCisJCQkJICAyICogKHdJbmRleCAtIDEpKTsKKwkJCXN0YXR1cyA9IChzdGF0dXMgJiAweGZmZjUpIHwgVVNCUE9SVFNDX1BFOworCQkJb3V0MTZyKHVzYl9iYXNlX2FkZHIgKyBVU0JQT1JUU0MxICsgMiAqICh3SW5kZXggLSAxKSwKKwkJCSAgICAgICBzdGF0dXMpOworCQkJbGVuID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSSF9TRVRfQUREUkVTUzoKKwkJcmguZGV2bnVtID0gd1ZhbHVlOworCQlsZW4gPSAwOworCQlicmVhazsKKwljYXNlIFJIX0dFVF9ERVNDUklQVE9SOgorCQlzd2l0Y2ggKCh3VmFsdWUgJiAweGZmMDApID4+IDgpIHsKKwkJY2FzZSAoMHgwMSk6CS8qIGRldmljZSBkZXNjcmlwdG9yICovCisJCQlpID0gc2l6ZW9mKHJvb3RfaHViX2NvbmZpZ19kZXMpOworCQkJc3RhdHVzID0gaSA+IHdMZW5ndGggPyB3TGVuZ3RoIDogaTsKKwkJCWxlbiA9IGxlbmkgPiBzdGF0dXMgPyBzdGF0dXMgOiBsZW5pOworCQkJbWVtY3B5KGRhdGEsIHJvb3RfaHViX2Rldl9kZXMsIGxlbik7CisJCQlicmVhazsKKwkJY2FzZSAoMHgwMik6CS8qIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRvciAqLworCQkJaSA9IHNpemVvZihyb290X2h1Yl9jb25maWdfZGVzKTsKKwkJCXN0YXR1cyA9IGkgPiB3TGVuZ3RoID8gd0xlbmd0aCA6IGk7CisJCQlsZW4gPSBsZW5pID4gc3RhdHVzID8gc3RhdHVzIDogbGVuaTsKKwkJCW1lbWNweShkYXRhLCByb290X2h1Yl9jb25maWdfZGVzLCBsZW4pOworCQkJYnJlYWs7CisJCWNhc2UgKDB4MDMpOgkvKnN0cmluZyBkZXNjcmlwdG9ycyAqLworCQkJaWYgKHdWYWx1ZSA9PSAweDAzMDApIHsKKwkJCQlpID0gc2l6ZW9mKHJvb3RfaHViX3N0cl9pbmRleDApOworCQkJCXN0YXR1cyA9IGkgPiB3TGVuZ3RoID8gd0xlbmd0aCA6IGk7CisJCQkJbGVuID0gbGVuaSA+IHN0YXR1cyA/IHN0YXR1cyA6IGxlbmk7CisJCQkJbWVtY3B5KGRhdGEsIHJvb3RfaHViX3N0cl9pbmRleDAsIGxlbik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAod1ZhbHVlID09IDB4MDMwMSkgeworCQkJCWkgPSBzaXplb2Yocm9vdF9odWJfc3RyX2luZGV4MSk7CisJCQkJc3RhdHVzID0gaSA+IHdMZW5ndGggPyB3TGVuZ3RoIDogaTsKKwkJCQlsZW4gPSBsZW5pID4gc3RhdHVzID8gc3RhdHVzIDogbGVuaTsKKwkJCQltZW1jcHkoZGF0YSwgcm9vdF9odWJfc3RyX2luZGV4MSwgbGVuKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXN0YXQgPSBVU0JfU1RfU1RBTExFRDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUkhfR0VUX0RFU0NSSVBUT1IgfCBSSF9DTEFTUzoKKwkJcm9vdF9odWJfaHViX2Rlc1syXSA9IDI7CisJCWkgPSBzaXplb2Yocm9vdF9odWJfaHViX2Rlcyk7CisJCXN0YXR1cyA9IGkgPiB3TGVuZ3RoID8gd0xlbmd0aCA6IGk7CisJCWxlbiA9IGxlbmkgPiBzdGF0dXMgPyBzdGF0dXMgOiBsZW5pOworCQltZW1jcHkoZGF0YSwgcm9vdF9odWJfaHViX2RlcywgbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBSSF9HRVRfQ09ORklHVVJBVElPTjoKKwkJKih1bnNpZ25lZCBjaGFyICopZGF0YSA9IDB4MDE7CisJCWxlbiA9IDE7CisJCWJyZWFrOworCWNhc2UgUkhfU0VUX0NPTkZJR1VSQVRJT046CisJCWxlbiA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0YXQgPSBVU0JfU1RfU1RBTExFRDsKKwl9CisJVVNCX1JIX1BSSU5URigiUm9vdC1IdWIgc3RhdCAlbHggcG9ydDE6ICV4IHBvcnQyOiAleFxuXG4iLCBzdGF0LAorCQkgICAgICBpbjE2cih1c2JfYmFzZV9hZGRyICsgVVNCUE9SVFNDMSksCisJCSAgICAgIGluMTZyKHVzYl9iYXNlX2FkZHIgKyBVU0JQT1JUU0MyKSk7CisJZGV2LT5hY3RfbGVuID0gbGVuOworCWRldi0+c3RhdHVzID0gc3RhdDsKKwlyZXR1cm4gc3RhdDsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNvbWUgRGVidWcgUm91dGluZXMKKyAqLworCisjaWZkZWYJVVNCX1JIX0RFQlVHCisKK3N0YXRpYyB2b2lkIHVzYl9kaXNwbGF5X1JlcSh1bnNpZ25lZCBzaG9ydCByZXEpCit7CisJVVNCX1JIX1BSSU5URigiLSBSb290LUh1YiBSZXF1ZXN0OiAiKTsKKwlzd2l0Y2ggKHJlcSkgeworCWNhc2UgUkhfR0VUX1NUQVRVUzoKKwkJVVNCX1JIX1BSSU5URigiR2V0IFN0YXR1cyAiKTsKKwkJYnJlYWs7CisJY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfSU5URVJGQUNFOgorCQlVU0JfUkhfUFJJTlRGKCJHZXQgU3RhdHVzIEludGVyZmFjZSAiKTsKKwkJYnJlYWs7CisJY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfRU5EUE9JTlQ6CisJCVVTQl9SSF9QUklOVEYoIkdldCBTdGF0dXMgRW5kcG9pbnQgIik7CisJCWJyZWFrOworCWNhc2UgUkhfR0VUX1NUQVRVUyB8IFJIX0NMQVNTOgorCQlVU0JfUkhfUFJJTlRGKCJHZXQgU3RhdHVzIENsYXNzIik7CisJCWJyZWFrOwkJLyogaHViIHBvd2VyICoqICovCisJY2FzZSBSSF9HRVRfU1RBVFVTIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKKwkJVVNCX1JIX1BSSU5URigiR2V0IFN0YXR1cyBDbGFzcyBPdGhlcnMiKTsKKwkJYnJlYWs7CisJY2FzZSBSSF9DTEVBUl9GRUFUVVJFIHwgUkhfRU5EUE9JTlQ6CisJCVVTQl9SSF9QUklOVEYoIkNsZWFyIEZlYXR1cmUgRW5kcG9pbnQgIik7CisJCWJyZWFrOworCWNhc2UgUkhfQ0xFQVJfRkVBVFVSRSB8IFJIX0NMQVNTOgorCQlVU0JfUkhfUFJJTlRGKCJDbGVhciBGZWF0dXJlIENsYXNzICIpOworCQlicmVhazsKKwljYXNlIFJIX0NMRUFSX0ZFQVRVUkUgfCBSSF9PVEhFUiB8IFJIX0NMQVNTOgorCQlVU0JfUkhfUFJJTlRGKCJDbGVhciBGZWF0dXJlIE90aGVyIENsYXNzICIpOworCQlicmVhazsKKwljYXNlIFJIX1NFVF9GRUFUVVJFIHwgUkhfT1RIRVIgfCBSSF9DTEFTUzoKKwkJVVNCX1JIX1BSSU5URigiU2V0IEZlYXR1cmUgT3RoZXIgQ2xhc3MgIik7CisJCWJyZWFrOworCWNhc2UgUkhfU0VUX0FERFJFU1M6CisJCVVTQl9SSF9QUklOVEYoIlNldCBBZGRyZXNzICIpOworCQlicmVhazsKKwljYXNlIFJIX0dFVF9ERVNDUklQVE9SOgorCQlVU0JfUkhfUFJJTlRGKCJHZXQgRGVzY3JpcHRvciAiKTsKKwkJYnJlYWs7CisJY2FzZSBSSF9HRVRfREVTQ1JJUFRPUiB8IFJIX0NMQVNTOgorCQlVU0JfUkhfUFJJTlRGKCJHZXQgRGVzY3JpcHRvciBDbGFzcyAiKTsKKwkJYnJlYWs7CisJY2FzZSBSSF9HRVRfQ09ORklHVVJBVElPTjoKKwkJVVNCX1JIX1BSSU5URigiR2V0IENvbmZpZ3VyYXRpb24gIik7CisJCWJyZWFrOworCWNhc2UgUkhfU0VUX0NPTkZJR1VSQVRJT046CisJCVVTQl9SSF9QUklOVEYoIkdldCBDb25maWd1cmF0aW9uICIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlVU0JfUkhfUFJJTlRGKCIqKioqVU5LTk9XTioqKiogMHglMDRYICIsIHJlcSk7CisJfQorCVVTQl9SSF9QUklOVEYoIlxuIik7CisKK30KKworc3RhdGljIHZvaWQgdXNiX2Rpc3BsYXlfd1ZhbHVlKHVuc2lnbmVkIHNob3J0IHdWYWx1ZSwgdW5zaWduZWQgc2hvcnQgd0luZGV4KQoreworCXN3aXRjaCAod1ZhbHVlKSB7CisJY2FzZSAoUkhfUE9SVF9FTkFCTEUpOgorCQlVU0JfUkhfUFJJTlRGKCJSb290LUh1YjogRW5hYmxlIFBvcnQgJWRcbiIsIHdJbmRleCk7CisJCWJyZWFrOworCWNhc2UgKFJIX1BPUlRfU1VTUEVORCk6CisJCVVTQl9SSF9QUklOVEYoIlJvb3QtSHViOiBTdXNwZW5kIFBvcnQgJWRcbiIsIHdJbmRleCk7CisJCWJyZWFrOworCWNhc2UgKFJIX1BPUlRfUE9XRVIpOgorCQlVU0JfUkhfUFJJTlRGKCJSb290LUh1YjogUG9ydCBQb3dlciAlZFxuIiwgd0luZGV4KTsKKwkJYnJlYWs7CisJY2FzZSAoUkhfQ19QT1JUX0NPTk5FQ1RJT04pOgorCQlVU0JfUkhfUFJJTlRGKCJSb290LUh1YjogQyBQb3J0IENvbm5lY3Rpb24gUG9ydCAlZFxuIiwgd0luZGV4KTsKKwkJYnJlYWs7CisJY2FzZSAoUkhfQ19QT1JUX0VOQUJMRSk6CisJCVVTQl9SSF9QUklOVEYoIlJvb3QtSHViOiBDIFBvcnQgRW5hYmxlIFBvcnQgJWRcbiIsIHdJbmRleCk7CisJCWJyZWFrOworCWNhc2UgKFJIX0NfUE9SVF9TVVNQRU5EKToKKwkJVVNCX1JIX1BSSU5URigiUm9vdC1IdWI6IEMgUG9ydCBTdXNwZW5kIFBvcnQgJWRcbiIsIHdJbmRleCk7CisJCWJyZWFrOworCWNhc2UgKFJIX0NfUE9SVF9PVkVSX0NVUlJFTlQpOgorCQlVU0JfUkhfUFJJTlRGKCJSb290LUh1YjogQyBQb3J0IE92ZXIgQ3VycmVudCBQb3J0ICVkXG4iLAorCQkJICAgICAgd0luZGV4KTsKKwkJYnJlYWs7CisJY2FzZSAoUkhfQ19QT1JUX1JFU0VUKToKKwkJVVNCX1JIX1BSSU5URigiUm9vdC1IdWI6IEMgUG9ydCByZXNldCBQb3J0ICVkXG4iLCB3SW5kZXgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlVU0JfUkhfUFJJTlRGKCJSb290LUh1YjogdW5rbm93biAleCAleFxuIiwgd1ZhbHVlLCB3SW5kZXgpOworCQlicmVhazsKKwl9Cit9CisKKyNlbmRpZgorCisvKiNpZmRlZglVU0JfVUhDSV9ERUJVRyovCisKK3N0YXRpYyBpbnQgdXNiX2Rpc3BsYXlfdGQodWhjaV90ZF90ICogdGQpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJaW50IHZhbGlkOworCisJcHJpbnRmKCJURCBhdCAlcDpcbiIsIHRkKTsKKworCXRtcCA9IHN3YXBfMzIoUkVBRDMyKCZ0ZC0+bGluaykpOworCXByaW50ZigiTGluayBwb2ludHMgdG8gMHglMDhsWCwgJXMgZmlyc3QsICVzLCAlc1xuIiwgdG1wICYgMHhmZmZmZmZmMCwKKwkgICAgICAgKCh0bXAgJiAweDQpID09IDB4NCkgPyAiRGVwdGgiIDogIkJyZWF0aCIsCisJICAgICAgICgodG1wICYgMHgyKSA9PSAweDIpID8gIlFIIiA6ICJURCIsCisJICAgICAgICgodG1wICYgMHgxKSA9PSAweDEpID8gImludmFsaWQiIDogInZhbGlkIik7CisJdmFsaWQgPSAoKHRtcCAmIDB4MSkgPT0gMHgwKTsKKwl0bXAgPSBzd2FwXzMyKFJFQUQzMigmdGQtPnN0YXR1cykpOworCXByaW50ZgorCSAgICAoIiAgICAgJXMgJWxkIEVycm9ycyAlcyAlcyAlcyBcbiAgICAgJXMgJXMgJXMgJXMgJXMgJXNcbiAgICAgTGVuIDB4JWxYXG4iLAorCSAgICAgKCgodG1wID4+IDI5KSAmIDB4MSkgPT0gMHgxKSA/ICJTUEQgRW5hYmxlIiA6ICJTUEQgRGlzYWJsZSIsCisJICAgICAoKHRtcCA+PiAyOCkgJiAweDMpLAorCSAgICAgKCgodG1wID4+IDI2KSAmIDB4MSkgPT0gMHgxKSA/ICJMb3cgU3BlZWQiIDogIkZ1bGwgU3BlZWQiLAorCSAgICAgKCgodG1wID4+IDI1KSAmIDB4MSkgPT0gMHgxKSA/ICJJU08gIiA6ICIiLAorCSAgICAgKCgodG1wID4+IDI0KSAmIDB4MSkgPT0gMHgxKSA/ICJJT0MgIiA6ICIiLAorCSAgICAgKCgodG1wID4+IDIzKSAmIDB4MSkgPT0gMHgxKSA/ICJBY3RpdmUgIiA6ICJJbmFjdGl2ZSAiLAorCSAgICAgKCgodG1wID4+IDIyKSAmIDB4MSkgPT0gMHgxKSA/ICJTdGFsbGVkIiA6ICIiLAorCSAgICAgKCgodG1wID4+IDIxKSAmIDB4MSkgPT0gMHgxKSA/ICJEYXRhIEJ1ZmZlciBFcnJvciIgOiAiIiwKKwkgICAgICgoKHRtcCA+PiAyMCkgJiAweDEpID09IDB4MSkgPyAiQmFiYmxlIiA6ICIiLAorCSAgICAgKCgodG1wID4+IDE5KSAmIDB4MSkgPT0gMHgxKSA/ICJOQUsiIDogIiIsCisJICAgICAoKCh0bXAgPj4gMTgpICYgMHgxKSA9PSAweDEpID8gIkJpdHN0dWZmIEVycm9yIiA6ICIiLAorCSAgICAgKHRtcCAmIDB4N2ZmKSk7CisJdG1wID0gc3dhcF8zMihSRUFEMzIoJnRkLT5pbmZvKSk7CisJcHJpbnRmKCIgICAgIE1heExlbiAweCVsWFxuIiwgKCh0bXAgPj4gMjEpICYgMHg3RkYpKTsKKwlwcmludGYoIiAgICAgJXNFbmRwb2ludCAweCVsWCBEZXYgQWRkciAweCVsWCBQSUQgMHglbFhcbiIsCisJICAgICAgICgodG1wID4+IDE5KSAmIDB4MSkgPT0gMHgxID8gIlRPR0dMRSAiIDogIiIsICgodG1wID4+IDE1KSAmIDB4RiksCisJICAgICAgICgodG1wID4+IDgpICYgMHg3RiksIHRtcCAmIDB4RkYpOworCXRtcCA9IHN3YXBfMzIoUkVBRDMyKCZ0ZC0+YnVmZmVyKSk7CisJcHJpbnRmKCIgICAgIEJ1ZmZlciAweCUwOGxYXG4iLCB0bXApOworCXByaW50ZigiICAgICBERVYgJTA4bFhcbiIsIHRkLT5kZXZfcHRyKTsKKwlyZXR1cm4gdmFsaWQ7Cit9CisKK3ZvaWQgdXNiX3Nob3dfdGQoaW50IG1heCkKK3sKKwlpbnQgaTsKKwlpZiAobWF4ID4gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKKwkJCXVzYl9kaXNwbGF5X3RkKCZ0bXBfdGRbaV0pOworCQl9CisJfSBlbHNlIHsKKwkJaSA9IDA7CisJCWRvIHsKKwkJCXByaW50ZigidG1wX3RkWyVkXVxuIiwgaSk7CisJCX0gd2hpbGUgKHVzYl9kaXNwbGF5X3RkKCZ0bXBfdGRbaSsrXSkpOworCX0KK30KKwordm9pZCBncnVzYl9zaG93X3JlZ3Modm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJdG1wID0gaW4xNnIodXNiX2Jhc2VfYWRkciArIFVTQkNNRCk7CisJcHJpbnRmKCIgVVNCQ01EOiAgIDB4JTA0eFxuIiwgdG1wKTsKKwl0bXAgPSBpbjE2cih1c2JfYmFzZV9hZGRyICsgVVNCU1RTKTsKKwlwcmludGYoIiBVU0JTVFM6ICAgMHglMDR4XG4iLCB0bXApOworCXRtcCA9IGluMTZyKHVzYl9iYXNlX2FkZHIgKyBVU0JJTlRSKTsKKwlwcmludGYoIiBVU0JJTlRSOiAgIDB4JTA0eFxuIiwgdG1wKTsKKwl0bXAgPSBpbjE2cih1c2JfYmFzZV9hZGRyICsgVVNCRlJOVU0pOworCXByaW50ZigiIEZSTlVNOiAgIDB4JTA0eFxuIiwgdG1wKTsKKwl0bXAgPSBpbjMycih1c2JfYmFzZV9hZGRyICsgVVNCRkxCQVNFQUREKTsKKwlwcmludGYoIiBGTEJBU0VBREQ6ICAgMHglMDh4XG4iLCB0bXApOworCXRtcCA9IGluMTZyKHVzYl9iYXNlX2FkZHIgKyBVU0JTT0YpOworCXByaW50ZigiIFNPRk1PRDogICAweCUwNHhcbiIsIHRtcCk7CisJdG1wID0gaW4xNnIodXNiX2Jhc2VfYWRkciArIFVTQlBPUlRTQzEpOworCXByaW50ZigiIFBPUlRTQzE6ICAgMHglMDR4XG4iLCB0bXApOworfQorCisvKiNlbmRpZiovCisjZW5kaWYJCQkJLyogQ09ORklHX1VTQl9VSENJICovCisKKy8qIEVPRiAqLwpkaWZmIC0tZ2l0IGEvY3B1L2xlb24zL3VzYl91aGNpLmggYi9jcHUvbGVvbjMvdXNiX3VoY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjU3MmE2Ci0tLSAvZGV2L251bGwKKysrIGIvY3B1L2xlb24zL3VzYl91aGNpLmgKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDEKKyAqIERlbmlzIFBldGVyLCBNUEwgQUcgU3dpdHplcmxhbmQKKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBOb3RlOiBQYXJ0IG9mIHRoaXMgY29kZSBoYXMgYmVlbiBkZXJpdmVkIGZyb20gbGludXgKKyAqCisgKi8KKyNpZm5kZWYgX1VTQl9VSENJX0hfCisjZGVmaW5lIF9VU0JfVUhDSV9IXworCisvKiBDb21tYW5kIHJlZ2lzdGVyICovCisjZGVmaW5lIFVTQkNNRAkJMAorI2RlZmluZSAgIFVTQkNNRF9SUyAgICAgICAweDAwMDEJLyogUnVuL1N0b3AgKi8KKyNkZWZpbmUgICBVU0JDTURfSENSRVNFVCAgMHgwMDAyCS8qIEhvc3QgcmVzZXQgKi8KKyNkZWZpbmUgICBVU0JDTURfR1JFU0VUICAgMHgwMDA0CS8qIEdsb2JhbCByZXNldCAqLworI2RlZmluZSAgIFVTQkNNRF9FR1NNICAgICAweDAwMDgJLyogR2xvYmFsIFN1c3BlbmQgTW9kZSAqLworI2RlZmluZSAgIFVTQkNNRF9GR1IgICAgICAweDAwMTAJLyogRm9yY2UgR2xvYmFsIFJlc3VtZSAqLworI2RlZmluZSAgIFVTQkNNRF9TV0RCRyAgICAweDAwMjAJLyogU1cgRGVidWcgbW9kZSAqLworI2RlZmluZSAgIFVTQkNNRF9DRiAgICAgICAweDAwNDAJLyogQ29uZmlnIEZsYWcgKHN3IG9ubHkpICovCisjZGVmaW5lICAgVVNCQ01EX01BWFAgICAgIDB4MDA4MAkvKiBNYXggUGFja2V0ICgwID0gMzIsIDEgPSA2NCkgKi8KKworLyogU3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lIFVTQlNUUwkJMgorI2RlZmluZSAgIFVTQlNUU19VU0JJTlQgICAweDAwMDEJLyogSW50ZXJydXB0IGR1ZSB0byBJT0MgKi8KKyNkZWZpbmUgICBVU0JTVFNfRVJST1IgICAgMHgwMDAyCS8qIEludGVycnVwdCBkdWUgdG8gZXJyb3IgKi8KKyNkZWZpbmUgICBVU0JTVFNfUkQgICAgICAgMHgwMDA0CS8qIFJlc3VtZSBEZXRlY3QgKi8KKyNkZWZpbmUgICBVU0JTVFNfSFNFICAgICAgMHgwMDA4CS8qIEhvc3QgU3lzdGVtIEVycm9yIC0gYmFzaWNhbGx5IFBDSSBwcm9ibGVtcyAqLworI2RlZmluZSAgIFVTQlNUU19IQ1BFICAgICAweDAwMTAJLyogSG9zdCBDb250cm9sbGVyIFByb2Nlc3MgRXJyb3IgLSB0aGUgc2NyaXB0cyB3ZXJlIGJ1Z2d5ICovCisjZGVmaW5lICAgVVNCU1RTX0hDSCAgICAgIDB4MDAyMAkvKiBIQyBIYWx0ZWQgKi8KKworLyogSW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLworI2RlZmluZSBVU0JJTlRSCQk0CisjZGVmaW5lICAgVVNCSU5UUl9USU1FT1VUIDB4MDAwMQkvKiBUaW1lb3V0L0NSQyBlcnJvciBlbmFibGUgKi8KKyNkZWZpbmUgICBVU0JJTlRSX1JFU1VNRSAgMHgwMDAyCS8qIFJlc3VtZSBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lICAgVVNCSU5UUl9JT0MgICAgIDB4MDAwNAkvKiBJbnRlcnJ1cHQgT24gQ29tcGxldGUgZW5hYmxlICovCisjZGVmaW5lICAgVVNCSU5UUl9TUCAgICAgIDB4MDAwOAkvKiBTaG9ydCBwYWNrZXQgaW50ZXJydXB0IGVuYWJsZSAqLworCisjZGVmaW5lIFVTQkZSTlVNICAgICAgNgorI2RlZmluZSBVU0JGTEJBU0VBREQgIDgKKyNkZWZpbmUgVVNCU09GICAgICAgICAxMgorCisvKiBVU0IgcG9ydCBzdGF0dXMgYW5kIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIFVTQlBPUlRTQzEJMTYKKyNkZWZpbmUgVVNCUE9SVFNDMgkxOAorI2RlZmluZSAgIFVTQlBPUlRTQ19DQ1MgICAweDAwMDEJLyogQ3VycmVudCBDb25uZWN0IFN0YXR1cyAoImRldmljZSBwcmVzZW50IikgKi8KKyNkZWZpbmUgICBVU0JQT1JUU0NfQ1NDICAgMHgwMDAyCS8qIENvbm5lY3QgU3RhdHVzIENoYW5nZSAqLworI2RlZmluZSAgIFVTQlBPUlRTQ19QRSAgICAweDAwMDQJLyogUG9ydCBFbmFibGUgKi8KKyNkZWZpbmUgICBVU0JQT1JUU0NfUEVDICAgMHgwMDA4CS8qIFBvcnQgRW5hYmxlIENoYW5nZSAqLworI2RlZmluZSAgIFVTQlBPUlRTQ19MUyAgICAweDAwMzAJLyogTGluZSBTdGF0dXMgKi8KKyNkZWZpbmUgICBVU0JQT1JUU0NfUkQgICAgMHgwMDQwCS8qIFJlc3VtZSBEZXRlY3QgKi8KKyNkZWZpbmUgICBVU0JQT1JUU0NfTFNEQSAgMHgwMTAwCS8qIExvdyBTcGVlZCBEZXZpY2UgQXR0YWNoZWQgKi8KKyNkZWZpbmUgICBVU0JQT1JUU0NfUFIgICAgMHgwMjAwCS8qIFBvcnQgUmVzZXQgKi8KKyNkZWZpbmUgICBVU0JQT1JUU0NfU1VTUCAgMHgxMDAwCS8qIFN1c3BlbmQgKi8KKworLyogTGVnYWN5IHN1cHBvcnQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVVNCTEVHU1VQIDB4YzAKKyNkZWZpbmUgVVNCTEVHU1VQX0RFRkFVTFQgMHgyMDAwCS8qIG9ubHkgUElSUSBlbmFibGUgc2V0ICovCisKKyNkZWZpbmUgVUhDSV9OVUxMX0RBVEFfU0laRSAweDdmZgkvKiBmb3IgVUhDSSBjb250cm9sbGVyIFREICovCisjZGVmaW5lIFVIQ0lfUElEICAgICAgICAgICAgMHhmZgkvKiBQSUQgTUFTSyAqLworCisjZGVmaW5lIFVIQ0lfUFRSX0JJVFMgICAgICAgMHgwMDBGCisjZGVmaW5lIFVIQ0lfUFRSX1RFUk0gICAgICAgMHgwMDAxCisjZGVmaW5lIFVIQ0lfUFRSX1FIICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFVIQ0lfUFRSX0RFUFRIICAgICAgMHgwMDA0CisKKy8qIGZvciBURCA8c3RhdHVzPjogKi8KKyNkZWZpbmUgVERfQ1RSTF9TUEQgICAgICAgICAoMSA8PCAyOSkJLyogU2hvcnQgUGFja2V0IERldGVjdCAqLworI2RlZmluZSBURF9DVFJMX0NfRVJSX01BU0sgICgzIDw8IDI3KQkvKiBFcnJvciBDb3VudGVyIGJpdHMgKi8KKyNkZWZpbmUgVERfQ1RSTF9MUyAgICAgICAgICAoMSA8PCAyNikJLyogTG93IFNwZWVkIERldmljZSAqLworI2RlZmluZSBURF9DVFJMX0lPUyAgICAgICAgICgxIDw8IDI1KQkvKiBJc29jaHJvbm91cyBTZWxlY3QgKi8KKyNkZWZpbmUgVERfQ1RSTF9JT0MgICAgICAgICAoMSA8PCAyNCkJLyogSW50ZXJydXB0IG9uIENvbXBsZXRlICovCisjZGVmaW5lIFREX0NUUkxfQUNUSVZFICAgICAgKDEgPDwgMjMpCS8qIFREIEFjdGl2ZSAqLworI2RlZmluZSBURF9DVFJMX1NUQUxMRUQgICAgICgxIDw8IDIyKQkvKiBURCBTdGFsbGVkICovCisjZGVmaW5lIFREX0NUUkxfREJVRkVSUiAgICAgKDEgPDwgMjEpCS8qIERhdGEgQnVmZmVyIEVycm9yICovCisjZGVmaW5lIFREX0NUUkxfQkFCQkxFICAgICAgKDEgPDwgMjApCS8qIEJhYmJsZSBEZXRlY3RlZCAqLworI2RlZmluZSBURF9DVFJMX05BSyAgICAgICAgICgxIDw8IDE5KQkvKiBOQUsgUmVjZWl2ZWQgKi8KKyNkZWZpbmUgVERfQ1RSTF9DUkNUSU1FTyAgICAoMSA8PCAxOCkJLyogQ1JDL1RpbWUgT3V0IEVycm9yICovCisjZGVmaW5lIFREX0NUUkxfQklUU1RVRkYgICAgKDEgPDwgMTcpCS8qIEJpdCBTdHVmZiBFcnJvciAqLworI2RlZmluZSBURF9DVFJMX0FDVExFTl9NQVNLIDB4N2ZmCS8qIGFjdHVhbCBsZW5ndGgsIGVuY29kZWQgYXMgbiAtIDEgKi8KKworI2RlZmluZSBURF9DVFJMX0FOWV9FUlJPUgkoVERfQ1RSTF9TVEFMTEVEIHwgVERfQ1RSTF9EQlVGRVJSIHwgXAorCQkJCSBURF9DVFJMX0JBQkJMRSB8IFREX0NUUkxfQ1JDVElNRSB8IFREX0NUUkxfQklUU1RVRkYpCisKKyNkZWZpbmUgVERfVE9LRU5fVE9HR0xFCQkxOQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIFZpcnR1YWwgUm9vdCBIVUIKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogZGVzdGluYXRpb24gb2YgcmVxdWVzdCAqLworI2RlZmluZSBSSF9JTlRFUkZBQ0UgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFJIX0VORFBPSU5UICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgUkhfT1RIRVIgICAgICAgICAgICAgICAgICAgMHgwMworCisjZGVmaW5lIFJIX0NMQVNTICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgUkhfVkVORE9SICAgICAgICAgICAgICAgICAgMHg0MAorCisvKiBSZXF1ZXN0czogYlJlcXVlc3QgPDwgOCB8IGJtUmVxdWVzdFR5cGUgKi8KKyNkZWZpbmUgUkhfR0VUX1NUQVRVUyAgICAgICAgICAgMHgwMDgwCisjZGVmaW5lIFJIX0NMRUFSX0ZFQVRVUkUgICAgICAgIDB4MDEwMAorI2RlZmluZSBSSF9TRVRfRkVBVFVSRSAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgUkhfU0VUX0FERFJFU1MgICAgICAgICAgMHgwNTAwCisjZGVmaW5lIFJIX0dFVF9ERVNDUklQVE9SICAgICAgIDB4MDY4MAorI2RlZmluZSBSSF9TRVRfREVTQ1JJUFRPUiAgICAgICAweDA3MDAKKyNkZWZpbmUgUkhfR0VUX0NPTkZJR1VSQVRJT04gICAgMHgwODgwCisjZGVmaW5lIFJIX1NFVF9DT05GSUdVUkFUSU9OICAgIDB4MDkwMAorI2RlZmluZSBSSF9HRVRfU1RBVEUgICAgICAgICAgICAweDAyODAKKyNkZWZpbmUgUkhfR0VUX0lOVEVSRkFDRSAgICAgICAgMHgwQTgwCisjZGVmaW5lIFJIX1NFVF9JTlRFUkZBQ0UgICAgICAgIDB4MEIwMAorI2RlZmluZSBSSF9TWU5DX0ZSQU1FICAgICAgICAgICAweDBDODAKKy8qIE91ciBWZW5kb3IgU3BlY2lmaWMgUmVxdWVzdCAqLworI2RlZmluZSBSSF9TRVRfRVAgICAgICAgICAgICAgICAweDIwMDAKKworLyogSHViIHBvcnQgZmVhdHVyZXMgKi8KKyNkZWZpbmUgUkhfUE9SVF9DT05ORUNUSU9OICAgICAgICAgMHgwMAorI2RlZmluZSBSSF9QT1JUX0VOQUJMRSAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFJIX1BPUlRfU1VTUEVORCAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgUkhfUE9SVF9PVkVSX0NVUlJFTlQgICAgICAgMHgwMworI2RlZmluZSBSSF9QT1JUX1JFU0VUICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIFJIX1BPUlRfUE9XRVIgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgUkhfUE9SVF9MT1dfU1BFRUQgICAgICAgICAgMHgwOQorI2RlZmluZSBSSF9DX1BPUlRfQ09OTkVDVElPTiAgICAgICAweDEwCisjZGVmaW5lIFJIX0NfUE9SVF9FTkFCTEUgICAgICAgICAgIDB4MTEKKyNkZWZpbmUgUkhfQ19QT1JUX1NVU1BFTkQgICAgICAgICAgMHgxMgorI2RlZmluZSBSSF9DX1BPUlRfT1ZFUl9DVVJSRU5UICAgICAweDEzCisjZGVmaW5lIFJIX0NfUE9SVF9SRVNFVCAgICAgICAgICAgIDB4MTQKKworLyogSHViIGZlYXR1cmVzICovCisjZGVmaW5lIFJIX0NfSFVCX0xPQ0FMX1BPV0VSICAgICAgIDB4MDAKKyNkZWZpbmUgUkhfQ19IVUJfT1ZFUl9DVVJSRU5UICAgICAgMHgwMQorCisjZGVmaW5lIFJIX0RFVklDRV9SRU1PVEVfV0FLRVVQICAgIDB4MDAKKyNkZWZpbmUgUkhfRU5EUE9JTlRfU1RBTEwgICAgICAgICAgMHgwMQorCisvKiBPdXIgVmVuZG9yIFNwZWNpZmljIGZlYXR1cmUgKi8KKyNkZWZpbmUgUkhfUkVNT1ZFX0VQICAgICAgICAgICAgICAgMHgwMAorCisjZGVmaW5lIFJIX0FDSyAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUkhfUkVRX0VSUiAgICAgICAgICAgICAgICAgLTEKKyNkZWZpbmUgUkhfTkFDSyAgICAgICAgICAgICAgICAgICAgMHgwMAorCisvKiBUcmFuc2ZlciBkZXNjcmlwdG9yIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgbGluazsJLyogbmV4dCB0ZC9xaCAoTEUpICovCisJdW5zaWduZWQgbG9uZyBzdGF0dXM7CS8qIHN0YXR1cyBvZiB0aGUgdGQgKi8KKwl1bnNpZ25lZCBsb25nIGluZm87CS8qIE1heCBMZW5naHQgLyBFbmRwb2ludCAvIGRldmljZSBhZGRyZXNzIGFuZCBQSUQgKi8KKwl1bnNpZ25lZCBsb25nIGJ1ZmZlcjsJLyogcG9pbnRlciB0byBkYXRhIGJ1ZmZlciAoTEUpICovCisJdW5zaWduZWQgbG9uZyBkZXZfcHRyOwkvKiBwb2ludGVyIHRvIHRoZSBhc3NpZ25lZCBkZXZpY2UgKEJFKSAqLworCXVuc2lnbmVkIGxvbmcgcmVzWzNdOwkvKiByZXNlcnZlZCAoVERzIG11c3QgYmUgOEJ5dGUgYWxpZ25lZCkgKi8KK30gdWhjaV90ZF90LCAqcHVoY2lfdGRfdDsKKworLyogUXVldWUgSGVhZGVyIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgaGVhZDsJLyogTmV4dCBRSCAoTEUpICovCisJdW5zaWduZWQgbG9uZyBlbGVtZW50OwkvKiBRdWV1ZSBlbGVtZW50IHBvaW50ZXIgKExFKSAqLworCXVuc2lnbmVkIGxvbmcgcmVzWzVdOwkvKiByZXNlcnZlZCAqLworCXVuc2lnbmVkIGxvbmcgZGV2X3B0cjsJLyogaWYgMCBubyB0ZHMgaGF2ZSBiZWVuIGFzc2lnbmVkIHRvIHRoaXMgcWggKi8KK30gdWhjaV9xaF90LCAqcHVoY2lfcWhfdDsKKworc3RydWN0IHZpcnRfcm9vdF9odWIgeworCWludCBkZXZudW07CQkvKiBBZGRyZXNzIG9mIFJvb3QgSHViIGVuZHBvaW50ICovCisJaW50IG51bXBvcnRzOwkJLyogbnVtYmVyIG9mIHBvcnRzICovCisJaW50IGNfcF9yWzhdOwkJLyogQ19QT1JUX1JFU0VUICovCit9OworCisjZW5kaWYJCQkJLyogX1VTQl9VSENJX0hfICovCg==