LyoKICogIE11bHRpLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkKICoKICogIENvcHlyaWdodCAoQykgMjAwNi0yMDE1LCBBUk0gTGltaXRlZCwgQWxsIFJpZ2h0cyBSZXNlcnZlZAogKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAKICoKICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5CiAqICBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKICogIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKgogKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgbWJlZCBUTFMgKGh0dHBzOi8vdGxzLm1iZWQub3JnKQogKi8KCi8qCiAqICBUaGUgZm9sbG93aW5nIHNvdXJjZXMgd2VyZSByZWZlcmVuY2VkIGluIHRoZSBkZXNpZ24gb2YgdGhpcyBNdWx0aS1wcmVjaXNpb24KICogIEludGVnZXIgbGlicmFyeToKICoKICogIFsxXSBIYW5kYm9vayBvZiBBcHBsaWVkIENyeXB0b2dyYXBoeSAtIDE5OTcKICogICAgICBNZW5lemVzLCB2YW4gT29yc2Nob3QgYW5kIFZhbnN0b25lCiAqCiAqICBbMl0gTXVsdGktUHJlY2lzaW9uIE1hdGgKICogICAgICBUb20gU3QgRGVuaXMKICogICAgICBodHRwczovL2dpdGh1Yi5jb20vbGlidG9tL2xpYnRvbW1hdGgvYmxvYi9kZXZlbG9wL3RvbW1hdGgucGRmCiAqCiAqICBbM10gR05VIE11bHRpLVByZWNpc2lvbiBBcml0aG1ldGljIExpYnJhcnkKICogICAgICBodHRwczovL2dtcGxpYi5vcmcvbWFudWFsL2luZGV4Lmh0bWwKICoKICovCgojaWYgIWRlZmluZWQoTUJFRFRMU19DT05GSUdfRklMRSkKI2luY2x1ZGUgIm1iZWR0bHMvY29uZmlnLmgiCiNlbHNlCiNpbmNsdWRlIE1CRURUTFNfQ09ORklHX0ZJTEUKI2VuZGlmCgojaWYgZGVmaW5lZChNQkVEVExTX0JJR05VTV9DKQoKI2luY2x1ZGUgIm1iZWR0bHMvYmlnbnVtLmgiCiNpbmNsdWRlICJtYmVkdGxzL2JuX211bC5oIgojaW5jbHVkZSAibWJlZHRscy9wbGF0Zm9ybV91dGlsLmgiCgojaW5jbHVkZSA8c3RyaW5nLmg+CgojaWYgZGVmaW5lZChNQkVEVExTX1BMQVRGT1JNX0MpCiNpbmNsdWRlICJtYmVkdGxzL3BsYXRmb3JtLmgiCiNlbHNlCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNkZWZpbmUgbWJlZHRsc19wcmludGYgICAgIHByaW50ZgojZGVmaW5lIG1iZWR0bHNfY2FsbG9jICAgIGNhbGxvYwojZGVmaW5lIG1iZWR0bHNfZnJlZSAgICAgICBmcmVlCiNlbmRpZgoKI2RlZmluZSBNUElfVkFMSURBVEVfUkVUKCBjb25kICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBNQkVEVExTX0lOVEVSTkFMX1ZBTElEQVRFX1JFVCggY29uZCwgTUJFRFRMU19FUlJfTVBJX0JBRF9JTlBVVF9EQVRBICkKI2RlZmluZSBNUElfVkFMSURBVEUoIGNvbmQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBNQkVEVExTX0lOVEVSTkFMX1ZBTElEQVRFKCBjb25kICkKCiNkZWZpbmUgY2lMICAgIChzaXplb2YobWJlZHRsc19tcGlfdWludCkpICAgICAgICAgLyogY2hhcnMgaW4gbGltYiAgKi8KI2RlZmluZSBiaUwgICAgKGNpTCA8PCAzKSAgICAgICAgICAgICAgIC8qIGJpdHMgIGluIGxpbWIgICovCiNkZWZpbmUgYmlIICAgIChjaUwgPDwgMikgICAgICAgICAgICAgICAvKiBoYWxmIGxpbWIgc2l6ZSAqLwoKI2RlZmluZSBNUElfU0laRV9UX01BWCAgKCAoc2l6ZV90KSAtMSApIC8qIFNJWkVfVF9NQVggaXMgbm90IHN0YW5kYXJkICovCgovKgogKiBDb252ZXJ0IGJldHdlZW4gYml0cy9jaGFycyBhbmQgbnVtYmVyIG9mIGxpbWJzCiAqIERpdmlkZSBmaXJzdCBpbiBvcmRlciB0byBhdm9pZCBwb3RlbnRpYWwgb3ZlcmZsb3dzCiAqLwojZGVmaW5lIEJJVFNfVE9fTElNQlMoaSkgICggKGkpIC8gYmlMICsgKCAoaSkgJSBiaUwgIT0gMCApICkKI2RlZmluZSBDSEFSU19UT19MSU1CUyhpKSAoIChpKSAvIGNpTCArICggKGkpICUgY2lMICE9IDAgKSApCgovKiBJbXBsZW1lbnRhdGlvbiB0aGF0IHNob3VsZCBuZXZlciBiZSBvcHRpbWl6ZWQgb3V0IGJ5IHRoZSBjb21waWxlciAqLwpzdGF0aWMgdm9pZCBtYmVkdGxzX21waV96ZXJvaXplKCBtYmVkdGxzX21waV91aW50ICp2LCBzaXplX3QgbiApCnsKICAgIG1iZWR0bHNfcGxhdGZvcm1femVyb2l6ZSggdiwgY2lMICogbiApOwp9CgovKgogKiBJbml0aWFsaXplIG9uZSBNUEkKICovCnZvaWQgbWJlZHRsc19tcGlfaW5pdCggbWJlZHRsc19tcGkgKlggKQp7CiAgICBNUElfVkFMSURBVEUoIFggIT0gTlVMTCApOwoKICAgIFgtPnMgPSAxOwogICAgWC0+biA9IDA7CiAgICBYLT5wID0gTlVMTDsKfQoKLyoKICogVW5hbGxvY2F0ZSBvbmUgTVBJCiAqLwp2b2lkIG1iZWR0bHNfbXBpX2ZyZWUoIG1iZWR0bHNfbXBpICpYICkKewogICAgaWYoIFggPT0gTlVMTCApCiAgICAgICAgcmV0dXJuOwoKICAgIGlmKCBYLT5wICE9IE5VTEwgKQogICAgewogICAgICAgIG1iZWR0bHNfbXBpX3plcm9pemUoIFgtPnAsIFgtPm4gKTsKICAgICAgICBtYmVkdGxzX2ZyZWUoIFgtPnAgKTsKICAgIH0KCiAgICBYLT5zID0gMTsKICAgIFgtPm4gPSAwOwogICAgWC0+cCA9IE5VTEw7Cn0KCi8qCiAqIEVubGFyZ2UgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgbGltYnMKICovCmludCBtYmVkdGxzX21waV9ncm93KCBtYmVkdGxzX21waSAqWCwgc2l6ZV90IG5ibGltYnMgKQp7CiAgICBtYmVkdGxzX21waV91aW50ICpwOwogICAgTVBJX1ZBTElEQVRFX1JFVCggWCAhPSBOVUxMICk7CgogICAgaWYoIG5ibGltYnMgPiBNQkVEVExTX01QSV9NQVhfTElNQlMgKQogICAgICAgIHJldHVybiggTUJFRFRMU19FUlJfTVBJX0FMTE9DX0ZBSUxFRCApOwoKICAgIGlmKCBYLT5uIDwgbmJsaW1icyApCiAgICB7CiAgICAgICAgaWYoICggcCA9IChtYmVkdGxzX21waV91aW50KiltYmVkdGxzX2NhbGxvYyggbmJsaW1icywgY2lMICkgKSA9PSBOVUxMICkKICAgICAgICAgICAgcmV0dXJuKCBNQkVEVExTX0VSUl9NUElfQUxMT0NfRkFJTEVEICk7CgogICAgICAgIGlmKCBYLT5wICE9IE5VTEwgKQogICAgICAgIHsKICAgICAgICAgICAgbWVtY3B5KCBwLCBYLT5wLCBYLT5uICogY2lMICk7CiAgICAgICAgICAgIG1iZWR0bHNfbXBpX3plcm9pemUoIFgtPnAsIFgtPm4gKTsKICAgICAgICAgICAgbWJlZHRsc19mcmVlKCBYLT5wICk7CiAgICAgICAgfQoKICAgICAgICBYLT5uID0gbmJsaW1iczsKICAgICAgICBYLT5wID0gcDsKICAgIH0KCiAgICByZXR1cm4oIDAgKTsKfQoKLyoKICogUmVzaXplIGRvd24gYXMgbXVjaCBhcyBwb3NzaWJsZSwKICogd2hpbGUga2VlcGluZyBhdCBsZWFzdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBsaW1icwogKi8KaW50IG1iZWR0bHNfbXBpX3NocmluayggbWJlZHRsc19tcGkgKlgsIHNpemVfdCBuYmxpbWJzICkKewogICAgbWJlZHRsc19tcGlfdWludCAqcDsKICAgIHNpemVfdCBpOwogICAgTVBJX1ZBTElEQVRFX1JFVCggWCAhPSBOVUxMICk7CgogICAgaWYoIG5ibGltYnMgPiBNQkVEVExTX01QSV9NQVhfTElNQlMgKQogICAgICAgIHJldHVybiggTUJFRFRMU19FUlJfTVBJX0FMTE9DX0ZBSUxFRCApOwoKICAgIC8qIEFjdHVhbGx5IHJlc2l6ZSB1cCBpbiB0aGlzIGNhc2UgKi8KICAgIGlmKCBYLT5uIDw9IG5ibGltYnMgKQogICAgICAgIHJldHVybiggbWJlZHRsc19tcGlfZ3JvdyggWCwgbmJsaW1icyApICk7CgogICAgZm9yKCBpID0gWC0+biAtIDE7IGkgPiAwOyBpLS0gKQogICAgICAgIGlmKCBYLT5wW2ldICE9IDAgKQogICAgICAgICAgICBicmVhazsKICAgIGkrKzsKCiAgICBpZiggaSA8IG5ibGltYnMgKQogICAgICAgIGkgPSBuYmxpbWJzOwoKICAgIGlmKCAoIHAgPSAobWJlZHRsc19tcGlfdWludCopbWJlZHRsc19jYWxsb2MoIGksIGNpTCApICkgPT0gTlVMTCApCiAgICAgICAgcmV0dXJuKCBNQkVEVExTX0VSUl9NUElfQUxMT0NfRkFJTEVEICk7CgogICAgaWYoIFgtPnAgIT0gTlVMTCApCiAgICB7CiAgICAgICAgbWVtY3B5KCBwLCBYLT5wLCBpICogY2lMICk7CiAgICAgICAgbWJlZHRsc19tcGlfemVyb2l6ZSggWC0+cCwgWC0+biApOwogICAgICAgIG1iZWR0bHNfZnJlZSggWC0+cCApOwogICAgfQoKICAgIFgtPm4gPSBpOwogICAgWC0+cCA9IHA7CgogICAgcmV0dXJuKCAwICk7Cn0KCi8qCiAqIENvcHkgdGhlIGNvbnRlbnRzIG9mIFkgaW50byBYCiAqLwppbnQgbWJlZHRsc19tcGlfY29weSggbWJlZHRsc19tcGkgKlgsIGNvbnN0IG1iZWR0bHNfbXBpICpZICkKewogICAgaW50IHJldCA9IDA7CiAgICBzaXplX3QgaTsKICAgIE1QSV9WQUxJREFURV9SRVQoIFggIT0gTlVMTCApOwogICAgTVBJX1ZBTElEQVRFX1JFVCggWSAhPSBOVUxMICk7CgogICAgaWYoIFggPT0gWSApCiAgICAgICAgcmV0dXJuKCAwICk7CgogICAgaWYoIFktPnAgPT0gTlVMTCApCiAgICB7CiAgICAgICAgbWJlZHRsc19tcGlfZnJlZSggWCApOwogICAgICAgIHJldHVybiggMCApOwogICAgfQoKICAgIGZvciggaSA9IFktPm4gLSAxOyBpID4gMDsgaS0tICkKICAgICAgICBpZiggWS0+cFtpXSAhPSAwICkKICAgICAgICAgICAgYnJlYWs7CiAgICBpKys7CgogICAgWC0+cyA9IFktPnM7CgogICAgaWYoIFgtPm4gPCBpICkKICAgIHsKICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX2dyb3coIFgsIGkgKSApOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIG1lbXNldCggWC0+cCArIGksIDAsICggWC0+biAtIGkgKSAqIGNpTCApOwogICAgfQoKICAgIG1lbWNweSggWC0+cCwgWS0+cCwgaSAqIGNpTCApOwoKY2xlYW51cDoKCiAgICByZXR1cm4oIHJldCApOwp9CgovKgogKiBTd2FwIHRoZSBjb250ZW50cyBvZiBYIGFuZCBZCiAqLwp2b2lkIG1iZWR0bHNfbXBpX3N3YXAoIG1iZWR0bHNfbXBpICpYLCBtYmVkdGxzX21waSAqWSApCnsKICAgIG1iZWR0bHNfbXBpIFQ7CiAgICBNUElfVkFMSURBVEUoIFggIT0gTlVMTCApOwogICAgTVBJX1ZBTElEQVRFKCBZICE9IE5VTEwgKTsKCiAgICBtZW1jcHkoICZULCAgWCwgc2l6ZW9mKCBtYmVkdGxzX21waSApICk7CiAgICBtZW1jcHkoICBYLCAgWSwgc2l6ZW9mKCBtYmVkdGxzX21waSApICk7CiAgICBtZW1jcHkoICBZLCAmVCwgc2l6ZW9mKCBtYmVkdGxzX21waSApICk7Cn0KCi8qCiAqIENvbmRpdGlvbmFsbHkgYXNzaWduIFggPSBZLCB3aXRob3V0IGxlYWtpbmcgaW5mb3JtYXRpb24KICogYWJvdXQgd2hldGhlciB0aGUgYXNzaWdubWVudCB3YXMgbWFkZSBvciBub3QuCiAqIChMZWFraW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXNwZWN0aXZlIHNpemVzIG9mIFggYW5kIFkgaXMgb2sgaG93ZXZlci4pCiAqLwppbnQgbWJlZHRsc19tcGlfc2FmZV9jb25kX2Fzc2lnbiggbWJlZHRsc19tcGkgKlgsIGNvbnN0IG1iZWR0bHNfbXBpICpZLCB1bnNpZ25lZCBjaGFyIGFzc2lnbiApCnsKICAgIGludCByZXQgPSAwOwogICAgc2l6ZV90IGk7CiAgICBNUElfVkFMSURBVEVfUkVUKCBYICE9IE5VTEwgKTsKICAgIE1QSV9WQUxJREFURV9SRVQoIFkgIT0gTlVMTCApOwoKICAgIC8qIG1ha2Ugc3VyZSBhc3NpZ24gaXMgMCBvciAxIGluIGEgdGltZS1jb25zdGFudCBtYW5uZXIgKi8KICAgIGFzc2lnbiA9IChhc3NpZ24gfCAodW5zaWduZWQgY2hhciktYXNzaWduKSA+PiA3OwoKICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfZ3JvdyggWCwgWS0+biApICk7CgogICAgWC0+cyA9IFgtPnMgKiAoIDEgLSBhc3NpZ24gKSArIFktPnMgKiBhc3NpZ247CgogICAgZm9yKCBpID0gMDsgaSA8IFktPm47IGkrKyApCiAgICAgICAgWC0+cFtpXSA9IFgtPnBbaV0gKiAoIDEgLSBhc3NpZ24gKSArIFktPnBbaV0gKiBhc3NpZ247CgogICAgZm9yKCA7IGkgPCBYLT5uOyBpKysgKQogICAgICAgIFgtPnBbaV0gKj0gKCAxIC0gYXNzaWduICk7CgpjbGVhbnVwOgogICAgcmV0dXJuKCByZXQgKTsKfQoKLyoKICogQ29uZGl0aW9uYWxseSBzd2FwIFggYW5kIFksIHdpdGhvdXQgbGVha2luZyBpbmZvcm1hdGlvbgogKiBhYm91dCB3aGV0aGVyIHRoZSBzd2FwIHdhcyBtYWRlIG9yIG5vdC4KICogSGVyZSBpdCBpcyBub3Qgb2sgdG8gc2ltcGx5IHN3YXAgdGhlIHBvaW50ZXJzLCB3aGljaCB3aG91bGQgbGVhZCB0bwogKiBkaWZmZXJlbnQgbWVtb3J5IGFjY2VzcyBwYXR0ZXJucyB3aGVuIFggYW5kIFkgYXJlIHVzZWQgYWZ0ZXJ3YXJkcy4KICovCmludCBtYmVkdGxzX21waV9zYWZlX2NvbmRfc3dhcCggbWJlZHRsc19tcGkgKlgsIG1iZWR0bHNfbXBpICpZLCB1bnNpZ25lZCBjaGFyIHN3YXAgKQp7CiAgICBpbnQgcmV0LCBzOwogICAgc2l6ZV90IGk7CiAgICBtYmVkdGxzX21waV91aW50IHRtcDsKICAgIE1QSV9WQUxJREFURV9SRVQoIFggIT0gTlVMTCApOwogICAgTVBJX1ZBTElEQVRFX1JFVCggWSAhPSBOVUxMICk7CgogICAgaWYoIFggPT0gWSApCiAgICAgICAgcmV0dXJuKCAwICk7CgogICAgLyogbWFrZSBzdXJlIHN3YXAgaXMgMCBvciAxIGluIGEgdGltZS1jb25zdGFudCBtYW5uZXIgKi8KICAgIHN3YXAgPSAoc3dhcCB8ICh1bnNpZ25lZCBjaGFyKS1zd2FwKSA+PiA3OwoKICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfZ3JvdyggWCwgWS0+biApICk7CiAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX2dyb3coIFksIFgtPm4gKSApOwoKICAgIHMgPSBYLT5zOwogICAgWC0+cyA9IFgtPnMgKiAoIDEgLSBzd2FwICkgKyBZLT5zICogc3dhcDsKICAgIFktPnMgPSBZLT5zICogKCAxIC0gc3dhcCApICsgICAgcyAqIHN3YXA7CgoKICAgIGZvciggaSA9IDA7IGkgPCBYLT5uOyBpKysgKQogICAgewogICAgICAgIHRtcCA9IFgtPnBbaV07CiAgICAgICAgWC0+cFtpXSA9IFgtPnBbaV0gKiAoIDEgLSBzd2FwICkgKyBZLT5wW2ldICogc3dhcDsKICAgICAgICBZLT5wW2ldID0gWS0+cFtpXSAqICggMSAtIHN3YXAgKSArICAgICB0bXAgKiBzd2FwOwogICAgfQoKY2xlYW51cDoKICAgIHJldHVybiggcmV0ICk7Cn0KCi8qCiAqIFNldCB2YWx1ZSBmcm9tIGludGVnZXIKICovCmludCBtYmVkdGxzX21waV9sc2V0KCBtYmVkdGxzX21waSAqWCwgbWJlZHRsc19tcGlfc2ludCB6ICkKewogICAgaW50IHJldDsKICAgIE1QSV9WQUxJREFURV9SRVQoIFggIT0gTlVMTCApOwoKICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfZ3JvdyggWCwgMSApICk7CiAgICBtZW1zZXQoIFgtPnAsIDAsIFgtPm4gKiBjaUwgKTsKCiAgICBYLT5wWzBdID0gKCB6IDwgMCApID8gLXogOiB6OwogICAgWC0+cyAgICA9ICggeiA8IDAgKSA/IC0xIDogMTsKCmNsZWFudXA6CgogICAgcmV0dXJuKCByZXQgKTsKfQoKLyoKICogR2V0IGEgc3BlY2lmaWMgYml0CiAqLwppbnQgbWJlZHRsc19tcGlfZ2V0X2JpdCggY29uc3QgbWJlZHRsc19tcGkgKlgsIHNpemVfdCBwb3MgKQp7CiAgICBNUElfVkFMSURBVEVfUkVUKCBYICE9IE5VTEwgKTsKCiAgICBpZiggWC0+biAqIGJpTCA8PSBwb3MgKQogICAgICAgIHJldHVybiggMCApOwoKICAgIHJldHVybiggKCBYLT5wW3BvcyAvIGJpTF0gPj4gKCBwb3MgJSBiaUwgKSApICYgMHgwMSApOwp9CgovKiBHZXQgYSBzcGVjaWZpYyBieXRlLCB3aXRob3V0IHJhbmdlIGNoZWNrcy4gKi8KI2RlZmluZSBHRVRfQllURSggWCwgaSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAoICggKCBYICktPnBbKCBpICkgLyBjaUxdID4+ICggKCAoIGkgKSAlIGNpTCApICogOCApICkgJiAweGZmICkKCi8qCiAqIFNldCBhIGJpdCB0byBhIHNwZWNpZmljIHZhbHVlIG9mIDAgb3IgMQogKi8KaW50IG1iZWR0bHNfbXBpX3NldF9iaXQoIG1iZWR0bHNfbXBpICpYLCBzaXplX3QgcG9zLCB1bnNpZ25lZCBjaGFyIHZhbCApCnsKICAgIGludCByZXQgPSAwOwogICAgc2l6ZV90IG9mZiA9IHBvcyAvIGJpTDsKICAgIHNpemVfdCBpZHggPSBwb3MgJSBiaUw7CiAgICBNUElfVkFMSURBVEVfUkVUKCBYICE9IE5VTEwgKTsKCiAgICBpZiggdmFsICE9IDAgJiYgdmFsICE9IDEgKQogICAgICAgIHJldHVybiggTUJFRFRMU19FUlJfTVBJX0JBRF9JTlBVVF9EQVRBICk7CgogICAgaWYoIFgtPm4gKiBiaUwgPD0gcG9zICkKICAgIHsKICAgICAgICBpZiggdmFsID09IDAgKQogICAgICAgICAgICByZXR1cm4oIDAgKTsKCiAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9ncm93KCBYLCBvZmYgKyAxICkgKTsKICAgIH0KCiAgICBYLT5wW29mZl0gJj0gfiggKG1iZWR0bHNfbXBpX3VpbnQpIDB4MDEgPDwgaWR4ICk7CiAgICBYLT5wW29mZl0gfD0gKG1iZWR0bHNfbXBpX3VpbnQpIHZhbCA8PCBpZHg7CgpjbGVhbnVwOgoKICAgIHJldHVybiggcmV0ICk7Cn0KCi8qCiAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGxlc3Mgc2lnbmlmaWNhbnQgemVyby1iaXRzCiAqLwpzaXplX3QgbWJlZHRsc19tcGlfbHNiKCBjb25zdCBtYmVkdGxzX21waSAqWCApCnsKICAgIHNpemVfdCBpLCBqLCBjb3VudCA9IDA7CiAgICBNQkVEVExTX0lOVEVSTkFMX1ZBTElEQVRFX1JFVCggWCAhPSBOVUxMLCAwICk7CgogICAgZm9yKCBpID0gMDsgaSA8IFgtPm47IGkrKyApCiAgICAgICAgZm9yKCBqID0gMDsgaiA8IGJpTDsgaisrLCBjb3VudCsrICkKICAgICAgICAgICAgaWYoICggKCBYLT5wW2ldID4+IGogKSAmIDEgKSAhPSAwICkKICAgICAgICAgICAgICAgIHJldHVybiggY291bnQgKTsKCiAgICByZXR1cm4oIDAgKTsKfQoKLyoKICogQ291bnQgbGVhZGluZyB6ZXJvIGJpdHMgaW4gYSBnaXZlbiBpbnRlZ2VyCiAqLwpzdGF0aWMgc2l6ZV90IG1iZWR0bHNfY2x6KCBjb25zdCBtYmVkdGxzX21waV91aW50IHggKQp7CiAgICBzaXplX3QgajsKICAgIG1iZWR0bHNfbXBpX3VpbnQgbWFzayA9IChtYmVkdGxzX21waV91aW50KSAxIDw8IChiaUwgLSAxKTsKCiAgICBmb3IoIGogPSAwOyBqIDwgYmlMOyBqKysgKQogICAgewogICAgICAgIGlmKCB4ICYgbWFzayApIGJyZWFrOwoKICAgICAgICBtYXNrID4+PSAxOwogICAgfQoKICAgIHJldHVybiBqOwp9CgovKgogKiBSZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzCiAqLwpzaXplX3QgbWJlZHRsc19tcGlfYml0bGVuKCBjb25zdCBtYmVkdGxzX21waSAqWCApCnsKICAgIHNpemVfdCBpLCBqOwoKICAgIGlmKCBYLT5uID09IDAgKQogICAgICAgIHJldHVybiggMCApOwoKICAgIGZvciggaSA9IFgtPm4gLSAxOyBpID4gMDsgaS0tICkKICAgICAgICBpZiggWC0+cFtpXSAhPSAwICkKICAgICAgICAgICAgYnJlYWs7CgogICAgaiA9IGJpTCAtIG1iZWR0bHNfY2x6KCBYLT5wW2ldICk7CgogICAgcmV0dXJuKCAoIGkgKiBiaUwgKSArIGogKTsKfQoKLyoKICogUmV0dXJuIHRoZSB0b3RhbCBzaXplIGluIGJ5dGVzCiAqLwpzaXplX3QgbWJlZHRsc19tcGlfc2l6ZSggY29uc3QgbWJlZHRsc19tcGkgKlggKQp7CiAgICByZXR1cm4oICggbWJlZHRsc19tcGlfYml0bGVuKCBYICkgKyA3ICkgPj4gMyApOwp9CgovKgogKiBDb252ZXJ0IGFuIEFTQ0lJIGNoYXJhY3RlciB0byBkaWdpdCB2YWx1ZQogKi8Kc3RhdGljIGludCBtcGlfZ2V0X2RpZ2l0KCBtYmVkdGxzX21waV91aW50ICpkLCBpbnQgcmFkaXgsIGNoYXIgYyApCnsKICAgICpkID0gMjU1OwoKICAgIGlmKCBjID49IDB4MzAgJiYgYyA8PSAweDM5ICkgKmQgPSBjIC0gMHgzMDsKICAgIGlmKCBjID49IDB4NDEgJiYgYyA8PSAweDQ2ICkgKmQgPSBjIC0gMHgzNzsKICAgIGlmKCBjID49IDB4NjEgJiYgYyA8PSAweDY2ICkgKmQgPSBjIC0gMHg1NzsKCiAgICBpZiggKmQgPj0gKG1iZWR0bHNfbXBpX3VpbnQpIHJhZGl4ICkKICAgICAgICByZXR1cm4oIE1CRURUTFNfRVJSX01QSV9JTlZBTElEX0NIQVJBQ1RFUiApOwoKICAgIHJldHVybiggMCApOwp9CgovKgogKiBJbXBvcnQgZnJvbSBhbiBBU0NJSSBzdHJpbmcKICovCmludCBtYmVkdGxzX21waV9yZWFkX3N0cmluZyggbWJlZHRsc19tcGkgKlgsIGludCByYWRpeCwgY29uc3QgY2hhciAqcyApCnsKICAgIGludCByZXQ7CiAgICBzaXplX3QgaSwgaiwgc2xlbiwgbjsKICAgIG1iZWR0bHNfbXBpX3VpbnQgZDsKICAgIG1iZWR0bHNfbXBpIFQ7CiAgICBNUElfVkFMSURBVEVfUkVUKCBYICE9IE5VTEwgKTsKICAgIE1QSV9WQUxJREFURV9SRVQoIHMgIT0gTlVMTCApOwoKICAgIGlmKCByYWRpeCA8IDIgfHwgcmFkaXggPiAxNiApCiAgICAgICAgcmV0dXJuKCBNQkVEVExTX0VSUl9NUElfQkFEX0lOUFVUX0RBVEEgKTsKCiAgICBtYmVkdGxzX21waV9pbml0KCAmVCApOwoKICAgIHNsZW4gPSBzdHJsZW4oIHMgKTsKCiAgICBpZiggcmFkaXggPT0gMTYgKQogICAgewogICAgICAgIGlmKCBzbGVuID4gTVBJX1NJWkVfVF9NQVggPj4gMiApCiAgICAgICAgICAgIHJldHVybiggTUJFRFRMU19FUlJfTVBJX0JBRF9JTlBVVF9EQVRBICk7CgogICAgICAgIG4gPSBCSVRTX1RPX0xJTUJTKCBzbGVuIDw8IDIgKTsKCiAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9ncm93KCBYLCBuICkgKTsKICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX2xzZXQoIFgsIDAgKSApOwoKICAgICAgICBmb3IoIGkgPSBzbGVuLCBqID0gMDsgaSA+IDA7IGktLSwgaisrICkKICAgICAgICB7CiAgICAgICAgICAgIGlmKCBpID09IDEgJiYgc1tpIC0gMV0gPT0gJy0nICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgWC0+cyA9IC0xOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIE1CRURUTFNfTVBJX0NISyggbXBpX2dldF9kaWdpdCggJmQsIHJhZGl4LCBzW2kgLSAxXSApICk7CiAgICAgICAgICAgIFgtPnBbaiAvICggMiAqIGNpTCApXSB8PSBkIDw8ICggKCBqICUgKCAyICogY2lMICkgKSA8PCAyICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfbHNldCggWCwgMCApICk7CgogICAgICAgIGZvciggaSA9IDA7IGkgPCBzbGVuOyBpKysgKQogICAgICAgIHsKICAgICAgICAgICAgaWYoIGkgPT0gMCAmJiBzW2ldID09ICctJyApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFgtPnMgPSAtMTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1waV9nZXRfZGlnaXQoICZkLCByYWRpeCwgc1tpXSApICk7CiAgICAgICAgICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfbXVsX2ludCggJlQsIFgsIHJhZGl4ICkgKTsKCiAgICAgICAgICAgIGlmKCBYLT5zID09IDEgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX2FkZF9pbnQoIFgsICZULCBkICkgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfc3ViX2ludCggWCwgJlQsIGQgKSApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKY2xlYW51cDoKCiAgICBtYmVkdGxzX21waV9mcmVlKCAmVCApOwoKICAgIHJldHVybiggcmV0ICk7Cn0KCi8qCiAqIEhlbHBlciB0byB3cml0ZSB0aGUgZGlnaXRzIGhpZ2gtb3JkZXIgZmlyc3QuCiAqLwpzdGF0aWMgaW50IG1waV93cml0ZV9obHAoIG1iZWR0bHNfbXBpICpYLCBpbnQgcmFkaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKnAsIGNvbnN0IHNpemVfdCBidWZsZW4gKQp7CiAgICBpbnQgcmV0OwogICAgbWJlZHRsc19tcGlfdWludCByOwogICAgc2l6ZV90IGxlbmd0aCA9IDA7CiAgICBjaGFyICpwX2VuZCA9ICpwICsgYnVmbGVuOwoKICAgIGRvCiAgICB7CiAgICAgICAgaWYoIGxlbmd0aCA+PSBidWZsZW4gKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuKCBNQkVEVExTX0VSUl9NUElfQlVGRkVSX1RPT19TTUFMTCApOwogICAgICAgIH0KCiAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9tb2RfaW50KCAmciwgWCwgcmFkaXggKSApOwogICAgICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfZGl2X2ludCggWCwgTlVMTCwgWCwgcmFkaXggKSApOwogICAgICAgIC8qCiAgICAgICAgICogV3JpdGUgdGhlIHJlc2lkdWUgaW4gdGhlIGN1cnJlbnQgcG9zaXRpb24sIGFzIGFuIEFTQ0lJIGNoYXJhY3Rlci4KICAgICAgICAgKi8KICAgICAgICBpZiggciA8IDB4QSApCiAgICAgICAgICAgICooLS1wX2VuZCkgPSAoY2hhcikoICcwJyArIHIgKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgICooLS1wX2VuZCkgPSAoY2hhcikoICdBJyArICggciAtIDB4QSApICk7CgogICAgICAgIGxlbmd0aCsrOwogICAgfSB3aGlsZSggbWJlZHRsc19tcGlfY21wX2ludCggWCwgMCApICE9IDAgKTsKCiAgICBtZW1tb3ZlKCAqcCwgcF9lbmQsIGxlbmd0aCApOwogICAgKnAgKz0gbGVuZ3RoOwoKY2xlYW51cDoKCiAgICByZXR1cm4oIHJldCApOwp9CgovKgogKiBFeHBvcnQgaW50byBhbiBBU0NJSSBzdHJpbmcKICovCmludCBtYmVkdGxzX21waV93cml0ZV9zdHJpbmcoIGNvbnN0IG1iZWR0bHNfbXBpICpYLCBpbnQgcmFkaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zmxlbiwgc2l6ZV90ICpvbGVuICkKewogICAgaW50IHJldCA9IDA7CiAgICBzaXplX3QgbjsKICAgIGNoYXIgKnA7CiAgICBtYmVkdGxzX21waSBUOwogICAgTVBJX1ZBTElEQVRFX1JFVCggWCAgICAhPSBOVUxMICk7CiAgICBNUElfVkFMSURBVEVfUkVUKCBvbGVuICE9IE5VTEwgKTsKICAgIE1QSV9WQUxJREFURV9SRVQoIGJ1ZmxlbiA9PSAwIHx8IGJ1ZiAhPSBOVUxMICk7CgogICAgaWYoIHJhZGl4IDwgMiB8fCByYWRpeCA+IDE2ICkKICAgICAgICByZXR1cm4oIE1CRURUTFNfRVJSX01QSV9CQURfSU5QVVRfREFUQSApOwoKICAgIG4gPSBtYmVkdGxzX21waV9iaXRsZW4oIFggKTsgLyogTnVtYmVyIG9mIGJpdHMgbmVjZXNzYXJ5IHRvIHByZXNlbnQgYG5gLiAqLwogICAgaWYoIHJhZGl4ID49ICA0ICkgbiA+Pj0gMTsgICAvKiBOdW1iZXIgb2YgNC1hZGljIGRpZ2l0cyBuZWNlc3NhcnkgdG8gcHJlc2VudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBgbmAuIElmIHJhZGl4ID4gNCwgdGhpcyBtaWdodCBiZSBhIHN0cmljdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvdmVyYXBwcm94aW1hdGlvbiBvZiB0aGUgbnVtYmVyIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJhZGl4LWFkaWMgZGlnaXRzIG5lZWRlZCB0byBwcmVzZW50IGBuYC4gKi8KICAgIGlmKCByYWRpeCA+PSAxNiApIG4gPj49IDE7ICAgLyogTnVtYmVyIG9mIGhleGFkZWNpbWFsIGRpZ2l0cyBuZWNlc3NhcnkgdG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcHJlc2VudCBgbmAuICovCgogICAgbiArPSAxOyAvKiBUZXJtaW5hdGluZyBudWxsIGJ5dGUgKi8KICAgIG4gKz0gMTsgLyogQ29tcGVuc2F0ZSBmb3IgdGhlIGRpdmlzaW9ucyBhYm92ZSwgd2hpY2ggcm91bmQgZG93biBgbmAKICAgICAgICAgICAgICogaW4gY2FzZSBpdCdzIG5vdCBldmVuLiAqLwogICAgbiArPSAxOyAvKiBQb3RlbnRpYWwgJy0nLXNpZ24uICovCiAgICBuICs9ICggbiAmIDEgKTsgLyogTWFrZSBuIGV2ZW4gdG8gaGF2ZSBlbm91Z2ggc3BhY2UgZm9yIGhleGFkZWNpbWFsIHdyaXRpbmcsCiAgICAgICAgICAgICAgICAgICAgICogd2hpY2ggYWx3YXlzIHVzZXMgYW4gZXZlbiBudW1iZXIgb2YgaGV4LWRpZ2l0cy4gKi8KCiAgICBpZiggYnVmbGVuIDwgbiApCiAgICB7CiAgICAgICAgKm9sZW4gPSBuOwogICAgICAgIHJldHVybiggTUJFRFRMU19FUlJfTVBJX0JVRkZFUl9UT09fU01BTEwgKTsKICAgIH0KCiAgICBwID0gYnVmOwogICAgbWJlZHRsc19tcGlfaW5pdCggJlQgKTsKCiAgICBpZiggWC0+cyA9PSAtMSApCiAgICB7CiAgICAgICAgKnArKyA9ICctJzsKICAgICAgICBidWZsZW4tLTsKICAgIH0KCiAgICBpZiggcmFkaXggPT0gMTYgKQogICAgewogICAgICAgIGludCBjOwogICAgICAgIHNpemVfdCBpLCBqLCBrOwoKICAgICAgICBmb3IoIGkgPSBYLT5uLCBrID0gMDsgaSA+IDA7IGktLSApCiAgICAgICAgewogICAgICAgICAgICBmb3IoIGogPSBjaUw7IGogPiAwOyBqLS0gKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjID0gKCBYLT5wW2kgLSAxXSA+PiAoICggaiAtIDEgKSA8PCAzKSApICYgMHhGRjsKCiAgICAgICAgICAgICAgICBpZiggYyA9PSAwICYmIGsgPT0gMCAmJiAoIGkgKyBqICkgIT0gMiApCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICAgICAgKihwKyspID0gIjAxMjM0NTY3ODlBQkNERUYiIFtjIC8gMTZdOwogICAgICAgICAgICAgICAgKihwKyspID0gIjAxMjM0NTY3ODlBQkNERUYiIFtjICUgMTZdOwogICAgICAgICAgICAgICAgayA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9jb3B5KCAmVCwgWCApICk7CgogICAgICAgIGlmKCBULnMgPT0gLTEgKQogICAgICAgICAgICBULnMgPSAxOwoKICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1waV93cml0ZV9obHAoICZULCByYWRpeCwgJnAsIGJ1ZmxlbiApICk7CiAgICB9CgogICAgKnArKyA9ICdcMCc7CiAgICAqb2xlbiA9IHAgLSBidWY7CgpjbGVhbnVwOgoKICAgIG1iZWR0bHNfbXBpX2ZyZWUoICZUICk7CgogICAgcmV0dXJuKCByZXQgKTsKfQoKI2lmIGRlZmluZWQoTUJFRFRMU19GU19JTykKLyoKICogUmVhZCBYIGZyb20gYW4gb3BlbmVkIGZpbGUKICovCmludCBtYmVkdGxzX21waV9yZWFkX2ZpbGUoIG1iZWR0bHNfbXBpICpYLCBpbnQgcmFkaXgsIEZJTEUgKmZpbiApCnsKICAgIG1iZWR0bHNfbXBpX3VpbnQgZDsKICAgIHNpemVfdCBzbGVuOwogICAgY2hhciAqcDsKICAgIC8qCiAgICAgKiBCdWZmZXIgc2hvdWxkIGhhdmUgc3BhY2UgZm9yIChzaG9ydCkgbGFiZWwgYW5kIGRlY2ltYWwgZm9ybWF0dGVkIE1QSSwKICAgICAqIG5ld2xpbmUgY2hhcmFjdGVycyBhbmQgJ1wwJwogICAgICovCiAgICBjaGFyIHNbIE1CRURUTFNfTVBJX1JXX0JVRkZFUl9TSVpFIF07CgogICAgTVBJX1ZBTElEQVRFX1JFVCggWCAgICE9IE5VTEwgKTsKICAgIE1QSV9WQUxJREFURV9SRVQoIGZpbiAhPSBOVUxMICk7CgogICAgaWYoIHJhZGl4IDwgMiB8fCByYWRpeCA+IDE2ICkKICAgICAgICByZXR1cm4oIE1CRURUTFNfRVJSX01QSV9CQURfSU5QVVRfREFUQSApOwoKICAgIG1lbXNldCggcywgMCwgc2l6ZW9mKCBzICkgKTsKICAgIGlmKCBmZ2V0cyggcywgc2l6ZW9mKCBzICkgLSAxLCBmaW4gKSA9PSBOVUxMICkKICAgICAgICByZXR1cm4oIE1CRURUTFNfRVJSX01QSV9GSUxFX0lPX0VSUk9SICk7CgogICAgc2xlbiA9IHN0cmxlbiggcyApOwogICAgaWYoIHNsZW4gPT0gc2l6ZW9mKCBzICkgLSAyICkKICAgICAgICByZXR1cm4oIE1CRURUTFNfRVJSX01QSV9CVUZGRVJfVE9PX1NNQUxMICk7CgogICAgaWYoIHNsZW4gPiAwICYmIHNbc2xlbiAtIDFdID09ICdcbicgKSB7IHNsZW4tLTsgc1tzbGVuXSA9ICdcMCc7IH0KICAgIGlmKCBzbGVuID4gMCAmJiBzW3NsZW4gLSAxXSA9PSAnXHInICkgeyBzbGVuLS07IHNbc2xlbl0gPSAnXDAnOyB9CgogICAgcCA9IHMgKyBzbGVuOwogICAgd2hpbGUoIHAtLSA+IHMgKQogICAgICAgIGlmKCBtcGlfZ2V0X2RpZ2l0KCAmZCwgcmFkaXgsICpwICkgIT0gMCApCiAgICAgICAgICAgIGJyZWFrOwoKICAgIHJldHVybiggbWJlZHRsc19tcGlfcmVhZF9zdHJpbmcoIFgsIHJhZGl4LCBwICsgMSApICk7Cn0KCi8qCiAqIFdyaXRlIFggaW50byBhbiBvcGVuZWQgZmlsZSAob3Igc3Rkb3V0IGlmIGZvdXQgPT0gTlVMTCkKICovCmludCBtYmVkdGxzX21waV93cml0ZV9maWxlKCBjb25zdCBjaGFyICpwLCBjb25zdCBtYmVkdGxzX21waSAqWCwgaW50IHJhZGl4LCBGSUxFICpmb3V0ICkKewogICAgaW50IHJldDsKICAgIHNpemVfdCBuLCBzbGVuLCBwbGVuOwogICAgLyoKICAgICAqIEJ1ZmZlciBzaG91bGQgaGF2ZSBzcGFjZSBmb3IgKHNob3J0KSBsYWJlbCBhbmQgZGVjaW1hbCBmb3JtYXR0ZWQgTVBJLAogICAgICogbmV3bGluZSBjaGFyYWN0ZXJzIGFuZCAnXDAnCiAgICAgKi8KICAgIGNoYXIgc1sgTUJFRFRMU19NUElfUldfQlVGRkVSX1NJWkUgXTsKICAgIE1QSV9WQUxJREFURV9SRVQoIFggIT0gTlVMTCApOwoKICAgIGlmKCByYWRpeCA8IDIgfHwgcmFkaXggPiAxNiApCiAgICAgICAgcmV0dXJuKCBNQkVEVExTX0VSUl9NUElfQkFEX0lOUFVUX0RBVEEgKTsKCiAgICBtZW1zZXQoIHMsIDAsIHNpemVvZiggcyApICk7CgogICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV93cml0ZV9zdHJpbmcoIFgsIHJhZGl4LCBzLCBzaXplb2YoIHMgKSAtIDIsICZuICkgKTsKCiAgICBpZiggcCA9PSBOVUxMICkgcCA9ICIiOwoKICAgIHBsZW4gPSBzdHJsZW4oIHAgKTsKICAgIHNsZW4gPSBzdHJsZW4oIHMgKTsKICAgIHNbc2xlbisrXSA9ICdccic7CiAgICBzW3NsZW4rK10gPSAnXG4nOwoKICAgIGlmKCBmb3V0ICE9IE5VTEwgKQogICAgewogICAgICAgIGlmKCBmd3JpdGUoIHAsIDEsIHBsZW4sIGZvdXQgKSAhPSBwbGVuIHx8CiAgICAgICAgICAgIGZ3cml0ZSggcywgMSwgc2xlbiwgZm91dCApICE9IHNsZW4gKQogICAgICAgICAgICByZXR1cm4oIE1CRURUTFNfRVJSX01QSV9GSUxFX0lPX0VSUk9SICk7CiAgICB9CiAgICBlbHNlCiAgICAgICAgbWJlZHRsc19wcmludGYoICIlcyVzIiwgcCwgcyApOwoKY2xlYW51cDoKCiAgICByZXR1cm4oIHJldCApOwp9CiNlbmRpZiAvKiBNQkVEVExTX0ZTX0lPICovCgoKLyogQ29udmVydCBhIGJpZy1lbmRpYW4gYnl0ZSBhcnJheSBhbGlnbmVkIHRvIHRoZSBzaXplIG9mIG1iZWR0bHNfbXBpX3VpbnQKICogaW50byB0aGUgc3RvcmFnZSBmb3JtIHVzZWQgYnkgbWJlZHRsc19tcGkuICovCgpzdGF0aWMgbWJlZHRsc19tcGlfdWludCBtcGlfdWludF9iaWdlbmRpYW5fdG9faG9zdF9jKCBtYmVkdGxzX21waV91aW50IHggKQp7CiAgICB1aW50OF90IGk7CiAgICBtYmVkdGxzX21waV91aW50IHRtcCA9IDA7CiAgICAvKiBUaGlzIHdvcmtzIHJlZ2FyZGxlc3Mgb2YgdGhlIGVuZGlhbm5lc3MuICovCiAgICBmb3IoIGkgPSAwOyBpIDwgY2lMOyBpKyssIHggPj49IDggKQogICAgICAgIHRtcCB8PSAoIHggJiAweEZGICkgPDwgKCAoIGNpTCAtIDEgLSBpICkgPDwgMyApOwogICAgcmV0dXJuKCB0bXAgKTsKfQoKc3RhdGljIG1iZWR0bHNfbXBpX3VpbnQgbXBpX3VpbnRfYmlnZW5kaWFuX3RvX2hvc3QoIG1iZWR0bHNfbXBpX3VpbnQgeCApCnsKI2lmIGRlZmluZWQoX19CWVRFX09SREVSX18pCgovKiBOb3RoaW5nIHRvIGRvIG9uIGJpZ2VuZGlhbiBzeXN0ZW1zLiAqLwojaWYgKCBfX0JZVEVfT1JERVJfXyA9PSBfX09SREVSX0JJR19FTkRJQU5fXyApCiAgICByZXR1cm4oIHggKTsKI2VuZGlmIC8qIF9fQllURV9PUkRFUl9fID09IF9fT1JERVJfQklHX0VORElBTl9fICovCgojaWYgKCBfX0JZVEVfT1JERVJfXyA9PSBfX09SREVSX0xJVFRMRV9FTkRJQU5fXyApCgovKiBGb3IgR0NDIGFuZCBDbGFuZywgaGF2ZSBidWlsdGlucyBmb3IgYnl0ZSBzd2FwcGluZy4gKi8KI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19HTlVDX1BSRVJFUSkKI2lmIF9fR05VQ19QUkVSRVEoNCwzKQojZGVmaW5lIGhhdmVfYnN3YXAKI2VuZGlmCiNlbmRpZgoKI2lmIGRlZmluZWQoX19jbGFuZ19fKSAmJiBkZWZpbmVkKF9faGFzX2J1aWx0aW4pCiNpZiBfX2hhc19idWlsdGluKF9fYnVpbHRpbl9ic3dhcDMyKSAgJiYgICAgICAgICAgICAgICAgIFwKICAgIF9faGFzX2J1aWx0aW4oX19idWlsdGluX2Jzd2FwNjQpCiNkZWZpbmUgaGF2ZV9ic3dhcAojZW5kaWYKI2VuZGlmCgojaWYgZGVmaW5lZChoYXZlX2Jzd2FwKQogICAgLyogVGhlIGNvbXBpbGVyIGlzIGhvcGVmdWxseSBhYmxlIHRvIHN0YXRpY2FsbHkgZXZhbHVhdGUgdGhpcyEgKi8KICAgIHN3aXRjaCggc2l6ZW9mKG1iZWR0bHNfbXBpX3VpbnQpICkKICAgIHsKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgIHJldHVybiggX19idWlsdGluX2Jzd2FwMzIoeCkgKTsKICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgIHJldHVybiggX19idWlsdGluX2Jzd2FwNjQoeCkgKTsKICAgIH0KI2VuZGlmCiNlbmRpZiAvKiBfX0JZVEVfT1JERVJfXyA9PSBfX09SREVSX0xJVFRMRV9FTkRJQU5fXyAqLwojZW5kaWYgLyogX19CWVRFX09SREVSX18gKi8KCiAgICAvKiBGYWxsIGJhY2sgdG8gQy1iYXNlZCByZW9yZGVyaW5nIGlmIHdlIGRvbid0IGtub3cgdGhlIGJ5dGUgb3JkZXIKICAgICAqIG9yIHdlIGNvdWxkbid0IHVzZSBhIGNvbXBpbGVyLXNwZWNpZmljIGJ1aWx0aW4uICovCiAgICByZXR1cm4oIG1waV91aW50X2JpZ2VuZGlhbl90b19ob3N0X2MoIHggKSApOwp9CgpzdGF0aWMgdm9pZCBtcGlfYmlnZW5kaWFuX3RvX2hvc3QoIG1iZWR0bHNfbXBpX3VpbnQgKiBjb25zdCBwLCBzaXplX3QgbGltYnMgKQp7CiAgICBtYmVkdGxzX21waV91aW50ICpjdXJfbGltYl9sZWZ0OwogICAgbWJlZHRsc19tcGlfdWludCAqY3VyX2xpbWJfcmlnaHQ7CiAgICBpZiggbGltYnMgPT0gMCApCiAgICAgICAgcmV0dXJuOwoKICAgIC8qCiAgICAgKiBUcmF2ZXJzZSBsaW1icyBhbmQKICAgICAqIC0gYWRhcHQgYnl0ZS1vcmRlciBpbiBlYWNoIGxpbWIKICAgICAqIC0gc3dhcCB0aGUgbGltYnMgdGhlbXNlbHZlcy4KICAgICAqIEZvciB0aGF0LCBzaW11bHRhbmVvdXNseSB0cmF2ZXJzZSB0aGUgbGltYnMgZnJvbSBsZWZ0IHRvIHJpZ2h0CiAgICAgKiBhbmQgZnJvbSByaWdodCB0byBsZWZ0LCBhcyBsb25nIGFzIHRoZSBsZWZ0IGluZGV4IGlzIG5vdCBiaWdnZXIKICAgICAqIHRoYW4gdGhlIHJpZ2h0IGluZGV4IChpdCdzIG5vdCBhIHByb2JsZW0gaWYgbGltYnMgaXMgb2RkIGFuZCB0aGUKICAgICAqIGluZGljZXMgY29pbmNpZGUgaW4gdGhlIGxhc3QgaXRlcmF0aW9uKS4KICAgICAqLwogICAgZm9yKCBjdXJfbGltYl9sZWZ0ID0gcCwgY3VyX2xpbWJfcmlnaHQgPSBwICsgKCBsaW1icyAtIDEgKTsKICAgICAgICAgY3VyX2xpbWJfbGVmdCA8PSBjdXJfbGltYl9yaWdodDsKICAgICAgICAgY3VyX2xpbWJfbGVmdCsrLCBjdXJfbGltYl9yaWdodC0tICkKICAgIHsKICAgICAgICBtYmVkdGxzX21waV91aW50IHRtcDsKICAgICAgICAvKiBOb3RlIHRoYXQgaWYgY3VyX2xpbWJfbGVmdCA9PSBjdXJfbGltYl9yaWdodCwKICAgICAgICAgKiB0aGlzIGNvZGUgZWZmZWN0aXZlbHkgc3dhcHMgdGhlIGJ5dGVzIG9ubHkgb25jZS4gKi8KICAgICAgICB0bXAgICAgICAgICAgICAgPSBtcGlfdWludF9iaWdlbmRpYW5fdG9faG9zdCggKmN1cl9saW1iX2xlZnQgICk7CiAgICAgICAgKmN1cl9saW1iX2xlZnQgID0gbXBpX3VpbnRfYmlnZW5kaWFuX3RvX2hvc3QoICpjdXJfbGltYl9yaWdodCApOwogICAgICAgICpjdXJfbGltYl9yaWdodCA9IHRtcDsKICAgIH0KfQoKLyoKICogSW1wb3J0IFggZnJvbSB1bnNpZ25lZCBiaW5hcnkgZGF0YSwgYmlnIGVuZGlhbgogKi8KaW50IG1iZWR0bHNfbXBpX3JlYWRfYmluYXJ5KCBtYmVkdGxzX21waSAqWCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuICkKewogICAgaW50IHJldDsKICAgIHNpemVfdCBjb25zdCBsaW1icyAgICA9IENIQVJTX1RPX0xJTUJTKCBidWZsZW4gKTsKICAgIHNpemVfdCBjb25zdCBvdmVyaGVhZCA9ICggbGltYnMgKiBjaUwgKSAtIGJ1ZmxlbjsKICAgIHVuc2lnbmVkIGNoYXIgKlhwOwoKICAgIE1QSV9WQUxJREFURV9SRVQoIFggIT0gTlVMTCApOwogICAgTVBJX1ZBTElEQVRFX1JFVCggYnVmbGVuID09IDAgfHwgYnVmICE9IE5VTEwgKTsKCiAgICAvKiBFbnN1cmUgdGhhdCB0YXJnZXQgTVBJIGhhcyBleGFjdGx5IHRoZSBuZWNlc3NhcnkgbnVtYmVyIG9mIGxpbWJzICovCiAgICBpZiggWC0+biAhPSBsaW1icyApCiAgICB7CiAgICAgICAgbWJlZHRsc19tcGlfZnJlZSggWCApOwogICAgICAgIG1iZWR0bHNfbXBpX2luaXQoIFggKTsKICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX2dyb3coIFgsIGxpbWJzICkgKTsKICAgIH0KICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfbHNldCggWCwgMCApICk7CgogICAgLyogQXZvaWQgY2FsbGluZyBgbWVtY3B5YCB3aXRoIE5VTEwgc291cmNlIGFyZ3VtZW50LAogICAgICogZXZlbiBpZiBidWZsZW4gaXMgMC4gKi8KICAgIGlmKCBidWYgIT0gTlVMTCApCiAgICB7CiAgICAgICAgWHAgPSAodW5zaWduZWQgY2hhciopIFgtPnA7CiAgICAgICAgbWVtY3B5KCBYcCArIG92ZXJoZWFkLCBidWYsIGJ1ZmxlbiApOwoKICAgICAgICBtcGlfYmlnZW5kaWFuX3RvX2hvc3QoIFgtPnAsIGxpbWJzICk7CiAgICB9CgpjbGVhbnVwOgoKICAgIHJldHVybiggcmV0ICk7Cn0KCi8qCiAqIEV4cG9ydCBYIGludG8gdW5zaWduZWQgYmluYXJ5IGRhdGEsIGJpZyBlbmRpYW4KICovCmludCBtYmVkdGxzX21waV93cml0ZV9iaW5hcnkoIGNvbnN0IG1iZWR0bHNfbXBpICpYLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4gKQp7CiAgICBzaXplX3Qgc3RvcmVkX2J5dGVzOwogICAgc2l6ZV90IGJ5dGVzX3RvX2NvcHk7CiAgICB1bnNpZ25lZCBjaGFyICpwOwogICAgc2l6ZV90IGk7CgogICAgTVBJX1ZBTElEQVRFX1JFVCggWCAhPSBOVUxMICk7CiAgICBNUElfVkFMSURBVEVfUkVUKCBidWZsZW4gPT0gMCB8fCBidWYgIT0gTlVMTCApOwoKICAgIHN0b3JlZF9ieXRlcyA9IFgtPm4gKiBjaUw7CgogICAgaWYoIHN0b3JlZF9ieXRlcyA8IGJ1ZmxlbiApCiAgICB7CiAgICAgICAgLyogVGhlcmUgaXMgZW5vdWdoIHNwYWNlIGluIHRoZSBvdXRwdXQgYnVmZmVyLiBXcml0ZSBpbml0aWFsCiAgICAgICAgICogbnVsbCBieXRlcyBhbmQgcmVjb3JkIHRoZSBwb3NpdGlvbiBhdCB3aGljaCB0byBzdGFydAogICAgICAgICAqIHdyaXRpbmcgdGhlIHNpZ25pZmljYW50IGJ5dGVzLiBJbiB0aGlzIGNhc2UsIHRoZSBleGVjdXRpb24KICAgICAgICAgKiB0cmFjZSBvZiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgdmFsdWUgb2YgdGhlCiAgICAgICAgICogbnVtYmVyLiAqLwogICAgICAgIGJ5dGVzX3RvX2NvcHkgPSBzdG9yZWRfYnl0ZXM7CiAgICAgICAgcCA9IGJ1ZiArIGJ1ZmxlbiAtIHN0b3JlZF9ieXRlczsKICAgICAgICBtZW1zZXQoIGJ1ZiwgMCwgYnVmbGVuIC0gc3RvcmVkX2J5dGVzICk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgLyogVGhlIG91dHB1dCBidWZmZXIgaXMgc21hbGxlciB0aGFuIHRoZSBhbGxvY2F0ZWQgc2l6ZSBvZiBYLgogICAgICAgICAqIEhvd2V2ZXIgWCBtYXkgZml0IGlmIGl0cyBsZWFkaW5nIGJ5dGVzIGFyZSB6ZXJvLiAqLwogICAgICAgIGJ5dGVzX3RvX2NvcHkgPSBidWZsZW47CiAgICAgICAgcCA9IGJ1ZjsKICAgICAgICBmb3IoIGkgPSBieXRlc190b19jb3B5OyBpIDwgc3RvcmVkX2J5dGVzOyBpKysgKQogICAgICAgIHsKICAgICAgICAgICAgaWYoIEdFVF9CWVRFKCBYLCBpICkgIT0gMCApCiAgICAgICAgICAgICAgICByZXR1cm4oIE1CRURUTFNfRVJSX01QSV9CVUZGRVJfVE9PX1NNQUxMICk7CiAgICAgICAgfQogICAgfQoKICAgIGZvciggaSA9IDA7IGkgPCBieXRlc190b19jb3B5OyBpKysgKQogICAgICAgIHBbYnl0ZXNfdG9fY29weSAtIGkgLSAxXSA9IEdFVF9CWVRFKCBYLCBpICk7CgogICAgcmV0dXJuKCAwICk7Cn0KCi8qCiAqIExlZnQtc2hpZnQ6IFggPDw9IGNvdW50CiAqLwppbnQgbWJlZHRsc19tcGlfc2hpZnRfbCggbWJlZHRsc19tcGkgKlgsIHNpemVfdCBjb3VudCApCnsKICAgIGludCByZXQ7CiAgICBzaXplX3QgaSwgdjAsIHQxOwogICAgbWJlZHRsc19tcGlfdWludCByMCA9IDAsIHIxOwogICAgTVBJX1ZBTElEQVRFX1JFVCggWCAhPSBOVUxMICk7CgogICAgdjAgPSBjb3VudCAvIChiaUwgICAgKTsKICAgIHQxID0gY291bnQgJiAoYmlMIC0gMSk7CgogICAgaSA9IG1iZWR0bHNfbXBpX2JpdGxlbiggWCApICsgY291bnQ7CgogICAgaWYoIFgtPm4gKiBiaUwgPCBpICkKICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX2dyb3coIFgsIEJJVFNfVE9fTElNQlMoIGkgKSApICk7CgogICAgcmV0ID0gMDsKCiAgICAvKgogICAgICogc2hpZnQgYnkgY291bnQgLyBsaW1iX3NpemUKICAgICAqLwogICAgaWYoIHYwID4gMCApCiAgICB7CiAgICAgICAgZm9yKCBpID0gWC0+bjsgaSA+IHYwOyBpLS0gKQogICAgICAgICAgICBYLT5wW2kgLSAxXSA9IFgtPnBbaSAtIHYwIC0gMV07CgogICAgICAgIGZvciggOyBpID4gMDsgaS0tICkKICAgICAgICAgICAgWC0+cFtpIC0gMV0gPSAwOwogICAgfQoKICAgIC8qCiAgICAgKiBzaGlmdCBieSBjb3VudCAlIGxpbWJfc2l6ZQogICAgICovCiAgICBpZiggdDEgPiAwICkKICAgIHsKICAgICAgICBmb3IoIGkgPSB2MDsgaSA8IFgtPm47IGkrKyApCiAgICAgICAgewogICAgICAgICAgICByMSA9IFgtPnBbaV0gPj4gKGJpTCAtIHQxKTsKICAgICAgICAgICAgWC0+cFtpXSA8PD0gdDE7CiAgICAgICAgICAgIFgtPnBbaV0gfD0gcjA7CiAgICAgICAgICAgIHIwID0gcjE7CiAgICAgICAgfQogICAgfQoKY2xlYW51cDoKCiAgICByZXR1cm4oIHJldCApOwp9CgovKgogKiBSaWdodC1zaGlmdDogWCA+Pj0gY291bnQKICovCmludCBtYmVkdGxzX21waV9zaGlmdF9yKCBtYmVkdGxzX21waSAqWCwgc2l6ZV90IGNvdW50ICkKewogICAgc2l6ZV90IGksIHYwLCB2MTsKICAgIG1iZWR0bHNfbXBpX3VpbnQgcjAgPSAwLCByMTsKICAgIE1QSV9WQUxJREFURV9SRVQoIFggIT0gTlVMTCApOwoKICAgIHYwID0gY291bnQgLyAgYmlMOwogICAgdjEgPSBjb3VudCAmIChiaUwgLSAxKTsKCiAgICBpZiggdjAgPiBYLT5uIHx8ICggdjAgPT0gWC0+biAmJiB2MSA+IDAgKSApCiAgICAgICAgcmV0dXJuIG1iZWR0bHNfbXBpX2xzZXQoIFgsIDAgKTsKCiAgICAvKgogICAgICogc2hpZnQgYnkgY291bnQgLyBsaW1iX3NpemUKICAgICAqLwogICAgaWYoIHYwID4gMCApCiAgICB7CiAgICAgICAgZm9yKCBpID0gMDsgaSA8IFgtPm4gLSB2MDsgaSsrICkKICAgICAgICAgICAgWC0+cFtpXSA9IFgtPnBbaSArIHYwXTsKCiAgICAgICAgZm9yKCA7IGkgPCBYLT5uOyBpKysgKQogICAgICAgICAgICBYLT5wW2ldID0gMDsKICAgIH0KCiAgICAvKgogICAgICogc2hpZnQgYnkgY291bnQgJSBsaW1iX3NpemUKICAgICAqLwogICAgaWYoIHYxID4gMCApCiAgICB7CiAgICAgICAgZm9yKCBpID0gWC0+bjsgaSA+IDA7IGktLSApCiAgICAgICAgewogICAgICAgICAgICByMSA9IFgtPnBbaSAtIDFdIDw8IChiaUwgLSB2MSk7CiAgICAgICAgICAgIFgtPnBbaSAtIDFdID4+PSB2MTsKICAgICAgICAgICAgWC0+cFtpIC0gMV0gfD0gcjA7CiAgICAgICAgICAgIHIwID0gcjE7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiggMCApOwp9CgovKgogKiBDb21wYXJlIHVuc2lnbmVkIHZhbHVlcwogKi8KaW50IG1iZWR0bHNfbXBpX2NtcF9hYnMoIGNvbnN0IG1iZWR0bHNfbXBpICpYLCBjb25zdCBtYmVkdGxzX21waSAqWSApCnsKICAgIHNpemVfdCBpLCBqOwogICAgTVBJX1ZBTElEQVRFX1JFVCggWCAhPSBOVUxMICk7CiAgICBNUElfVkFMSURBVEVfUkVUKCBZICE9IE5VTEwgKTsKCiAgICBmb3IoIGkgPSBYLT5uOyBpID4gMDsgaS0tICkKICAgICAgICBpZiggWC0+cFtpIC0gMV0gIT0gMCApCiAgICAgICAgICAgIGJyZWFrOwoKICAgIGZvciggaiA9IFktPm47IGogPiAwOyBqLS0gKQogICAgICAgIGlmKCBZLT5wW2ogLSAxXSAhPSAwICkKICAgICAgICAgICAgYnJlYWs7CgogICAgaWYoIGkgPT0gMCAmJiBqID09IDAgKQogICAgICAgIHJldHVybiggMCApOwoKICAgIGlmKCBpID4gaiApIHJldHVybiggIDEgKTsKICAgIGlmKCBqID4gaSApIHJldHVybiggLTEgKTsKCiAgICBmb3IoIDsgaSA+IDA7IGktLSApCiAgICB7CiAgICAgICAgaWYoIFgtPnBbaSAtIDFdID4gWS0+cFtpIC0gMV0gKSByZXR1cm4oICAxICk7CiAgICAgICAgaWYoIFgtPnBbaSAtIDFdIDwgWS0+cFtpIC0gMV0gKSByZXR1cm4oIC0xICk7CiAgICB9CgogICAgcmV0dXJuKCAwICk7Cn0KCi8qCiAqIENvbXBhcmUgc2lnbmVkIHZhbHVlcwogKi8KaW50IG1iZWR0bHNfbXBpX2NtcF9tcGkoIGNvbnN0IG1iZWR0bHNfbXBpICpYLCBjb25zdCBtYmVkdGxzX21waSAqWSApCnsKICAgIHNpemVfdCBpLCBqOwogICAgTVBJX1ZBTElEQVRFX1JFVCggWCAhPSBOVUxMICk7CiAgICBNUElfVkFMSURBVEVfUkVUKCBZICE9IE5VTEwgKTsKCiAgICBmb3IoIGkgPSBYLT5uOyBpID4gMDsgaS0tICkKICAgICAgICBpZiggWC0+cFtpIC0gMV0gIT0gMCApCiAgICAgICAgICAgIGJyZWFrOwoKICAgIGZvciggaiA9IFktPm47IGogPiAwOyBqLS0gKQogICAgICAgIGlmKCBZLT5wW2ogLSAxXSAhPSAwICkKICAgICAgICAgICAgYnJlYWs7CgogICAgaWYoIGkgPT0gMCAmJiBqID09IDAgKQogICAgICAgIHJldHVybiggMCApOwoKICAgIGlmKCBpID4gaiApIHJldHVybiggIFgtPnMgKTsKICAgIGlmKCBqID4gaSApIHJldHVybiggLVktPnMgKTsKCiAgICBpZiggWC0+cyA+IDAgJiYgWS0+cyA8IDAgKSByZXR1cm4oICAxICk7CiAgICBpZiggWS0+cyA+IDAgJiYgWC0+cyA8IDAgKSByZXR1cm4oIC0xICk7CgogICAgZm9yKCA7IGkgPiAwOyBpLS0gKQogICAgewogICAgICAgIGlmKCBYLT5wW2kgLSAxXSA+IFktPnBbaSAtIDFdICkgcmV0dXJuKCAgWC0+cyApOwogICAgICAgIGlmKCBYLT5wW2kgLSAxXSA8IFktPnBbaSAtIDFdICkgcmV0dXJuKCAtWC0+cyApOwogICAgfQoKICAgIHJldHVybiggMCApOwp9CgovKgogKiBDb21wYXJlIHNpZ25lZCB2YWx1ZXMKICovCmludCBtYmVkdGxzX21waV9jbXBfaW50KCBjb25zdCBtYmVkdGxzX21waSAqWCwgbWJlZHRsc19tcGlfc2ludCB6ICkKewogICAgbWJlZHRsc19tcGkgWTsKICAgIG1iZWR0bHNfbXBpX3VpbnQgcFsxXTsKICAgIE1QSV9WQUxJREFURV9SRVQoIFggIT0gTlVMTCApOwoKICAgICpwICA9ICggeiA8IDAgKSA/IC16IDogejsKICAgIFkucyA9ICggeiA8IDAgKSA/IC0xIDogMTsKICAgIFkubiA9IDE7CiAgICBZLnAgPSBwOwoKICAgIHJldHVybiggbWJlZHRsc19tcGlfY21wX21waSggWCwgJlkgKSApOwp9CgovKgogKiBVbnNpZ25lZCBhZGRpdGlvbjogWCA9IHxBfCArIHxCfCAgKEhBQyAxNC43KQogKi8KI2lmIGRlZmluZWQoTUJFRFRMU19NUElfQUREX0FCU19BTFQpCmludCBtYmVkdGxzX21waV9hZGRfYWJzX29yaWcoIG1iZWR0bHNfbXBpICpYLCBjb25zdCBtYmVkdGxzX21waSAqQSwgY29uc3QgbWJlZHRsc19tcGkgKkIgKQojZWxzZQppbnQgbWJlZHRsc19tcGlfYWRkX2FicyggbWJlZHRsc19tcGkgKlgsIGNvbnN0IG1iZWR0bHNfbXBpICpBLCBjb25zdCBtYmVkdGxzX21waSAqQiApCiNlbmRpZiAvKiBNQkVEVExTX01QSV9BRERfQUJTX0FMVCAqLwp7CiAgICBpbnQgcmV0OwogICAgc2l6ZV90IGksIGo7CiAgICBtYmVkdGxzX21waV91aW50ICpvLCAqcCwgYywgdG1wOwogICAgTVBJX1ZBTElEQVRFX1JFVCggWCAhPSBOVUxMICk7CiAgICBNUElfVkFMSURBVEVfUkVUKCBBICE9IE5VTEwgKTsKICAgIE1QSV9WQUxJREFURV9SRVQoIEIgIT0gTlVMTCApOwoKICAgIGlmKCBYID09IEIgKQogICAgewogICAgICAgIGNvbnN0IG1iZWR0bHNfbXBpICpUID0gQTsgQSA9IFg7IEIgPSBUOwogICAgfQoKICAgIGlmKCBYICE9IEEgKQogICAgICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfY29weSggWCwgQSApICk7CgogICAgLyoKICAgICAqIFggc2hvdWxkIGFsd2F5cyBiZSBwb3NpdGl2ZSBhcyBhIHJlc3VsdCBvZiB1bnNpZ25lZCBhZGRpdGlvbnMuCiAgICAgKi8KICAgIFgtPnMgPSAxOwoKICAgIGZvciggaiA9IEItPm47IGogPiAwOyBqLS0gKQogICAgICAgIGlmKCBCLT5wW2ogLSAxXSAhPSAwICkKICAgICAgICAgICAgYnJlYWs7CgogICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9ncm93KCBYLCBqICkgKTsKCiAgICBvID0gQi0+cDsgcCA9IFgtPnA7IGMgPSAwOwoKICAgIC8qCiAgICAgKiB0bXAgaXMgdXNlZCBiZWNhdXNlIGl0IG1pZ2h0IGhhcHBlbiB0aGF0IHAgPT0gbwogICAgICovCiAgICBmb3IoIGkgPSAwOyBpIDwgajsgaSsrLCBvKyssIHArKyApCiAgICB7CiAgICAgICAgdG1wPSAqbzsKICAgICAgICAqcCArPSAgYzsgYyAgPSAoICpwIDwgIGMgKTsKICAgICAgICAqcCArPSB0bXA7IGMgKz0gKCAqcCA8IHRtcCApOwogICAgfQoKICAgIHdoaWxlKCBjICE9IDAgKQogICAgewogICAgICAgIGlmKCBpID49IFgtPm4gKQogICAgICAgIHsKICAgICAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9ncm93KCBYLCBpICsgMSApICk7CiAgICAgICAgICAgIHAgPSBYLT5wICsgaTsKICAgICAgICB9CgogICAgICAgICpwICs9IGM7IGMgPSAoICpwIDwgYyApOyBpKys7IHArKzsKICAgIH0KCmNsZWFudXA6CgogICAgcmV0dXJuKCByZXQgKTsKfQoKLyoKICogSGVscGVyIGZvciBtYmVkdGxzX21waSBzdWJ0cmFjdGlvbgogKi8Kc3RhdGljIHZvaWQgbXBpX3N1Yl9obHAoIHNpemVfdCBuLCBtYmVkdGxzX21waV91aW50ICpzLCBtYmVkdGxzX21waV91aW50ICpkICkKewogICAgc2l6ZV90IGk7CiAgICBtYmVkdGxzX21waV91aW50IGMsIHo7CgogICAgZm9yKCBpID0gYyA9IDA7IGkgPCBuOyBpKyssIHMrKywgZCsrICkKICAgIHsKICAgICAgICB6ID0gKCAqZCA8ICBjICk7ICAgICAqZCAtPSAgYzsKICAgICAgICBjID0gKCAqZCA8ICpzICkgKyB6OyAqZCAtPSAqczsKICAgIH0KCiAgICB3aGlsZSggYyAhPSAwICkKICAgIHsKICAgICAgICB6ID0gKCAqZCA8IGMgKTsgKmQgLT0gYzsKICAgICAgICBjID0gejsgZCsrOwogICAgfQp9CgovKgogKiBVbnNpZ25lZCBzdWJ0cmFjdGlvbjogWCA9IHxBfCAtIHxCfCAgKEhBQyAxNC45KQogKi8KI2lmIGRlZmluZWQoTUJFRFRMU19NUElfU1VCX0FCU19BTFQpCmludCBtYmVkdGxzX21waV9zdWJfYWJzX29yaWcoIG1iZWR0bHNfbXBpICpYLCBjb25zdCBtYmVkdGxzX21waSAqQSwgY29uc3QgbWJlZHRsc19tcGkgKkIgKQojZWxzZQppbnQgbWJlZHRsc19tcGlfc3ViX2FicyggbWJlZHRsc19tcGkgKlgsIGNvbnN0IG1iZWR0bHNfbXBpICpBLCBjb25zdCBtYmVkdGxzX21waSAqQiApCiNlbmRpZiAvKiBNQkVEVExTX01QSV9TVUJfQUJTX0FMVCAqLwp7CiAgICBtYmVkdGxzX21waSBUQjsKICAgIGludCByZXQ7CiAgICBzaXplX3QgbjsKICAgIE1QSV9WQUxJREFURV9SRVQoIFggIT0gTlVMTCApOwogICAgTVBJX1ZBTElEQVRFX1JFVCggQSAhPSBOVUxMICk7CiAgICBNUElfVkFMSURBVEVfUkVUKCBCICE9IE5VTEwgKTsKCiAgICBpZiggbWJlZHRsc19tcGlfY21wX2FicyggQSwgQiApIDwgMCApCiAgICAgICAgcmV0dXJuKCBNQkVEVExTX0VSUl9NUElfTkVHQVRJVkVfVkFMVUUgKTsKCiAgICBtYmVkdGxzX21waV9pbml0KCAmVEIgKTsKCiAgICBpZiggWCA9PSBCICkKICAgIHsKICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX2NvcHkoICZUQiwgQiApICk7CiAgICAgICAgQiA9ICZUQjsKICAgIH0KCiAgICBpZiggWCAhPSBBICkKICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX2NvcHkoIFgsIEEgKSApOwoKICAgIC8qCiAgICAgKiBYIHNob3VsZCBhbHdheXMgYmUgcG9zaXRpdmUgYXMgYSByZXN1bHQgb2YgdW5zaWduZWQgc3VidHJhY3Rpb25zLgogICAgICovCiAgICBYLT5zID0gMTsKCiAgICByZXQgPSAwOwoKICAgIGZvciggbiA9IEItPm47IG4gPiAwOyBuLS0gKQogICAgICAgIGlmKCBCLT5wW24gLSAxXSAhPSAwICkKICAgICAgICAgICAgYnJlYWs7CgogICAgbXBpX3N1Yl9obHAoIG4sIEItPnAsIFgtPnAgKTsKCmNsZWFudXA6CgogICAgbWJlZHRsc19tcGlfZnJlZSggJlRCICk7CgogICAgcmV0dXJuKCByZXQgKTsKfQoKLyoKICogU2lnbmVkIGFkZGl0aW9uOiBYID0gQSArIEIKICovCmludCBtYmVkdGxzX21waV9hZGRfbXBpKCBtYmVkdGxzX21waSAqWCwgY29uc3QgbWJlZHRsc19tcGkgKkEsIGNvbnN0IG1iZWR0bHNfbXBpICpCICkKewogICAgaW50IHJldCwgczsKICAgIE1QSV9WQUxJREFURV9SRVQoIFggIT0gTlVMTCApOwogICAgTVBJX1ZBTElEQVRFX1JFVCggQSAhPSBOVUxMICk7CiAgICBNUElfVkFMSURBVEVfUkVUKCBCICE9IE5VTEwgKTsKCiAgICBzID0gQS0+czsKICAgIGlmKCBBLT5zICogQi0+cyA8IDAgKQogICAgewogICAgICAgIGlmKCBtYmVkdGxzX21waV9jbXBfYWJzKCBBLCBCICkgPj0gMCApCiAgICAgICAgewogICAgICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX3N1Yl9hYnMoIFgsIEEsIEIgKSApOwogICAgICAgICAgICBYLT5zID0gIHM7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfc3ViX2FicyggWCwgQiwgQSApICk7CiAgICAgICAgICAgIFgtPnMgPSAtczsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9hZGRfYWJzKCBYLCBBLCBCICkgKTsKICAgICAgICBYLT5zID0gczsKICAgIH0KCmNsZWFudXA6CgogICAgcmV0dXJuKCByZXQgKTsKfQoKLyoKICogU2lnbmVkIHN1YnRyYWN0aW9uOiBYID0gQSAtIEIKICovCmludCBtYmVkdGxzX21waV9zdWJfbXBpKCBtYmVkdGxzX21waSAqWCwgY29uc3QgbWJlZHRsc19tcGkgKkEsIGNvbnN0IG1iZWR0bHNfbXBpICpCICkKewogICAgaW50IHJldCwgczsKICAgIE1QSV9WQUxJREFURV9SRVQoIFggIT0gTlVMTCApOwogICAgTVBJX1ZBTElEQVRFX1JFVCggQSAhPSBOVUxMICk7CiAgICBNUElfVkFMSURBVEVfUkVUKCBCICE9IE5VTEwgKTsKCiAgICBzID0gQS0+czsKICAgIGlmKCBBLT5zICogQi0+cyA+IDAgKQogICAgewogICAgICAgIGlmKCBtYmVkdGxzX21waV9jbXBfYWJzKCBBLCBCICkgPj0gMCApCiAgICAgICAgewogICAgICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX3N1Yl9hYnMoIFgsIEEsIEIgKSApOwogICAgICAgICAgICBYLT5zID0gIHM7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfc3ViX2FicyggWCwgQiwgQSApICk7CiAgICAgICAgICAgIFgtPnMgPSAtczsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9hZGRfYWJzKCBYLCBBLCBCICkgKTsKICAgICAgICBYLT5zID0gczsKICAgIH0KCmNsZWFudXA6CgogICAgcmV0dXJuKCByZXQgKTsKfQoKLyoKICogU2lnbmVkIGFkZGl0aW9uOiBYID0gQSArIGIKICovCmludCBtYmVkdGxzX21waV9hZGRfaW50KCBtYmVkdGxzX21waSAqWCwgY29uc3QgbWJlZHRsc19tcGkgKkEsIG1iZWR0bHNfbXBpX3NpbnQgYiApCnsKICAgIG1iZWR0bHNfbXBpIF9COwogICAgbWJlZHRsc19tcGlfdWludCBwWzFdOwogICAgTVBJX1ZBTElEQVRFX1JFVCggWCAhPSBOVUxMICk7CiAgICBNUElfVkFMSURBVEVfUkVUKCBBICE9IE5VTEwgKTsKCiAgICBwWzBdID0gKCBiIDwgMCApID8gLWIgOiBiOwogICAgX0IucyA9ICggYiA8IDAgKSA/IC0xIDogMTsKICAgIF9CLm4gPSAxOwogICAgX0IucCA9IHA7CgogICAgcmV0dXJuKCBtYmVkdGxzX21waV9hZGRfbXBpKCBYLCBBLCAmX0IgKSApOwp9CgovKgogKiBTaWduZWQgc3VidHJhY3Rpb246IFggPSBBIC0gYgogKi8KaW50IG1iZWR0bHNfbXBpX3N1Yl9pbnQoIG1iZWR0bHNfbXBpICpYLCBjb25zdCBtYmVkdGxzX21waSAqQSwgbWJlZHRsc19tcGlfc2ludCBiICkKewogICAgbWJlZHRsc19tcGkgX0I7CiAgICBtYmVkdGxzX21waV91aW50IHBbMV07CiAgICBNUElfVkFMSURBVEVfUkVUKCBYICE9IE5VTEwgKTsKICAgIE1QSV9WQUxJREFURV9SRVQoIEEgIT0gTlVMTCApOwoKICAgIHBbMF0gPSAoIGIgPCAwICkgPyAtYiA6IGI7CiAgICBfQi5zID0gKCBiIDwgMCApID8gLTEgOiAxOwogICAgX0IubiA9IDE7CiAgICBfQi5wID0gcDsKCiAgICByZXR1cm4oIG1iZWR0bHNfbXBpX3N1Yl9tcGkoIFgsIEEsICZfQiApICk7Cn0KCi8qCiAqIEhlbHBlciBmb3IgbWJlZHRsc19tcGkgbXVsdGlwbGljYXRpb24KICovCnN0YXRpYwojaWYgZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoX19hcm1fXykKLyoKICogQXBwbGUgTExWTSB2ZXJzaW9uIDQuMiAoY2xhbmctNDI1LjAuMjQpIChiYXNlZCBvbiBMTFZNIDMuMnN2bikKICogYXBwZWFycyB0byBuZWVkIHRoaXMgdG8gcHJldmVudCBiYWQgQVJNIGNvZGUgZ2VuZXJhdGlvbiBhdCAtTzMuCiAqLwpfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKQojZW5kaWYKdm9pZCBtcGlfbXVsX2hscCggc2l6ZV90IGksIG1iZWR0bHNfbXBpX3VpbnQgKnMsIG1iZWR0bHNfbXBpX3VpbnQgKmQsIG1iZWR0bHNfbXBpX3VpbnQgYiApCnsKICAgIG1iZWR0bHNfbXBpX3VpbnQgYyA9IDAsIHQgPSAwOwoKI2lmIGRlZmluZWQoTVVMQUREQ19IVUlUKQogICAgZm9yKCA7IGkgPj0gODsgaSAtPSA4ICkKICAgIHsKICAgICAgICBNVUxBRERDX0lOSVQKICAgICAgICBNVUxBRERDX0hVSVQKICAgICAgICBNVUxBRERDX1NUT1AKICAgIH0KCiAgICBmb3IoIDsgaSA+IDA7IGktLSApCiAgICB7CiAgICAgICAgTVVMQUREQ19JTklUCiAgICAgICAgTVVMQUREQ19DT1JFCiAgICAgICAgTVVMQUREQ19TVE9QCiAgICB9CiNlbHNlIC8qIE1VTEFERENfSFVJVCAqLwogICAgZm9yKCA7IGkgPj0gMTY7IGkgLT0gMTYgKQogICAgewogICAgICAgIE1VTEFERENfSU5JVAogICAgICAgIE1VTEFERENfQ09SRSAgIE1VTEFERENfQ09SRQogICAgICAgIE1VTEFERENfQ09SRSAgIE1VTEFERENfQ09SRQogICAgICAgIE1VTEFERENfQ09SRSAgIE1VTEFERENfQ09SRQogICAgICAgIE1VTEFERENfQ09SRSAgIE1VTEFERENfQ09SRQoKICAgICAgICBNVUxBRERDX0NPUkUgICBNVUxBRERDX0NPUkUKICAgICAgICBNVUxBRERDX0NPUkUgICBNVUxBRERDX0NPUkUKICAgICAgICBNVUxBRERDX0NPUkUgICBNVUxBRERDX0NPUkUKICAgICAgICBNVUxBRERDX0NPUkUgICBNVUxBRERDX0NPUkUKICAgICAgICBNVUxBRERDX1NUT1AKICAgIH0KCiAgICBmb3IoIDsgaSA+PSA4OyBpIC09IDggKQogICAgewogICAgICAgIE1VTEFERENfSU5JVAogICAgICAgIE1VTEFERENfQ09SRSAgIE1VTEFERENfQ09SRQogICAgICAgIE1VTEFERENfQ09SRSAgIE1VTEFERENfQ09SRQoKICAgICAgICBNVUxBRERDX0NPUkUgICBNVUxBRERDX0NPUkUKICAgICAgICBNVUxBRERDX0NPUkUgICBNVUxBRERDX0NPUkUKICAgICAgICBNVUxBRERDX1NUT1AKICAgIH0KCiAgICBmb3IoIDsgaSA+IDA7IGktLSApCiAgICB7CiAgICAgICAgTVVMQUREQ19JTklUCiAgICAgICAgTVVMQUREQ19DT1JFCiAgICAgICAgTVVMQUREQ19TVE9QCiAgICB9CiNlbmRpZiAvKiBNVUxBRERDX0hVSVQgKi8KCiAgICB0Kys7CgogICAgZG8gewogICAgICAgICpkICs9IGM7IGMgPSAoICpkIDwgYyApOyBkKys7CiAgICB9CiAgICB3aGlsZSggYyAhPSAwICk7Cn0KCi8qCiAqIEJhc2VsaW5lIG11bHRpcGxpY2F0aW9uOiBYID0gQSAqIEIgIChIQUMgMTQuMTIpCiAqLwojaWYgZGVmaW5lZChNQkVEVExTX01QSV9NVUxfTVBJX0FMVCkKaW50IG1iZWR0bHNfbXBpX211bF9tcGlfb3JpZyggbWJlZHRsc19tcGkgKlgsIGNvbnN0IG1iZWR0bHNfbXBpICpBLCBjb25zdCBtYmVkdGxzX21waSAqQiApCiNlbHNlCmludCBtYmVkdGxzX21waV9tdWxfbXBpKCBtYmVkdGxzX21waSAqWCwgY29uc3QgbWJlZHRsc19tcGkgKkEsIGNvbnN0IG1iZWR0bHNfbXBpICpCICkKI2VuZGlmIC8qIE1CRURUTFNfTVBJX01VTF9NUElfQUxUICovCnsKICAgIGludCByZXQ7CiAgICBzaXplX3QgaSwgajsKICAgIG1iZWR0bHNfbXBpIFRBLCBUQjsKICAgIE1QSV9WQUxJREFURV9SRVQoIFggIT0gTlVMTCApOwogICAgTVBJX1ZBTElEQVRFX1JFVCggQSAhPSBOVUxMICk7CiAgICBNUElfVkFMSURBVEVfUkVUKCBCICE9IE5VTEwgKTsKCiAgICBtYmVkdGxzX21waV9pbml0KCAmVEEgKTsgbWJlZHRsc19tcGlfaW5pdCggJlRCICk7CgogICAgaWYoIFggPT0gQSApIHsgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9jb3B5KCAmVEEsIEEgKSApOyBBID0gJlRBOyB9CiAgICBpZiggWCA9PSBCICkgeyBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX2NvcHkoICZUQiwgQiApICk7IEIgPSAmVEI7IH0KCiAgICBmb3IoIGkgPSBBLT5uOyBpID4gMDsgaS0tICkKICAgICAgICBpZiggQS0+cFtpIC0gMV0gIT0gMCApCiAgICAgICAgICAgIGJyZWFrOwoKICAgIGZvciggaiA9IEItPm47IGogPiAwOyBqLS0gKQogICAgICAgIGlmKCBCLT5wW2ogLSAxXSAhPSAwICkKICAgICAgICAgICAgYnJlYWs7CgogICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9ncm93KCBYLCBpICsgaiApICk7CiAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX2xzZXQoIFgsIDAgKSApOwoKICAgIGZvciggOyBqID4gMDsgai0tICkKICAgICAgICBtcGlfbXVsX2hscCggaSwgQS0+cCwgWC0+cCArIGogLSAxLCBCLT5wW2ogLSAxXSApOwoKICAgIFgtPnMgPSBBLT5zICogQi0+czsKCmNsZWFudXA6CgogICAgbWJlZHRsc19tcGlfZnJlZSggJlRCICk7IG1iZWR0bHNfbXBpX2ZyZWUoICZUQSApOwoKICAgIHJldHVybiggcmV0ICk7Cn0KCi8qCiAqIEJhc2VsaW5lIG11bHRpcGxpY2F0aW9uOiBYID0gQSAqIGIKICovCmludCBtYmVkdGxzX21waV9tdWxfaW50KCBtYmVkdGxzX21waSAqWCwgY29uc3QgbWJlZHRsc19tcGkgKkEsIG1iZWR0bHNfbXBpX3VpbnQgYiApCnsKICAgIG1iZWR0bHNfbXBpIF9COwogICAgbWJlZHRsc19tcGlfdWludCBwWzFdOwogICAgTVBJX1ZBTElEQVRFX1JFVCggWCAhPSBOVUxMICk7CiAgICBNUElfVkFMSURBVEVfUkVUKCBBICE9IE5VTEwgKTsKCiAgICBfQi5zID0gMTsKICAgIF9CLm4gPSAxOwogICAgX0IucCA9IHA7CiAgICBwWzBdID0gYjsKCiAgICByZXR1cm4oIG1iZWR0bHNfbXBpX211bF9tcGkoIFgsIEEsICZfQiApICk7Cn0KCi8qCiAqIFVuc2lnbmVkIGludGVnZXIgZGl2aWRlIC0gZG91YmxlIG1iZWR0bHNfbXBpX3VpbnQgZGl2aWRlbmQsIHUxL3UwLCBhbmQKICogbWJlZHRsc19tcGlfdWludCBkaXZpc29yLCBkCiAqLwpzdGF0aWMgbWJlZHRsc19tcGlfdWludCBtYmVkdGxzX2ludF9kaXZfaW50KCBtYmVkdGxzX21waV91aW50IHUxLAogICAgICAgICAgICBtYmVkdGxzX21waV91aW50IHUwLCBtYmVkdGxzX21waV91aW50IGQsIG1iZWR0bHNfbXBpX3VpbnQgKnIgKQp7CiNpZiBkZWZpbmVkKE1CRURUTFNfSEFWRV9VREJMKQogICAgbWJlZHRsc190X3VkYmwgZGl2aWRlbmQsIHF1b3RpZW50OwojZWxzZQogICAgY29uc3QgbWJlZHRsc19tcGlfdWludCByYWRpeCA9IChtYmVkdGxzX21waV91aW50KSAxIDw8IGJpSDsKICAgIGNvbnN0IG1iZWR0bHNfbXBpX3VpbnQgdWludF9oYWxmd29yZF9tYXNrID0gKCAobWJlZHRsc19tcGlfdWludCkgMSA8PCBiaUggKSAtIDE7CiAgICBtYmVkdGxzX21waV91aW50IGQwLCBkMSwgcTAsIHExLCByQVgsIHIwLCBxdW90aWVudDsKICAgIG1iZWR0bHNfbXBpX3VpbnQgdTBfbXN3LCB1MF9sc3c7CiAgICBzaXplX3QgczsKI2VuZGlmCgogICAgLyoKICAgICAqIENoZWNrIGZvciBvdmVyZmxvdwogICAgICovCiAgICBpZiggMCA9PSBkIHx8IHUxID49IGQgKQogICAgewogICAgICAgIGlmIChyICE9IE5VTEwpICpyID0gfjA7CgogICAgICAgIHJldHVybiAoIH4wICk7CiAgICB9CgojaWYgZGVmaW5lZChNQkVEVExTX0hBVkVfVURCTCkKICAgIGRpdmlkZW5kICA9IChtYmVkdGxzX3RfdWRibCkgdTEgPDwgYmlMOwogICAgZGl2aWRlbmQgfD0gKG1iZWR0bHNfdF91ZGJsKSB1MDsKICAgIHF1b3RpZW50ID0gZGl2aWRlbmQgLyBkOwogICAgaWYoIHF1b3RpZW50ID4gKCAobWJlZHRsc190X3VkYmwpIDEgPDwgYmlMICkgLSAxICkKICAgICAgICBxdW90aWVudCA9ICggKG1iZWR0bHNfdF91ZGJsKSAxIDw8IGJpTCApIC0gMTsKCiAgICBpZiggciAhPSBOVUxMICkKICAgICAgICAqciA9IChtYmVkdGxzX21waV91aW50KSggZGl2aWRlbmQgLSAocXVvdGllbnQgKiBkICkgKTsKCiAgICByZXR1cm4gKG1iZWR0bHNfbXBpX3VpbnQpIHF1b3RpZW50OwojZWxzZQoKICAgIC8qCiAgICAgKiBBbGdvcml0aG0gRCwgU2VjdGlvbiA0LjMuMSAtIFRoZSBBcnQgb2YgQ29tcHV0ZXIgUHJvZ3JhbW1pbmcKICAgICAqICAgVm9sLiAyIC0gU2VtaW51bWVyaWNhbCBBbGdvcml0aG1zLCBLbnV0aAogICAgICovCgogICAgLyoKICAgICAqIE5vcm1hbGl6ZSB0aGUgZGl2aXNvciwgZCwgYW5kIGRpdmlkZW5kLCB1MCwgdTEKICAgICAqLwogICAgcyA9IG1iZWR0bHNfY2x6KCBkICk7CiAgICBkID0gZCA8PCBzOwoKICAgIHUxID0gdTEgPDwgczsKICAgIHUxIHw9ICggdTAgPj4gKCBiaUwgLSBzICkgKSAmICggLShtYmVkdGxzX21waV9zaW50KXMgPj4gKCBiaUwgLSAxICkgKTsKICAgIHUwID0gIHUwIDw8IHM7CgogICAgZDEgPSBkID4+IGJpSDsKICAgIGQwID0gZCAmIHVpbnRfaGFsZndvcmRfbWFzazsKCiAgICB1MF9tc3cgPSB1MCA+PiBiaUg7CiAgICB1MF9sc3cgPSB1MCAmIHVpbnRfaGFsZndvcmRfbWFzazsKCiAgICAvKgogICAgICogRmluZCB0aGUgZmlyc3QgcXVvdGllbnQgYW5kIHJlbWFpbmRlcgogICAgICovCiAgICBxMSA9IHUxIC8gZDE7CiAgICByMCA9IHUxIC0gZDEgKiBxMTsKCiAgICB3aGlsZSggcTEgPj0gcmFkaXggfHwgKCBxMSAqIGQwID4gcmFkaXggKiByMCArIHUwX21zdyApICkKICAgIHsKICAgICAgICBxMSAtPSAxOwogICAgICAgIHIwICs9IGQxOwoKICAgICAgICBpZiAoIHIwID49IHJhZGl4ICkgYnJlYWs7CiAgICB9CgogICAgckFYID0gKCB1MSAqIHJhZGl4ICkgKyAoIHUwX21zdyAtIHExICogZCApOwogICAgcTAgPSByQVggLyBkMTsKICAgIHIwID0gckFYIC0gcTAgKiBkMTsKCiAgICB3aGlsZSggcTAgPj0gcmFkaXggfHwgKCBxMCAqIGQwID4gcmFkaXggKiByMCArIHUwX2xzdyApICkKICAgIHsKICAgICAgICBxMCAtPSAxOwogICAgICAgIHIwICs9IGQxOwoKICAgICAgICBpZiAoIHIwID49IHJhZGl4ICkgYnJlYWs7CiAgICB9CgogICAgaWYgKHIgIT0gTlVMTCkKICAgICAgICAqciA9ICggckFYICogcmFkaXggKyB1MF9sc3cgLSBxMCAqIGQgKSA+PiBzOwoKICAgIHF1b3RpZW50ID0gcTEgKiByYWRpeCArIHEwOwoKICAgIHJldHVybiBxdW90aWVudDsKI2VuZGlmCn0KCi8qCiAqIERpdmlzaW9uIGJ5IG1iZWR0bHNfbXBpOiBBID0gUSAqIEIgKyBSICAoSEFDIDE0LjIwKQogKi8KaW50IG1iZWR0bHNfbXBpX2Rpdl9tcGkoIG1iZWR0bHNfbXBpICpRLCBtYmVkdGxzX21waSAqUiwgY29uc3QgbWJlZHRsc19tcGkgKkEsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYmVkdGxzX21waSAqQiApCnsKICAgIGludCByZXQ7CiAgICBzaXplX3QgaSwgbiwgdCwgazsKICAgIG1iZWR0bHNfbXBpIFgsIFksIFosIFQxLCBUMjsKICAgIE1QSV9WQUxJREFURV9SRVQoIEEgIT0gTlVMTCApOwogICAgTVBJX1ZBTElEQVRFX1JFVCggQiAhPSBOVUxMICk7CgogICAgaWYoIG1iZWR0bHNfbXBpX2NtcF9pbnQoIEIsIDAgKSA9PSAwICkKICAgICAgICByZXR1cm4oIE1CRURUTFNfRVJSX01QSV9ESVZJU0lPTl9CWV9aRVJPICk7CgogICAgbWJlZHRsc19tcGlfaW5pdCggJlggKTsgbWJlZHRsc19tcGlfaW5pdCggJlkgKTsgbWJlZHRsc19tcGlfaW5pdCggJlogKTsKICAgIG1iZWR0bHNfbXBpX2luaXQoICZUMSApOyBtYmVkdGxzX21waV9pbml0KCAmVDIgKTsKCiAgICBpZiggbWJlZHRsc19tcGlfY21wX2FicyggQSwgQiApIDwgMCApCiAgICB7CiAgICAgICAgaWYoIFEgIT0gTlVMTCApIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfbHNldCggUSwgMCApICk7CiAgICAgICAgaWYoIFIgIT0gTlVMTCApIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfY29weSggUiwgQSApICk7CiAgICAgICAgcmV0dXJuKCAwICk7CiAgICB9CgogICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9jb3B5KCAmWCwgQSApICk7CiAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX2NvcHkoICZZLCBCICkgKTsKICAgIFgucyA9IFkucyA9IDE7CgogICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9ncm93KCAmWiwgQS0+biArIDIgKSApOwogICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9sc2V0KCAmWiwgIDAgKSApOwogICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9ncm93KCAmVDEsIDIgKSApOwogICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9ncm93KCAmVDIsIDMgKSApOwoKICAgIGsgPSBtYmVkdGxzX21waV9iaXRsZW4oICZZICkgJSBiaUw7CiAgICBpZiggayA8IGJpTCAtIDEgKQogICAgewogICAgICAgIGsgPSBiaUwgLSAxIC0gazsKICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX3NoaWZ0X2woICZYLCBrICkgKTsKICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX3NoaWZ0X2woICZZLCBrICkgKTsKICAgIH0KICAgIGVsc2UgayA9IDA7CgogICAgbiA9IFgubiAtIDE7CiAgICB0ID0gWS5uIC0gMTsKICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfc2hpZnRfbCggJlksIGJpTCAqICggbiAtIHQgKSApICk7CgogICAgd2hpbGUoIG1iZWR0bHNfbXBpX2NtcF9tcGkoICZYLCAmWSApID49IDAgKQogICAgewogICAgICAgIFoucFtuIC0gdF0rKzsKICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX3N1Yl9tcGkoICZYLCAmWCwgJlkgKSApOwogICAgfQogICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9zaGlmdF9yKCAmWSwgYmlMICogKCBuIC0gdCApICkgKTsKCiAgICBmb3IoIGkgPSBuOyBpID4gdCA7IGktLSApCiAgICB7CiAgICAgICAgaWYoIFgucFtpXSA+PSBZLnBbdF0gKQogICAgICAgICAgICBaLnBbaSAtIHQgLSAxXSA9IH4wOwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIFoucFtpIC0gdCAtIDFdID0gbWJlZHRsc19pbnRfZGl2X2ludCggWC5wW2ldLCBYLnBbaSAtIDFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZLnBbdF0sIE5VTEwpOwogICAgICAgIH0KCiAgICAgICAgWi5wW2kgLSB0IC0gMV0rKzsKICAgICAgICBkbwogICAgICAgIHsKICAgICAgICAgICAgWi5wW2kgLSB0IC0gMV0tLTsKCiAgICAgICAgICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfbHNldCggJlQxLCAwICkgKTsKICAgICAgICAgICAgVDEucFswXSA9ICggdCA8IDEgKSA/IDAgOiBZLnBbdCAtIDFdOwogICAgICAgICAgICBUMS5wWzFdID0gWS5wW3RdOwogICAgICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX211bF9pbnQoICZUMSwgJlQxLCBaLnBbaSAtIHQgLSAxXSApICk7CgogICAgICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX2xzZXQoICZUMiwgMCApICk7CiAgICAgICAgICAgIFQyLnBbMF0gPSAoIGkgPCAyICkgPyAwIDogWC5wW2kgLSAyXTsKICAgICAgICAgICAgVDIucFsxXSA9ICggaSA8IDEgKSA/IDAgOiBYLnBbaSAtIDFdOwogICAgICAgICAgICBUMi5wWzJdID0gWC5wW2ldOwogICAgICAgIH0KICAgICAgICB3aGlsZSggbWJlZHRsc19tcGlfY21wX21waSggJlQxLCAmVDIgKSA+IDAgKTsKCiAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9tdWxfaW50KCAmVDEsICZZLCBaLnBbaSAtIHQgLSAxXSApICk7CiAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9zaGlmdF9sKCAmVDEsICBiaUwgKiAoIGkgLSB0IC0gMSApICkgKTsKICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX3N1Yl9tcGkoICZYLCAmWCwgJlQxICkgKTsKCiAgICAgICAgaWYoIG1iZWR0bHNfbXBpX2NtcF9pbnQoICZYLCAwICkgPCAwICkKICAgICAgICB7CiAgICAgICAgICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfY29weSggJlQxLCAmWSApICk7CiAgICAgICAgICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfc2hpZnRfbCggJlQxLCBiaUwgKiAoIGkgLSB0IC0gMSApICkgKTsKICAgICAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9hZGRfbXBpKCAmWCwgJlgsICZUMSApICk7CiAgICAgICAgICAgIFoucFtpIC0gdCAtIDFdLS07CiAgICAgICAgfQogICAgfQoKICAgIGlmKCBRICE9IE5VTEwgKQogICAgewogICAgICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfY29weSggUSwgJlogKSApOwogICAgICAgIFEtPnMgPSBBLT5zICogQi0+czsKICAgIH0KCiAgICBpZiggUiAhPSBOVUxMICkKICAgIHsKICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX3NoaWZ0X3IoICZYLCBrICkgKTsKICAgICAgICBYLnMgPSBBLT5zOwogICAgICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfY29weSggUiwgJlggKSApOwoKICAgICAgICBpZiggbWJlZHRsc19tcGlfY21wX2ludCggUiwgMCApID09IDAgKQogICAgICAgICAgICBSLT5zID0gMTsKICAgIH0KCmNsZWFudXA6CgogICAgbWJlZHRsc19tcGlfZnJlZSggJlggKTsgbWJlZHRsc19tcGlfZnJlZSggJlkgKTsgbWJlZHRsc19tcGlfZnJlZSggJlogKTsKICAgIG1iZWR0bHNfbXBpX2ZyZWUoICZUMSApOyBtYmVkdGxzX21waV9mcmVlKCAmVDIgKTsKCiAgICByZXR1cm4oIHJldCApOwp9CgovKgogKiBEaXZpc2lvbiBieSBpbnQ6IEEgPSBRICogYiArIFIKICovCmludCBtYmVkdGxzX21waV9kaXZfaW50KCBtYmVkdGxzX21waSAqUSwgbWJlZHRsc19tcGkgKlIsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYmVkdGxzX21waSAqQSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1iZWR0bHNfbXBpX3NpbnQgYiApCnsKICAgIG1iZWR0bHNfbXBpIF9COwogICAgbWJlZHRsc19tcGlfdWludCBwWzFdOwogICAgTVBJX1ZBTElEQVRFX1JFVCggQSAhPSBOVUxMICk7CgogICAgcFswXSA9ICggYiA8IDAgKSA/IC1iIDogYjsKICAgIF9CLnMgPSAoIGIgPCAwICkgPyAtMSA6IDE7CiAgICBfQi5uID0gMTsKICAgIF9CLnAgPSBwOwoKICAgIHJldHVybiggbWJlZHRsc19tcGlfZGl2X21waSggUSwgUiwgQSwgJl9CICkgKTsKfQoKLyoKICogTW9kdWxvOiBSID0gQSBtb2QgQgogKi8KI2lmIGRlZmluZWQoTUJFRFRMU19NUElfTU9EX01QSV9BTFQpCmludCBtYmVkdGxzX21waV9tb2RfbXBpX29yaWcoIG1iZWR0bHNfbXBpICpSLCBjb25zdCBtYmVkdGxzX21waSAqQSwgY29uc3QgbWJlZHRsc19tcGkgKkIgKQojZWxzZQppbnQgbWJlZHRsc19tcGlfbW9kX21waSggbWJlZHRsc19tcGkgKlIsIGNvbnN0IG1iZWR0bHNfbXBpICpBLCBjb25zdCBtYmVkdGxzX21waSAqQiApCiNlbmRpZiAvKiBNQkVEVExTX01QSV9NT0RfTVBJX0FMVCAqLwp7CiAgICBpbnQgcmV0OwogICAgTVBJX1ZBTElEQVRFX1JFVCggUiAhPSBOVUxMICk7CiAgICBNUElfVkFMSURBVEVfUkVUKCBBICE9IE5VTEwgKTsKICAgIE1QSV9WQUxJREFURV9SRVQoIEIgIT0gTlVMTCApOwoKICAgIGlmKCBtYmVkdGxzX21waV9jbXBfaW50KCBCLCAwICkgPCAwICkKICAgICAgICByZXR1cm4oIE1CRURUTFNfRVJSX01QSV9ORUdBVElWRV9WQUxVRSApOwoKICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfZGl2X21waSggTlVMTCwgUiwgQSwgQiApICk7CgogICAgd2hpbGUoIG1iZWR0bHNfbXBpX2NtcF9pbnQoIFIsIDAgKSA8IDAgKQogICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX2FkZF9tcGkoIFIsIFIsIEIgKSApOwoKICAgIHdoaWxlKCBtYmVkdGxzX21waV9jbXBfbXBpKCBSLCBCICkgPj0gMCApCiAgICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfc3ViX21waSggUiwgUiwgQiApICk7CgpjbGVhbnVwOgoKICAgIHJldHVybiggcmV0ICk7Cn0KCi8qCiAqIE1vZHVsbzogciA9IEEgbW9kIGIKICovCmludCBtYmVkdGxzX21waV9tb2RfaW50KCBtYmVkdGxzX21waV91aW50ICpyLCBjb25zdCBtYmVkdGxzX21waSAqQSwgbWJlZHRsc19tcGlfc2ludCBiICkKewogICAgc2l6ZV90IGk7CiAgICBtYmVkdGxzX21waV91aW50IHgsIHksIHo7CiAgICBNUElfVkFMSURBVEVfUkVUKCByICE9IE5VTEwgKTsKICAgIE1QSV9WQUxJREFURV9SRVQoIEEgIT0gTlVMTCApOwoKICAgIGlmKCBiID09IDAgKQogICAgICAgIHJldHVybiggTUJFRFRMU19FUlJfTVBJX0RJVklTSU9OX0JZX1pFUk8gKTsKCiAgICBpZiggYiA8IDAgKQogICAgICAgIHJldHVybiggTUJFRFRMU19FUlJfTVBJX05FR0FUSVZFX1ZBTFVFICk7CgogICAgLyoKICAgICAqIGhhbmRsZSB0cml2aWFsIGNhc2VzCiAgICAgKi8KICAgIGlmKCBiID09IDEgKQogICAgewogICAgICAgICpyID0gMDsKICAgICAgICByZXR1cm4oIDAgKTsKICAgIH0KCiAgICBpZiggYiA9PSAyICkKICAgIHsKICAgICAgICAqciA9IEEtPnBbMF0gJiAxOwogICAgICAgIHJldHVybiggMCApOwogICAgfQoKICAgIC8qCiAgICAgKiBnZW5lcmFsIGNhc2UKICAgICAqLwogICAgZm9yKCBpID0gQS0+biwgeSA9IDA7IGkgPiAwOyBpLS0gKQogICAgewogICAgICAgIHggID0gQS0+cFtpIC0gMV07CiAgICAgICAgeSAgPSAoIHkgPDwgYmlIICkgfCAoIHggPj4gYmlIICk7CiAgICAgICAgeiAgPSB5IC8gYjsKICAgICAgICB5IC09IHogKiBiOwoKICAgICAgICB4IDw8PSBiaUg7CiAgICAgICAgeSAgPSAoIHkgPDwgYmlIICkgfCAoIHggPj4gYmlIICk7CiAgICAgICAgeiAgPSB5IC8gYjsKICAgICAgICB5IC09IHogKiBiOwogICAgfQoKICAgIC8qCiAgICAgKiBJZiBBIGlzIG5lZ2F0aXZlLCB0aGVuIHRoZSBjdXJyZW50IHkgcmVwcmVzZW50cyBhIG5lZ2F0aXZlIHZhbHVlLgogICAgICogRmxpcHBpbmcgaXQgdG8gdGhlIHBvc2l0aXZlIHNpZGUuCiAgICAgKi8KICAgIGlmKCBBLT5zIDwgMCAmJiB5ICE9IDAgKQogICAgICAgIHkgPSBiIC0geTsKCiAgICAqciA9IHk7CgogICAgcmV0dXJuKCAwICk7Cn0KCi8qCiAqIEZhc3QgTW9udGdvbWVyeSBpbml0aWFsaXphdGlvbiAodGhhbmtzIHRvIFRvbSBTdCBEZW5pcykKICovCnN0YXRpYyB2b2lkIG1waV9tb250Z19pbml0KCBtYmVkdGxzX21waV91aW50ICptbSwgY29uc3QgbWJlZHRsc19tcGkgKk4gKQp7CiAgICBtYmVkdGxzX21waV91aW50IHgsIG0wID0gTi0+cFswXTsKICAgIHVuc2lnbmVkIGludCBpOwoKICAgIHggID0gbTA7CiAgICB4ICs9ICggKCBtMCArIDIgKSAmIDQgKSA8PCAxOwoKICAgIGZvciggaSA9IGJpTDsgaSA+PSA4OyBpIC89IDIgKQogICAgICAgIHggKj0gKCAyIC0gKCBtMCAqIHggKSApOwoKICAgICptbSA9IH54ICsgMTsKfQoKLyoKICogTW9udGdvbWVyeSBtdWx0aXBsaWNhdGlvbjogQSA9IEEgKiBCICogUl4tMSBtb2QgTiAgKEhBQyAxNC4zNikKICovCnN0YXRpYyBpbnQgbXBpX21vbnRtdWwoIG1iZWR0bHNfbXBpICpBLCBjb25zdCBtYmVkdGxzX21waSAqQiwgY29uc3QgbWJlZHRsc19tcGkgKk4sIG1iZWR0bHNfbXBpX3VpbnQgbW0sCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYmVkdGxzX21waSAqVCApCnsKICAgIHNpemVfdCBpLCBuLCBtOwogICAgbWJlZHRsc19tcGlfdWludCB1MCwgdTEsICpkOwoKICAgIGlmKCBULT5uIDwgTi0+biArIDEgfHwgVC0+cCA9PSBOVUxMICkKICAgICAgICByZXR1cm4oIE1CRURUTFNfRVJSX01QSV9CQURfSU5QVVRfREFUQSApOwoKICAgIG1lbXNldCggVC0+cCwgMCwgVC0+biAqIGNpTCApOwoKICAgIGQgPSBULT5wOwogICAgbiA9IE4tPm47CiAgICBtID0gKCBCLT5uIDwgbiApID8gQi0+biA6IG47CgogICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCiAgICB7CiAgICAgICAgLyoKICAgICAgICAgKiBUID0gKFQgKyB1MCpCICsgdTEqTikgLyAyXmJpTAogICAgICAgICAqLwogICAgICAgIHUwID0gQS0+cFtpXTsKICAgICAgICB1MSA9ICggZFswXSArIHUwICogQi0+cFswXSApICogbW07CgogICAgICAgIG1waV9tdWxfaGxwKCBtLCBCLT5wLCBkLCB1MCApOwogICAgICAgIG1waV9tdWxfaGxwKCBuLCBOLT5wLCBkLCB1MSApOwoKICAgICAgICAqZCsrID0gdTA7IGRbbiArIDFdID0gMDsKICAgIH0KCiAgICBtZW1jcHkoIEEtPnAsIGQsICggbiArIDEgKSAqIGNpTCApOwoKICAgIGlmKCBtYmVkdGxzX21waV9jbXBfYWJzKCBBLCBOICkgPj0gMCApCiAgICAgICAgbXBpX3N1Yl9obHAoIG4sIE4tPnAsIEEtPnAgKTsKICAgIGVsc2UKICAgICAgICAvKiBwcmV2ZW50IHRpbWluZyBhdHRhY2tzICovCiAgICAgICAgbXBpX3N1Yl9obHAoIG4sIEEtPnAsIFQtPnAgKTsKCiAgICByZXR1cm4oIDAgKTsKfQoKLyoKICogTW9udGdvbWVyeSByZWR1Y3Rpb246IEEgPSBBICogUl4tMSBtb2QgTgogKi8Kc3RhdGljIGludCBtcGlfbW9udHJlZCggbWJlZHRsc19tcGkgKkEsIGNvbnN0IG1iZWR0bHNfbXBpICpOLAogICAgICAgICAgICAgICAgICAgICAgICBtYmVkdGxzX21waV91aW50IG1tLCBjb25zdCBtYmVkdGxzX21waSAqVCApCnsKICAgIG1iZWR0bHNfbXBpX3VpbnQgeiA9IDE7CiAgICBtYmVkdGxzX21waSBVOwoKICAgIFUubiA9IFUucyA9IChpbnQpIHo7CiAgICBVLnAgPSAmejsKCiAgICByZXR1cm4oIG1waV9tb250bXVsKCBBLCAmVSwgTiwgbW0sIFQgKSApOwp9CgovKgogKiBTbGlkaW5nLXdpbmRvdyBleHBvbmVudGlhdGlvbjogWCA9IEFeRSBtb2QgTiAgKEhBQyAxNC44NSkKICovCiNpZiBkZWZpbmVkKE1CRURUTFNfTVBJX0VYUF9NT0RfQUxUKQppbnQgbWJlZHRsc19tcGlfZXhwX21vZF9vcmlnKCBtYmVkdGxzX21waSAqWCwgY29uc3QgbWJlZHRsc19tcGkgKkEsIGNvbnN0IG1iZWR0bHNfbXBpICpFLCBjb25zdCBtYmVkdGxzX21waSAqTiwgbWJlZHRsc19tcGkgKl9SUiApCiNlbHNlCmludCBtYmVkdGxzX21waV9leHBfbW9kKCBtYmVkdGxzX21waSAqWCwgY29uc3QgbWJlZHRsc19tcGkgKkEsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYmVkdGxzX21waSAqRSwgY29uc3QgbWJlZHRsc19tcGkgKk4sCiAgICAgICAgICAgICAgICAgICAgICAgICBtYmVkdGxzX21waSAqX1JSICkKI2VuZGlmIC8qIE1CRURUTFNfTVBJX0VYUF9NT0RfQUxUICovCnsKICAgIGludCByZXQ7CiAgICBzaXplX3Qgd2JpdHMsIHdzaXplLCBvbmUgPSAxOwogICAgc2l6ZV90IGksIGosIG5ibGltYnM7CiAgICBzaXplX3QgYnVmc2l6ZSwgbmJpdHM7CiAgICBtYmVkdGxzX21waV91aW50IGVpLCBtbSwgc3RhdGU7CiAgICBtYmVkdGxzX21waSBSUiwgVCwgV1sgMiA8PCBNQkVEVExTX01QSV9XSU5ET1dfU0laRSBdLCBBcG9zOwogICAgaW50IG5lZzsKCiAgICBNUElfVkFMSURBVEVfUkVUKCBYICE9IE5VTEwgKTsKICAgIE1QSV9WQUxJREFURV9SRVQoIEEgIT0gTlVMTCApOwogICAgTVBJX1ZBTElEQVRFX1JFVCggRSAhPSBOVUxMICk7CiAgICBNUElfVkFMSURBVEVfUkVUKCBOICE9IE5VTEwgKTsKCiAgICBpZiggbWJlZHRsc19tcGlfY21wX2ludCggTiwgMCApIDw9IDAgfHwgKCBOLT5wWzBdICYgMSApID09IDAgKQogICAgICAgIHJldHVybiggTUJFRFRMU19FUlJfTVBJX0JBRF9JTlBVVF9EQVRBICk7CgogICAgaWYoIG1iZWR0bHNfbXBpX2NtcF9pbnQoIEUsIDAgKSA8IDAgKQogICAgICAgIHJldHVybiggTUJFRFRMU19FUlJfTVBJX0JBRF9JTlBVVF9EQVRBICk7CgogICAgLyoKICAgICAqIEluaXQgdGVtcHMgYW5kIHdpbmRvdyBzaXplCiAgICAgKi8KICAgIG1waV9tb250Z19pbml0KCAmbW0sIE4gKTsKICAgIG1iZWR0bHNfbXBpX2luaXQoICZSUiApOyBtYmVkdGxzX21waV9pbml0KCAmVCApOwogICAgbWJlZHRsc19tcGlfaW5pdCggJkFwb3MgKTsKICAgIG1lbXNldCggVywgMCwgc2l6ZW9mKCBXICkgKTsKCiAgICBpID0gbWJlZHRsc19tcGlfYml0bGVuKCBFICk7CgogICAgd3NpemUgPSAoIGkgPiA2NzEgKSA/IDYgOiAoIGkgPiAyMzkgKSA/IDUgOgogICAgICAgICAgICAoIGkgPiAgNzkgKSA/IDQgOiAoIGkgPiAgMjMgKSA/IDMgOiAxOwoKI2lmKCBNQkVEVExTX01QSV9XSU5ET1dfU0laRSA8IDYgKQogICAgaWYoIHdzaXplID4gTUJFRFRMU19NUElfV0lORE9XX1NJWkUgKQogICAgICAgIHdzaXplID0gTUJFRFRMU19NUElfV0lORE9XX1NJWkU7CiNlbmRpZgoKICAgIGogPSBOLT5uICsgMTsKICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfZ3JvdyggWCwgaiApICk7CiAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX2dyb3coICZXWzFdLCAgaiApICk7CiAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX2dyb3coICZULCBqICogMiApICk7CgogICAgLyoKICAgICAqIENvbXBlbnNhdGUgZm9yIG5lZ2F0aXZlIEEgKGFuZCBjb3JyZWN0IGF0IHRoZSBlbmQpCiAgICAgKi8KICAgIG5lZyA9ICggQS0+cyA9PSAtMSApOwogICAgaWYoIG5lZyApCiAgICB7CiAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9jb3B5KCAmQXBvcywgQSApICk7CiAgICAgICAgQXBvcy5zID0gMTsKICAgICAgICBBID0gJkFwb3M7CiAgICB9CgogICAgLyoKICAgICAqIElmIDFzdCBjYWxsLCBwcmUtY29tcHV0ZSBSXjIgbW9kIE4KICAgICAqLwogICAgaWYoIF9SUiA9PSBOVUxMIHx8IF9SUi0+cCA9PSBOVUxMICkKICAgIHsKICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX2xzZXQoICZSUiwgMSApICk7CiAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9zaGlmdF9sKCAmUlIsIE4tPm4gKiAyICogYmlMICkgKTsKICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX21vZF9tcGkoICZSUiwgJlJSLCBOICkgKTsKCiAgICAgICAgaWYoIF9SUiAhPSBOVUxMICkKICAgICAgICAgICAgbWVtY3B5KCBfUlIsICZSUiwgc2l6ZW9mKCBtYmVkdGxzX21waSApICk7CiAgICB9CiAgICBlbHNlCiAgICAgICAgbWVtY3B5KCAmUlIsIF9SUiwgc2l6ZW9mKCBtYmVkdGxzX21waSApICk7CgogICAgLyoKICAgICAqIFdbMV0gPSBBICogUl4yICogUl4tMSBtb2QgTiA9IEEgKiBSIG1vZCBOCiAgICAgKi8KICAgIGlmKCBtYmVkdGxzX21waV9jbXBfbXBpKCBBLCBOICkgPj0gMCApCiAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9tb2RfbXBpKCAmV1sxXSwgQSwgTiApICk7CiAgICBlbHNlCiAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9jb3B5KCAmV1sxXSwgQSApICk7CgogICAgTUJFRFRMU19NUElfQ0hLKCBtcGlfbW9udG11bCggJldbMV0sICZSUiwgTiwgbW0sICZUICkgKTsKCiAgICAvKgogICAgICogWCA9IFJeMiAqIFJeLTEgbW9kIE4gPSBSIG1vZCBOCiAgICAgKi8KICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfY29weSggWCwgJlJSICkgKTsKICAgIE1CRURUTFNfTVBJX0NISyggbXBpX21vbnRyZWQoIFgsIE4sIG1tLCAmVCApICk7CgogICAgaWYoIHdzaXplID4gMSApCiAgICB7CiAgICAgICAgLyoKICAgICAgICAgKiBXWzEgPDwgKHdzaXplIC0gMSldID0gV1sxXSBeICh3c2l6ZSAtIDEpCiAgICAgICAgICovCiAgICAgICAgaiA9ICBvbmUgPDwgKCB3c2l6ZSAtIDEgKTsKCiAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9ncm93KCAmV1tqXSwgTi0+biArIDEgKSApOwogICAgICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfY29weSggJldbal0sICZXWzFdICAgICkgKTsKCiAgICAgICAgZm9yKCBpID0gMDsgaSA8IHdzaXplIC0gMTsgaSsrICkKICAgICAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtcGlfbW9udG11bCggJldbal0sICZXW2pdLCBOLCBtbSwgJlQgKSApOwoKICAgICAgICAvKgogICAgICAgICAqIFdbaV0gPSBXW2kgLSAxXSAqIFdbMV0KICAgICAgICAgKi8KICAgICAgICBmb3IoIGkgPSBqICsgMTsgaSA8ICggb25lIDw8IHdzaXplICk7IGkrKyApCiAgICAgICAgewogICAgICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX2dyb3coICZXW2ldLCBOLT5uICsgMSApICk7CiAgICAgICAgICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfY29weSggJldbaV0sICZXW2kgLSAxXSApICk7CgogICAgICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1waV9tb250bXVsKCAmV1tpXSwgJldbMV0sIE4sIG1tLCAmVCApICk7CiAgICAgICAgfQogICAgfQoKICAgIG5ibGltYnMgPSBFLT5uOwogICAgYnVmc2l6ZSA9IDA7CiAgICBuYml0cyAgID0gMDsKICAgIHdiaXRzICAgPSAwOwogICAgc3RhdGUgICA9IDA7CgogICAgd2hpbGUoIDEgKQogICAgewogICAgICAgIGlmKCBidWZzaXplID09IDAgKQogICAgICAgIHsKICAgICAgICAgICAgaWYoIG5ibGltYnMgPT0gMCApCiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIG5ibGltYnMtLTsKCiAgICAgICAgICAgIGJ1ZnNpemUgPSBzaXplb2YoIG1iZWR0bHNfbXBpX3VpbnQgKSA8PCAzOwogICAgICAgIH0KCiAgICAgICAgYnVmc2l6ZS0tOwoKICAgICAgICBlaSA9IChFLT5wW25ibGltYnNdID4+IGJ1ZnNpemUpICYgMTsKCiAgICAgICAgLyoKICAgICAgICAgKiBza2lwIGxlYWRpbmcgMHMKICAgICAgICAgKi8KICAgICAgICBpZiggZWkgPT0gMCAmJiBzdGF0ZSA9PSAwICkKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgIGlmKCBlaSA9PSAwICYmIHN0YXRlID09IDEgKQogICAgICAgIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogb3V0IG9mIHdpbmRvdywgc3F1YXJlIFgKICAgICAgICAgICAgICovCiAgICAgICAgICAgIE1CRURUTFNfTVBJX0NISyggbXBpX21vbnRtdWwoIFgsIFgsIE4sIG1tLCAmVCApICk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAgKiBhZGQgZWkgdG8gY3VycmVudCB3aW5kb3cKICAgICAgICAgKi8KICAgICAgICBzdGF0ZSA9IDI7CgogICAgICAgIG5iaXRzKys7CiAgICAgICAgd2JpdHMgfD0gKCBlaSA8PCAoIHdzaXplIC0gbmJpdHMgKSApOwoKICAgICAgICBpZiggbmJpdHMgPT0gd3NpemUgKQogICAgICAgIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogWCA9IFhed3NpemUgUl4tMSBtb2QgTgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IHdzaXplOyBpKysgKQogICAgICAgICAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtcGlfbW9udG11bCggWCwgWCwgTiwgbW0sICZUICkgKTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFggPSBYICogV1t3Yml0c10gUl4tMSBtb2QgTgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtcGlfbW9udG11bCggWCwgJldbd2JpdHNdLCBOLCBtbSwgJlQgKSApOwoKICAgICAgICAgICAgc3RhdGUtLTsKICAgICAgICAgICAgbmJpdHMgPSAwOwogICAgICAgICAgICB3Yml0cyA9IDA7CiAgICAgICAgfQogICAgfQoKICAgIC8qCiAgICAgKiBwcm9jZXNzIHRoZSByZW1haW5pbmcgYml0cwogICAgICovCiAgICBmb3IoIGkgPSAwOyBpIDwgbmJpdHM7IGkrKyApCiAgICB7CiAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtcGlfbW9udG11bCggWCwgWCwgTiwgbW0sICZUICkgKTsKCiAgICAgICAgd2JpdHMgPDw9IDE7CgogICAgICAgIGlmKCAoIHdiaXRzICYgKCBvbmUgPDwgd3NpemUgKSApICE9IDAgKQogICAgICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1waV9tb250bXVsKCBYLCAmV1sxXSwgTiwgbW0sICZUICkgKTsKICAgIH0KCiAgICAvKgogICAgICogWCA9IEFeRSAqIFIgKiBSXi0xIG1vZCBOID0gQV5FIG1vZCBOCiAgICAgKi8KICAgIE1CRURUTFNfTVBJX0NISyggbXBpX21vbnRyZWQoIFgsIE4sIG1tLCAmVCApICk7CgogICAgaWYoIG5lZyAmJiBFLT5uICE9IDAgJiYgKCBFLT5wWzBdICYgMSApICE9IDAgKQogICAgewogICAgICAgIFgtPnMgPSAtMTsKICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX2FkZF9tcGkoIFgsIE4sIFggKSApOwogICAgfQoKY2xlYW51cDoKCiAgICBmb3IoIGkgPSAoIG9uZSA8PCAoIHdzaXplIC0gMSApICk7IGkgPCAoIG9uZSA8PCB3c2l6ZSApOyBpKysgKQogICAgICAgIG1iZWR0bHNfbXBpX2ZyZWUoICZXW2ldICk7CgogICAgbWJlZHRsc19tcGlfZnJlZSggJldbMV0gKTsgbWJlZHRsc19tcGlfZnJlZSggJlQgKTsgbWJlZHRsc19tcGlfZnJlZSggJkFwb3MgKTsKCiAgICBpZiggX1JSID09IE5VTEwgfHwgX1JSLT5wID09IE5VTEwgKQogICAgICAgIG1iZWR0bHNfbXBpX2ZyZWUoICZSUiApOwoKICAgIHJldHVybiggcmV0ICk7Cn0KCi8qCiAqIEdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yOiBHID0gZ2NkKEEsIEIpICAoSEFDIDE0LjU0KQogKi8KI2lmIGRlZmluZWQoTUJFRFRMU19NUElfR0NEX0FMVCkKaW50IG1iZWR0bHNfbXBpX2djZF9vcmlnKCBtYmVkdGxzX21waSAqRywgY29uc3QgbWJlZHRsc19tcGkgKkEsIGNvbnN0IG1iZWR0bHNfbXBpICpCICkKI2Vsc2UKaW50IG1iZWR0bHNfbXBpX2djZCggbWJlZHRsc19tcGkgKkcsIGNvbnN0IG1iZWR0bHNfbXBpICpBLCBjb25zdCBtYmVkdGxzX21waSAqQiApCiNlbmRpZiAvKiBNQkVEVExTX01QSV9HQ0RfQUxUICovCnsKICAgIGludCByZXQ7CiAgICBzaXplX3QgbHosIGx6dDsKICAgIG1iZWR0bHNfbXBpIFRHLCBUQSwgVEI7CgogICAgTVBJX1ZBTElEQVRFX1JFVCggRyAhPSBOVUxMICk7CiAgICBNUElfVkFMSURBVEVfUkVUKCBBICE9IE5VTEwgKTsKICAgIE1QSV9WQUxJREFURV9SRVQoIEIgIT0gTlVMTCApOwoKICAgIG1iZWR0bHNfbXBpX2luaXQoICZURyApOyBtYmVkdGxzX21waV9pbml0KCAmVEEgKTsgbWJlZHRsc19tcGlfaW5pdCggJlRCICk7CgogICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9jb3B5KCAmVEEsIEEgKSApOwogICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9jb3B5KCAmVEIsIEIgKSApOwoKICAgIGx6ID0gbWJlZHRsc19tcGlfbHNiKCAmVEEgKTsKICAgIGx6dCA9IG1iZWR0bHNfbXBpX2xzYiggJlRCICk7CgogICAgaWYoIGx6dCA8IGx6ICkKICAgICAgICBseiA9IGx6dDsKCiAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX3NoaWZ0X3IoICZUQSwgbHogKSApOwogICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9zaGlmdF9yKCAmVEIsIGx6ICkgKTsKCiAgICBUQS5zID0gVEIucyA9IDE7CgogICAgd2hpbGUoIG1iZWR0bHNfbXBpX2NtcF9pbnQoICZUQSwgMCApICE9IDAgKQogICAgewogICAgICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfc2hpZnRfciggJlRBLCBtYmVkdGxzX21waV9sc2IoICZUQSApICkgKTsKICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX3NoaWZ0X3IoICZUQiwgbWJlZHRsc19tcGlfbHNiKCAmVEIgKSApICk7CgogICAgICAgIGlmKCBtYmVkdGxzX21waV9jbXBfbXBpKCAmVEEsICZUQiApID49IDAgKQogICAgICAgIHsKICAgICAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9zdWJfYWJzKCAmVEEsICZUQSwgJlRCICkgKTsKICAgICAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9zaGlmdF9yKCAmVEEsIDEgKSApOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX3N1Yl9hYnMoICZUQiwgJlRCLCAmVEEgKSApOwogICAgICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX3NoaWZ0X3IoICZUQiwgMSApICk7CiAgICAgICAgfQogICAgfQoKICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfc2hpZnRfbCggJlRCLCBseiApICk7CiAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX2NvcHkoIEcsICZUQiApICk7CgpjbGVhbnVwOgoKICAgIG1iZWR0bHNfbXBpX2ZyZWUoICZURyApOyBtYmVkdGxzX21waV9mcmVlKCAmVEEgKTsgbWJlZHRsc19tcGlfZnJlZSggJlRCICk7CgogICAgcmV0dXJuKCByZXQgKTsKfQoKLyoKICogRmlsbCBYIHdpdGggc2l6ZSBieXRlcyBvZiByYW5kb20uCiAqCiAqIFVzZSBhIHRlbXBvcmFyeSBieXRlcyByZXByZXNlbnRhdGlvbiB0byBtYWtlIHN1cmUgdGhlIHJlc3VsdCBpcyB0aGUgc2FtZQogKiByZWdhcmRsZXNzIG9mIHRoZSBwbGF0Zm9ybSBlbmRpYW5uZXNzICh1c2VmdWwgd2hlbiBmX3JuZyBpcyBhY3R1YWxseQogKiBkZXRlcm1pbmlzdGljLCBlZyBmb3IgdGVzdHMpLgogKi8KaW50IG1iZWR0bHNfbXBpX2ZpbGxfcmFuZG9tKCBtYmVkdGxzX21waSAqWCwgc2l6ZV90IHNpemUsCiAgICAgICAgICAgICAgICAgICAgIGludCAoKmZfcm5nKSh2b2lkICosIHVuc2lnbmVkIGNoYXIgKiwgc2l6ZV90KSwKICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcF9ybmcgKQp7CiAgICBpbnQgcmV0OwogICAgc2l6ZV90IGNvbnN0IGxpbWJzID0gQ0hBUlNfVE9fTElNQlMoIHNpemUgKTsKICAgIHNpemVfdCBjb25zdCBvdmVyaGVhZCA9ICggbGltYnMgKiBjaUwgKSAtIHNpemU7CiAgICB1bnNpZ25lZCBjaGFyICpYcDsKCiAgICBNUElfVkFMSURBVEVfUkVUKCBYICAgICAhPSBOVUxMICk7CiAgICBNUElfVkFMSURBVEVfUkVUKCBmX3JuZyAhPSBOVUxMICk7CgogICAgLyogRW5zdXJlIHRoYXQgdGFyZ2V0IE1QSSBoYXMgZXhhY3RseSB0aGUgbmVjZXNzYXJ5IG51bWJlciBvZiBsaW1icyAqLwogICAgaWYoIFgtPm4gIT0gbGltYnMgKQogICAgewogICAgICAgIG1iZWR0bHNfbXBpX2ZyZWUoIFggKTsKICAgICAgICBtYmVkdGxzX21waV9pbml0KCBYICk7CiAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9ncm93KCBYLCBsaW1icyApICk7CiAgICB9CiAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX2xzZXQoIFgsIDAgKSApOwoKICAgIFhwID0gKHVuc2lnbmVkIGNoYXIqKSBYLT5wOwogICAgZl9ybmcoIHBfcm5nLCBYcCArIG92ZXJoZWFkLCBzaXplICk7CgogICAgbXBpX2JpZ2VuZGlhbl90b19ob3N0KCBYLT5wLCBsaW1icyApOwoKY2xlYW51cDoKICAgIHJldHVybiggcmV0ICk7Cn0KCi8qCiAqIE1vZHVsYXIgaW52ZXJzZTogWCA9IEFeLTEgbW9kIE4gIChIQUMgMTQuNjEgLyAxNC42NCkKICovCiNpZiBkZWZpbmVkKE1CRURUTFNfTVBJX0lOVl9NT0RfQUxUKQppbnQgbWJlZHRsc19tcGlfaW52X21vZF9vcmlnKCBtYmVkdGxzX21waSAqWCwgY29uc3QgbWJlZHRsc19tcGkgKkEsIGNvbnN0IG1iZWR0bHNfbXBpICpOICkKI2Vsc2UKaW50IG1iZWR0bHNfbXBpX2ludl9tb2QoIG1iZWR0bHNfbXBpICpYLCBjb25zdCBtYmVkdGxzX21waSAqQSwgY29uc3QgbWJlZHRsc19tcGkgKk4gKQojZW5kaWYgLyogTUJFRFRMU19NUElfSU5WX01PRF9BTFQgKi8KewogICAgaW50IHJldDsKICAgIG1iZWR0bHNfbXBpIEcsIFRBLCBUVSwgVTEsIFUyLCBUQiwgVFYsIFYxLCBWMjsKICAgIE1QSV9WQUxJREFURV9SRVQoIFggIT0gTlVMTCApOwogICAgTVBJX1ZBTElEQVRFX1JFVCggQSAhPSBOVUxMICk7CiAgICBNUElfVkFMSURBVEVfUkVUKCBOICE9IE5VTEwgKTsKCiAgICBpZiggbWJlZHRsc19tcGlfY21wX2ludCggTiwgMSApIDw9IDAgKQogICAgICAgIHJldHVybiggTUJFRFRMU19FUlJfTVBJX0JBRF9JTlBVVF9EQVRBICk7CgogICAgbWJlZHRsc19tcGlfaW5pdCggJlRBICk7IG1iZWR0bHNfbXBpX2luaXQoICZUVSApOyBtYmVkdGxzX21waV9pbml0KCAmVTEgKTsgbWJlZHRsc19tcGlfaW5pdCggJlUyICk7CiAgICBtYmVkdGxzX21waV9pbml0KCAmRyApOyBtYmVkdGxzX21waV9pbml0KCAmVEIgKTsgbWJlZHRsc19tcGlfaW5pdCggJlRWICk7CiAgICBtYmVkdGxzX21waV9pbml0KCAmVjEgKTsgbWJlZHRsc19tcGlfaW5pdCggJlYyICk7CgogICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9nY2QoICZHLCBBLCBOICkgKTsKCiAgICBpZiggbWJlZHRsc19tcGlfY21wX2ludCggJkcsIDEgKSAhPSAwICkKICAgIHsKICAgICAgICByZXQgPSBNQkVEVExTX0VSUl9NUElfTk9UX0FDQ0VQVEFCTEU7CiAgICAgICAgZ290byBjbGVhbnVwOwogICAgfQoKICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfbW9kX21waSggJlRBLCBBLCBOICkgKTsKICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfY29weSggJlRVLCAmVEEgKSApOwogICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9jb3B5KCAmVEIsIE4gKSApOwogICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9jb3B5KCAmVFYsIE4gKSApOwoKICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfbHNldCggJlUxLCAxICkgKTsKICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfbHNldCggJlUyLCAwICkgKTsKICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfbHNldCggJlYxLCAwICkgKTsKICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfbHNldCggJlYyLCAxICkgKTsKCiAgICBkbwogICAgewogICAgICAgIHdoaWxlKCAoIFRVLnBbMF0gJiAxICkgPT0gMCApCiAgICAgICAgewogICAgICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX3NoaWZ0X3IoICZUVSwgMSApICk7CgogICAgICAgICAgICBpZiggKCBVMS5wWzBdICYgMSApICE9IDAgfHwgKCBVMi5wWzBdICYgMSApICE9IDAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX2FkZF9tcGkoICZVMSwgJlUxLCAmVEIgKSApOwogICAgICAgICAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9zdWJfbXBpKCAmVTIsICZVMiwgJlRBICkgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9zaGlmdF9yKCAmVTEsIDEgKSApOwogICAgICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX3NoaWZ0X3IoICZVMiwgMSApICk7CiAgICAgICAgfQoKICAgICAgICB3aGlsZSggKCBUVi5wWzBdICYgMSApID09IDAgKQogICAgICAgIHsKICAgICAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9zaGlmdF9yKCAmVFYsIDEgKSApOwoKICAgICAgICAgICAgaWYoICggVjEucFswXSAmIDEgKSAhPSAwIHx8ICggVjIucFswXSAmIDEgKSAhPSAwICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9hZGRfbXBpKCAmVjEsICZWMSwgJlRCICkgKTsKICAgICAgICAgICAgICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfc3ViX21waSggJlYyLCAmVjIsICZUQSApICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfc2hpZnRfciggJlYxLCAxICkgKTsKICAgICAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9zaGlmdF9yKCAmVjIsIDEgKSApOwogICAgICAgIH0KCiAgICAgICAgaWYoIG1iZWR0bHNfbXBpX2NtcF9tcGkoICZUVSwgJlRWICkgPj0gMCApCiAgICAgICAgewogICAgICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX3N1Yl9tcGkoICZUVSwgJlRVLCAmVFYgKSApOwogICAgICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX3N1Yl9tcGkoICZVMSwgJlUxLCAmVjEgKSApOwogICAgICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX3N1Yl9tcGkoICZVMiwgJlUyLCAmVjIgKSApOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX3N1Yl9tcGkoICZUViwgJlRWLCAmVFUgKSApOwogICAgICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX3N1Yl9tcGkoICZWMSwgJlYxLCAmVTEgKSApOwogICAgICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX3N1Yl9tcGkoICZWMiwgJlYyLCAmVTIgKSApOwogICAgICAgIH0KICAgIH0KICAgIHdoaWxlKCBtYmVkdGxzX21waV9jbXBfaW50KCAmVFUsIDAgKSAhPSAwICk7CgogICAgd2hpbGUoIG1iZWR0bHNfbXBpX2NtcF9pbnQoICZWMSwgMCApIDwgMCApCiAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9hZGRfbXBpKCAmVjEsICZWMSwgTiApICk7CgogICAgd2hpbGUoIG1iZWR0bHNfbXBpX2NtcF9tcGkoICZWMSwgTiApID49IDAgKQogICAgICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfc3ViX21waSggJlYxLCAmVjEsIE4gKSApOwoKICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfY29weSggWCwgJlYxICkgKTsKCmNsZWFudXA6CgogICAgbWJlZHRsc19tcGlfZnJlZSggJlRBICk7IG1iZWR0bHNfbXBpX2ZyZWUoICZUVSApOyBtYmVkdGxzX21waV9mcmVlKCAmVTEgKTsgbWJlZHRsc19tcGlfZnJlZSggJlUyICk7CiAgICBtYmVkdGxzX21waV9mcmVlKCAmRyApOyBtYmVkdGxzX21waV9mcmVlKCAmVEIgKTsgbWJlZHRsc19tcGlfZnJlZSggJlRWICk7CiAgICBtYmVkdGxzX21waV9mcmVlKCAmVjEgKTsgbWJlZHRsc19tcGlfZnJlZSggJlYyICk7CgogICAgcmV0dXJuKCByZXQgKTsKfQoKI2lmIGRlZmluZWQoTUJFRFRMU19HRU5QUklNRSkKCnN0YXRpYyBjb25zdCBpbnQgc21hbGxfcHJpbWVbXSA9CnsKICAgICAgICAzLCAgICA1LCAgICA3LCAgIDExLCAgIDEzLCAgIDE3LCAgIDE5LCAgIDIzLAogICAgICAgMjksICAgMzEsICAgMzcsICAgNDEsICAgNDMsICAgNDcsICAgNTMsICAgNTksCiAgICAgICA2MSwgICA2NywgICA3MSwgICA3MywgICA3OSwgICA4MywgICA4OSwgICA5NywKICAgICAgMTAxLCAgMTAzLCAgMTA3LCAgMTA5LCAgMTEzLCAgMTI3LCAgMTMxLCAgMTM3LAogICAgICAxMzksICAxNDksICAxNTEsICAxNTcsICAxNjMsICAxNjcsICAxNzMsICAxNzksCiAgICAgIDE4MSwgIDE5MSwgIDE5MywgIDE5NywgIDE5OSwgIDIxMSwgIDIyMywgIDIyNywKICAgICAgMjI5LCAgMjMzLCAgMjM5LCAgMjQxLCAgMjUxLCAgMjU3LCAgMjYzLCAgMjY5LAogICAgICAyNzEsICAyNzcsICAyODEsICAyODMsICAyOTMsICAzMDcsICAzMTEsICAzMTMsCiAgICAgIDMxNywgIDMzMSwgIDMzNywgIDM0NywgIDM0OSwgIDM1MywgIDM1OSwgIDM2NywKICAgICAgMzczLCAgMzc5LCAgMzgzLCAgMzg5LCAgMzk3LCAgNDAxLCAgNDA5LCAgNDE5LAogICAgICA0MjEsICA0MzEsICA0MzMsICA0MzksICA0NDMsICA0NDksICA0NTcsICA0NjEsCiAgICAgIDQ2MywgIDQ2NywgIDQ3OSwgIDQ4NywgIDQ5MSwgIDQ5OSwgIDUwMywgIDUwOSwKICAgICAgNTIxLCAgNTIzLCAgNTQxLCAgNTQ3LCAgNTU3LCAgNTYzLCAgNTY5LCAgNTcxLAogICAgICA1NzcsICA1ODcsICA1OTMsICA1OTksICA2MDEsICA2MDcsICA2MTMsICA2MTcsCiAgICAgIDYxOSwgIDYzMSwgIDY0MSwgIDY0MywgIDY0NywgIDY1MywgIDY1OSwgIDY2MSwKICAgICAgNjczLCAgNjc3LCAgNjgzLCAgNjkxLCAgNzAxLCAgNzA5LCAgNzE5LCAgNzI3LAogICAgICA3MzMsICA3MzksICA3NDMsICA3NTEsICA3NTcsICA3NjEsICA3NjksICA3NzMsCiAgICAgIDc4NywgIDc5NywgIDgwOSwgIDgxMSwgIDgyMSwgIDgyMywgIDgyNywgIDgyOSwKICAgICAgODM5LCAgODUzLCAgODU3LCAgODU5LCAgODYzLCAgODc3LCAgODgxLCAgODgzLAogICAgICA4ODcsICA5MDcsICA5MTEsICA5MTksICA5MjksICA5MzcsICA5NDEsICA5NDcsCiAgICAgIDk1MywgIDk2NywgIDk3MSwgIDk3NywgIDk4MywgIDk5MSwgIDk5NywgLTEwMwp9OwoKLyoKICogU21hbGwgZGl2aXNvcnMgdGVzdCAoWCBtdXN0IGJlIHBvc2l0aXZlKQogKgogKiBSZXR1cm4gdmFsdWVzOgogKiAwOiBubyBzbWFsbCBmYWN0b3IgKHBvc3NpYmxlIHByaW1lLCBtb3JlIHRlc3RzIG5lZWRlZCkKICogMTogY2VydGFpbiBwcmltZQogKiBNQkVEVExTX0VSUl9NUElfTk9UX0FDQ0VQVEFCTEU6IGNlcnRhaW4gbm9uLXByaW1lCiAqIG90aGVyIG5lZ2F0aXZlOiBlcnJvcgogKi8Kc3RhdGljIGludCBtcGlfY2hlY2tfc21hbGxfZmFjdG9ycyggY29uc3QgbWJlZHRsc19tcGkgKlggKQp7CiAgICBpbnQgcmV0ID0gMDsKICAgIHNpemVfdCBpOwogICAgbWJlZHRsc19tcGlfdWludCByOwoKICAgIGlmKCAoIFgtPnBbMF0gJiAxICkgPT0gMCApCiAgICAgICAgcmV0dXJuKCBNQkVEVExTX0VSUl9NUElfTk9UX0FDQ0VQVEFCTEUgKTsKCiAgICBmb3IoIGkgPSAwOyBzbWFsbF9wcmltZVtpXSA+IDA7IGkrKyApCiAgICB7CiAgICAgICAgaWYoIG1iZWR0bHNfbXBpX2NtcF9pbnQoIFgsIHNtYWxsX3ByaW1lW2ldICkgPD0gMCApCiAgICAgICAgICAgIHJldHVybiggMSApOwoKICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX21vZF9pbnQoICZyLCBYLCBzbWFsbF9wcmltZVtpXSApICk7CgogICAgICAgIGlmKCByID09IDAgKQogICAgICAgICAgICByZXR1cm4oIE1CRURUTFNfRVJSX01QSV9OT1RfQUNDRVBUQUJMRSApOwogICAgfQoKY2xlYW51cDoKICAgIHJldHVybiggcmV0ICk7Cn0KCi8qCiAqIE1pbGxlci1SYWJpbiBwc2V1ZG8tcHJpbWFsaXR5IHRlc3QgIChIQUMgNC4yNCkKICovCnN0YXRpYyBpbnQgbXBpX21pbGxlcl9yYWJpbiggY29uc3QgbWJlZHRsc19tcGkgKlgsIHNpemVfdCByb3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqZl9ybmcpKHZvaWQgKiwgdW5zaWduZWQgY2hhciAqLCBzaXplX3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBfcm5nICkKewogICAgaW50IHJldCwgY291bnQ7CiAgICBzaXplX3QgaSwgaiwgaywgczsKICAgIG1iZWR0bHNfbXBpIFcsIFIsIFQsIEEsIFJSOwoKICAgIE1QSV9WQUxJREFURV9SRVQoIFggICAgICE9IE5VTEwgKTsKICAgIE1QSV9WQUxJREFURV9SRVQoIGZfcm5nICE9IE5VTEwgKTsKCiAgICBtYmVkdGxzX21waV9pbml0KCAmVyApOyBtYmVkdGxzX21waV9pbml0KCAmUiApOwogICAgbWJlZHRsc19tcGlfaW5pdCggJlQgKTsgbWJlZHRsc19tcGlfaW5pdCggJkEgKTsKICAgIG1iZWR0bHNfbXBpX2luaXQoICZSUiApOwoKICAgIC8qCiAgICAgKiBXID0gfFh8IC0gMQogICAgICogUiA9IFcgPj4gbHNiKCBXICkKICAgICAqLwogICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9zdWJfaW50KCAmVywgWCwgMSApICk7CiAgICBzID0gbWJlZHRsc19tcGlfbHNiKCAmVyApOwogICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9jb3B5KCAmUiwgJlcgKSApOwogICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9zaGlmdF9yKCAmUiwgcyApICk7CgogICAgaSA9IG1iZWR0bHNfbXBpX2JpdGxlbiggWCApOwoKICAgIGZvciggaSA9IDA7IGkgPCByb3VuZHM7IGkrKyApCiAgICB7CiAgICAgICAgLyoKICAgICAgICAgKiBwaWNrIGEgcmFuZG9tIEEsIDEgPCBBIDwgfFh8IC0gMQogICAgICAgICAqLwogICAgICAgIGNvdW50ID0gMDsKICAgICAgICBkbyB7CiAgICAgICAgICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfZmlsbF9yYW5kb20oICZBLCBYLT5uICogY2lMLCBmX3JuZywgcF9ybmcgKSApOwoKICAgICAgICAgICAgaiA9IG1iZWR0bHNfbXBpX2JpdGxlbiggJkEgKTsKICAgICAgICAgICAgayA9IG1iZWR0bHNfbXBpX2JpdGxlbiggJlcgKTsKICAgICAgICAgICAgaWYgKGogPiBrKSB7CiAgICAgICAgICAgICAgICBBLnBbQS5uIC0gMV0gJj0gKCAobWJlZHRsc19tcGlfdWludCkgMSA8PCAoIGsgLSAoIEEubiAtIDEgKSAqIGJpTCAtIDEgKSApIC0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGNvdW50KysgPiAzMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIE1CRURUTFNfRVJSX01QSV9OT1RfQUNDRVBUQUJMRTsKICAgICAgICAgICAgfQoKICAgICAgICB9IHdoaWxlICggbWJlZHRsc19tcGlfY21wX21waSggJkEsICZXICkgPj0gMCB8fAogICAgICAgICAgICAgICAgICBtYmVkdGxzX21waV9jbXBfaW50KCAmQSwgMSApICA8PSAwICAgICk7CgogICAgICAgIC8qCiAgICAgICAgICogQSA9IEFeUiBtb2QgfFh8CiAgICAgICAgICovCiAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9leHBfbW9kKCAmQSwgJkEsICZSLCBYLCAmUlIgKSApOwoKICAgICAgICBpZiggbWJlZHRsc19tcGlfY21wX21waSggJkEsICZXICkgPT0gMCB8fAogICAgICAgICAgICBtYmVkdGxzX21waV9jbXBfaW50KCAmQSwgIDEgKSA9PSAwICkKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgIGogPSAxOwogICAgICAgIHdoaWxlKCBqIDwgcyAmJiBtYmVkdGxzX21waV9jbXBfbXBpKCAmQSwgJlcgKSAhPSAwICkKICAgICAgICB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIEEgPSBBICogQSBtb2QgfFh8CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX211bF9tcGkoICZULCAmQSwgJkEgKSApOwogICAgICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX21vZF9tcGkoICZBLCAmVCwgWCAgKSApOwoKICAgICAgICAgICAgaWYoIG1iZWR0bHNfbXBpX2NtcF9pbnQoICZBLCAxICkgPT0gMCApCiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGorKzsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogbm90IHByaW1lIGlmIEEgIT0gfFh8IC0gMSBvciBBID09IDEKICAgICAgICAgKi8KICAgICAgICBpZiggbWJlZHRsc19tcGlfY21wX21waSggJkEsICZXICkgIT0gMCB8fAogICAgICAgICAgICBtYmVkdGxzX21waV9jbXBfaW50KCAmQSwgIDEgKSA9PSAwICkKICAgICAgICB7CiAgICAgICAgICAgIHJldCA9IE1CRURUTFNfRVJSX01QSV9OT1RfQUNDRVBUQUJMRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKY2xlYW51cDoKICAgIG1iZWR0bHNfbXBpX2ZyZWUoICZXICk7IG1iZWR0bHNfbXBpX2ZyZWUoICZSICk7CiAgICBtYmVkdGxzX21waV9mcmVlKCAmVCApOyBtYmVkdGxzX21waV9mcmVlKCAmQSApOwogICAgbWJlZHRsc19tcGlfZnJlZSggJlJSICk7CgogICAgcmV0dXJuKCByZXQgKTsKfQoKLyoKICogUHNldWRvLXByaW1hbGl0eSB0ZXN0OiBzbWFsbCBmYWN0b3JzLCB0aGVuIE1pbGxlci1SYWJpbgogKi8KaW50IG1iZWR0bHNfbXBpX2lzX3ByaW1lX2V4dCggY29uc3QgbWJlZHRsc19tcGkgKlgsIGludCByb3VuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmZfcm5nKSh2b2lkICosIHVuc2lnbmVkIGNoYXIgKiwgc2l6ZV90KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcF9ybmcgKQp7CiAgICBpbnQgcmV0OwogICAgbWJlZHRsc19tcGkgWFg7CiAgICBNUElfVkFMSURBVEVfUkVUKCBYICAgICAhPSBOVUxMICk7CiAgICBNUElfVkFMSURBVEVfUkVUKCBmX3JuZyAhPSBOVUxMICk7CgogICAgWFgucyA9IDE7CiAgICBYWC5uID0gWC0+bjsKICAgIFhYLnAgPSBYLT5wOwoKICAgIGlmKCBtYmVkdGxzX21waV9jbXBfaW50KCAmWFgsIDAgKSA9PSAwIHx8CiAgICAgICAgbWJlZHRsc19tcGlfY21wX2ludCggJlhYLCAxICkgPT0gMCApCiAgICAgICAgcmV0dXJuKCBNQkVEVExTX0VSUl9NUElfTk9UX0FDQ0VQVEFCTEUgKTsKCiAgICBpZiggbWJlZHRsc19tcGlfY21wX2ludCggJlhYLCAyICkgPT0gMCApCiAgICAgICAgcmV0dXJuKCAwICk7CgogICAgaWYoICggcmV0ID0gbXBpX2NoZWNrX3NtYWxsX2ZhY3RvcnMoICZYWCApICkgIT0gMCApCiAgICB7CiAgICAgICAgaWYoIHJldCA9PSAxICkKICAgICAgICAgICAgcmV0dXJuKCAwICk7CgogICAgICAgIHJldHVybiggcmV0ICk7CiAgICB9CgogICAgcmV0dXJuKCBtcGlfbWlsbGVyX3JhYmluKCAmWFgsIHJvdW5kcywgZl9ybmcsIHBfcm5nICkgKTsKfQoKI2lmICFkZWZpbmVkKE1CRURUTFNfREVQUkVDQVRFRF9SRU1PVkVEKQovKgogKiBQc2V1ZG8tcHJpbWFsaXR5IHRlc3QsIGVycm9yIHByb2JhYmlsaXR5IDJeLTgwCiAqLwojaWYgZGVmaW5lZChNQkVEVExTX01QSV9JU19QUklNRV9BTFQpCmludCBtYmVkdGxzX21waV9pc19wcmltZV9vcmlnKCBjb25zdCBtYmVkdGxzX21waSAqWCwKICAgICAgICAgICAgICAgICAgaW50ICgqZl9ybmcpKHZvaWQgKiwgdW5zaWduZWQgY2hhciAqLCBzaXplX3QpLAogICAgICAgICAgICAgICAgICB2b2lkICpwX3JuZyApCiNlbHNlCmludCBtYmVkdGxzX21waV9pc19wcmltZSggY29uc3QgbWJlZHRsc19tcGkgKlgsCiAgICAgICAgICAgICAgICAgIGludCAoKmZfcm5nKSh2b2lkICosIHVuc2lnbmVkIGNoYXIgKiwgc2l6ZV90KSwKICAgICAgICAgICAgICAgICAgdm9pZCAqcF9ybmcgKQojZW5kaWYgLyogTUJFRFRMU19NUElfSVNfUFJJTUVfQUxUICovCnsKICAgIE1QSV9WQUxJREFURV9SRVQoIFggICAgICE9IE5VTEwgKTsKICAgIE1QSV9WQUxJREFURV9SRVQoIGZfcm5nICE9IE5VTEwgKTsKCiAgICAvKgogICAgICogSW4gdGhlIHBhc3Qgb3VyIGtleSBnZW5lcmF0aW9uIGFpbWVkIGZvciBhbiBlcnJvciByYXRlIG9mIGF0IG1vc3QKICAgICAqIDJeLTgwLiBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQsIGFpbSBmb3IgdGhlIHNhbWUgY2VydGFpbnR5CiAgICAgKiBoZXJlIGFzIHdlbGwuCiAgICAgKi8KICAgIHJldHVybiggbWJlZHRsc19tcGlfaXNfcHJpbWVfZXh0KCBYLCA0MCwgZl9ybmcsIHBfcm5nICkgKTsKfQojZW5kaWYKCi8qCiAqIFByaW1lIG51bWJlciBnZW5lcmF0aW9uCiAqCiAqIFRvIGdlbmVyYXRlIGFuIFJTQSBrZXkgaW4gYSB3YXkgcmVjb21tZW5kZWQgYnkgRklQUyAxODYtNCwgYm90aCBwcmltZXMgbXVzdAogKiBiZSBlaXRoZXIgMTAyNCBiaXRzIG9yIDE1MzYgYml0cyBsb25nLCBhbmQgZmxhZ3MgbXVzdCBjb250YWluCiAqIE1CRURUTFNfTVBJX0dFTl9QUklNRV9GTEFHX0xPV19FUlIuCiAqLwppbnQgbWJlZHRsc19tcGlfZ2VuX3ByaW1lKCBtYmVkdGxzX21waSAqWCwgc2l6ZV90IG5iaXRzLCBpbnQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICBpbnQgKCpmX3JuZykodm9pZCAqLCB1bnNpZ25lZCBjaGFyICosIHNpemVfdCksCiAgICAgICAgICAgICAgICAgICB2b2lkICpwX3JuZyApCnsKI2lmZGVmIE1CRURUTFNfSEFWRV9JTlQ2NAovLyBjZWlsKDJeNjMuNSkKI2RlZmluZSBDRUlMX01BWFVJTlRfRElWX1NRUlQyIDB4YjUwNGYzMzNmOWRlNjQ4NVVMTAojZWxzZQovLyBjZWlsKDJeMzEuNSkKI2RlZmluZSBDRUlMX01BWFVJTlRfRElWX1NRUlQyIDB4YjUwNGYzMzRVCiNlbmRpZgogICAgaW50IHJldCA9IE1CRURUTFNfRVJSX01QSV9OT1RfQUNDRVBUQUJMRTsKICAgIHNpemVfdCBrLCBuOwogICAgaW50IHJvdW5kczsKICAgIG1iZWR0bHNfbXBpX3VpbnQgcjsKICAgIG1iZWR0bHNfbXBpIFk7CgogICAgTVBJX1ZBTElEQVRFX1JFVCggWCAgICAgIT0gTlVMTCApOwogICAgTVBJX1ZBTElEQVRFX1JFVCggZl9ybmcgIT0gTlVMTCApOwoKICAgIGlmKCBuYml0cyA8IDMgfHwgbmJpdHMgPiBNQkVEVExTX01QSV9NQVhfQklUUyApCiAgICAgICAgcmV0dXJuKCBNQkVEVExTX0VSUl9NUElfQkFEX0lOUFVUX0RBVEEgKTsKCiAgICBtYmVkdGxzX21waV9pbml0KCAmWSApOwoKICAgIG4gPSBCSVRTX1RPX0xJTUJTKCBuYml0cyApOwoKICAgIGlmKCAoIGZsYWdzICYgTUJFRFRMU19NUElfR0VOX1BSSU1FX0ZMQUdfTE9XX0VSUiApID09IDAgKQogICAgewogICAgICAgIC8qCiAgICAgICAgICogMl4tODAgZXJyb3IgcHJvYmFiaWxpdHksIG51bWJlciBvZiByb3VuZHMgY2hvc2VuIHBlciBIQUMsIHRhYmxlIDQuNAogICAgICAgICAqLwogICAgICAgIHJvdW5kcyA9ICggKCBuYml0cyA+PSAxMzAwICkgPyAgMiA6ICggbmJpdHMgPj0gIDg1MCApID8gIDMgOgogICAgICAgICAgICAgICAgICAgKCBuYml0cyA+PSAgNjUwICkgPyAgNCA6ICggbmJpdHMgPj0gIDM1MCApID8gIDggOgogICAgICAgICAgICAgICAgICAgKCBuYml0cyA+PSAgMjUwICkgPyAxMiA6ICggbmJpdHMgPj0gIDE1MCApID8gMTggOiAyNyApOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIC8qCiAgICAgICAgICogMl4tMTAwIGVycm9yIHByb2JhYmlsaXR5LCBudW1iZXIgb2Ygcm91bmRzIGNvbXB1dGVkIGJhc2VkIG9uIEhBQywKICAgICAgICAgKiBmYWN0IDQuNDgKICAgICAgICAgKi8KICAgICAgICByb3VuZHMgPSAoICggbmJpdHMgPj0gMTQ1MCApID8gIDQgOiAoIG5iaXRzID49ICAxMTUwICkgPyAgNSA6CiAgICAgICAgICAgICAgICAgICAoIG5iaXRzID49IDEwMDAgKSA/ICA2IDogKCBuYml0cyA+PSAgIDg1MCApID8gIDcgOgogICAgICAgICAgICAgICAgICAgKCBuYml0cyA+PSAgNzUwICkgPyAgOCA6ICggbmJpdHMgPj0gICA1MDAgKSA/IDEzIDoKICAgICAgICAgICAgICAgICAgICggbmJpdHMgPj0gIDI1MCApID8gMjggOiAoIG5iaXRzID49ICAgMTUwICkgPyA0MCA6IDUxICk7CiAgICB9CgogICAgd2hpbGUoIDEgKQogICAgewogICAgICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfZmlsbF9yYW5kb20oIFgsIG4gKiBjaUwsIGZfcm5nLCBwX3JuZyApICk7CiAgICAgICAgLyogbWFrZSBzdXJlIGdlbmVyYXRlZCBudW1iZXIgaXMgYXQgbGVhc3QgKG5iaXRzLTEpKzAuNSBiaXRzIChGSVBTIDE4Ni00IKdCLjMuMyBzdGVwcyA0LjQsIDUuNSkgKi8KICAgICAgICBpZiggWC0+cFtuLTFdIDwgQ0VJTF9NQVhVSU5UX0RJVl9TUVJUMiApIGNvbnRpbnVlOwoKICAgICAgICBrID0gbiAqIGJpTDsKICAgICAgICBpZiggayA+IG5iaXRzICkgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9zaGlmdF9yKCBYLCBrIC0gbmJpdHMgKSApOwogICAgICAgIFgtPnBbMF0gfD0gMTsKCiAgICAgICAgaWYoICggZmxhZ3MgJiBNQkVEVExTX01QSV9HRU5fUFJJTUVfRkxBR19ESCApID09IDAgKQogICAgICAgIHsKICAgICAgICAgICAgcmV0ID0gbWJlZHRsc19tcGlfaXNfcHJpbWVfZXh0KCBYLCByb3VuZHMsIGZfcm5nLCBwX3JuZyApOwoKICAgICAgICAgICAgaWYoIHJldCAhPSBNQkVEVExTX0VSUl9NUElfTk9UX0FDQ0VQVEFCTEUgKQogICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBBbiBuZWNlc3NhcnkgY29uZGl0aW9uIGZvciBZIGFuZCBYID0gMlkgKyAxIHRvIGJlIHByaW1lCiAgICAgICAgICAgICAqIGlzIFggPSAyIG1vZCAzICh3aGljaCBpcyBlcXVpdmFsZW50IHRvIFkgPSAyIG1vZCAzKS4KICAgICAgICAgICAgICogTWFrZSBzdXJlIGl0IGlzIHNhdGlzZmllZCwgd2hpbGUga2VlcGluZyBYID0gMyBtb2QgNAogICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIFgtPnBbMF0gfD0gMjsKCiAgICAgICAgICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfbW9kX2ludCggJnIsIFgsIDMgKSApOwogICAgICAgICAgICBpZiggciA9PSAwICkKICAgICAgICAgICAgICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfYWRkX2ludCggWCwgWCwgOCApICk7CiAgICAgICAgICAgIGVsc2UgaWYoIHIgPT0gMSApCiAgICAgICAgICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX2FkZF9pbnQoIFgsIFgsIDQgKSApOwoKICAgICAgICAgICAgLyogU2V0IFkgPSAoWC0xKSAvIDIsIHdoaWNoIGlzIFggLyAyIGJlY2F1c2UgWCBpcyBvZGQgKi8KICAgICAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9jb3B5KCAmWSwgWCApICk7CiAgICAgICAgICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfc2hpZnRfciggJlksIDEgKSApOwoKICAgICAgICAgICAgd2hpbGUoIDEgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogRmlyc3QsIGNoZWNrIHNtYWxsIGZhY3RvcnMgZm9yIFggYW5kIFkKICAgICAgICAgICAgICAgICAqIGJlZm9yZSBkb2luZyBNaWxsZXItUmFiaW4gb24gYW55IG9mIHRoZW0KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYoICggcmV0ID0gbXBpX2NoZWNrX3NtYWxsX2ZhY3RvcnMoICBYICAgICAgICAgKSApID09IDAgJiYKICAgICAgICAgICAgICAgICAgICAoIHJldCA9IG1waV9jaGVja19zbWFsbF9mYWN0b3JzKCAmWSAgICAgICAgICkgKSA9PSAwICYmCiAgICAgICAgICAgICAgICAgICAgKCByZXQgPSBtcGlfbWlsbGVyX3JhYmluKCAgWCwgcm91bmRzLCBmX3JuZywgcF9ybmcgICkgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IDAgJiYKICAgICAgICAgICAgICAgICAgICAoIHJldCA9IG1waV9taWxsZXJfcmFiaW4oICZZLCByb3VuZHMsIGZfcm5nLCBwX3JuZyAgKSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gMCApCiAgICAgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwoKICAgICAgICAgICAgICAgIGlmKCByZXQgIT0gTUJFRFRMU19FUlJfTVBJX05PVF9BQ0NFUFRBQkxFICkKICAgICAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIE5leHQgY2FuZGlkYXRlcy4gV2Ugd2FudCB0byBwcmVzZXJ2ZSBZID0gKFgtMSkgLyAyIGFuZAogICAgICAgICAgICAgICAgICogWSA9IDEgbW9kIDIgYW5kIFkgPSAyIG1vZCAzIChlcSBYID0gMyBtb2QgNCBhbmQgWCA9IDIgbW9kIDMpCiAgICAgICAgICAgICAgICAgKiBzbyB1cCBZIGJ5IDYgYW5kIFggYnkgMTIuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfYWRkX2ludCggIFgsICBYLCAxMiApICk7CiAgICAgICAgICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX2FkZF9pbnQoICZZLCAmWSwgNiAgKSApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKY2xlYW51cDoKCiAgICBtYmVkdGxzX21waV9mcmVlKCAmWSApOwoKICAgIHJldHVybiggcmV0ICk7Cn0KCiNlbmRpZiAvKiBNQkVEVExTX0dFTlBSSU1FICovCgojaWYgZGVmaW5lZChNQkVEVExTX1NFTEZfVEVTVCkKCiNkZWZpbmUgR0NEX1BBSVJfQ09VTlQgIDMKCnN0YXRpYyBjb25zdCBpbnQgZ2NkX3BhaXJzW0dDRF9QQUlSX0NPVU5UXVszXSA9CnsKICAgIHsgNjkzLCA2MDksIDIxIH0sCiAgICB7IDE3NjQsIDg2OCwgMjggfSwKICAgIHsgNzY4NDU0OTIzLCA1NDIxNjc4MTQsIDEgfQp9OwoKLyoKICogQ2hlY2t1cCByb3V0aW5lCiAqLwppbnQgbWJlZHRsc19tcGlfc2VsZl90ZXN0KCBpbnQgdmVyYm9zZSApCnsKICAgIGludCByZXQsIGk7CiAgICBtYmVkdGxzX21waSBBLCBFLCBOLCBYLCBZLCBVLCBWOwoKICAgIG1iZWR0bHNfbXBpX2luaXQoICZBICk7IG1iZWR0bHNfbXBpX2luaXQoICZFICk7IG1iZWR0bHNfbXBpX2luaXQoICZOICk7IG1iZWR0bHNfbXBpX2luaXQoICZYICk7CiAgICBtYmVkdGxzX21waV9pbml0KCAmWSApOyBtYmVkdGxzX21waV9pbml0KCAmVSApOyBtYmVkdGxzX21waV9pbml0KCAmViApOwoKICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfcmVhZF9zdHJpbmcoICZBLCAxNiwKICAgICAgICAiRUZFMDIxQzI2NDVGRDFEQzU4NkU2OTE4NEFGNEEzMUUiIFwKICAgICAgICAiRDVGNTNFOTNCNUYxMjNGQTQxNjgwODY3QkExMTAxMzEiIFwKICAgICAgICAiOTQ0RkU3OTUyRTI1MTczMzc3ODBDQjBEQjgwRTYxQUEiIFwKICAgICAgICAiRTdDOEREQzZDNUM2QUFERUIzNEVCMzhBMkY0MEQ1RTYiICkgKTsKCiAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX3JlYWRfc3RyaW5nKCAmRSwgMTYsCiAgICAgICAgIkIyRTdFRkQzNzA3NUI5RjAzRkY5ODlDN0M1MDUxQzIwIiBcCiAgICAgICAgIjM0RDJBMzIzODEwMjUxMTI3RTdCRjg2MjVBNEY0OUE1IiBcCiAgICAgICAgIkYzRTI3RjREQThCRDU5QzQ3RDZEQUFCQTRDODEyN0JEIiBcCiAgICAgICAgIjVCNUMyNTc2MzIyMkZFRkNDRkMzOEI4MzIzNjZDMjlFIiApICk7CgogICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9yZWFkX3N0cmluZyggJk4sIDE2LAogICAgICAgICIwMDY2QTE5ODE4NkMxOEMxMEIyRjVFRDlCNTIyNzUyQSIgXAogICAgICAgICI5ODMwQjY5OTE2RTUzNUM4RjA0NzUxOEE4ODlBNDNBNSIgXAogICAgICAgICI5NEI2QkVEMjdBMTY4RDMxRDRBNTJGODg5MjVBQThGNSIgKSApOwoKICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfbXVsX21waSggJlgsICZBLCAmTiApICk7CgogICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9yZWFkX3N0cmluZyggJlUsIDE2LAogICAgICAgICI2MDJBQjdFQ0E1OTdBM0Q2QjU2RkY5ODI5QTVFOEI4NSIgXAogICAgICAgICI5RTg1N0VBOTVBMDM1MTJFMkJBRTczOTE2ODhEMjY0QSIgXAogICAgICAgICJBNTY2M0IwMzQxREI5Q0NGRDJDNEM1RjQyMUZFQzgxNCIgXAogICAgICAgICI4MDAxQjcyRTg0OEEzOENBRTFDNjVGNzhFNTZBQkRFRiIgXAogICAgICAgICJFMTJEM0MwMzlCOEEwMkQ2QkU1OTNGMEJCQkRBNTZGMSIgXAogICAgICAgICJFQ0Y2NzcxNTJFRjgwNDM3MEMxQTMwNUNBRjNCNUJGMSIgXAogICAgICAgICIzMDg3OUI1NkM2MURFNTg0QTBGNTNBMjQ0N0E1MUUiICkgKTsKCiAgICBpZiggdmVyYm9zZSAhPSAwICkKICAgICAgICBtYmVkdGxzX3ByaW50ZiggIiAgTVBJIHRlc3QgIzEgKG11bF9tcGkpOiAiICk7CgogICAgaWYoIG1iZWR0bHNfbXBpX2NtcF9tcGkoICZYLCAmVSApICE9IDAgKQogICAgewogICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQogICAgICAgICAgICBtYmVkdGxzX3ByaW50ZiggImZhaWxlZFxuIiApOwoKICAgICAgICByZXQgPSAxOwogICAgICAgIGdvdG8gY2xlYW51cDsKICAgIH0KCiAgICBpZiggdmVyYm9zZSAhPSAwICkKICAgICAgICBtYmVkdGxzX3ByaW50ZiggInBhc3NlZFxuIiApOwoKICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfZGl2X21waSggJlgsICZZLCAmQSwgJk4gKSApOwoKICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfcmVhZF9zdHJpbmcoICZVLCAxNiwKICAgICAgICAiMjU2NTY3MzM2MDU5RTUyQ0FFMjI5MjU0NzQ3MDVGMzlBOTQiICkgKTsKCiAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX3JlYWRfc3RyaW5nKCAmViwgMTYsCiAgICAgICAgIjY2MTNGMjYxNjIyMjNERjQ4OEU5Q0Q0OENDMTMyQzdBIiBcCiAgICAgICAgIjBBQzkzQzcwMUIwMDFCMDkyRTRFNUI5RjczQkNEMjdCIiBcCiAgICAgICAgIjlFRTUwRDA2NTdDNzdGMzc0RTkwM0NERkE0QzY0MiIgKSApOwoKICAgIGlmKCB2ZXJib3NlICE9IDAgKQogICAgICAgIG1iZWR0bHNfcHJpbnRmKCAiICBNUEkgdGVzdCAjMiAoZGl2X21waSk6ICIgKTsKCiAgICBpZiggbWJlZHRsc19tcGlfY21wX21waSggJlgsICZVICkgIT0gMCB8fAogICAgICAgIG1iZWR0bHNfbXBpX2NtcF9tcGkoICZZLCAmViApICE9IDAgKQogICAgewogICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQogICAgICAgICAgICBtYmVkdGxzX3ByaW50ZiggImZhaWxlZFxuIiApOwoKICAgICAgICByZXQgPSAxOwogICAgICAgIGdvdG8gY2xlYW51cDsKICAgIH0KCiAgICBpZiggdmVyYm9zZSAhPSAwICkKICAgICAgICBtYmVkdGxzX3ByaW50ZiggInBhc3NlZFxuIiApOwoKICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfZXhwX21vZCggJlgsICZBLCAmRSwgJk4sIE5VTEwgKSApOwoKICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfcmVhZF9zdHJpbmcoICZVLCAxNiwKICAgICAgICAiMzZFMTM5QUVBNTUyMTU2MDlEMjgxNjk5OEVEMDIwQkIiIFwKICAgICAgICAiQkQ5NkMzNzg5MEY2NTE3MUQ5NDhFOUJDN0NCQUE0RDkiIFwKICAgICAgICAiMzI1RDI0RDZBM0MxMjcxMEYxMEEwOUZBMDhBQjg3IiApICk7CgogICAgaWYoIHZlcmJvc2UgIT0gMCApCiAgICAgICAgbWJlZHRsc19wcmludGYoICIgIE1QSSB0ZXN0ICMzIChleHBfbW9kKTogIiApOwoKICAgIGlmKCBtYmVkdGxzX21waV9jbXBfbXBpKCAmWCwgJlUgKSAhPSAwICkKICAgIHsKICAgICAgICBpZiggdmVyYm9zZSAhPSAwICkKICAgICAgICAgICAgbWJlZHRsc19wcmludGYoICJmYWlsZWRcbiIgKTsKCiAgICAgICAgcmV0ID0gMTsKICAgICAgICBnb3RvIGNsZWFudXA7CiAgICB9CgogICAgaWYoIHZlcmJvc2UgIT0gMCApCiAgICAgICAgbWJlZHRsc19wcmludGYoICJwYXNzZWRcbiIgKTsKCiAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX2ludl9tb2QoICZYLCAmQSwgJk4gKSApOwoKICAgIE1CRURUTFNfTVBJX0NISyggbWJlZHRsc19tcGlfcmVhZF9zdHJpbmcoICZVLCAxNiwKICAgICAgICAiMDAzQTBBQUVERDdFNzg0RkMwN0Q4RjlFQzZFM0JGRDUiIFwKICAgICAgICAiQzNEQkE3NjQ1NjM2M0ExMDg2OTYyMkVBQzJERDg0RUMiIFwKICAgICAgICAiQzVCOEE3NERBQzREMDlFMDNCNUUwQkU3NzlGMkRGNjEiICkgKTsKCiAgICBpZiggdmVyYm9zZSAhPSAwICkKICAgICAgICBtYmVkdGxzX3ByaW50ZiggIiAgTVBJIHRlc3QgIzQgKGludl9tb2QpOiAiICk7CgogICAgaWYoIG1iZWR0bHNfbXBpX2NtcF9tcGkoICZYLCAmVSApICE9IDAgKQogICAgewogICAgICAgIGlmKCB2ZXJib3NlICE9IDAgKQogICAgICAgICAgICBtYmVkdGxzX3ByaW50ZiggImZhaWxlZFxuIiApOwoKICAgICAgICByZXQgPSAxOwogICAgICAgIGdvdG8gY2xlYW51cDsKICAgIH0KCiAgICBpZiggdmVyYm9zZSAhPSAwICkKICAgICAgICBtYmVkdGxzX3ByaW50ZiggInBhc3NlZFxuIiApOwoKICAgIGlmKCB2ZXJib3NlICE9IDAgKQogICAgICAgIG1iZWR0bHNfcHJpbnRmKCAiICBNUEkgdGVzdCAjNSAoc2ltcGxlIGdjZCk6ICIgKTsKCiAgICBmb3IoIGkgPSAwOyBpIDwgR0NEX1BBSVJfQ09VTlQ7IGkrKyApCiAgICB7CiAgICAgICAgTUJFRFRMU19NUElfQ0hLKCBtYmVkdGxzX21waV9sc2V0KCAmWCwgZ2NkX3BhaXJzW2ldWzBdICkgKTsKICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX2xzZXQoICZZLCBnY2RfcGFpcnNbaV1bMV0gKSApOwoKICAgICAgICBNQkVEVExTX01QSV9DSEsoIG1iZWR0bHNfbXBpX2djZCggJkEsICZYLCAmWSApICk7CgogICAgICAgIGlmKCBtYmVkdGxzX21waV9jbXBfaW50KCAmQSwgZ2NkX3BhaXJzW2ldWzJdICkgIT0gMCApCiAgICAgICAgewogICAgICAgICAgICBpZiggdmVyYm9zZSAhPSAwICkKICAgICAgICAgICAgICAgIG1iZWR0bHNfcHJpbnRmKCAiZmFpbGVkIGF0ICVkXG4iLCBpICk7CgogICAgICAgICAgICByZXQgPSAxOwogICAgICAgICAgICBnb3RvIGNsZWFudXA7CiAgICAgICAgfQogICAgfQoKICAgIGlmKCB2ZXJib3NlICE9IDAgKQogICAgICAgIG1iZWR0bHNfcHJpbnRmKCAicGFzc2VkXG4iICk7CgpjbGVhbnVwOgoKICAgIGlmKCByZXQgIT0gMCAmJiB2ZXJib3NlICE9IDAgKQogICAgICAgIG1iZWR0bHNfcHJpbnRmKCAiVW5leHBlY3RlZCBlcnJvciwgcmV0dXJuIGNvZGUgPSAlMDhYXG4iLCByZXQgKTsKCiAgICBtYmVkdGxzX21waV9mcmVlKCAmQSApOyBtYmVkdGxzX21waV9mcmVlKCAmRSApOyBtYmVkdGxzX21waV9mcmVlKCAmTiApOyBtYmVkdGxzX21waV9mcmVlKCAmWCApOwogICAgbWJlZHRsc19tcGlfZnJlZSggJlkgKTsgbWJlZHRsc19tcGlfZnJlZSggJlUgKTsgbWJlZHRsc19tcGlfZnJlZSggJlYgKTsKCiAgICBpZiggdmVyYm9zZSAhPSAwICkKICAgICAgICBtYmVkdGxzX3ByaW50ZiggIlxuIiApOwoKICAgIHJldHVybiggcmV0ICk7Cn0KCiNlbmRpZiAvKiBNQkVEVExTX1NFTEZfVEVTVCAqLwoKI2VuZGlmIC8qIE1CRURUTFNfQklHTlVNX0MgKi8K