LyoKICogTUlETCBwcm94eS9zdHViIHN0dWZmCiAqCiAqIENvcHlyaWdodCAyMDAyIE92ZSBL5XZlbiwgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKgogKiBUT0RPOgogKiAgLSBmaWd1cmUgb3V0IHdoZXRoZXIgd2UgKnJlYWxseSogZ290IHRoaXMgcmlnaHQKICogIC0gY2hlY2sgZm9yIGVycm9ycyBhbmQgdGhyb3cgZXhjZXB0aW9ucwogKi8KCiNpbmNsdWRlIDxzdGRhcmcuaD4KCiNkZWZpbmUgQ09CSk1BQ1JPUwoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKCiNpbmNsdWRlICJvYmpiYXNlLmgiCgojaW5jbHVkZSAicnBjcHJveHkuaCIKCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgojaW5jbHVkZSAibmRyX21pc2MuaCIKI2luY2x1ZGUgInJwY25kci5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwocnBjKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgTmRyQ2xpZW50SW5pdGlhbGl6ZU5ldyBbUlBDUlQ0LkBdCiAqLwp2b2lkIFdJTkFQSSBOZHJDbGllbnRJbml0aWFsaXplTmV3KCBQUlBDX01FU1NBR0UgcFJwY01lc3NhZ2UsIFBNSURMX1NUVUJfTUVTU0FHRSBwU3R1Yk1zZywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBNSURMX1NUVUJfREVTQyBwU3R1YkRlc2MsIHVuc2lnbmVkIGludCBQcm9jTnVtICkKewogIFRSQUNFKCIocFJwY01lc3NhZ2UgPT0gXiVwLCBwU3R1Yk1zZyA9PSBeJXAsIHBTdHViRGVzYyA9PSBeJXAsIFByb2NOdW0gPT0gJWQpXG4iLAogICAgcFJwY01lc3NhZ2UsIHBTdHViTXNnLCBwU3R1YkRlc2MsIFByb2NOdW0pOwoKICBwUnBjTWVzc2FnZS0+SGFuZGxlID0gTlVMTDsKICBwUnBjTWVzc2FnZS0+UHJvY051bSA9IFByb2NOdW0gfCBSUENfRkxBR1NfVkFMSURfQklUOwogIHBScGNNZXNzYWdlLT5ScGNJbnRlcmZhY2VJbmZvcm1hdGlvbiA9IHBTdHViRGVzYy0+UnBjSW50ZXJmYWNlSW5mb3JtYXRpb247CiAgcFJwY01lc3NhZ2UtPlJwY0ZsYWdzID0gMDsKICBwUnBjTWVzc2FnZS0+UmVzZXJ2ZWRGb3JSdW50aW1lID0gTlVMTDsKICBwUnBjTWVzc2FnZS0+RGF0YVJlcHJlc2VudGF0aW9uID0gTkRSX0xPQ0FMX0RBVEFfUkVQUkVTRU5UQVRJT047CgogIHBTdHViTXNnLT5ScGNNc2cgPSBwUnBjTWVzc2FnZTsKICBwU3R1Yk1zZy0+QnVmZmVyU3RhcnQgPSBOVUxMOwogIHBTdHViTXNnLT5CdWZmZXJFbmQgPSBOVUxMOwogIHBTdHViTXNnLT5CdWZmZXJMZW5ndGggPSAwOwogIHBTdHViTXNnLT5Jc0NsaWVudCA9IFRSVUU7CiAgcFN0dWJNc2ctPlJldXNlQnVmZmVyID0gRkFMU0U7CiAgcFN0dWJNc2ctPnBBbGxvY0FsbE5vZGVzQ29udGV4dCA9IE5VTEw7CiAgcFN0dWJNc2ctPnBQb2ludGVyUXVldWVTdGF0ZSA9IE5VTEw7CiAgcFN0dWJNc2ctPklnbm9yZUVtYmVkZGVkUG9pbnRlcnMgPSAwOwogIHBTdHViTXNnLT5Qb2ludGVyQnVmZmVyTWFyayA9IE5VTEw7CiAgcFN0dWJNc2ctPmZCdWZmZXJWYWxpZCA9IDA7CiAgcFN0dWJNc2ctPnVGbGFncyA9IDA7CiAgcFN0dWJNc2ctPnBmbkFsbG9jYXRlID0gcFN0dWJEZXNjLT5wZm5BbGxvY2F0ZTsKICBwU3R1Yk1zZy0+cGZuRnJlZSA9IHBTdHViRGVzYy0+cGZuRnJlZTsKICBwU3R1Yk1zZy0+U3RhY2tUb3AgPSBOVUxMOwogIHBTdHViTXNnLT5TdHViRGVzYyA9IHBTdHViRGVzYzsKICBwU3R1Yk1zZy0+RnVsbFB0clJlZklkID0gMDsKICBwU3R1Yk1zZy0+UG9pbnRlckxlbmd0aCA9IDA7CiAgcFN0dWJNc2ctPmZJbkRvbnRGcmVlID0gMDsKICBwU3R1Yk1zZy0+ZkRvbnRDYWxsRnJlZUluc3QgPSAwOwogIHBTdHViTXNnLT5mSW5Pbmx5UGFyYW0gPSAwOwogIHBTdHViTXNnLT5mSGFzUmV0dXJuID0gMDsKICBwU3R1Yk1zZy0+Zkhhc0V4dGVuc2lvbnMgPSAwOwogIHBTdHViTXNnLT5mSGFzTmV3Q29yckRlc2MgPSAwOwogIHBTdHViTXNnLT5mVW51c2VkID0gMDsKICBwU3R1Yk1zZy0+ZHdEZXN0Q29udGV4dCA9IE1TSENUWF9ESUZGRVJFTlRNQUNISU5FOwogIHBTdHViTXNnLT5wdkRlc3RDb250ZXh0ID0gTlVMTDsKICBwU3R1Yk1zZy0+cFJwY0NoYW5uZWxCdWZmZXIgPSBOVUxMOwogIHBTdHViTXNnLT5wQXJyYXlJbmZvID0gTlVMTDsKICBwU3R1Yk1zZy0+ZHdTdHViUGhhc2UgPSAwOwogIC8qIEZJWE1FOiBMb3dTdGFja01hcmsgKi8KICBwU3R1Yk1zZy0+cEFzeW5jTXNnID0gTlVMTDsKICBwU3R1Yk1zZy0+cENvcnJJbmZvID0gTlVMTDsKICBwU3R1Yk1zZy0+cENvcnJNZW1vcnkgPSBOVUxMOwogIHBTdHViTXNnLT5wTWVtb3J5TGlzdCA9IE5VTEw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICBOZHJTZXJ2ZXJJbml0aWFsaXplTmV3IFtSUENSVDQuQF0KICovCnVuc2lnbmVkIGNoYXIqIFdJTkFQSSBOZHJTZXJ2ZXJJbml0aWFsaXplTmV3KCBQUlBDX01FU1NBR0UgcFJwY01zZywgUE1JRExfU1RVQl9NRVNTQUdFIHBTdHViTXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE1JRExfU1RVQl9ERVNDIHBTdHViRGVzYyApCnsKICBUUkFDRSgiKHBScGNNc2cgPT0gXiVwLCBwU3R1Yk1zZyA9PSBeJXAsIHBTdHViRGVzYyA9PSBeJXApXG4iLCBwUnBjTXNnLCBwU3R1Yk1zZywgcFN0dWJEZXNjKTsKCiAgcFN0dWJNc2ctPlJwY01zZyA9IHBScGNNc2c7CiAgcFN0dWJNc2ctPkJ1ZmZlciA9IHBTdHViTXNnLT5CdWZmZXJTdGFydCA9IHBScGNNc2ctPkJ1ZmZlcjsKICBwU3R1Yk1zZy0+QnVmZmVyRW5kID0gcFN0dWJNc2ctPkJ1ZmZlciArIHBScGNNc2ctPkJ1ZmZlckxlbmd0aDsKICBwU3R1Yk1zZy0+QnVmZmVyTGVuZ3RoID0gcFJwY01zZy0+QnVmZmVyTGVuZ3RoOwogIHBTdHViTXNnLT5Jc0NsaWVudCA9IEZBTFNFOwogIHBTdHViTXNnLT5SZXVzZUJ1ZmZlciA9IEZBTFNFOwogIHBTdHViTXNnLT5wQWxsb2NBbGxOb2Rlc0NvbnRleHQgPSBOVUxMOwogIHBTdHViTXNnLT5wUG9pbnRlclF1ZXVlU3RhdGUgPSBOVUxMOwogIHBTdHViTXNnLT5JZ25vcmVFbWJlZGRlZFBvaW50ZXJzID0gMDsKICBwU3R1Yk1zZy0+UG9pbnRlckJ1ZmZlck1hcmsgPSBOVUxMOwogIHBTdHViTXNnLT51RmxhZ3MgPSAwOwogIHBTdHViTXNnLT5wZm5BbGxvY2F0ZSA9IHBTdHViRGVzYy0+cGZuQWxsb2NhdGU7CiAgcFN0dWJNc2ctPnBmbkZyZWUgPSBwU3R1YkRlc2MtPnBmbkZyZWU7CiAgcFN0dWJNc2ctPlN0YWNrVG9wID0gTlVMTDsKICBwU3R1Yk1zZy0+U3R1YkRlc2MgPSBwU3R1YkRlc2M7CiAgcFN0dWJNc2ctPkZ1bGxQdHJYbGF0VGFibGVzID0gTlVMTDsKICBwU3R1Yk1zZy0+RnVsbFB0clJlZklkID0gMDsKICBwU3R1Yk1zZy0+UG9pbnRlckxlbmd0aCA9IDA7CiAgcFN0dWJNc2ctPmZJbkRvbnRGcmVlID0gMDsKICBwU3R1Yk1zZy0+ZkRvbnRDYWxsRnJlZUluc3QgPSAwOwogIHBTdHViTXNnLT5mSW5Pbmx5UGFyYW0gPSAwOwogIHBTdHViTXNnLT5mSGFzUmV0dXJuID0gMDsKICBwU3R1Yk1zZy0+Zkhhc0V4dGVuc2lvbnMgPSAwOwogIHBTdHViTXNnLT5mSGFzTmV3Q29yckRlc2MgPSAwOwogIHBTdHViTXNnLT5mVW51c2VkID0gMDsKICBwU3R1Yk1zZy0+ZHdEZXN0Q29udGV4dCA9IE1TSENUWF9ESUZGRVJFTlRNQUNISU5FOwogIHBTdHViTXNnLT5wdkRlc3RDb250ZXh0ID0gTlVMTDsKICBwU3R1Yk1zZy0+cFJwY0NoYW5uZWxCdWZmZXIgPSBOVUxMOwogIHBTdHViTXNnLT5wQXJyYXlJbmZvID0gTlVMTDsKICBwU3R1Yk1zZy0+ZHdTdHViUGhhc2UgPSAwOwogIC8qIEZJWE1FOiBMb3dTdGFja01hcmsgKi8KICBwU3R1Yk1zZy0+cEFzeW5jTXNnID0gTlVMTDsKICBwU3R1Yk1zZy0+cENvcnJJbmZvID0gTlVMTDsKICBwU3R1Yk1zZy0+cENvcnJNZW1vcnkgPSBOVUxMOwogIHBTdHViTXNnLT5wTWVtb3J5TGlzdCA9IE5VTEw7CgogIHJldHVybiBOVUxMOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5kckdldEJ1ZmZlciBbUlBDUlQ0LkBdCiAqLwp1bnNpZ25lZCBjaGFyICpXSU5BUEkgTmRyR2V0QnVmZmVyKFBNSURMX1NUVUJfTUVTU0FHRSBzdHVibXNnLCBVTE9ORyBidWZsZW4sIFJQQ19CSU5ESU5HX0hBTkRMRSBoYW5kbGUpCnsKICBSUENfU1RBVFVTIHN0YXR1czsKCiAgVFJBQ0UoIihzdHVibXNnID09IF4lcCwgYnVmbGVuID09ICV1LCBoYW5kbGUgPT0gJXApXG4iLCBzdHVibXNnLCBidWZsZW4sIGhhbmRsZSk7CiAgCiAgc3R1Ym1zZy0+UnBjTXNnLT5IYW5kbGUgPSBoYW5kbGU7CiAgc3R1Ym1zZy0+UnBjTXNnLT5CdWZmZXJMZW5ndGggPSBidWZsZW47CgogIHN0YXR1cyA9IElfUnBjR2V0QnVmZmVyKHN0dWJtc2ctPlJwY01zZyk7CiAgaWYgKHN0YXR1cyAhPSBSUENfU19PSykKICAgIFJwY1JhaXNlRXhjZXB0aW9uKHN0YXR1cyk7CgogIHN0dWJtc2ctPkJ1ZmZlciA9IHN0dWJtc2ctPlJwY01zZy0+QnVmZmVyOwogIHN0dWJtc2ctPmZCdWZmZXJWYWxpZCA9IFRSVUU7CiAgc3R1Ym1zZy0+QnVmZmVyTGVuZ3RoID0gc3R1Ym1zZy0+UnBjTXNnLT5CdWZmZXJMZW5ndGg7CiAgcmV0dXJuIHN0dWJtc2ctPkJ1ZmZlcjsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5kckZyZWVCdWZmZXIgW1JQQ1JUNC5AXQogKi8Kdm9pZCBXSU5BUEkgTmRyRnJlZUJ1ZmZlcihQTUlETF9TVFVCX01FU1NBR0UgcFN0dWJNc2cpCnsKICBUUkFDRSgiKHBTdHViTXNnID09IF4lcClcbiIsIHBTdHViTXNnKTsKICBpZiAocFN0dWJNc2ctPmZCdWZmZXJWYWxpZCkKICB7CiAgICBJX1JwY0ZyZWVCdWZmZXIocFN0dWJNc2ctPlJwY01zZyk7CiAgICBwU3R1Yk1zZy0+ZkJ1ZmZlclZhbGlkID0gRkFMU0U7CiAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJTZW5kUmVjZWl2ZSBbUlBDUlQ0LkBdCiAqLwp1bnNpZ25lZCBjaGFyICpXSU5BUEkgTmRyU2VuZFJlY2VpdmUoIFBNSURMX1NUVUJfTUVTU0FHRSBzdHVibXNnLCB1bnNpZ25lZCBjaGFyICpidWZmZXIgICkKewogIFJQQ19TVEFUVVMgc3RhdHVzOwoKICBUUkFDRSgiKHN0dWJtc2cgPT0gXiVwLCBidWZmZXIgPT0gXiVwKVxuIiwgc3R1Ym1zZywgYnVmZmVyKTsKCiAgLyogRklYTUU6IGhvdyB0byBoYW5kbGUgZXJyb3JzPyAocmFpc2UgZXhjZXB0aW9uPykgKi8KICBpZiAoIXN0dWJtc2cpIHsKICAgIEVSUigiTlVMTCBzdHViIG1lc3NhZ2UuICBObyBhY3Rpb24gdGFrZW4uXG4iKTsKICAgIHJldHVybiBOVUxMOwogIH0KICBpZiAoIXN0dWJtc2ctPlJwY01zZykgewogICAgRVJSKCJSUEMgTWVzc2FnZSBub3QgcHJlc2VudCBpbiBzdHViIG1lc3NhZ2UuICBObyBhY3Rpb24gdGFrZW4uXG4iKTsKICAgIHJldHVybiBOVUxMOwogIH0KCiAgc3R1Ym1zZy0+UnBjTXNnLT5CdWZmZXJMZW5ndGggPSBidWZmZXIgLSAodW5zaWduZWQgY2hhciAqKXN0dWJtc2ctPlJwY01zZy0+QnVmZmVyOwogIHN0YXR1cyA9IElfUnBjU2VuZFJlY2VpdmUoc3R1Ym1zZy0+UnBjTXNnKTsKICBpZiAoc3RhdHVzICE9IFJQQ19TX09LKQogICAgUnBjUmFpc2VFeGNlcHRpb24oc3RhdHVzKTsKCiAgc3R1Ym1zZy0+QnVmZmVyTGVuZ3RoID0gc3R1Ym1zZy0+UnBjTXNnLT5CdWZmZXJMZW5ndGg7CiAgc3R1Ym1zZy0+QnVmZmVyU3RhcnQgPSBzdHVibXNnLT5ScGNNc2ctPkJ1ZmZlcjsKICBzdHVibXNnLT5CdWZmZXJFbmQgPSBzdHVibXNnLT5CdWZmZXJTdGFydCArIHN0dWJtc2ctPkJ1ZmZlckxlbmd0aDsKICBzdHVibXNnLT5CdWZmZXIgPSBzdHVibXNnLT5CdWZmZXJTdGFydDsKCiAgLyogRklYTUU6IGlzIHRoaXMgdGhlIHJpZ2h0IHJldHVybiB2YWx1ZT8gKi8KICByZXR1cm4gTlVMTDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRyTWFwQ29tbUFuZEZhdWx0U3RhdHVzIFtSUENSVDQuQF0KICovClJQQ19TVEFUVVMgUlBDX0VOVFJZIE5kck1hcENvbW1BbmRGYXVsdFN0YXR1cyggUE1JRExfU1RVQl9NRVNTQUdFIHBTdHViTXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HICpwQ29tbVN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyAqcEZhdWx0U3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJQQ19TVEFUVVMgU3RhdHVzICkKewogICAgVFJBQ0UoIiglcCwgJXAsICVwLCAlbGQpXG4iLCBwU3R1Yk1zZywgcENvbW1TdGF0dXMsIHBGYXVsdFN0YXR1cywgU3RhdHVzKTsKCiAgICBzd2l0Y2ggKFN0YXR1cykKICAgIHsKICAgIGNhc2UgRVJST1JfSU5WQUxJRF9IQU5ETEU6CiAgICBjYXNlIFJQQ19TX0lOVkFMSURfQklORElORzoKICAgIGNhc2UgUlBDX1NfVU5LTk9XTl9JRjoKICAgIGNhc2UgUlBDX1NfU0VSVkVSX1VOQVZBSUxBQkxFOgogICAgY2FzZSBSUENfU19TRVJWRVJfVE9PX0JVU1k6CiAgICBjYXNlIFJQQ19TX0NBTExfRkFJTEVEX0RORToKICAgIGNhc2UgUlBDX1NfUFJPVE9DT0xfRVJST1I6CiAgICBjYXNlIFJQQ19TX1VOU1VQUE9SVEVEX1RSQU5TX1NZTjoKICAgIGNhc2UgUlBDX1NfVU5TVVBQT1JURURfVFlQRToKICAgIGNhc2UgUlBDX1NfUFJPQ05VTV9PVVRfT0ZfUkFOR0U6CiAgICBjYXNlIEVQVF9TX05PVF9SRUdJU1RFUkVEOgogICAgY2FzZSBSUENfU19DT01NX0ZBSUxVUkU6CiAgICAgICAgKnBDb21tU3RhdHVzID0gU3RhdHVzOwogICAgICAgICpwRmF1bHRTdGF0dXMgPSAwOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICAqcENvbW1TdGF0dXMgPSAwOwogICAgICAgICpwRmF1bHRTdGF0dXMgPSBTdGF0dXM7CiAgICB9CgogICAgcmV0dXJuIFJQQ19TX09LOwp9Cg==