LyoKICogUlBDIGVuZHBvaW50IG1hcHBlcgogKgogKiBDb3B5cmlnaHQgMjAwMiBHcmVnIFR1cm5lcgogKiBDb3B5cmlnaHQgMjAwMSBPdmUgS+V2ZW4sIFRyYW5zR2FtaW5nIFRlY2hub2xvZ2llcwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICoKICogVE9ETzoKICogIC0gYWN0dWFsbHkgZG8gdGhpbmdzIHJpZ2h0CiAqLwoKI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgoKI2luY2x1ZGUgInJwYy5oIgoKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCiNpbmNsdWRlICJycGNfYmluZGluZy5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwob2xlKTsKCi8qIFRoZSAicmVhbCIgUlBDIHBvcnRtYXBwZXIgZW5kcG9pbnRzIHRoYXQgSSBrbm93IG9mIGFyZToKICoKICogIG5jYWRnX2lwX3VkcDogMTM1CiAqICBuY2Fjbl9pcF90Y3A6IDEzNQogKiAgbmNhY25fbnA6IFxccGlwZVxlcG1hcHBlciAoPykKICogIG5jYWxycGM6IGVwbWFwcGVyCiAqCiAqIElmIHRoZSB1c2VyJ3MgbWFjaGluZSByYW4gYSBEQ0UgUlBDIGRhZW1vbiwgaXQgd291bGQKICogcHJvYmFibHkgYmUgcG9zc2libGUgdG8gY29ubmVjdCB0byBpdCwgYnV0IHRoZXJlIGFyZSBtYW55CiAqIHJlYXNvbnMgbm90IHRvLCBsaWtlOgogKiAgLSB0aGUgdXNlciBwcm9iYWJseSBkb2VzICpub3QqIHJ1biBvbmUsIGFuZCBwcm9iYWJseQogKiAgICBzaG91bGRuJ3QgYmUgZm9yY2VkIHRvIHJ1biBvbmUganVzdCBmb3IgbG9jYWwgQ09NCiAqICAtIHZlcnkgZmV3IFVuaXggc3lzdGVtcyB1c2UgRENFIFJQQy4uLiBpZiB0aGV5IHJ1biBhIFJQQwogKiAgICBkYWVtb24gYXQgYWxsLCBpdCdzIHVzdWFsbHkgU3VuIFJQQwogKiAgLSBEQ0UgUlBDIHJlZ2lzdHJhdGlvbnMgYXJlIHBlcnNpc3RlbnQgYW5kIHNhdmVkIG9uIGRpc2ssCiAqICAgIHdoaWxlIE1TLVJQQyByZWdpc3RyYXRpb25zIGFyZSBkb2N1bWVudGVkIGFzIG5vbi1wZXJzaXN0ZW50CiAqICAgIGFuZCBzdG9yZWQgb25seSBpbiBSQU0sIGFuZCBhdXRvLWRlc3Ryb3llZCB3aGVuIHRoZSBwcm9jZXNzCiAqICAgIGRpZXMgKHNvbWV0aGluZyBEQ0UgUlBDIGNhbid0IGRvKQogKgogKiBPZiBjb3Vyc2UsIGlmIHRoZSB1c2VyICpkaWQqIHdhbnQgdG8gcnVuIGEgRENFIFJQQyBkYWVtb24gYW55d2F5LAogKiB0aGVyZSB3b3VsZCBiZSBpbnRlcm9wZXJhYmlsaXR5IGFkdmFudGFnZXMsIGxpa2UgdGhlIHBvc3NpYmlsaXR5CiAqIG9mIHJ1bm5pbmcgYSBmdWxseSBmdW5jdGlvbmFsIERDT00gc2VydmVyIHVzaW5nIFdpbmUuLi4KICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgUnBjRXBSZWdpc3RlckEgKFJQQ1JUNC5AKQogKi8KUlBDX1NUQVRVUyBXSU5BUEkgUnBjRXBSZWdpc3RlckEoIFJQQ19JRl9IQU5ETEUgSWZTcGVjLCBSUENfQklORElOR19WRUNUT1IgKkJpbmRpbmdWZWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVUlEX1ZFQ1RPUiAqVXVpZFZlY3RvciwgdW5zaWduZWQgY2hhciAqQW5ub3RhdGlvbiApCnsKICBSUENTU19OUF9NRVNTQUdFIG1zZzsKICBSUENTU19OUF9SRVBMWSByZXBseTsKICBjaGFyICp2YXJkYXRhX3BheWxvYWQsICp2cDsKICBQUlBDX1NFUlZFUl9JTlRFUkZBQ0UgSWYgPSAoUFJQQ19TRVJWRVJfSU5URVJGQUNFKUlmU3BlYzsKICB1bnNpZ25lZCBsb25nIGM7CiAgUlBDX1NUQVRVUyByc2x0ID0gUlBDX1NfT0s7CgogIFRSQUNFKCIoJXAsJXAsJXAsJXMpXG4iLCBJZlNwZWMsIEJpbmRpbmdWZWN0b3IsIFV1aWRWZWN0b3IsIGRlYnVnc3RyX2EoKGNoYXIqKUFubm90YXRpb24pKTsKICBUUkFDRSgiIGlmaWQ9JXNcbiIsIGRlYnVnc3RyX2d1aWQoJklmLT5JbnRlcmZhY2VJZC5TeW50YXhHVUlEKSk7CiAgZm9yIChjPTA7IGM8QmluZGluZ1ZlY3Rvci0+Q291bnQ7IGMrKykgewogICAgUnBjQmluZGluZyogYmluZCA9IChScGNCaW5kaW5nKikoQmluZGluZ1ZlY3Rvci0+QmluZGluZ0hbY10pOwogICAgVFJBQ0UoIiBwcm90c2VxWyVsZF09JXNcbiIsIGMsIGRlYnVnc3RyX2EoYmluZC0+UHJvdHNlcSkpOwogICAgVFJBQ0UoIiBlbmRwb2ludFslbGRdPSVzXG4iLCBjLCBkZWJ1Z3N0cl9hKGJpbmQtPkVuZHBvaW50KSk7CiAgfQogIGlmIChVdWlkVmVjdG9yKSB7CiAgICBmb3IgKGM9MDsgYzxVdWlkVmVjdG9yLT5Db3VudDsgYysrKQogICAgICBUUkFDRSgiIG9ialslbGRdPSVzXG4iLCBjLCBkZWJ1Z3N0cl9ndWlkKFV1aWRWZWN0b3ItPlV1aWRbY10pKTsKICB9CgogIC8qIEZJWE1FOiBEbyBzb21ldGhpbmcgd2l0aCBhbm5vdGF0aW9uLiAqLwoKICAvKiBjb25zdHJ1Y3QgdGhlIG1lc3NhZ2UgdG8gcnBjc3MgKi8KICBtc2cubWVzc2FnZV90eXBlID0gUlBDU1NfTlBfTUVTU0FHRV9UWVBFSURfUkVHSVNURVJFUE1TRzsKICBtc2cubWVzc2FnZS5yZWdpc3RlcmVwbXNnLmlmYWNlID0gSWYtPkludGVyZmFjZUlkOwogIG1zZy5tZXNzYWdlLnJlZ2lzdGVyZXBtc2cubm9fcmVwbGFjZSA9IDA7CgogIG1zZy5tZXNzYWdlLnJlZ2lzdGVyZXBtc2cub2JqZWN0X2NvdW50ID0gKFV1aWRWZWN0b3IpID8gVXVpZFZlY3Rvci0+Q291bnQgOiAwOwogIG1zZy5tZXNzYWdlLnJlZ2lzdGVyZXBtc2cuYmluZGluZ19jb3VudCA9IEJpbmRpbmdWZWN0b3ItPkNvdW50OwoKICAvKiBjYWxjdWxhdGUgdmFyZGF0YSBwYXlsb2FkIHNpemUgKi8KICBtc2cudmFyZGF0YV9wYXlsb2FkX3NpemUgPSBtc2cubWVzc2FnZS5yZWdpc3RlcmVwbXNnLm9iamVjdF9jb3VudCAqIHNpemVvZihVVUlEKTsKICBmb3IgKGM9MDsgYyA8IG1zZy5tZXNzYWdlLnJlZ2lzdGVyZXBtc2cuYmluZGluZ19jb3VudDsgYysrKSB7CiAgICBScGNCaW5kaW5nICpiaW5kID0gKFJwY0JpbmRpbmcgKikoQmluZGluZ1ZlY3Rvci0+QmluZGluZ0hbY10pOwogICAgbXNnLnZhcmRhdGFfcGF5bG9hZF9zaXplICs9IHN0cmxlbihiaW5kLT5Qcm90c2VxKSArIDE7CiAgICBtc2cudmFyZGF0YV9wYXlsb2FkX3NpemUgKz0gc3RybGVuKGJpbmQtPkVuZHBvaW50KSArIDE7CiAgfQoKICAvKiBhbGxvY2F0ZSB0aGUgcGF5bG9hZCBidWZmZXIgKi8KICB2cCA9IHZhcmRhdGFfcGF5bG9hZCA9IExvY2FsQWxsb2MoTFBUUiwgbXNnLnZhcmRhdGFfcGF5bG9hZF9zaXplKTsKICBpZiAoIXZhcmRhdGFfcGF5bG9hZCkKICAgIHJldHVybiBSUENfU19PVVRfT0ZfTUVNT1JZOwoKICAvKiBwb3B1bGF0ZSB0aGUgcGF5bG9hZCBkYXRhICovCiAgZm9yIChjPTA7IGMgPCBtc2cubWVzc2FnZS5yZWdpc3RlcmVwbXNnLm9iamVjdF9jb3VudDsgYysrKSB7CiAgICBDb3B5TWVtb3J5KHZwLCBVdWlkVmVjdG9yLT5VdWlkW2NdLCBzaXplb2YoVVVJRCkpOwogICAgdnAgKz0gc2l6ZW9mKFVVSUQpOwogIH0KCiAgZm9yIChjPTA7IGMgPCBtc2cubWVzc2FnZS5yZWdpc3RlcmVwbXNnLmJpbmRpbmdfY291bnQ7IGMrKykgewogICAgUnBjQmluZGluZyAqYmluZCA9IChScGNCaW5kaW5nKikoQmluZGluZ1ZlY3Rvci0+QmluZGluZ0hbY10pOwogICAgdW5zaWduZWQgbG9uZyBwc2xlbiA9IHN0cmxlbihiaW5kLT5Qcm90c2VxKSArIDEsIGVwbGVuID0gc3RybGVuKGJpbmQtPkVuZHBvaW50KSArIDE7CiAgICBDb3B5TWVtb3J5KHZwLCBiaW5kLT5Qcm90c2VxLCBwc2xlbik7CiAgICB2cCArPSBwc2xlbjsKICAgIENvcHlNZW1vcnkodnAsIGJpbmQtPkVuZHBvaW50LCBlcGxlbik7CiAgICB2cCArPSBlcGxlbjsKICB9CgogIC8qIHNlbmQgb3VyIHJlcXVlc3QgKi8KICBpZiAoIVJQQ1JUNF9SUENTU09uRGVtYW5kQ2FsbCgmbXNnLCB2YXJkYXRhX3BheWxvYWQsICZyZXBseSkpCiAgICByc2x0ID0gUlBDX1NfT1VUX09GX01FTU9SWTsKCiAgLyogZnJlZSB0aGUgcGF5bG9hZCBidWZmZXIgKi8KICBMb2NhbEZyZWUodmFyZGF0YV9wYXlsb2FkKTsKCiAgcmV0dXJuIHJzbHQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBScGNFcFVucmVnaXN0ZXIgKFJQQ1JUNC5AKQogKi8KUlBDX1NUQVRVUyBXSU5BUEkgUnBjRXBVbnJlZ2lzdGVyKCBSUENfSUZfSEFORExFIElmU3BlYywgUlBDX0JJTkRJTkdfVkVDVE9SICpCaW5kaW5nVmVjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVVSURfVkVDVE9SICpVdWlkVmVjdG9yICkKewogIFJQQ1NTX05QX01FU1NBR0UgbXNnOwogIFJQQ1NTX05QX1JFUExZIHJlcGx5OwogIGNoYXIgKnZhcmRhdGFfcGF5bG9hZCwgKnZwOwogIFBSUENfU0VSVkVSX0lOVEVSRkFDRSBJZiA9IChQUlBDX1NFUlZFUl9JTlRFUkZBQ0UpSWZTcGVjOwogIHVuc2lnbmVkIGxvbmcgYzsKICBSUENfU1RBVFVTIHJzbHQgPSBSUENfU19PSzsKCiAgVFJBQ0UoIiglcCwlcCwlcClcbiIsIElmU3BlYywgQmluZGluZ1ZlY3RvciwgVXVpZFZlY3Rvcik7CiAgVFJBQ0UoIiBpZmlkPSVzXG4iLCBkZWJ1Z3N0cl9ndWlkKCZJZi0+SW50ZXJmYWNlSWQuU3ludGF4R1VJRCkpOwogIGZvciAoYz0wOyBjPEJpbmRpbmdWZWN0b3ItPkNvdW50OyBjKyspIHsKICAgIFJwY0JpbmRpbmcqIGJpbmQgPSAoUnBjQmluZGluZyopKEJpbmRpbmdWZWN0b3ItPkJpbmRpbmdIW2NdKTsKICAgIFRSQUNFKCIgcHJvdHNlcVslbGRdPSVzXG4iLCBjLCBkZWJ1Z3N0cl9hKGJpbmQtPlByb3RzZXEpKTsKICAgIFRSQUNFKCIgZW5kcG9pbnRbJWxkXT0lc1xuIiwgYywgZGVidWdzdHJfYShiaW5kLT5FbmRwb2ludCkpOwogIH0KICBpZiAoVXVpZFZlY3RvcikgewogICAgZm9yIChjPTA7IGM8VXVpZFZlY3Rvci0+Q291bnQ7IGMrKykKICAgICAgVFJBQ0UoIiBvYmpbJWxkXT0lc1xuIiwgYywgZGVidWdzdHJfZ3VpZChVdWlkVmVjdG9yLT5VdWlkW2NdKSk7CiAgfQoKICAvKiBjb25zdHJ1Y3QgdGhlIG1lc3NhZ2UgdG8gcnBjc3MgKi8KICBtc2cubWVzc2FnZV90eXBlID0gUlBDU1NfTlBfTUVTU0FHRV9UWVBFSURfVU5SRUdJU1RFUkVQTVNHOwogIG1zZy5tZXNzYWdlLnVucmVnaXN0ZXJlcG1zZy5pZmFjZSA9IElmLT5JbnRlcmZhY2VJZDsKCiAgbXNnLm1lc3NhZ2UudW5yZWdpc3RlcmVwbXNnLm9iamVjdF9jb3VudCA9IChVdWlkVmVjdG9yKSA/IFV1aWRWZWN0b3ItPkNvdW50IDogMDsKICBtc2cubWVzc2FnZS51bnJlZ2lzdGVyZXBtc2cuYmluZGluZ19jb3VudCA9IEJpbmRpbmdWZWN0b3ItPkNvdW50OwoKICAvKiBjYWxjdWxhdGUgdmFyZGF0YSBwYXlsb2FkIHNpemUgKi8KICBtc2cudmFyZGF0YV9wYXlsb2FkX3NpemUgPSBtc2cubWVzc2FnZS51bnJlZ2lzdGVyZXBtc2cub2JqZWN0X2NvdW50ICogc2l6ZW9mKFVVSUQpOwogIGZvciAoYz0wOyBjIDwgbXNnLm1lc3NhZ2UudW5yZWdpc3RlcmVwbXNnLmJpbmRpbmdfY291bnQ7IGMrKykgewogICAgUnBjQmluZGluZyAqYmluZCA9IChScGNCaW5kaW5nICopKEJpbmRpbmdWZWN0b3ItPkJpbmRpbmdIW2NdKTsKICAgIG1zZy52YXJkYXRhX3BheWxvYWRfc2l6ZSArPSBzdHJsZW4oYmluZC0+UHJvdHNlcSkgKyAxOwogICAgbXNnLnZhcmRhdGFfcGF5bG9hZF9zaXplICs9IHN0cmxlbihiaW5kLT5FbmRwb2ludCkgKyAxOwogIH0KCiAgLyogYWxsb2NhdGUgdGhlIHBheWxvYWQgYnVmZmVyICovCiAgdnAgPSB2YXJkYXRhX3BheWxvYWQgPSBMb2NhbEFsbG9jKExQVFIsIG1zZy52YXJkYXRhX3BheWxvYWRfc2l6ZSk7CiAgaWYgKCF2YXJkYXRhX3BheWxvYWQpCiAgICByZXR1cm4gUlBDX1NfT1VUX09GX01FTU9SWTsKCiAgLyogcG9wdWxhdGUgdGhlIHBheWxvYWQgZGF0YSAqLwogIGZvciAoYz0wOyBjIDwgbXNnLm1lc3NhZ2UudW5yZWdpc3RlcmVwbXNnLm9iamVjdF9jb3VudDsgYysrKSB7CiAgICBDb3B5TWVtb3J5KHZwLCBVdWlkVmVjdG9yLT5VdWlkW2NdLCBzaXplb2YoVVVJRCkpOwogICAgdnAgKz0gc2l6ZW9mKFVVSUQpOwogIH0KCiAgZm9yIChjPTA7IGMgPCBtc2cubWVzc2FnZS51bnJlZ2lzdGVyZXBtc2cuYmluZGluZ19jb3VudDsgYysrKSB7CiAgICBScGNCaW5kaW5nICpiaW5kID0gKFJwY0JpbmRpbmcqKShCaW5kaW5nVmVjdG9yLT5CaW5kaW5nSFtjXSk7CiAgICB1bnNpZ25lZCBsb25nIHBzbGVuID0gc3RybGVuKGJpbmQtPlByb3RzZXEpICsgMSwgZXBsZW4gPSBzdHJsZW4oYmluZC0+RW5kcG9pbnQpICsgMTsKICAgIENvcHlNZW1vcnkodnAsIGJpbmQtPlByb3RzZXEsIHBzbGVuKTsKICAgIHZwICs9IHBzbGVuOwogICAgQ29weU1lbW9yeSh2cCwgYmluZC0+RW5kcG9pbnQsIGVwbGVuKTsKICAgIHZwICs9IGVwbGVuOwogIH0KCiAgLyogc2VuZCBvdXIgcmVxdWVzdCAqLwogIGlmICghUlBDUlQ0X1JQQ1NTT25EZW1hbmRDYWxsKCZtc2csIHZhcmRhdGFfcGF5bG9hZCwgJnJlcGx5KSkKICAgIHJzbHQgPSBSUENfU19PVVRfT0ZfTUVNT1JZOwoKICAvKiBmcmVlIHRoZSBwYXlsb2FkIGJ1ZmZlciAqLwogIExvY2FsRnJlZSh2YXJkYXRhX3BheWxvYWQpOwoKICByZXR1cm4gcnNsdDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgIFJwY0VwUmVzb2x2ZUJpbmRpbmcgKFJQQ1JUNC5AKQogKi8KUlBDX1NUQVRVUyBXSU5BUEkgUnBjRXBSZXNvbHZlQmluZGluZyggUlBDX0JJTkRJTkdfSEFORExFIEJpbmRpbmcsIFJQQ19JRl9IQU5ETEUgSWZTcGVjICkKewogIFJQQ1NTX05QX01FU1NBR0UgbXNnOwogIFJQQ1NTX05QX1JFUExZIHJlcGx5OwogIFBSUENfQ0xJRU5UX0lOVEVSRkFDRSBJZiA9IChQUlBDX0NMSUVOVF9JTlRFUkZBQ0UpSWZTcGVjOwogIFJwY0JpbmRpbmcqIGJpbmQgPSAoUnBjQmluZGluZyopQmluZGluZzsKCiAgVFJBQ0UoIiglcCwlcClcbiIsIEJpbmRpbmcsIElmU3BlYyk7CiAgVFJBQ0UoIiBwcm90c2VxPSVzXG4iLCBkZWJ1Z3N0cl9hKGJpbmQtPlByb3RzZXEpKTsKICBUUkFDRSgiIG9iaj0lc1xuIiwgZGVidWdzdHJfZ3VpZCgmYmluZC0+T2JqZWN0VXVpZCkpOwogIFRSQUNFKCIgaWZpZD0lc1xuIiwgZGVidWdzdHJfZ3VpZCgmSWYtPkludGVyZmFjZUlkLlN5bnRheEdVSUQpKTsKCiAgLyogRklYTUU6IHRvdGFsbHkgdW50ZXN0ZWQgKi8KCiAgLyoganVzdCByZXR1cm4gZm9yIGZ1bGx5IGJvdW5kIGhhbmRsZXMgKi8KICBpZiAoYmluZC0+RW5kcG9pbnQgJiYgKGJpbmQtPkVuZHBvaW50WzBdICE9ICdcMCcpKQogICAgcmV0dXJuIFJQQ19TX09LOwoKICAvKiBjb25zdHJ1Y3QgdGhlIG1lc3NhZ2UgdG8gcnBjc3MgKi8KICBtc2cubWVzc2FnZV90eXBlID0gUlBDU1NfTlBfTUVTU0FHRV9UWVBFSURfUkVTT0xWRUVQTVNHOwogIG1zZy5tZXNzYWdlLnJlc29sdmVlcG1zZy5pZmFjZSA9IElmLT5JbnRlcmZhY2VJZDsKICBtc2cubWVzc2FnZS5yZXNvbHZlZXBtc2cub2JqZWN0ID0gYmluZC0+T2JqZWN0VXVpZDsKIAogIG1zZy52YXJkYXRhX3BheWxvYWRfc2l6ZSA9IHN0cmxlbihiaW5kLT5Qcm90c2VxKSArIDE7CgogIC8qIHNlbmQgdGhlIG1lc3NhZ2UgKi8KICBpZiAoIVJQQ1JUNF9SUENTU09uRGVtYW5kQ2FsbCgmbXNnLCBiaW5kLT5Qcm90c2VxLCAmcmVwbHkpKQogICAgcmV0dXJuIFJQQ19TX09VVF9PRl9NRU1PUlk7CgogIC8qIGVtcHR5LXN0cmluZyByZXN1bHQgbWVhbnMgbm90IHJlZ2lzdGVyZWQgKi8KICBpZiAocmVwbHkuYXNfc3RyaW5nWzBdID09ICdcMCcpCiAgICByZXR1cm4gRVBUX1NfTk9UX1JFR0lTVEVSRUQ7CiAgCiAgLyogb3RoZXJ3aXNlIHdlIGZ1bGx5IGJpbmQgdGhlIGhhbmRsZSAmIHJldHVybiBSUENfU19PSyAqLwogIHJldHVybiBSUENSVDRfUmVzb2x2ZUJpbmRpbmcoQmluZGluZywgcmVwbHkuYXNfc3RyaW5nKTsKfQo=