LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgICAgICAgRFlOQU1JQyBNRU1PUlkgTUFOQUdFTUVOVCBNT0RVTEUgICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICRNb2R1bGU6ICAgTUVNT1JZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8gCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxICAgICAgKiAqLwovKiAqICBNUEkgZnVlciBJbmZvcm1hdGlrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICAgKiAqLwovKiAqICBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VICAgICAgICAqICovCi8qICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlICAgICAgICogKi8KLyogKiAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgKiAqLwovKiAqICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCAgKiAqLwovKiAqICBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuICAgICAqICovCi8qICogIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTICAgICogKi8KLyogKiAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgKiAqLwovKiAqICBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgICAgKiAqLwovKiAqICBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAqICovCi8qICogIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSAgICAgICogKi8KLyogKiAgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogJFJldmlzaW9uJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICRTdGF0ZSQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogJERhdGUkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICRBdXRob3IkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgQ29udGFjdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgICAgICAgICAgICBDaHJpc3RvcGggV2VpZGVuYmFjaCAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgIE1QSSBmdWVyIEluZm9ybWF0aWsgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgU3R1aGxzYXR6ZW5oYXVzd2VnIDg1ICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgICAgICAgICAgICA2NjEyMyBTYWFyYnJ1ZWNrZW4gICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgIEVtYWlsOiB3ZWlkZW5iQG1waS1zYi5tcGcuZGUgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgR2VybWFueSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgovKiAkUkNTZmlsZSQgKi8KCiNpbmNsdWRlICJtZW1vcnkuaCIKCnVuc2lnbmVkIGludCAgbWVtb3J5X1BBR0VTSVpFOyAgIC8qIHNpemUgb2YgYSBwYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCmxvbmcgICAgICAgICAgbWVtb3J5X01BWE1FTTsgICAgIC8qIGFtb3VudCBvZiBtZW1vcnkgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uICovCnN0YXRpYyBpbnQgICAgbWVtb3J5X19FT0YgPSBFT0Y7IC8qIGludGVybmFsICJFbmQgT2YgTWVtb3J5IiBtYXJrZXIgICAgICAgICAgICovCnVuc2lnbmVkIGxvbmcgbWVtb3J5X05FV0JZVEVTOyAgIC8qIG51bWJlciBvZiBhbGxvY2F0ZWQgYnl0ZXMgICAgICAgICAgICAgICAgICovCnVuc2lnbmVkIGxvbmcgbWVtb3J5X0ZSRUVEQllURVM7IC8qIG51bWJlciBvZiBmcmVlZCBieXRlcyAgICAgICAgICAgICAgICAgICAgICovCgpjb25zdCB1bnNpZ25lZCBpbnQgbWVtb3J5X0FMSUdOID0gc2l6ZW9mKFBPSU5URVIpOyAKLyogQ3J1Y2lhbDogaGFyZHdhcmUgbXVzdCBzdXBwb3J0IGFjY2VzcyB0byB3b3JkcyAKICAgb2Ygc2l6ZSBQT0lOVEVSLgoqLwoKI2lmZGVmIENIRUNLCnVuc2lnbmVkIGludCBtZW1vcnlfTEVGVFRBRzsgICAgIC8qIHNpemUgb2YgbGVmdCBkZWJ1ZyBtYXJrICAgICAgICAgICAgICAgICAgICovCnVuc2lnbmVkIGludCBtZW1vcnlfT0ZGU0VUOyAgICAgIC8qIGFsaWdubWVudC1jb3JyZWN0IHNpemUgb2YgbGVmdCBkZWJ1ZyBtYXJrICovCnVuc2lnbmVkIGludCBtZW1vcnlfTUFSS1NJWkU7ICAgIC8qIHRvdGFsIHNpemUgb2YgZGVidWcgbWFya3MgICAgICAgICAgICAgICAgICovCgpCT09MICAgICAgICAgbWVtb3J5X01BTkFHRU1FTlRfSU5JVElBTElaRUQgPSBGQUxTRTsKCiNlbHNlICAvKiBDSEVDSyBub3QgZGVmaW5lZCAqLwp1bnNpZ25lZCBpbnQgbWVtb3J5X01BUktTSVpFID0gMDsKdW5zaWduZWQgaW50IG1lbW9yeV9PRkZTRVQgICA9IDA7CiNlbmRpZiAvKiBDSEVDSyAqLwoKY29uc3QgdW5zaWduZWQgaW50IG1lbW9yeV9NQUdJQ01BTExPQyA9IDE7IC8qICJibG9jayBhbGxvY2F0ZWQiIG1hcmtlciAqLwpjb25zdCB1bnNpZ25lZCBpbnQgbWVtb3J5X01BR0lDRlJFRSAgID0gMjsgLyogImJsb2NrIGZyZWVkIiBtYXJrZXIgICAgICovCgovKiBJbnRlcm5hbCBhcnJheSBvZiByZXNvdXJjZXMgZm9yIGRpZmZlcmVudCBibG9jayBzaXplcyAqLwovKiAuLi4gKyAxIHRvIHN1cHBvcnQgb2RkIHZhbHVlcyBmb3IgbWVtb3J5X19TSEFSRURQQUdFUyBsaWtlIDcgKi8Kc3RhdGljIE1FTU9SWV9SRVNPVVJDRSBtZW1vcnlfUEFHRVNbbWVtb3J5X19EWU5NQVhTSVpFL21lbW9yeV9fU0hBUkVEUEFHRVMgKyAxXTsKCgovKiBSZXNvdXJjZXMgZm9yIGFsbCBhZG1pbmlzdHJhdGVkIGJsb2NrIHNpemVzICovCk1FTU9SWV9SRVNPVVJDRSAqIG1lbW9yeV9BUlJBWVttZW1vcnlfX0RZTk1BWFNJWkVdOwoKLyogZG91YmxlIGxpbmtlZCBsaXN0IGZvciBhZG1pbmlzdGVyaW5nIGJsb2NrcyBvZiBtZW1vcnkKICAgd2hvc2Ugc2l6ZSBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIG1lbW9yeV9fRFlOTUFYU0laRS4KKi8gCk1FTU9SWV9CSUdCTE9DS0hFQURFUiBtZW1vcnlfQklHQkxPQ0tTID0gTlVMTDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwovKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogIElOSVRJQUxJWkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZmRlZiBDSEVDSwpzdGF0aWMgQk9PTCBtZW1vcnlfTWFuYWdlbWVudEluaXRpYWxpemVkKHZvaWQpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgIElOUFVUICA6IE5vbmUuCiAgIFJFVFVSTlM6IFRSVUUgaWYgbWVtb3J5IG1hbmFnZW1lbnQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCwKICAgICAgICAgICAgZWxzZSBGQUxTRS4KICAgU1VNTUFSWTogQ2hlY2tzIGlmIG1lbW9yeV9Jbml0IHdhcyBjYWxsZWQuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICByZXR1cm4gbWVtb3J5X01BTkFHRU1FTlRfSU5JVElBTElaRUQ7Cn0KI2VuZGlmIC8qIENIRUNLICovCgp2b2lkIG1lbW9yeV9Jbml0KGxvbmcgTWF4bWVtKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUICA6IFRoZSBtYXhpbWFsIGFtb3VudCBvZiBtZW1vcnkgYXZhaWxhYmxlIGluIGJ5dGVzIAogICAgICAgICAgIGZvciB0aGUgbWVtb3J5IG1vZHVsZTsgaWYgTWF4bWVtIDwgMCB0aGUgbW9kdWxlIAogICAgICAgICAgIGFsbG9jYXRlcyBhcyBtdWNoIG1lbW9yeSBhcyBhdmFpbGFibGUgZnJvbSB0aGUgCiAgICAgICAgICAgc3lzdGVtLgogIFJFVFVSTlM6IE5vbmUuCiAgU1VNTUFSWTogSW5pdGlhbGl6ZXMgdGhlIG1lbW9yeSBtYW5hZ2VtZW50LiBJdCBoYXMgdG8gYmUgCiAgICAgICAgICAgY2FsbGVkIGJlZm9yZSB5b3UgY2FuIHBlcmZvcm0gYW55IG1vZHVsZSBvcGVyYXRpb24uIAogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gYXV0b21hdGljYWxseSBpbmNyZWFzZXMgdGhlIGRlZmF1bHQgCiAgICAgICAgICAgcGFnZSBzaXplIGlmIGl0IGlzIHRvbyBzbWFsbCBmb3IgdHdvIG9iamVjdHMgb2YgCiAgICAgICAgICAgc2l6ZSBtZW1vcnlfX0RZTk1BWFNJWkUuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICBpbnQgaTsKICBpbnQgZXh0cmE7ICAgICAgICAgICAgIC8qIHNpemUgb2YgaW50ZXJuYWxseSB1c2VkIHNwYWNlIG9uIGVhY2ggcGFnZSAgKi8KCiAgbWVtb3J5X0ZSRUVEQllURVMgPSAwOyAvKiBzZXQgdG90YWwgbnVtYmVyIG9mIGZyZWVkIGJ5dGVzIHRvIHplcm8gICAgICovCiAgbWVtb3J5X05FV0JZVEVTICAgPSAwOyAvKiBzZXQgdG90YWwgbnVtYmVyIG9mIGFsbG9jYXRlZCBieXRlcyB0byB6ZXJvICovCgogIC8qIHNldCB0aGUgc2l6ZSBvZiBhIHBhZ2Ugd2UgYWxsb2NhdGUgZnJvbSB0aGUgb3BlcmF0aW5nIHN5c3RlbSAqLwogIG1lbW9yeV9QQUdFU0laRSAgID0gbWVtb3J5X19ERUZBVUxUUEFHRVNJWkU7CgojaWZkZWYgQ0hFQ0sKCiAgLyogVGVzdCBpZiBtZW1vcnkgbWFuYWdlbWVudCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkICovCiAKICBpZiAoIW1lbW9yeV9NYW5hZ2VtZW50SW5pdGlhbGl6ZWQoKSkgewogICAgLyogaWYgdGhhdCBpcyBub3QgdGhlIGNhc2UsIHNldCBjaGVjayB2YXJpYWJsZSB0byBUUlVFICovCiAgICBtZW1vcnlfTUFOQUdFTUVOVF9JTklUSUFMSVpFRCA9IFRSVUU7CiAgfQogIGVsc2UgewogICAgLyogb3RoZXJ3aXNlIHRoZSB1c2VyIGlzIHRyeWluZyBpbml0aWFsaXplIGl0IGZvciBhIAogICAgICAgc2Vjb25kIHRpbWUsIHNvIHByaW50IGFuIGVycm9yIGFuZCBleGl0LgogICAgKi8KICAgIG1pc2NfU3RhcnRVc2VyRXJyb3JSZXBvcnQoKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBJbiBtZW1vcnlfSW5pdDoiKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBNZW1vcnkgRXJyb3IuIik7CiAgICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiIFRyeWluZyB0byBpbml0aWFsaXplIG1lbW9yeSBtYW5hZ2VtZW50Iik7CiAgICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiIGZvciBhIHNlY29uZCB0aW1lLlxuIik7CiAgICBtaXNjX0ZpbmlzaFVzZXJFcnJvclJlcG9ydCgpOwogIH0KCiAgLyogQ2FsY3VsYXRlIHRoZSBzaXplIG9mIGRlYnVnIG1hcmtzICovCiAgbWVtb3J5X0xFRlRUQUcgID0gc2l6ZW9mKE1FTU9SWV9JTkZPTk9ERSkgKyBzaXplb2YodW5zaWduZWQgaW50KTsKCiAgaWYgKChzaXplb2YoTUVNT1JZX0lORk9OT0RFKSArIHNpemVvZih1bnNpZ25lZCBpbnQpKSAlIG1lbW9yeV9BTElHTiA9PSAwKSB7CiAgICBtZW1vcnlfT0ZGU0VUICAgPSBtZW1vcnlfTEVGVFRBRzsKICB9CiAgZWxzZSB7CiAgICBtZW1vcnlfT0ZGU0VUICAgPSBtZW1vcnlfTEVGVFRBRyArIG1lbW9yeV9BTElHTiAKICAgICAgLSAobWVtb3J5X0xFRlRUQUcgJSBtZW1vcnlfQUxJR04pOwogIH0KCiAgaWYgKChzaXplb2YodW5zaWduZWQgaW50KSAlIG1lbW9yeV9BTElHTikgPT0gMCkgewogICAgbWVtb3J5X01BUktTSVpFID0gIG1lbW9yeV9PRkZTRVQgKyBzaXplb2YodW5zaWduZWQgaW50KTsKICB9CiAgZWxzZSB7CiAgICBtZW1vcnlfTUFSS1NJWkUgPSAgbWVtb3J5X09GRlNFVCArIHNpemVvZih1bnNpZ25lZCBpbnQpICsgbWVtb3J5X0FMSUdOIAogICAgICAtIChzaXplb2YodW5zaWduZWQgaW50KSAlIG1lbW9yeV9BTElHTik7CiAgfQojZW5kaWYKCiAgLyogQ2FsY3VsYXRlIHRoZSBzaXplIG9mIGludGVybmFsbHkgdXNlZCBzcGFjZSBvbiBlYWNoIHBhZ2UgKi8KICAvKiBleHRyYTogT25lIHBvaW50ZXIgZm9yIGNoYWluaW5nIHBhZ2VzLCBvbmUgZm9yIEVPRiAoKyBtYXJrc2l6ZSkgKi8KICBleHRyYSA9IDIqc2l6ZW9mKFBPSU5URVIpICsgbWVtb3J5X01BUktTSVpFOyAKCgogIC8qIFRlc3Qgd2hldGhlciBwYWdlIHNpemUgaXMgcmVhc29uYWJsZSB3aXRoIHJlc3BlY3QgCiAgICAgdG8gZHluYW1pYyBhbGxvY2F0aW9uIHRocmVzaG9sZAogICovCiAgd2hpbGUgKG1lbW9yeV9QQUdFU0laRSA8ICgyKihtZW1vcnlfX0RZTk1BWFNJWkUgKyBtZW1vcnlfTUFSS1NJWkUpICsgZXh0cmEpKSB7CiAgICAvKiBNaW5pbXVtIHR3byBvYmplY3RzIHBlciBhbGxvY2F0ZWQgcGFnZSAqLwogICAgbWVtb3J5X1BBR0VTSVpFICs9IG1lbW9yeV9fREVGQVVMVFBBR0VTSVpFLzI7ICAgIAogIH0KCiAgLyogU2V0IGFtb3VudCBvZiBtZW1vcnkgYXZhaWxhYmxlIHRvIHRoZSBtb2R1bGUgZm9yIGFsbG9jYXRpb24gKi8KICBpZiAoTWF4bWVtIDw9IDApIHsKICAgIC8qIHVubGltaXRlZCAobGltaXRlZCBvbmx5IGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtKSAqLwogICAgbWVtb3J5X01BWE1FTSA9IG1lbW9yeV9fVU5MSU1JVEVEOwogIH0KICBlbHNlIHsKICAgIC8qIE1heG1lbSBieXRlcyAqLwogICAgbWVtb3J5X01BWE1FTSA9IE1heG1lbTsKICB9CgogIC8qIEluaXRpYWxpemUgbWVtb3J5X0FSUkFZIGFuZCBtZW1vcnlfUkVTT1VSQ0VzICovCiAgZm9yIChpPTE7IGk8bWVtb3J5X19EWU5NQVhTSVpFOyBpKyspIHsKICAgIE1FTU9SWV9SRVNPVVJDRSAqQ3VycmVudFJlc291cmNlOwogICAgaW50ICAgICAgICAgICAgIFRvdGFsU2l6ZTsKCiAgICAvKiBNYXAgbWVtb3J5X0FSUkFZW2ldIHRvIGFwcHJvcHJpYXRlIFJlc291cmNlICovCiAgICBtZW1vcnlfQVJSQVlbaV0gICAgICAgICAgICAgICA9ICZtZW1vcnlfUEFHRVNbKGktMSkvbWVtb3J5X19TSEFSRURQQUdFU107CgogICAgQ3VycmVudFJlc291cmNlID0gbWVtb3J5X0FSUkFZW2ldOwoKICAgIEN1cnJlbnRSZXNvdXJjZS0+ZnJlZSAgICAgICAgICAgID0gJm1lbW9yeV9fRU9GOyAvKiBubyBibG9ja3MgZnJlZWQgICAgICovCiAgICBDdXJyZW50UmVzb3VyY2UtPm5leHQgICAgICAgICAgICA9ICZtZW1vcnlfX0VPRjsgLyogbm8gYmxvY2tzIGFsbG9jYXRlZCAqLwogICAgQ3VycmVudFJlc291cmNlLT5lbmRfb2ZfcGFnZSAgICAgPSAmbWVtb3J5X19FT0Y7IC8qIG5vIChlbmQgb2YpIHBhZ2UgICAgKi8KICAgIEN1cnJlbnRSZXNvdXJjZS0+cGFnZSAgICAgICAgICAgID0gJm1lbW9yeV9fRU9GOyAvKiBubyBwYWdlIGFsbG9jYXRlZCAgICovCgogICAgLyogU2l6ZSBvZiBhIHByb3Blcmx5IGFsaWduZWQgYmxvY2sgb2YgcmVxdWVzdGVkIHNpemUgaSAqLwogICAgQ3VycmVudFJlc291cmNlLT5hbGlnbmVkX3NpemUgICAgPSBtZW1vcnlfQ2FsY3VsYXRlUmVhbEJsb2NrU2l6ZShpKTsKCiAgICAvKiBUb3RhbCBibG9jayBzaXplIGluY2x1ZGluZyBkZWJ1ZyBtYXJrcyAqLwogICAgQ3VycmVudFJlc291cmNlLT50b3RhbF9zaXplICAgICAgPSBtZW1vcnlfTUFSS1NJWkUgCiAgICAgICsgQ3VycmVudFJlc291cmNlLT5hbGlnbmVkX3NpemU7CgogICAgVG90YWxTaXplICAgICAgICAgICAgICAgICAgICAgICAgPSBDdXJyZW50UmVzb3VyY2UtPnRvdGFsX3NpemU7CgogICAgLyogbGFzdCBibG9ja7RzIG9mZnNldCAqLwogICAgQ3VycmVudFJlc291cmNlLT5vZmZzZXQgICAgICAgICAgPQogICAgICAoKG1lbW9yeV9QQUdFU0laRS1leHRyYSkvVG90YWxTaXplKSpUb3RhbFNpemUgCiAgICAgICsgc2l6ZW9mKFBPSU5URVIpICsgbWVtb3J5X09GRlNFVDsKICB9Cn0KCgp2b2lkIG1lbW9yeV9SZXN0cmljdChsb25nIE1heG1lbSkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVCAgOiBUaGUgbWF4aW1hbCBhbW91bnQgb2YgbWVtb3J5IGF2YWlsYWJsZSBmb3IgZnVydGhlciAKICAgICAgICAgICBhbGxvY2F0aW9uIChpbiBieXRlcyk7IGlmIE1heG1lbSA8IDAgZnV0dXJlIAogICAgICAgICAgIGFsbG9jYXRpb25zIGFyZSB1bnJlc3RyaWN0ZWQuCiAgUkVUVVJOUzogTm9uZS4KICBTVU1NQVJZOiBTZXRzIHRoZSBtYXhpbWFsIGFtb3VudCBvZiBtZW1vcnkgYXZhaWxhYmxlIGZvciAKICAgICAgICAgICBmdXR1cmUgYWxsb2NhdGlvbnMuIElmIHRoZSB1c2VyIHRyaWVzIHRvIGFsbG9jYXRlIAogICAgICAgICAgIG1vcmUgbWVtb3J5LCB0aGUgbW9kdWxlIGRpc3BsYXlzIGFuIGVycm9yIG1lc3NhZ2UgCiAgICAgICAgICAgYW5kIHRlcm1pbmF0ZXMgdGhlIHByb2dyYW0gYnkgY2FsbGluZyB0aGUgZXhpdCgpIAogICAgICAgICAgIGZ1bmN0aW9uLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgLyogUmVzZXQgdGhlIG1heGltdW0gYW1vdW50IG9mIG1lbW9yeSBhdmFpbGFibGUgKi8gCiAgaWYgKE1heG1lbSA8PSAwKSB7CiAgICAvKiB1bmxpbWl0ZWQgKi8KICAgIG1lbW9yeV9NQVhNRU0gPSBtZW1vcnlfX1VOTElNSVRFRDsKICB9CiAgZWxzZSB7CiAgICAvKiBNYXhtZW0gYnl0ZXMgKi8KICAgIG1lbW9yeV9NQVhNRU0gPSBNYXhtZW07CiAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqICBDSEVDSyBDT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaWZkZWYgQ0hFQ0sKc3RhdGljIHZvaWQgbWVtb3J5X0NoZWNrSWZNb2R1bGVJc0luaXRpYWxpemVkKGNvbnN0IGNoYXIgKiBGdW5jdGlvbiwKCQkJCSAgICAgICBjb25zdCBjaGFyICogRmlsZSwKCQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBpbnQgTGluZSkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQgIDogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRoYXQgcmVxdWVzdHMgdGhlCiAgICAgICAgICAgY2hlY2ssIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGFuZCB0aGUgbGluZSwgCgkgICB3aGVyZSB0aGUgcmVxdWVzdGluZyBmdW5jdGlvbiB3YXMgY2FsbGVkLCBhbmQKCSAgIHRoZSBsaW5lLgogIFJFVFVSTlM6IE5vbmUuCiAgU1VNTUFSWTogQ2hlY2tzIGlmIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBtb2R1bGUgaGFzCiAgICAgICAgICAgYmVlbiBwcm9wZXJseSBpbml0aWFsaXplZC4gWW91IG5lZWQgdG8KCSAgIGluaXRpYWxpemUgdGhlIG1vZHVsZSBieSBjYWxsaW5nIG1lbW9yeV9Jbml0CgkgICBiZWZvcmUgeW91IHVzZSBhbnkgZnVuY3Rpb25zIGZyb20gdGhlIG1vZHVsZS4KCSAgIElmIHRoZSBjaGVjayBmYWlscywgdGhpcyBmdW5jdGlvbiBwcmludHMgYW4KCSAgIGVycm9yIG1lc3NhZ2UgYW5kIGV4aXRzIHRoZSBhcHBsaWNhdGlvbi4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgaWYgKCFtZW1vcnlfTWFuYWdlbWVudEluaXRpYWxpemVkKCkpIHsKICAgIG1pc2NfU3RhcnRVc2VyRXJyb3JSZXBvcnQoKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBJbiAlczoiLCBGdW5jdGlvbik7CiAgICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiXG4gTWVtb3J5IEVycm9yLiIpOwogICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIiBNZW1vcnkgbWFuYWdlbWVudCBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CiAgICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiXG4gWW91IGhhdmUgdG8gY2FsbCBtZW1vcnlfSW5pdCgpIik7CiAgICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiIGJlZm9yZSB5b3UgY2FuIHVzZSBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMuXG4iKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBFcnJvciBvY2N1cnJlZCBpbiAlcyIsIEZ1bmN0aW9uKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCIgY2FsbGVkIGZyb20gZmlsZSAlcyBhdCBsaW5lICVkLlxuIiwKCQkJIEZpbGUsIExpbmUpOwogICAgbWlzY19GaW5pc2hVc2VyRXJyb3JSZXBvcnQoKTsKICB9Cn0KCnN0YXRpYyB2b2lkIG1lbW9yeV9DaGVja0lmUG9pbnRlcklzQWxyZWFkeUZyZWVkKFBPSU5URVIgUG9pbnRlciwKCQkJCQkgY29uc3QgY2hhciAqIEZ1bmN0aW9uLAoJCQkJCSBjb25zdCBjaGFyICogRmlsZSwKCQkJCQkgdW5zaWduZWQgc2hvcnQgaW50IExpbmUpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUICA6IFRoZSBwb2ludGVyIHRvIGJlIGNoZWNrZWQsIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgIGZ1bmN0aW9uIHRoYXQgcmVxdWVzdHMgdGhlIGNoZWNrLCB0aGUgbmFtZSBvZgoJICAgdGhlIGZpbGUgYW5kIHRoZSBsaW5lLCB3aGVyZSB0aGUgcmVxdWVzdGluZwoJICAgZnVuY3Rpb24gd2FzIGNhbGxlZCwgYW5kIHRoZSBsaW5lLgogIFJFVFVSTlM6IE5vbmUuCiAgU1VNTUFSWTogQ2hlY2tzIGlmIHRoZSBwb2ludGVyIGhhcyBhbHJlYWR5IGJlZW4gZnJlZWQuCgkgICBJZiB0aGUgY2hlY2sgZmFpbHMsIHRoaXMgZnVuY3Rpb24gcHJpbnRzIGFuCgkgICBlcnJvciBtZXNzYWdlIGFuZCBleGl0cyB0aGUgYXBwbGljYXRpb24uCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIGlmICggbWVtb3J5X0dldEJsb2NrU3RhdHVzKFBvaW50ZXIpID09IG1lbW9yeV9NQUdJQ0ZSRUUpIHsKICAgIE1FTU9SWV9JTkZPICBJbmZvOyAgICAgICAgICAvKiBibG9ja7RzIGRlYnVnIGluZm9ybWF0aW9uICAgICAgKi8KCiAgICBJbmZvID0gKE1FTU9SWV9JTkZPKSAoKGNoYXIgKikgUG9pbnRlciAtIG1lbW9yeV9PRkZTRVQpOwoKICAgIG1pc2NfU3RhcnRVc2VyRXJyb3JSZXBvcnQoKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBJbiAlczoiLCBGdW5jdGlvbik7CiAgICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiXG4gTWVtb3J5IEVycm9yLiIpOwogICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIiBQb2ludGVyICVwIHdhcyBhbGxvY2F0ZWQgaW4gZmlsZSAlcyBhdCBsaW5lICVkLiIsCgkJCSBQb2ludGVyLCBJbmZvLT5tYWxsb2NJbkZpbGUsIEluZm8tPm1hbGxvY0F0TGluZSk7CiAgICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiXG4gSXQgaGFzIGFscmVhZHkgYmVlbiBmcmVlZCBpbiBmaWxlICVzIGF0IGxpbmUgJWQuIiwKCQkJIEluZm8tPmZyZWVJbkZpbGUsIEluZm8tPmZyZWVBdExpbmUpOwogICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIFNpemUgb2YgbWVtb3J5IGJsb2NrIGlzICVkIGJ5dGVzLiIsCgkJCSBtZW1vcnlfR2V0QmxvY2tTaXplKFBvaW50ZXIpKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBFcnJvciBvY2N1cnJlZCBpbiAlcyIsIEZ1bmN0aW9uKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCIgY2FsbGVkIGZyb20gZmlsZSAlcyBhdCBsaW5lICVkLlxuIiwKCQkJIEZpbGUsIExpbmUpOwogICAgbWlzY19GaW5pc2hVc2VyRXJyb3JSZXBvcnQoKTsKICB9Cn0KCnN0YXRpYyB2b2lkIG1lbW9yeV9DaGVja1BvaW50ZXIoUE9JTlRFUiBQb2ludGVyLCB1bnNpZ25lZCBpbnQgU2l6ZSkgCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVCAgOiBBIHBvaW50ZXIgdG8gYSBibG9jayBvZiBtZW1vcnksIGFuZCBpdHMgc2l6ZS4KICBSRVRVUk5TOiBOb3RoaW5nLgogIFNVTU1BUlk6IENoZWNrcyB3aGV0aGVyIGEgcG9pbnRlciBwb2ludHMgdG8gYSB2YWxpZAogICAgICAgICAgIGJsb2NrIG9mIG1lbW9yeS4KCSAgICAKICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgdGVzdHM6CgogICAgICAgICAgIElzIFBvaW50ZXIgYSBOVUxMIHBvaW50ZXI/CgogICAgICAgICAgIElzIFNpemUgZXF1YWwgdG8gemVybz8KCiAgICAgICAgICAgSXMgdGhlIFBvaW50ZXIgYWxpZ25tZW50IGNvcnJlY3Q/CgkKICAgICAgICAgICBEaWQgc29tZW9uZSB3cml0ZSBvdmVyIHRoZSBtZW1vcnkgYmxvY2sgCiAgICAgICAgICAgYm91bmRhcmllcz8KCiAgICAgICAgICAgSXMgU2l6ZSBzdGlsbCBjb3JyZWN0PwoKICAgICAgICAgICBJZiBTaXplIGlzIGdyZWF0ZXIgdGhhbiBtZW1vcnlfX0RZTk1BWFNJWkU6IAogICAgICAgICAgIElzIGl0IHByb3Blcmx5IGFkbWluaXN0cmF0ZWQgYnkgdGhlIG1vZHVsZT8KCiAgICAgICAgICAgSWYgdGhlIG1lbW9yeSBibG9jayB3YXMgZnJlZWQ6IERpZCBzb21lb25lIAogICAgICAgICAgIHdyaXRlIHRvIGl0IGFmdGVyIGRlYWxsb2NhdGlvbj8KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CgogIE1FTU9SWV9JTkZPIEluZm87CiAgdW5zaWduZWQgaW50IEJsb2NrU2l6ZSwgUmVhbEJsb2NrU2l6ZSwgQmxvY2tTdGF0dXM7CgogIEluZm8gPSAoTUVNT1JZX0lORk8pICgoY2hhciAqKSBQb2ludGVyIC0gbWVtb3J5X09GRlNFVCk7CgogIFJlYWxCbG9ja1NpemUgPSBtZW1vcnlfTG9va3VwUmVhbEJsb2NrU2l6ZShTaXplKTsKCiAgaWYgKFBvaW50ZXIgPT0gTlVMTCkgewogICAgLyogTlVMTCBwb2ludGVycyBtdXN0IG5vdCBiZSBkZXJlZmVyZW5jZWQgKi8KICAgIG1pc2NfU3RhcnRVc2VyRXJyb3JSZXBvcnQoKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBJbiBtZW1vcnlfQ2hlY2tQb2ludGVyOiIpOwogICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIE1lbW9yeSBFcnJvci4gUG9pbnRlciBpcyBhIE5VTEwgcG9pbnRlci5cbiIpOwogICAgbWlzY19GaW5pc2hVc2VyRXJyb3JSZXBvcnQoKTsKICB9CgoKICBpZiAoU2l6ZSA9PSAwKSB7CiAgICAvKiBXZSBkb260dCBhbGxvY2F0ZSAwIGJ5dGUgc2l6ZWQgYmxvY2tzICovCiAgICBtaXNjX1N0YXJ0VXNlckVycm9yUmVwb3J0KCk7CiAgICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiXG4gSW4gbWVtb3J5X0NoZWNrUG9pbnRlcjoiKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBNZW1vcnkgRXJyb3IuIik7CiAgICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiIFBvaW50ZXIgJXAgcG9pbnRzIHRvIGEgYmxvY2sgb2YgbWVtb3J5IiwgUG9pbnRlcik7CiAgICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiIHdpdGggc2l6ZSAwLlxuIik7IAogICAgbWlzY19GaW5pc2hVc2VyRXJyb3JSZXBvcnQoKTsKICB9CgogIGlmICgodW5zaWduZWQgbG9uZylQb2ludGVyICUgKHVuc2lnbmVkIGxvbmcpbWVtb3J5X0FMSUdOKXsKICAgIC8qIHdlIGV4cGVjdCBhbGwgcG9pbnRlcnMgdG8gYmUgY29ycmVjdGx5IGFsaWduZWQgKi8KICAgIG1pc2NfU3RhcnRVc2VyRXJyb3JSZXBvcnQoKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBJbiBtZW1vcnlfQ2hlY2tQb2ludGVyOiIpOwogICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIE1lbW9yeSBFcnJvci4iKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCIgUG9pbnRlciAlcCBpcyBub3QgYSBsZWdhbCBwb2ludGVyLlxuIiwgUG9pbnRlcik7CiAgICBtaXNjX0ZpbmlzaFVzZXJFcnJvclJlcG9ydCgpOwogIH0KCiAgLyogQmxvY2tTdGF0dXMgYW5kIEJsb2NrU2l6ZSBhcmUgaW5pdGlhbGl6ZWQgYWZ0ZXIKICAgICB3ZSBjYW4gYmUgc3VyZSBQb2ludGVyIGlzIHByb3Blcmx5IGFsaWduZWQuCiAgKi8KCiAgQmxvY2tTdGF0dXMgICA9IG1lbW9yeV9HZXRCbG9ja1N0YXR1cyhQb2ludGVyKTsKICBCbG9ja1NpemUgICAgID0gbWVtb3J5X0dldEJsb2NrU2l6ZShQb2ludGVyKTsKCiAgaWYgKEJsb2NrU3RhdHVzICE9IG1lbW9yeV9NQUdJQ01BTExPQyAKICAgICAgJiYgQmxvY2tTdGF0dXMgIT0gbWVtb3J5X01BR0lDRlJFRSkgewoKICAgIC8qIHdlIGV4cGVjdCBibG9jayBzdGF0dXMgdG8gYmUgZWl0aGVyIAogICAgICAgbWVtb3J5X01BR0lDTUFMTE9DIG9yIG1lbW9yeV9NQUdJQ0ZSRUUuCiAgICAgICBPdGhlciB2YWx1ZXMgbWlnaHQgcmVzdWx0IGZyb20gb3ZlcndyaXRpbmcsCiAgICAgICB0cnlpbmcgdG8gcmV0dXJuIGFuIHVuYWxsb2NhdGVkIGJsb2NrLAogICAgICAgb3IgdHJ5aW5nIHRvIHJldHVybiBhIGJsb2NrIGFsbG9jYXRlZCB3aXRoCiAgICAgICBhbm90aGVyIGFsbG9jYXRvci4KICAgICovCgogICAgbWlzY19TdGFydFVzZXJFcnJvclJlcG9ydCgpOwogICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIEluIG1lbW9yeV9DaGVja1BvaW50ZXI6Iik7CiAgICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiXG4gTWVtb3J5IEVycm9yLiIpOwogICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIiBQb2ludGVyICVwIHdhcyBub3QgKGRlKWFsbG9jYXRlZCBieSB0aGUgbW9kdWxlLCIsCgkJCSBQb2ludGVyKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBvciB0aGUgbWVtb3J5IGJsb2NrIHdhcyBjb3JydXB0ZWQuXG4iKTsKICAgIG1pc2NfRmluaXNoVXNlckVycm9yUmVwb3J0KCk7CiAgfQoKICBpZiAoQmxvY2tTdGF0dXMgPT0gbWVtb3J5X01BR0lDTUFMTE9DKSB7CiAgICBpZiAoQmxvY2tTaXplICE9IFNpemUpIHsKICAgICAgCiAgICAgIC8qIHdlIGV4cGVjdCBibG9jayBzaXplIGluIGEgYmxvY2u0cyBkZWJ1ZwoJIGluZm9ybWF0aW9uIGFuZCBnaXZlbiBibG9jayBzaXplIHRvIG1hdGNoLgogICAgICAqLwoKICAgICAgbWlzY19TdGFydFVzZXJFcnJvclJlcG9ydCgpOwogICAgICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiXG4gSW4gbWVtb3J5X0NoZWNrUG9pbnRlcjoiKTsKICAgICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIE1lbW9yeSBFcnJvci4iKTsKICAgICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIiBQb2ludGVyICVwIHdhcyBhcHBhcmVudGx5IGFsbG9jYXRlZCBmb3IiLAoJCQkgICBQb2ludGVyKTsKICAgICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIiBhIGJsb2NrIG9mIHNpemUgJWQsIiwKCQkJICAgQmxvY2tTaXplKTsKICAgICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIGJ1dCBpdCBpcyBleHBlY3RlZCB0byBiZSBhIGJsb2NrIG9mIHNpemUgJWQuIiwKCQkJICAgU2l6ZSk7CiAgICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBQcm9iYWJseSB0aGUgbWVtb3J5IGJsb2NrIHdhcyBjb3JydXB0ZWQuXG4iKTsKICAgICAgbWlzY19GaW5pc2hVc2VyRXJyb3JSZXBvcnQoKTsKCiAgICAgIC8qIHNpbmNlIHRoZSBsZWZ0IGRvZyB0YWcgc2VlbXMgdG8gYmUgY29ycnVwdGVkIHdlIGNhbiBub3Qgc2FmZWx5IGFzc3VtZSAKCSB0aGF0IG91ciBtZW1vcnkgaW5mbyBzdHJ1Y3R1cmUgaXMgc3RpbGwgdmFsaWQgc28gd2UgY2FuJ3QgcHJpbnQgaXQqLwogICAgfQoKICAgIGlmICgoU2l6ZSAlIG1lbW9yeV9BTElHTikgfHwgKFNpemUgJSBtZW1vcnlfX1NIQVJFRFBBR0VTKSkgewogICAgICAvKiBjaGVjayB0aGUgZmlsbGJ5dGVzIGJldHdlZW4gdXNlZCBzdG9yYWdlIAoJIGFuZCBkb2cgdGFnIGZvciBvdmVyd3JpdGluZyAqLwogICAgICBjaGFyICogcHRyLCAqIGxpbWl0OwogICAgICAKICAgICAgbGltaXQgICAgPSAoY2hhciAqKVBvaW50ZXIgKyBSZWFsQmxvY2tTaXplOwogICAgICAKICAgICAgZm9yIChwdHIgPSAoY2hhciAqKVBvaW50ZXIgKyBTaXplOyBwdHIgPCBsaW1pdDsgcHRyKyspIHsKCWlmICgqcHRyICE9IG1lbW9yeV9fRlJFRVNIUkVEREVSKSB7CgkgIG1pc2NfU3RhcnRVc2VyRXJyb3JSZXBvcnQoKTsKCSAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIEluIG1lbW9yeV9DaGVja1BvaW50ZXI6Iik7CgkgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBNZW1vcnkgRXJyb3IuIik7CgkgIG1pc2NfVXNlckVycm9yUmVwb3J0KCIgUG9pbnRlciAlcCB3YXMgYWxsb2NhdGVkIGluIGZpbGUgJXMgYXQgbGluZSAlZCwiLAoJCQkgICAgICAgUG9pbnRlciwgSW5mby0+bWFsbG9jSW5GaWxlLCBJbmZvLT5tYWxsb2NBdExpbmUpOwoJICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiXG4gZm9yIGEgYmxvY2sgb2Ygc2l6ZSAlZC4iLAoJCQkgICAgICAgQmxvY2tTaXplKTsKCSAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIFRoZSBtZW1vcnkgYmxvY2sgd2FzIGNvcnJ1cHRlZC5cbiIpOwoJICBtaXNjX0ZpbmlzaFVzZXJFcnJvclJlcG9ydCgpOwoJfQogICAgICB9CiAgICB9CiAgfQoKICBpZiAoU2l6ZSA+PSBtZW1vcnlfX0RZTk1BWFNJWkUpIHsKICAgIC8qIHdlIGV4cGVjdCBiaWcgYmxvY2tzIHRvIGJlIGNvcnJlY3RseSBsaW5rZWQgKi8KICAgIE1FTU9SWV9CSUdCTE9DS0hFQURFUiBCaWdCbG9ja0hlYWRlcjsKCiAgICBCaWdCbG9ja0hlYWRlciA9IChNRU1PUllfQklHQkxPQ0tIRUFERVIpICgoY2hhciAqKSBQb2ludGVyIC0gbWVtb3J5X09GRlNFVCAKCQkJCQkgICAgICAtIHNpemVvZihNRU1PUllfQklHQkxPQ0tIRUFERVJOT0RFKSk7CgogICAgLyogdGhpcyB0ZXN0IG1pZ2h0IGNyYXNoIHRoZSBwcm9ncmFtCiAgICAgICBpZiBzb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB0aGUgcG9pbnRlcnMsCiAgICAgICBzbyB5b3UgbWF5IG5vdCBnZXQgYSBtZXNzYWdlIGV2ZXJ5IHRpbWUuCiAgICAqLwogICAgaWYgKCgoQmlnQmxvY2tIZWFkZXItPnByZXZpb3VzICE9IE5VTEwpIAoJICYmIChCaWdCbG9ja0hlYWRlci0+cHJldmlvdXMtPm5leHQgIT0gQmlnQmxvY2tIZWFkZXIpKQoJfHwgKChCaWdCbG9ja0hlYWRlci0+cHJldmlvdXMgPT0gTlVMTCkgCgkgICAgJiYgKG1lbW9yeV9CSUdCTE9DS1MgIT0gQmlnQmxvY2tIZWFkZXIpKQoJfHwgKChCaWdCbG9ja0hlYWRlci0+bmV4dCAhPSBOVUxMKSAKCSAgICAmJiAoQmlnQmxvY2tIZWFkZXItPm5leHQtPnByZXZpb3VzICE9IEJpZ0Jsb2NrSGVhZGVyKSkpIHsKICAgICAgCiAgICAgIG1pc2NfU3RhcnRVc2VyRXJyb3JSZXBvcnQoKTsKICAgICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIEluIG1lbW9yeV9DaGVja1BvaW50ZXI6Iik7CiAgICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBNZW1vcnkgRXJyb3IuIik7CiAgICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCIgUG9pbnRlciAlcCB3YXMgbm90IGFsbG9jYXRlZCBieSB0aGUgbW9kdWxlLCIsCgkJCSAgIFBvaW50ZXIpOwogICAgICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiXG4gb3IgdGhlIG1lbW9yeSBibG9jayB3YXMgY29ycnVwdGVkLlxuIik7CiAgICAgIG1pc2NfRmluaXNoVXNlckVycm9yUmVwb3J0KCk7CiAgICB9CiAgfQogIAogIGlmIChCbG9ja1N0YXR1cyA9PSBtZW1vcnlfTUFHSUNGUkVFKSB7CiAgICAvKiB0ZXN0IGlmIHNvbWVvbmUgd3JvdGUgb3ZlciBmcmVlZCBtZW1vcnkgKi8KICAgIGNoYXIgKiBwdHIsICogbGltaXQ7CiAgICAKICAgIGxpbWl0ID0gKGNoYXIgKilQb2ludGVyICsgUmVhbEJsb2NrU2l6ZTsKCiAgICBmb3IgKHB0ciA9IChjaGFyICopUG9pbnRlciArIHNpemVvZihQT0lOVEVSKTsgcHRyIDwgbGltaXQgOyBwdHIrKyl7CiAgICAgIC8qIGZpcnN0IHNpemVvZihQT0lOVEVSKSBieXRlcyBhcmUgcmVzZXJ2ZWQgZm9yIHRoZQoJIHBvaW50ZXIgdG8gdGhlIG5leHQgZnJlZWQgYmxvY2sgaW4gdGhlIGxpc3QuIEFsbAoJIG90aGVyIGJ5dGVzIGluIHRoZSBibG9jayBzaG91bGQgc3RpbGwgaGF2ZSB0aGUgdmFsdWUKCSBvZiBtZW1vcnlfX0ZSRUVTSFJFRERFUgogICAgICAqLwogICAgICBpZiAoKnB0ciAhPSBtZW1vcnlfX0ZSRUVTSFJFRERFUikgewoJbWlzY19TdGFydFVzZXJFcnJvclJlcG9ydCgpOwoJbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIEluIG1lbW9yeV9DaGVja1BvaW50ZXI6Iik7CgltaXNjX1VzZXJFcnJvclJlcG9ydCgiXG4gTWVtb3J5IEVycm9yLiIpOwoJbWlzY19Vc2VyRXJyb3JSZXBvcnQoIiBQb2ludGVyICVwIHdhcyBhbGxvY2F0ZWQgaW4gZmlsZSAlcyBhdCBsaW5lICVkIiwKCQkJICAgICBQb2ludGVyLCBJbmZvLT5tYWxsb2NJbkZpbGUsIEluZm8tPm1hbGxvY0F0TGluZSk7CgltaXNjX1VzZXJFcnJvclJlcG9ydCgiXG4gZm9yIGEgYmxvY2sgb2Ygc2l6ZSAlZCIsQmxvY2tTaXplKTsKCW1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBhbmQgZnJlZWQgaW4gZmlsZSAlcyBhdCBsaW5lICVkLiIsCgkJCSAgICAgSW5mby0+ZnJlZUluRmlsZSwgSW5mby0+ZnJlZUF0TGluZSk7CgltaXNjX1VzZXJFcnJvclJlcG9ydCgiXG4gVGhlIG1lbW9yeSBibG9jayB3YXMgdXNlZCBhZnRlciBkZWFsbG9jYXRpb24uXG4iKTsKCW1pc2NfRmluaXNoVXNlckVycm9yUmVwb3J0KCk7CiAgICAgIH0KICAgIH0KICB9Cn0KCnZvaWQgbWVtb3J5X0NoZWNrRnJlZShQT0lOVEVSIEZyZWVwb2ludGVyLCB1bnNpZ25lZCBpbnQgU2l6ZSwKCQkgICAgICB1bnNpZ25lZCBpbnQgUmVhbEJsb2NrU2l6ZSwgY29uc3QgY2hhciAqIEZpbGUsCgkJICAgICAgdW5zaWduZWQgc2hvcnQgaW50IExpbmUpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgIElOUFVUICA6IFRoZSBwb2ludGVyIHRvIGJlIGZyZWVkLCB0aGUgc2l6ZSBvZiB0aGUgYmxvY2sKICAgICAgICAgICAgaXQgaXMgc3VwcG9zZWQgdG8gcG9pbnQgdG8sIHRoZSByZWFsIHNpemUgb2YKCSAgICB0aGF0IGJsb2NrLCB0aGUgZmlsZSBhbmQgbGluZSB3aGVyZSBtZW1vcnlfRnJlZQoJICAgIHdhcyBjYWxsZWQuCiAgIFJFVFVSTlM6IE5vbmUuCiAgIFNVTU1BUlk6IENoZWNrcyBpZiBtZW1vcnkgbWFuYWdlbWVudCB3YXMgaW5pdGlhbGl6ZWQsCiAgICAgICAgICAgIHRoZSBnaXZlbiBwb2ludGVyIGlzIGxlZ2FsLCBhbmQgbm90IGZyZWVkCgkgICAgYWxyZWFkeS4gSXQgYWxzbyB6ZXJvZXMgdGhlIGZyZWVkIG1lbW9yeSwgYW5kCgkgICAgc2V0cyB0aGUgYmxvY2sncyBkZWJ1ZyBhbmQgYWRtaW5pc3RyYXRpb24KCSAgICBpbmZvcm1hdGlvbi4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIE1FTU9SWV9JTkZPICBJbmZvOyAgICAgICAgICAvKiBibG9ja7RzIGRlYnVnIGluZm9ybWF0aW9uICAgICAgKi8KCiAgLyogQ2hlY2sgaWYgbWVtb3J5IG1hbmFnZW1lbnQgd2FzIGluaXRpYWxpemVkICovCiAgbWVtb3J5X0NoZWNrSWZNb2R1bGVJc0luaXRpYWxpemVkKCJtZW1vcnlfRnJlZSIsIEZpbGUsIExpbmUpOwoKICAvKiBDaGVjayBpZiBnaXZlbiBwb2ludGVyIGlzIGxlZ2FsICovCiAgbWVtb3J5X0NoZWNrUG9pbnRlcihGcmVlcG9pbnRlciwgU2l6ZSk7CgogIC8qIENoZWNrIGlmIGN1cnJlbnQgcG9pbnRlciBpcyBiZWluZyBmcmVlZCBmb3IgYSBzZWNvbmQgdGltZSAqLwogIG1lbW9yeV9DaGVja0lmUG9pbnRlcklzQWxyZWFkeUZyZWVkKEZyZWVwb2ludGVyLCAibWVtb3J5X0ZyZWUiLCBGaWxlLCBMaW5lKTsKCiAgLyogU2V0IGFsbCBieXRlcyB0byB6ZXJvLCBzbyB3ZSBjYW4gZGV0ZWN0IG92ZXJ3cml0aW5nIG9mIGZyZWVkIG1lbW9yeSAqLwogIG1lbXNldCAoRnJlZXBvaW50ZXIsIG1lbW9yeV9fRlJFRVNIUkVEREVSLCBSZWFsQmxvY2tTaXplKTsKCiAgLyogR2V0IGN1cnJlbnQgYmxvY2u0cyBkZWJ1ZyBpbmZvcm1hdGlvbiAqLwogIEluZm8gPSAoTUVNT1JZX0lORk8pICgoY2hhciAqKSBGcmVlcG9pbnRlciAtIG1lbW9yeV9PRkZTRVQpOwoKICAvKiBTZXQgYmxvY2u0cyBkZWJ1ZyBhbmQgYWRtaW5pc3RyYXRpb24gaW5mb3JtYXRpb24gKi8KICBtZW1vcnlfU2V0SW5mbyhJbmZvLEluZm8tPm1hbGxvY0luRmlsZSwgSW5mby0+bWFsbG9jQXRMaW5lLCBGaWxlLCBMaW5lKTsKICBtZW1vcnlfU2V0QmxvY2tTdGF0dXNBbmRTaXplKEZyZWVwb2ludGVyLCBtZW1vcnlfTUFHSUNGUkVFLCBTaXplKTsKfQojZW5kaWYgLyogQ0hFQ0sgKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwovKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogIE1BTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZmRlZiBOT19NRU1PUllfTUFOQUdFTUVOVAoKUE9JTlRFUiBtZW1vcnlfTWFsbG9jKHVuc2lnbmVkIGludCBCeXRlcykKewogIGNoYXIgKm1lbTsgLyogcG9pbnRlciB0byBtZW1vcnkgYmxvY2sgb2J0YWluZWQgZnJvbSBtYWxsb2MgKi8KCiAgLyogUGFzcyB0aGUgY2FsbCB0aHJvdWdoIHRvIGNvbXBpbGVytHMgbWFsbG9jICovCiAgbWVtID0gKGNoYXIgKiltYWxsb2MoQnl0ZXMpOwoKICAvKiBJZiBtYWxsb2MgZmFpbHMgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBhbmQgZXhpdCAqLwogIGlmIChtZW0gPT0gTlVMTCkgewogICAgbWlzY19TdGFydFVzZXJFcnJvclJlcG9ydCgpOwogICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIEluIG1lbW9yeV9NYWxsb2M6Iik7CiAgICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiXG4gTWVtb3J5IEVycm9yLiBPdXQgb2YgbWVtb3J5LlxuIik7CiAgICBtaXNjX0ZpbmlzaFVzZXJFcnJvclJlcG9ydCgpOwogIH0KCiAgcmV0dXJuIG1lbTsKfQoKI2Vsc2UKCiNpZmRlZiBDSEVDSwpQT0lOVEVSIG1lbW9yeV9NYWxsb2NJbnRlcm4odW5zaWduZWQgaW50IEJ5dGVzLCAKCQkJICAgIGNvbnN0IGNoYXIgKiBGaWxlLCAKCQkJICAgIHVuc2lnbmVkIHNob3J0IGludCBMaW5lKQojZWxzZQpQT0lOVEVSIG1lbW9yeV9NYWxsb2ModW5zaWduZWQgaW50IEJ5dGVzKQojZW5kaWYKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQgIDogVGhlIHNpemUgb2YgdGhlIHJlcXVlc3RlZCBtZW1vcnkgYmxvY2suICAgICAgCiAgUkVUVVJOUzogQSBwb2ludGVyIHRvIGEgYmxvY2sgb2YgPEJ5dGVzPiBieXRlcy4gICAgICAgCiAgU1VNTUFSWTogQWxsb2NhdGVzIGEgbWVtb3J5IGJsb2NrIG9mIHJlcXVlc3RlZCBsZW5ndGguCiAgRVhDRVBUIDogVHJ5aW5nIHRvIGFsbG9jYXRlIDAgYnl0ZXMsIHZpb2xhdGluZyBhIG1lbW9yeSAKICAgICAgICAgICByZXN0cmljdGlvbiwgb3IgcnVubmluZyBvdXQgb2Ygc3lzdGVtIG1lbW9yeSAKICAgIAkgICBjYXVzZSB0aGUgZnVuY3Rpb24gdG8gcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBhbmQgCgkgICBjYWxsIGV4aXQoKS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgY2hhciAgICAgICAgICAgICAgICAqTmV3TWVtb3J5OyAgICAgICAvKiBwb2ludGVyIHRvIGFsbG9jYXRlZCBtZW1vcnkgKi8KCiAgTUVNT1JZX1JFU09VUkNFICAgICAqUmVzb3VyY2U7ICAgICAgICAvKiBjdXJyZW50IHBhZ2UgcmVzb3VyY2UsCgkJCQkJICAgcmVxdWlyZWQgaWYgd2UgZG8gbm90IGFsbG9jYXRlIAoJCQkJCSAgIGEgYmlnIGJsb2NrICovCgojaWZkZWYgQ0hFQ0sKICBNRU1PUllfSU5GTyAgICAgICAgIE5ld0luZm87ICAgICAgICAgIC8qIFN0b3JhZ2UgZm9yIGZpbGUgYW5kIGxpbmUgCgkJCQkJICAgb2YgYWxsb2NhdGlvbiAqLwojZW5kaWYKCgojaWZkZWYgQ0hFQ0sKICAvKiBJcyB0aGUgbW9kdWxlIGluaXRpYWxpemVkPyAqLwogIG1lbW9yeV9DaGVja0lmTW9kdWxlSXNJbml0aWFsaXplZCgibWVtb3J5X01hbGxvYyIsIEZpbGUsIExpbmUpOwoKICAvKiBJcyBpdCBhIHJlcXVlc3QgZm9yIGEgYmxvY2sgb2YgemVybyBieXRlcz8gKi8KICBpZiAoQnl0ZXMgPT0gMCkgewogICAgLyogVGhlIGxhdGVzdCBkcmFmdCBmb3IgdGhlIEFOU0kgQyA5WCBzdGFuZGFyZCBzYXlzIGluIHNlY3Rpb24gNy4yMC4zOgoKICAgICAgICJJZiB0aGUgc2l6ZSBvZiB0aGUgc3BhY2UgcmVxdWVzdGVkIGlzIHplcm8sIHRoZSBiZWhhdmlvciBpcwogICAgICAgIGltcGxlbWVudGF0aW9uLWRlZmluZWQ6IGVpdGhlciBhIG51bGwgcG9pbnRlciBpcyByZXR1cm5lZCwgb3IKCXRoZSBiZWhhdmlvciBpcyBhcyBpZiB0aGUgc2l6ZSB3ZXJlIHNvbWUgbm9uemVybyB2YWx1ZSwKCWV4Y2VwdCB0aGF0IHRoZSBwb2ludGVyIHNoYWxsIG5vdCBiZSB1c2VkIHRvIGFjY2VzcyBhbiBvYmplY3QuIgoKCVdlIGhhdmUgZGVjaWRlZCB0byBwcmludCBhbiBlcnJvciBhbmQgZXhpdCB1cG9uIHN1Y2ggcmVxdWVzdHMgCglzaW5jZSB0aGV5IGFyZSBvZnRlbiBvcmlnaW5hdGVkIGJ5IGEgYnVnLiAKCglOb25zdGFuZGFyZCBidXQgaG9wZWZ1bGx5IGhlbHBmdWwuCiAgICAqLwoKICAgIG1pc2NfU3RhcnRVc2VyRXJyb3JSZXBvcnQoKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBJbiBtZW1vcnlfTWFsbG9jOiIpOwogICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIE1lbW9yeSBFcnJvci4gVHJpZWQgdG8gYWxsb2NhdGUgMCBCeXRlcyEiKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBFcnJvciBvY2N1cnJlZCBpbiBtZW1vcnlfTWFsbG9jIik7CiAgICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiIGNhbGxlZCBmcm9tIGZpbGUgJXMgYXQgbGluZSAlZC5cbiIsCgkJCSBGaWxlLCBMaW5lKTsKICAgIG1pc2NfRmluaXNoVXNlckVycm9yUmVwb3J0KCk7CiAgfQojZW5kaWYKICAKICAvKiBJZiBpdCBpcyBhIGJpZyBibG9jaywgdGhlbiBpdCBoYXMgdG8gYmUgCiAgICAgYWRtaW5pc3RyYXRlZCBpbiBhIHNwZWNpYWwgd2F5IAogICovCiAgaWYgKEJ5dGVzID49IG1lbW9yeV9fRFlOTUFYU0laRSkgewogICAgdW5zaWduZWQgaW50ICAgICAgICBSZWFsQmlnQmxvY2tTaXplOyAvKiByZWFsIGJsb2NrIHNpemUgaW5jbHVkaW5nIAoJCQkJCSAgICAgcGFkZGluZyxoZWFkZXIgCgkJCQkJICAgICBhbmQgZGVidWcgbWFya3MgKi8KCiAgICAvKiBUaGlzIGlzIHdoYXQgYSBiaWcgYmxvY2sgbG9va3MgbGlrZToKCiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgfCBNRU1PUllfQklHQkxPQ0tIRUFERVJOT0RFICAgfCBkZWJ1ZyBtYXJrcyB8IGNoYXIgKiB8IGRlYnVnIG1hcmtzIHwKICAgICAgIHwgcHJldmlvdXMgYW5kIG5leHQgYmlnIGJsb2NrIHxpbiBkZWJ1ZyBtb2RlfCBibG9jayAgfGluIGRlYnVnIG1vZGV8CiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgKi8KCgogICAgLyogQ2FsY3VsYXRlIHRoZSByZWFsIHNpemUgb2YgdGhlIGJpZyBibG9jaywgCiAgICAgICBmcm9tIHRoZSBzaXplIG9mIGFkbWluaXN0cmF0aW9uIGluZm9ybWF0aW9uLAogICAgICAgdGhlIHNpemUgb2YgZGVidWcgbWFya3MgYW5kIHRoZSByZXF1ZXN0ZWQgYmxvY2sgc2l6ZQogICAgKi8KCiAgICBSZWFsQmlnQmxvY2tTaXplID0gc2l6ZW9mKE1FTU9SWV9CSUdCTE9DS0hFQURFUk5PREUpICsgCiAgICAgIG1lbW9yeV9NQVJLU0laRSArIG1lbW9yeV9DYWxjdWxhdGVSZWFsQmxvY2tTaXplKEJ5dGVzKTsKCiAgICAvKiBDaGVjayBmb3IgdmlvbGF0aW9uIG9mIG1heGltdW0gYWxsb2NhdGlvbiBsaW1pdCAqLwogICAgaWYgKG1lbW9yeV9NQVhNRU0gPj0gMCkgewogICAgICAvKiB0aGVyZSBpcyBhIG1heGltdW0gYWxsb2NhdGlvbiBsaW1pdCwgCgkgbGV0tHMgc2VlIGlmIHRoZXJlIGlzIGVub3VnaCBsZWZ0IAogICAgICAqLwogICAgICBpZiAoKHVuc2lnbmVkIGludCltZW1vcnlfTUFYTUVNIDwgUmVhbEJpZ0Jsb2NrU2l6ZSkgewoJLyogaWYgaXQgaXMgbm90IHByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGV4aXQgKi8KCW1pc2NfU3RhcnRVc2VyRXJyb3JSZXBvcnQoKTsKCW1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBJbiBtZW1vcnlfTWFsbG9jOiIpOwoJbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIE1lbW9yeSBFcnJvci4iKTsKCW1pc2NfVXNlckVycm9yUmVwb3J0KCIgVGVybWluYXRlZCBieSB1c2VyIGdpdmVuIG1lbW9yeSByZXN0cmljdGlvbixcbiIpOwoJbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIHdoaWxlIHRyeWluZyB0byBhbGxvY2F0ZSAlbHUgYnl0ZXMuXG4iLCAKCQkJICAgICBSZWFsQmlnQmxvY2tTaXplKTsKCW1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBNYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkiKTsKCW1pc2NfVXNlckVycm9yUmVwb3J0KCIgbGVmdCBmb3IgYWxsb2NhdGlvbiBpcyAlbCBieXRlcy5cbiIsIAoJCQkgICAgIG1lbW9yeV9NQVhNRU0pOwojaWZkZWYgQ0hFQ0sKCW1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBFcnJvciBvY2N1cnJlZCBpbiBtZW1vcnlfTWFsbG9jIik7CgltaXNjX1VzZXJFcnJvclJlcG9ydCgiIGNhbGxlZCBmcm9tIGZpbGUgJXMgYXQgbGluZSAlZC5cbiIsCgkJCSAgICAgRmlsZSwgTGluZSk7CiNlbmRpZgoJbWlzY19GaW5pc2hVc2VyRXJyb3JSZXBvcnQoKTsKICAgICAgfSAKICAgICAgZWxzZQoJLyogb3RoZXJ3aXNlIHN1YnRyYWN0IHRoZSByZWFsIGJsb2NrIHNpemUgCgkgICBmcm9tIHRoZSBhbW91bnQgb2YgbWVtb3J5IGF2YWlsYWJsZSBmb3IgCgkgICBhbGxvY2F0aW9uCgkqLwoJbWVtb3J5X01BWE1FTSAtPSBSZWFsQmlnQmxvY2tTaXplOwogICAgfQoKICAgIC8qIGFsbG9jYXRlIGEgZnJlc2ggYmxvY2sgb2YgbWVtb3J5IHZpYSBhIGNhbGwgdG8gbWFsbG9jICovCiAgICBOZXdNZW1vcnkgPSAoY2hhciAqKW1hbGxvYyhSZWFsQmlnQmxvY2tTaXplKTsKCiAgICAvKiBDaGVjayBpZiBhbGxvY2F0aW9uIHdhcyBzdWNjZXNzZnVsICovCiAgICBpZiAoTmV3TWVtb3J5ICE9IE5VTEwpIHsKCiAgICAgIC8qIGlmIGl0IHdhcywgdGhlbiBhZG1pbmlzdHJhdGUgdGhlIGZyZXNoIGJsb2NrOgoJIGluc2VydCBpdCBpbnRvIHRoZSBiaWcgYmxvY2sgbGlzdC4gVGhlIGxpc3QgCgkgaXMgZG91YmxlIGxpbmtlZCBmb3IgZmFzdCBkZWxldGlvbiAKICAgICAgKi8KCiAgICAgIE1FTU9SWV9CSUdCTE9DS0hFQURFUiBOZXdCaWdCbG9jazsgLyogbmV3IGJsb2NrtHMgYWRtaW5pc3RyYXRpb24gCgkJCQkJICAgIGluZm9ybWF0aW9uICovCgogICAgICAvKiBpbnNlcnQgdGhlIGZyZXNoIGJsb2NrIGFzIHRoZSBmaXJzdCBsaXN0IGVsZW1lbnQgKi8KICAgICAgTmV3QmlnQmxvY2sgPSAoTUVNT1JZX0JJR0JMT0NLSEVBREVSKSBOZXdNZW1vcnk7CiAgICAgIE5ld0JpZ0Jsb2NrLT5uZXh0ID0gbWVtb3J5X0JJR0JMT0NLUzsKICAgICAgTmV3QmlnQmxvY2stPnByZXZpb3VzID0gTlVMTDsKCiAgICAgIC8qIGlmIHRoZXJlIGFyZSBhbHJlYWR5IGVsZW1lbnRzIGluIHRoZSBiaWcgYmxvY2sgbGlzdCwKCSBjaGFuZ2UgdGhlIGZpcnN0IGVsZW1lbnS0cyBwb2ludGVyIHRvIHRoZSBwcmV2aW91cyBibG9jawoJIHRvIHBvaW50IHRvIHRoZSBmcmVzaCBibG9ja7RzIGFkbWluaXN0cmF0aW9uIGluZm9ybWF0aW9uCiAgICAgICovCiAgICAgIGlmIChtZW1vcnlfQklHQkxPQ0tTICE9IE5VTEwpIHsKCW1lbW9yeV9CSUdCTE9DS1MtPnByZXZpb3VzID0gTmV3QmlnQmxvY2s7CiAgICAgIH0KCiAgICAgIC8qIHJlc2V0IHRoZSBiaWcgYmxvY2sgbGlzdCBwb2ludGVyIHRvIHBvaW50IHRvIHRoZSBmcmVzaCBibG9jayAqLyAKICAgICAgbWVtb3J5X0JJR0JMT0NLUyA9IE5ld0JpZ0Jsb2NrOwoKICAgICAgLyogc2tpcCB0aGUgYWRtaW5pc3RyYXRpb24gaW5mb3JtYXRpb24gKi8KICAgICAgTmV3TWVtb3J5ICs9IHNpemVvZihNRU1PUllfQklHQkxPQ0tIRUFERVJOT0RFKTsKCiNpZmRlZiBDSEVDSwogICAgICAvKiBzZXQgdGhlIGRlYnVnIGluZm9ybWF0aW9uIGFkZHJlc3MgKi8KICAgICAgTmV3SW5mbyA9IChNRU1PUllfSU5GTykgTmV3TWVtb3J5OwoKICAgICAgLyogc2tpcCBsZWZ0IGRlYnVnIG1hcmsgKi8KICAgICAgTmV3TWVtb3J5ICs9IG1lbW9yeV9PRkZTRVQ7CiNlbmRpZgoKICAgICAgLyogYWRkIGJsb2NrtHMgcmVhbCBzaXplIHRvIHRoZSB0b3RhbCBzdW0gb2YgYWxsb2NhdGVkIGJ5dGVzICovCiAgICAgIG1lbW9yeV9ORVdCWVRFUyAgICArPSBSZWFsQmlnQmxvY2tTaXplOwogICAgfQogICAgZWxzZSB7CiAgICAgIC8qIE5ld01lbW9yeSA9PSBOVUxMLiAKCSBtYWxsb2MgY291bGQgbm90IGFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrIG9mIHJlcXVpcmVkIHNpemUsCgkgc28gd2UgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBhbmQgZXhpdCAKICAgICAgKi8KICAgICAgbWlzY19TdGFydFVzZXJFcnJvclJlcG9ydCgpOwogICAgICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiXG4gSW4gbWVtb3J5X01hbGxvY0ludGVybjoiKTsKICAgICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIE1lbW9yeSBFcnJvci4gT3V0IG9mIG1lbW9yeS4iKTsKICAgICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIEZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcy5cbiIsIAoJCQkgICBSZWFsQmlnQmxvY2tTaXplKTsKI2lmZGVmIENIRUNLCiAgICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBFcnJvciBvY2N1cnJlZCBpbiBtZW1vcnlfTWFsbG9jIik7CiAgICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCIgY2FsbGVkIGZyb20gZmlsZSAlcyBhdCBsaW5lICVkLlxuIiwKCQkJICAgRmlsZSwgTGluZSk7CiNlbmRpZgogICAgICBtaXNjX0ZpbmlzaFVzZXJFcnJvclJlcG9ydCgpOwogICAgfQogIH0KICBlbHNlIHsKICAgIC8qIEJ5dGVzIDwgbWVtb3J5X19EWU5NQVhTSVpFLgogICAgICAgQSBtZW1vcnkgcmVxdWVzdCBmb3IgYSBtYW5hZ2VhYmxlIHNpemUgCiAgICAqLwoKICAgIC8qIEluaXRpYWxpemUgdGhlIG1lbW9yeSByZXNvdXJjZSBmb3IgdGhlIGdpdmVuIHNpemUgKi8KICAgIFJlc291cmNlID0gbWVtb3J5X0FSUkFZW0J5dGVzXTsKCgogICAgLyogQ2hlY2sgaWYgdGhlcmUgYXJlIGZyZWVkIGJsb2NrcyBvZiB0aGF0IHNpemUgKi8KICAgIGlmICgqKChpbnQgKilSZXNvdXJjZS0+ZnJlZSkgIT0gRU9GKSB7CgogICAgICAvKiBpZiB0aGF0IGlzIHRoZSBjYXNlLCB0aGVuIHVzZSBhbiBhbHJlYWR5IGZyZWVkIGJsb2NrICovCgogICAgICBOZXdNZW1vcnkgICAgICAgICAgICAgICAgID0gKGNoYXIgKikgUmVzb3VyY2UtPmZyZWU7CgogICAgICAvKiB1cGRhdGUgdGhlIGZyZWUgYmxvY2tzIGxpc3QgZm9yIHRoYXQgc2l6ZSAqLwogICAgICBSZXNvdXJjZS0+ZnJlZSAgICAgICAgICAgID0gKigoUE9JTlRFUiAqKShOZXdNZW1vcnkpKTsKCiAgICAgIC8qIHN1YnRyYWN0IGJsb2NrtHMgdG90YWwgc2l6ZSBmcm9tIHRoZSBzdW0gb2YgZnJlZWQgYnl0ZXMgKi8KICAgICAgbWVtb3J5X0ZSRUVEQllURVMgICAgICAgIC09IFJlc291cmNlLT50b3RhbF9zaXplOwoKI2lmZGVmIENIRUNLCiAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgYWRkcmVzcyBvZiB0aGUgYmxvY2u0cyBkZWJ1ZyBpbmZvcm1hdGlvbiAqLyAKICAgICAgTmV3SW5mbyA9IChNRU1PUllfSU5GTykgKChjaGFyKikgTmV3TWVtb3J5IC0gbWVtb3J5X09GRlNFVCk7CgogICAgICAvKiBDaGVjayBpZiB0aGUgYmxvY2sgaGFzIGJlZW4gdXNlZCBhZnRlciBkZWFsbG9jYXRpb24gKi8KICAgICAgbWVtb3J5X0NoZWNrUG9pbnRlcihOZXdNZW1vcnksIEJ5dGVzKTsgIAojZW5kaWYKICAgIH0gCiAgICBlbHNlIHsgCiAgICAgIC8qIHRoZXJlIGFyZSBubyBhbHJlYWR5IGZyZWVkIGJsb2NrcyBvZiB0aGF0IHNpemUgKi8KIAogICAgICAvKiBDaGVjayBpZiB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgbGVmdCBvbiBjdXJyZW50IHBhZ2UgKi8KICAgICAgaWYgKFJlc291cmNlLT5uZXh0ICE9IFJlc291cmNlLT5lbmRfb2ZfcGFnZSkgewoKCS8qIGlmIHRoYXQgaXMgdGhlIGNhc2UsIHRoZW4gdXNlIGEgZnJlc2ggYmxvY2sgZnJvbSBjdXJyZW50IHBhZ2UgKi8KCU5ld01lbW9yeSAgICAgICAgICAgICAgICA9IChjaGFyICopUmVzb3VyY2UtPm5leHQ7CgoJLyogdXBkYXRlIHRoZSBwb2ludGVyIHRvIHRoZSBuZXh0IHVzYWJsZSBibG9jayAqLwoJUmVzb3VyY2UtPm5leHQgICAgICAgICAgID0gTmV3TWVtb3J5ICsgUmVzb3VyY2UtPnRvdGFsX3NpemU7CgoJLyogYWRkIGJsb2NrtHMgdG90YWwgc2l6ZSB0byB0aGUgc3VtIG9mIGFsbG9jYXRlZCBieXRlcyAqLwoJbWVtb3J5X05FV0JZVEVTICAgICAgICAgKz0gUmVzb3VyY2UtPnRvdGFsX3NpemU7CgojaWZkZWYgQ0hFQ0sKCS8qIENoZWNrIGlmIHRoZSBmcmVzaCBibG9ja7RzIGFkZHJlc3MgaXMgc2FuZSAqLwoJaWYgKChjaGFyICopTmV3TWVtb3J5ID4gKGNoYXIgKikgUmVzb3VyY2UtPmVuZF9vZl9wYWdlKSB7CgkgIC8qIGlmIGl0IGlzIG5vdCwgdGhlbiB3ZSBoYXZlIGRldGVjdGVkIGFuIGludGVybmFsIGVycm9yCgkgICAgIGluIHRoZSBtb2R1bGUgaXRzZWxmLiBPb3BzISBTbyB3ZSBwcmludCBhbiBlcnJvciBtZXNzYWdlCgkgICAgIGFuZCBhYm9ydCwgaG9waW5nIHRoYXQgdGhlIGNvcmUgZHVtcCB3aWxsIGVuYWJsZSB1cyB0byAKCSAgICAgdHJhY2UgdGhlIGVycm9yIGJhY2sgdG8gaXRzIG9yaWdpbgoJICAqLwoJICBtaXNjX1N0YXJ0RXJyb3JSZXBvcnQoKTsKCSAgbWlzY19FcnJvclJlcG9ydCgiXG4gSW4gbWVtb3J5X01hbGxvYzoiKTsKCSAgbWlzY19FcnJvclJlcG9ydCgiXG4gTWVtb3J5IEVycm9yLiBBZGRyZXNzIG92ZXJmbG93ICVkLiIsQnl0ZXMpOwoJICBtaXNjX0Vycm9yUmVwb3J0KCJcbiBFcnJvciBvY2N1cnJlZCBpbiBtZW1vcnlfTWFsbG9jIik7CgkgIG1pc2NfRXJyb3JSZXBvcnQoIiBjYWxsZWQgZnJvbSBmaWxlICVzIGF0IGxpbmUgJWQuXG4iLCBGaWxlLCBMaW5lKTsKCSAgbWlzY19GaW5pc2hFcnJvclJlcG9ydCgpOwoJfQoKCS8qIGlmIGFsbCBpcyB3ZWxsLCB3ZSBpbml0aWFsaXplIHRoZSBwb2ludGVyIHRvIGZyZXNoIGJsb2NrtHMKCSAgIGRlYnVnIGluZm9ybWF0aW9uIAoJKi8KCU5ld0luZm8gPSAoTUVNT1JZX0lORk8pKChjaGFyKikgTmV3TWVtb3J5IC0gbWVtb3J5X09GRlNFVCk7CiNlbmRpZgoKICAgICAgfSAKICAgICAgZWxzZSB7IAoJLyogQ2hlY2sgZm9yIHZpb2xhdGlvbiBvZiBtYXhpbXVtIGFsbG9jYXRpb24gbGltaXQgKi8KCWlmIChtZW1vcnlfTUFYTUVNID49MCkgewoJICAvKiB0aGVyZSBpcyBhIG1heGltdW0gYWxsb2NhdGlvbiBsaW1pdCwgCgkgICAgIGxldLRzIHNlZSBpZiB0aGVyZSBpcyBlbm91Z2ggbGVmdAoJICAqLwoJICBpZiAoKHVuc2lnbmVkIGludCltZW1vcnlfTUFYTUVNIDwgbWVtb3J5X1BBR0VTSVpFKSB7CgkgICAgLyogaWYgaXQgaXMgbm90LCB0aGVuIHByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGV4aXQgKi8KCSAgICBtaXNjX1N0YXJ0VXNlckVycm9yUmVwb3J0KCk7CgkgICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIEluIG1lbW9yeV9NYWxsb2M6Iik7CgkgICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIE1lbW9yeSBFcnJvci4iKTsKCSAgICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiIFRlcm1pbmF0ZWQgYnkgdXNlciBnaXZlbiBtZW1vcnkgcmVzdHJpY3Rpb24uXG4iKTsKI2lmZGVmIENIRUNLCgkgICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIEVycm9yIG9jY3VycmVkIGluIG1lbW9yeV9NYWxsb2MiKTsKCSAgICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiIGNhbGxlZCBmcm9tIGZpbGUgJXMgYXQgbGluZSAlZC5cbiIsCgkJCQkgRmlsZSwgTGluZSk7CiNlbmRpZgoJICAgIG1pc2NfRmluaXNoVXNlckVycm9yUmVwb3J0KCk7CgkgIH0gCgkgIGVsc2UgewoJICAgIC8qIG90aGVyd2lzZSBzdWJ0cmFjdCB0aGUgcGFnZSBzaXplIGZyb20gdGhlIGxpbWl0ICovCgkgICAgbWVtb3J5X01BWE1FTSAtPSBtZW1vcnlfUEFHRVNJWkU7CgkgIH0KCX0KCgkvKiB0cnkgdG8gYWxsb2NhdGUgYSBuZXcgcGFnZSB2aWEgbWFsbG9jICovCglOZXdNZW1vcnk9KGNoYXIgKiltYWxsb2MobWVtb3J5X1BBR0VTSVpFKTsKCgkvKiBjaGVjayBpZiBhbGxvY2F0aW9uIHdhcyBzdWNjZXNzZnVsICovCglpZiAoTmV3TWVtb3J5ID09IE5VTEwpIHsKCSAgLyogaWYgaXQgd2FzbrR0IHByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGV4aXQgKi8KCSAgbWlzY19TdGFydFVzZXJFcnJvclJlcG9ydCgpOwoJICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiXG4gSW4gbWVtb3J5X01hbGxvYzoiKTsKCSAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIE1lbW9yeSBFcnJvci4iKTsKCSAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIiBUZXJtaW5hdGVkLCByYW4gb3V0IG9mIHN5c3RlbSBtZW1vcnkuXG4iKTsKI2lmZGVmIENIRUNLCgkgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBFcnJvciBvY2N1cnJlZCBpbiBtZW1vcnlfTWFsbG9jIik7CgkgIG1pc2NfVXNlckVycm9yUmVwb3J0KCIgY2FsbGVkIGZyb20gZmlsZSAlcyBhdCBsaW5lICVkLlxuIiwKCQkJICAgICAgIEZpbGUsIExpbmUpOwojZW5kaWYKCSAgbWlzY19GaW5pc2hVc2VyRXJyb3JSZXBvcnQoKTsKCX0KCgkvKiBvdGhlcndpc2UgYWRtaW5pc3RyYXRlIHRoZSBmcmVzaCBwYWdlLAoJICAgaS5lIGluc2VydCBpdCBhcyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgCgkgICBwYWdlIGxpc3QgZm9yIHRoZSBnaXZlbiBzaXplIAoJKi8KCSooKFBPSU5URVIgKilOZXdNZW1vcnkpICAgICA9IFJlc291cmNlLT5wYWdlOwoJUmVzb3VyY2UtPnBhZ2UgICAgICAgICAgICAgID0gTmV3TWVtb3J5OwoKCS8qIGFkZCBibG9ja7RzIHRvdGFsIHNpemUgdG8gdGhlIHN1bSBvZiBhbGxvY2F0ZWQgYnl0ZXMgKi8KCW1lbW9yeV9ORVdCWVRFUyAgICAgICAgICAgICs9IFJlc291cmNlLT50b3RhbF9zaXplOwoKCS8qIHNldCB0aGUgZW5kIG9mIHBhZ2UgcG9pbnRlciBmb3IgdGhlIGZyZXNoIHBhZ2UgKi8KCVJlc291cmNlLT5lbmRfb2ZfcGFnZSAgICAgICA9IChjaGFyICopIE5ld01lbW9yeSArIFJlc291cmNlLT5vZmZzZXQ7CgoJLyogc2tpcCB0aGUgcGFnZSBsaXN0ICovCglOZXdNZW1vcnkgKz0gc2l6ZW9mKFBPSU5URVIpOwoKI2lmZGVmIENIRUNLCgkvKiBzZXQgdGhlIGRlYnVnIGluZm9ybWF0aW9uIGFkZHJlc3MgKi8KCU5ld0luZm8gICAgPSAoTUVNT1JZX0lORk8pIE5ld01lbW9yeTsKCgkvKiBza2lwIHRoZSBsZWZ0IGRlYnVnIG1hcmsgKi8KCU5ld01lbW9yeSArPSBtZW1vcnlfT0ZGU0VUOwojZW5kaWYKCgkvKiB1cGRhdGUgdGhlIHBvaW50ZXIgdG8gdGhlIG5leHQgdXNhYmxlIGJsb2NrICovCQoJUmVzb3VyY2UtPm5leHQgICAgICAgICAgICAgID0gTmV3TWVtb3J5ICsgUmVzb3VyY2UtPnRvdGFsX3NpemU7CiAgICAgIH0KICAgIH0KICB9CgojaWZkZWYgQ0hFQ0sKICAvKiBTZXQgYmxvY2u0cyBkZWJ1ZyBpbmZvcm1hdGlvbiAqLwogIG1lbW9yeV9TZXRJbmZvKE5ld0luZm8sIEZpbGUsIExpbmUsIE5VTEwsIDApOwogIG1lbW9yeV9TZXRCbG9ja1N0YXR1c0FuZFNpemUoTmV3TWVtb3J5LCAgCgkJCSAgICAgICBtZW1vcnlfTUFHSUNNQUxMT0MsIEJ5dGVzKTsKCiAgLyogZGVsZXRlIGFsbCBibG9ja7RzIHVzYWJsZSBieXRlcyB3aXRoIGEgc2hyZWRkZXIgdmFsdWUgKi8KICBtZW1zZXQoTmV3TWVtb3J5LCBtZW1vcnlfX0ZSRUVTSFJFRERFUiwKCSBtZW1vcnlfTG9va3VwUmVhbEJsb2NrU2l6ZShCeXRlcykpOwojZW5kaWYKCiAgcmV0dXJuIE5ld01lbW9yeTsKfQoKI2VuZGlmCgoKCiNpZmRlZiBOT19NRU1PUllfTUFOQUdFTUVOVAoKUE9JTlRFUiBtZW1vcnlfQ2FsbG9jKHVuc2lnbmVkIGludCBFbGVtZW50cywgdW5zaWduZWQgaW50IEJ5dGVzKQp7CiAgY2hhciAqbWVtOyAvKiBwb2ludGVyIHRvIG1lbW9yeSBibG9jayBvYnRhaW5lZCBmcm9tIGNhbGxvYyAqLwoKICAvKiBQYXNzIGNhbGwgdGhyb3VnaCB0byBjb21waWxlcrRzIGNhbGxvYyAqLwogIG1lbSA9IChjaGFyICopY2FsbG9jKEVsZW1lbnRzLCBCeXRlcyk7CiAgCiAgLyogSWYgY2FsbG9jIGZhaWxzIHByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGV4aXQgKi8KICBpZiAobWVtID09IE5VTEwpIHsKICAgIG1pc2NfU3RhcnRVc2VyRXJyb3JSZXBvcnQoKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBJbiBtZW1vcnlfQ2FsbG9jOiIpOwogICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIE1lbW9yeSBFcnJvci4gT3V0IG9mIG1lbW9yeS5cbiIpOwogICAgbWlzY19GaW5pc2hVc2VyRXJyb3JSZXBvcnQoKTsKICB9CgogIHJldHVybiBtZW07Cn0KCiNlbHNlCgojaWZkZWYgQ0hFQ0sKUE9JTlRFUiBtZW1vcnlfQ2FsbG9jSW50ZXJuKHVuc2lnbmVkIGludCBFbGVtZW50cywgdW5zaWduZWQgaW50IEJ5dGVzLCAKCQkJICAgIGNvbnN0IGNoYXIgKiBGaWxlLCB1bnNpZ25lZCBzaG9ydCBpbnQgTGluZSkKI2Vsc2UKUE9JTlRFUiBtZW1vcnlfQ2FsbG9jKHVuc2lnbmVkIGludCBFbGVtZW50cywgdW5zaWduZWQgaW50IEJ5dGVzKQojZW5kaWYKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQgIDogVGhlIG51bWJlciBvZiByZXF1ZXN0ZWQgZXF1YWxseSBodWdlIGJsb2NrcywgCiAgICAgICAgICAgYW5kIGVhY2ggYmxvY2sncyBzaXplLgogIFJFVFVSTlM6IEEgcG9pbnRlciB0byBhIGJsb2NrIG9mIChCeXRlcyAqIEVsZW1lbnRzKSBieXRlcy4KICBTVU1NQVJZOiBBbGxvY2F0ZXMgYSBtZW1vcnkgYmxvY2sgb2YgcmVxdWVzdGVkIGxlbmd0aAogICAgICAgICAgIGZpbGxlZCB3aXRoIGNoYXIgdmFsdWUgJ1wwJy4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgY2hhciAgICAgICAqIG1lbTsgLyogcG9pbnRlciB0byBtZW1vcnkgYmxvY2sgb2J0YWluZWQgZnJvbSB0aGUgbW9kdWxlICovCgogIC8qIEFsbG9jYXRlIG1lbW9yeSB2aWEgb3VyIG1lbW9yeSBtYW5hZ2VtZW50ICovCiNpZmRlZiBDSEVDSwogIG1lbSA9IChjaGFyICopbWVtb3J5X01hbGxvY0ludGVybihFbGVtZW50cyAqIEJ5dGVzLCBGaWxlLCBMaW5lKTsKI2Vsc2UKICBtZW0gPSAoY2hhciAqKW1lbW9yeV9NYWxsb2MoRWxlbWVudHMgKiBCeXRlcyk7CiNlbmRpZgoKICAvKiBJZiBhbGxvY2F0aW9uIHdhcyBzdWNjZXNzZnVsIHNldCBhbGwgYnl0ZXMgdG8gemVybyAqLyAKICBpZiAobWVtICE9IE5VTEwpIHsKICAgIG1lbXNldChtZW0sMCwgRWxlbWVudHMgKiBCeXRlcyk7CiAgfQogIC8qIG90aGVyd2lzZSBwcmludCBhbiBlcnJvciBtZXNzYWdlIGFuZCBleGl0ICovCiAgZWxzZSB7CiAgICBtaXNjX1N0YXJ0VXNlckVycm9yUmVwb3J0KCk7CiAgICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiXG4gSW4gbWVtb3J5X0NhbGxvYzoiKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBNZW1vcnkgRXJyb3IuIE91dCBvZiBtZW1vcnkuXG4iKTsKI2lmZGVmIENIRUNLCiAgICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiXG4gRXJyb3Igb2NjdXJyZWQgaW4gbWVtb3J5X0NhbGxvYyIpOwogICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIiBjYWxsZWQgZnJvbSBmaWxlICVzIGF0IGxpbmUgJWQuXG4iLAoJCQkgRmlsZSwgTGluZSk7CiNlbmRpZgogICAgbWlzY19GaW5pc2hVc2VyRXJyb3JSZXBvcnQoKTsKICB9CgogIHJldHVybiBtZW07Cn0KI2VuZGlmCgp2b2lkIG1lbW9yeV9GcmVlQWxsTWVtKHZvaWQpIAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVCAgOiBOb25lLgogIFJFVFVSTlM6IE5vbmUuCiAgU1VNTUFSWTogRnJlZXMgYWxsIG1lbW9yeSBhbGxvY2F0ZWQgYnkgY2FsbHMgdG8gdGhlIG1vZHVsZS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgaW50IGk7CgogIC8qIGRlbGV0ZSBhbGwgcGFnZXMgZmlyc3QgYnkgZ29pbmcgdGhyb3VnaCB0aGUgbWVtb3J5X0FSUkFZLgogICAgIFRoaXMgaXMgc2xvd2VyIHRoYW4gdHJhdmVyc2luZyB0aGUgYXJyYXkgbWVtb3J5X1BBR0VTCiAgICAgZGlyZWN0bHksIGJ1dCBpcyBlYXNpZXIgdG8gaW1wbGVtZW50IGNvcnJlY3RseS4gU2luY2UKICAgICB0aGUgb25seSByZWFzb25hYmxlIHdheSB0byBjYWxsIG1lbW9yeV9GcmVlQWxsTWVtIGlzCiAgICAgYmVmb3JlIHRoZSBwcm9ncmFtIGV4aXRzLCBhIG1pbmltYWwgcGVyZm9ybWFuY2UgcGVuYWx0eQogICAgIHNob3VsZCBiZSBhY2NlcHRhYmxlCiAgKi8KCiAgZm9yIChpID0gMTsgaSA8IG1lbW9yeV9fRFlOTUFYU0laRTsgaSsrKSB7CiAgICBQT0lOVEVSIHRoaXNwYWdlLCBuZXh0cGFnZTsKICAgIE1FTU9SWV9SRVNPVVJDRSAqIFJlc291cmNlOwoKICAgIFJlc291cmNlID0gbWVtb3J5X0FSUkFZW2ldOwoKICAgIHRoaXNwYWdlID0gUmVzb3VyY2UtPnBhZ2U7CgogICAgaWYgKCooKGludCAqKXRoaXNwYWdlKSAhPSBFT0YpIHsKICAgICAgZG8gewoJbmV4dHBhZ2UgPSAqKChQT0lOVEVSICopdGhpc3BhZ2UpOwoJZnJlZSh0aGlzcGFnZSk7Cgl0aGlzcGFnZSA9IG5leHRwYWdlOwogICAgICB9IHdoaWxlICAoKigoaW50ICopdGhpc3BhZ2UpICE9IEVPRik7CgogICAgICAvKiBhbmQgcmVzZXQgdGhlIHJlc291cmNlIHN0cnVjdHVyZSAqLwogICAgICBSZXNvdXJjZS0+cGFnZSAgICAgICAgPSAmbWVtb3J5X19FT0Y7CiAgICAgIFJlc291cmNlLT5mcmVlICAgICAgICA9ICZtZW1vcnlfX0VPRjsKICAgICAgUmVzb3VyY2UtPm5leHQgICAgICAgID0gJm1lbW9yeV9fRU9GOwogICAgICBSZXNvdXJjZS0+ZW5kX29mX3BhZ2UgPSAmbWVtb3J5X19FT0Y7CiAgICB9CiAgfQoKICAvKiBub3cgZGVsZXRlIGFsbCBiaWcgYmxvY2tzIGxlZnQgKi8KCiAgaWYgKG1lbW9yeV9CSUdCTE9DS1MgIT0gTlVMTCkgewogICAgTUVNT1JZX0JJR0JMT0NLSEVBREVSIHRoaXNibG9jaywgbmV4dGJsb2NrOwogICAgCiAgICBmb3IgKHRoaXNibG9jayA9IG1lbW9yeV9CSUdCTE9DS1M7IAoJIHRoaXNibG9jayAhPSBOVUxMOyAKCSB0aGlzYmxvY2sgPSBuZXh0YmxvY2spIHsKICAgICAgbmV4dGJsb2NrID0gdGhpc2Jsb2NrLT5uZXh0OwogICAgICBmcmVlKHRoaXNibG9jayk7CiAgICB9CgogICAgLyogYW5kIHJlc2V0IHRoZSBsaXN0IHBvaW50ZXIgKi8KICAgIG1lbW9yeV9CSUdCTE9DS1MgPSBOVUxMOwogIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgREVCVUdHSU5HIElORk9STUFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdm9pZCBtZW1vcnlfUHJpbnQodm9pZCkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQgIDogTm9uZS4KICBSRVRVUk5TOiBOb25lLgogIFNVTU1BUlk6IFByaW50cyBtb2R1bGUgc3RhdHVzIGluZm9ybWF0aW9uIHRvIHN0ZG91dDoKICAgICAgICAgICB0aGUgZml4ZWQgc2l6ZSBvZiBhbiBpbnRlcm5hbCBtZW1vcnkgcGFnZSwgdGhlIHNpemUgCgkgICBvZiBkZWJ1ZyBtYXJrcyBmb3IgYSBibG9jayBvZiBtZW1vcnksIHRoZSBzaXplIG9mIAoJICAgZGVtYW5kZWQgYW5kIGZyZWVkIG1lbW9yeSBpbiBraWxvYnl0ZXMsIHJlbWFpbmluZyAKCSAgIG1lbW9yeSBpbiBieXRlcyBhbmQgdGhlIG51bWJlciBvZiBhbGxvY2F0ZWQgcGFnZXMgb2YgCgkgICBtZW1vcnkuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewojaWZuZGVmIE5PX01FTU9SWV9NQU5BR0VNRU5UCiAgLyogQ2FsbCBtZW1vcnlfRlByaW50IHRvIHByaW50IHN0YXR1cyBpbmZvcm1hdGlvbiB0byBzdGRvdXQgKi8KICBtZW1vcnlfRlByaW50KHN0ZG91dCk7CiNlbmRpZgp9Cgp2b2lkIG1lbW9yeV9GUHJpbnQoRklMRSogRmlsZSkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQgIDogQSBmaWxlIHBvaW50ZXIuCiAgUkVUVVJOUzogTm9uZS4KICBTVU1NQVJZOiBQcmludHMgbW9kdWxlIHN0YXR1cyBpbmZvcm1hdGlvbiB0byBnaXZlbiBGaWxlOgogICAgICAgICAgIHRoZSBmaXhlZCBzaXplIG9mIGFuIGludGVybmFsIG1lbW9yeSBwYWdlLCB0aGUgc2l6ZSAKCSAgIG9mIGRlYnVnIG1hcmtzIGZvciBhIGJsb2NrIG9mIG1lbW9yeSwgdGhlIHNpemUgb2YgCgkgICBkZW1hbmRlZCBhbmQgZnJlZWQgbWVtb3J5IGluIGtpbG9ieXRlcywgcmVtYWluaW5nIAoJICAgbWVtb3J5IGluIGJ5dGVzIGFuZCB0aGUgbnVtYmVyIG9mIGFsbG9jYXRlZCBwYWdlcyBvZiAKCSAgIG1lbW9yeS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiNpZm5kZWYgTk9fTUVNT1JZX01BTkFHRU1FTlQKICBpbnQgICAgIFBhZ2VzOyAgICAvKiBudW1iZXIgb2YgYWxsb2NhdGVkIHBhZ2VzICAgICAgICAgICAgICAgICAgKi8KICBpbnQgICAgIGk7CiAgUE9JTlRFUiBBY3RQYWdlOyAgLyogY3VycmVudCBwYWdlIGluIHBhZ2UgbGlzdCBmb3IgYSBibG9jayBzaXplICovCgogIC8qIENhbGN1bGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzICovCiAgUGFnZXMgPSAwOwogIGZvciAoaSA9IDE7IGkgPCBtZW1vcnlfX0RZTk1BWFNJWkU7IGkrPW1lbW9yeV9fU0hBUkVEUEFHRVMpIHsKICAgIC8qIGluY3JlYXNlIGkgYnkgbWVtb3J5X1NIQVJFRFBBR0VTIGR1ZSB0byBwYWdlIHNoYXJpbmcgKi8KICAgIEFjdFBhZ2UgPSBtZW1vcnlfQVJSQVlbaV0tPnBhZ2U7CgogICAgLyogVHJhdmVyc2UgdGhlIHBhZ2UgbGlzdCAqLwogICAgd2hpbGUgKCooKGludCAqKUFjdFBhZ2UpICE9IEVPRikgewogICAgICBQYWdlcysrOwogICAgICBBY3RQYWdlID0gKigoUE9JTlRFUiAqKUFjdFBhZ2UpOwogICAgfQogIH0KCiAgLyogUHJpbnQgc3RhdHVzIGluZm9ybWF0aW9uICovCiAgZnB1dHMoIlxuIyMjXG4iLCBGaWxlKTsKICBmcHJpbnRmKEZpbGUsIiMjIyBQYWdlc2l6ZTogJWRcbiIsCgkgIG1lbW9yeV9QQUdFU0laRSk7CiAgZnByaW50ZihGaWxlLCIjIyMgTWFya3NpemU6ICVkXG4iLAoJICAoaW50KW1lbW9yeV9NQVJLU0laRSk7CiAgZnByaW50ZihGaWxlLCIjIyMgTWVtb3J5IGRlbWFuZGVkOiAgJWx1IEtCeXRlc1xuIiwgCgkgIG1lbW9yeV9ORVdCWVRFUy9tZW1vcnlfX0tJTE9CWVRFKTsKICBmcHJpbnRmKEZpbGUsIiMjIyBNZW1vcnkgZnJlZWQ6ICAgICAlbHUgS0J5dGVzXG4iLCAKCSAgbWVtb3J5X0ZSRUVEQllURVMvbWVtb3J5X19LSUxPQllURSk7CiAgZnByaW50ZihGaWxlLCIjIyMgTWVtb3J5IHJlbWFpbmluZzogJWx1IEJ5dGVzXG4iLCAKCSAgbWVtb3J5X05FV0JZVEVTLW1lbW9yeV9GUkVFREJZVEVTKTsKICBmcHJpbnRmKEZpbGUsIiMjIyBQYWdlcyBhbGxvY2F0ZWQ6ICAlZCBQYWdlc1xuIiwgCgkgIFBhZ2VzKTsKICBmcHV0cygiIyMjXG4iLCBGaWxlKTsKI2VuZGlmCn0KCnZvaWQgbWVtb3J5X1ByaW50QWxsb2NhdGVkQmxvY2tzKHVuc2lnbmVkIGludCBTaXplKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVCAgOiBCbG9jayBzaXplLgogIFJFVFVSTlM6IE5vbmUuCiAgU1VNTUFSWTogUHJpbnRzIGFkZHJlc3NlcyBvZiBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrcyB3aXRoCiAgICAgICAgICAgZ2l2ZW4gU2l6ZSB0byBzdGRvdXQsIGlmIFNpemUgaXMgbGVzcyB0aGFuIAoJICAgbWVtb3J5X0RZTk1BWFNJWkUuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewojaWZuZGVmIE5PX01FTU9SWV9NQU5BR0VNRU5UCiAgTUVNT1JZX1JFU09VUkNFICpSZXNvdXJjZTsgICAgIC8qIGN1cnJlbnQgcmVzb3VyY2UgICAgICAgICAgICAgICAgICAgKi8KCiAgUE9JTlRFUiAgICAgICAgICBBY3RQYWdlOyAgICAgIC8qIGN1cnJlbnQgcGFnZSAgICAgICAgICAgICAgICAgICAgICAgKi8KICBQT0lOVEVSICAgICAgICAgIEFjdE5leHQ7ICAgICAgLyogbmV4dCB1c2FibGUgYmxvY2sgb24gY3VycmVudCBwYWdlICovCiAgUE9JTlRFUiAgICAgICAgICBBY3RFbmRPZlBhZ2U7IC8qIGVuZCBvZiBjdXJyZW50IHBhZ2UgICAgICAgICAgICAgICAgKi8KCiAgdW5zaWduZWQgaW50ICAgICBCbG9ja1NpemU7ICAgIC8qIGN1cnJlbnQgYmxvY2sgc2l6ZSAgICAgICAgICAgICAgICAgKi8KCiNpZmRlZiBDSEVDSwogIE1FTU9SWV9JTkZPICAgICAgSW5mbzsgICAgICAgICAvKiBjdXJyZW50IGJsb2NrtHMgZGVidWcgaW5mb3JtYXRpb24gICovCiNlbmRpZgoKICAvKiBBbGxvY2F0ZWQgYmxvY2tzIGFyZSBhZG1pbmlzdGVyZWQgCiAgICAgaW4gdHdvIHdheXMgZGVwZW5kaW5nIG9uIHRoZWlyIAogICAgIHNpemUuIElmIHRoZSBzaXplIGlzIGxlc3MgdGhhbgogICAgIG1lbW9yeV9fRFlOTUFYU0laRSB0aGUgYmxvY2sgaXMKICAgICBhbGxvY2F0ZWQgZnJvbSB0aGUgYXBwcm9wcmlhdGUKICAgICBwYWdlLiBPdGhlcndpc2UgdGhlIGJsb2NrIGlzIAogICAgIGFsbG9jYXRlZCBkaXJlY3RseSB2aWEgYSBjYWxsCiAgICAgdG8gbWFsbG9jIG9yIGNhbGxvYy4KCiAgICAgVGh1cyB3ZSBoYXZlIHR3byBmdW5jdGlvbnMgdG8KICAgICBwcmludCB0aGUgYWxsb2NhdGVkIGJsb2NrczoKICAgICBtZW1vcnlfUHJpbnRBbGxvY2F0ZWRCbG9ja3MgYW5kCiAgICAgbWVtb3J5X1ByaW50QWxvY2F0ZWRCaWdCbG9ja3MuCiAgKi8KCgogIC8qIENoZWNrIGlmIG1lbW9yeV9QcmludEFsbG9jYXRlZEJsb2NrcyBoYXMgYmVlbiBjYWxsZWQgZm9yCiAgICAgYSBsZWdhbCBibG9jayBzaXplCiAgKi8KCiAgaWYgKFNpemUgPj0gbWVtb3J5X19EWU5NQVhTSVpFKSB7CiAgICAvKiBpZiB0aGF0tHMgbm90IHRoZSBjYXNlIHByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGV4aXQgKi8KICAgIG1pc2NfU3RhcnRVc2VyRXJyb3JSZXBvcnQoKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBJbiBtZW1vcnlfUHJpbnRBbGxvY2F0ZWRCbG9ja3M6Iik7CiAgICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiXG4gUGFyYW1ldGVyIHNpemUgaXMgdG9vIGJpZzogJWQuIiwKCQkJIFNpemUpOwogICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIE1heGltYWwgYWxsb3dlZCB2YWx1ZSBpczogJWQuXG4iLCAKCQkJIG1lbW9yeV9fRFlOTUFYU0laRSk7CiAgICBtaXNjX0ZpbmlzaFVzZXJFcnJvclJlcG9ydCgpOwogIH0KICBlbHNlIHsKICAgIC8qIG90aGVyd2lzZSBzaXplIGlzIGxlZ2FsICovCgogICAgLyogaW5pdGlhbGl6ZSB0aGUgdmFyaWFibGVzICovCiAgICBSZXNvdXJjZSAgICAgPSBtZW1vcnlfQVJSQVlbU2l6ZV07CiAgICBBY3RQYWdlICAgICAgPSBSZXNvdXJjZS0+cGFnZTsKICAgIEFjdE5leHQgICAgICA9IFJlc291cmNlLT5uZXh0OwogICAgQWN0RW5kT2ZQYWdlID0gUmVzb3VyY2UtPmVuZF9vZl9wYWdlOwogICAgQmxvY2tTaXplICAgID0gUmVzb3VyY2UtPnRvdGFsX3NpemU7CgogICAgLyogVGVzdCBpZiB0aGVyZSB3ZXJlIGFueSByZXF1ZXN0cyBtYWRlIGZvciBibG9ja3Mgb2YgdGhhdCBzaXplICovCiAgICBpZiAoKigoaW50ICopQWN0UGFnZSkgPT0gRU9GKSB7CiAgICAgIC8qIENoZWNrIGlmIHBvaW50ZXJzIGFyZSBjb25zaXN0ZW50ICovCiAgICAgIGlmICgqKChpbnQgKilBY3ROZXh0KSA9PSBFT0YpIHsKCS8qIElmIHRoYXQgaXMgdHJ1ZSwgcHJpbnQgdGhhdCBpbmZvcm1hdGlvbiB0byBzdGRvdXQgKi8KCXB1dHMoIiAgIE5vIHJlcXVlc3Qgc28gZmFyIik7CiAgICAgIH0KICAgICAgZWxzZSB7CgkvKiBPdGhlcndpc2UgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBhbmQgYWJvcnQgKi8KCSBtaXNjX1N0YXJ0RXJyb3JSZXBvcnQoKTsKCSBtaXNjX0Vycm9yUmVwb3J0KCJcbiBJbiBtZW1vcnlfUHJpbnRBbGxvY2F0ZWRCbG9ja3M6Iik7CgkgbWlzY19FcnJvclJlcG9ydCgiXG4gTWVtb3J5IEVycm9yLiBObyBQYWdlIGVudHJ5IGJ1dCBOZXh0IGVudHJ5LlxuIik7CgkgbWlzY19GaW5pc2hFcnJvclJlcG9ydCgpOwogICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgLyogV2UgaGF2ZSByZWNlaXZlZCBzb21lIHJlcXVlc3RzIGZvciBibG9ja3Mgb2YgdGhhdCBzaXplICovIAojaWZkZWYgQ0hFQ0sKCiAgICAgIFBPSU5URVIgQWN0RGF0YTsgLyogY3VycmVudCBibG9jayAqLwoKCiAgICAgIC8qIFRyYXZlcnNlIHRocm91Z2ggdGhlIHBhZ2UgbGlzdCBmb3IgZ2l2ZW4gYmxvY2sgc2l6ZSAqLwogICAgICB3aGlsZSAoKigoaW50ICopQWN0UGFnZSkgIT0gRU9GKSB7CgoJLyogSW5pdGlhbGl6ZSB0aGUgdmFyaWFibGVzICovCglBY3REYXRhICAgICAgPSAoY2hhciAqKUFjdFBhZ2UgKyBzaXplb2YoUE9JTlRFUikgKyBtZW1vcnlfT0ZGU0VUOwoJQWN0RW5kT2ZQYWdlID0gKGNoYXIgKilBY3RQYWdlICsgUmVzb3VyY2UtPm9mZnNldDsKCgkvKiBWaXNpdCBibG9ja3Mgb24gY3VycmVudCBwYWdlIHVudGlsIHRoZSBlbmQgb2YKCSAgIHBhZ2UgaXMgcmVhY2hlZCwgb3IgYW4gYWxsb2NhdGVkIGJsb2NrIGlzIGZvdW5kCgkqLwoJd2hpbGUgKEFjdERhdGEgIT0gQWN0TmV4dCAKCSAgICAgICAmJiBBY3REYXRhICE9IEFjdEVuZE9mUGFnZQoJICAgICAgICYmIG1lbW9yeV9HZXRCbG9ja1N0YXR1cyhBY3REYXRhKSAhPSBtZW1vcnlfTUFHSUNNQUxMT0MpIHsKCSAgQWN0RGF0YSA9IChjaGFyICopQWN0RGF0YSArIEJsb2NrU2l6ZTsKCX0KCgkvKiBDaGVjayBpZiB0aGVyZSB3ZXJlIGFueSBhbGxvY2F0ZWQgYmxvY2tzIGZyb20gY3VycmVudCBwYWdlICovCglpZiAoQWN0RGF0YSA9PSBBY3ROZXh0IHx8IEFjdERhdGEgPT0gQWN0RW5kT2ZQYWdlKSB7CgkgIC8qIGlmIHRoYXS0cyBub3QgdGhlIGNhc2UgcHJpbnQgdGhlIGluZm9ybWF0aW9uIHRvIHN0ZG91dCAqLwoJICBwcmludGYoIlxuXG4gICBObyBtZW1vcnkgYWxsb2NhdGVkIGZyb20gcGFnZSBhdCBhZGRyZXNzICVwXG4iLCBBY3RQYWdlKTsKCX0KCWVsc2UgewoJICAvKiBvdGhlcndpc2UgcHJpbnQgYWRkcmVzcyBhbmQgb3JpZ2luIG9mIChkZSlhbGxvY2F0aW9uIG9mCgkgICAgIGFsbCBhbGxvY2F0ZWQgYmxvY2tzIG9uIGN1cnJlbnQgcGFnZSwgc3RhcnRpbmcKCSAgICAgd2l0aCB0aGUgYmxvY2sganVzdCBmb3VuZAoJICAqLwoJICBmcHV0cygiXG5cbiAgIEFsbG9jYXRlZCBidXQgbm90IGZyZWVkOiAiLCBzdGRvdXQpOwoJICBkbyAgewoJICAgIEluZm8gPSAoTUVNT1JZX0lORk8pICgoY2hhciAqKSBBY3REYXRhIC0gbWVtb3J5X09GRlNFVCk7CgkgICAgaWYgKG1lbW9yeV9HZXRCbG9ja1N0YXR1cyhBY3REYXRhKSA9PSBtZW1vcnlfTUFHSUNNQUxMT0MgCgkJJiYgbWVtb3J5X0dldEJsb2NrU2l6ZShBY3REYXRhKSA9PSBTaXplKSB7CgkgICAgICBwcmludGYoIlxuXHQlcCBhbGxvY2F0ZWQgaW4gZmlsZSAlcyBhdCBsaW5lICVkICIsIAoJCSAgICAgQWN0RGF0YSwgSW5mby0+bWFsbG9jSW5GaWxlLCBJbmZvLT5tYWxsb2NBdExpbmUpOwoJICAgIH0KCSAgICBBY3REYXRhID0gKGNoYXIgKilBY3REYXRhICsgQmxvY2tTaXplOwoJICB9IHdoaWxlIChBY3REYXRhICE9IEFjdE5leHQgJiYgQWN0RGF0YSAhPSBBY3RFbmRPZlBhZ2UpOwoJfQoKCS8qIGdvIHRvIHRoZSBuZXh0IHBhZ2UgaW4gdGhlIHBhZ2UgbGlzdCBmb3IgZ2l2ZW4gYmxvY2sgc2l6ZSAqLwoJQWN0UGFnZSA9ICooKFBPSU5URVIgKilBY3RQYWdlKTsKICAgICAgfQojZW5kaWYKICAgIH0KICB9CiNlbmRpZgp9Cgp2b2lkIG1lbW9yeV9QcmludEZyZWVkQmxvY2tzKHVuc2lnbmVkIGludCBTaXplKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVCAgOiBCbG9jayBzaXplLgogIFJFVFVSTlM6IE5vbmUuCiAgU1VNTUFSWTogUHJpbnRzIGFkZHJlc3NlcyBvZiBmcmVlZCBtZW1vcnkgYmxvY2tzIHdpdGggZ2l2ZW4gCiAgICAgICAgICAgU2l6ZSB0byBzdGRvdXQsIGlmIFNpemUgaXMgbGVzcyB0aGFuIAoJICAgbWVtb3J5X0RZTk1BWFNJWkUuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewojaWZuZGVmIE5PX01FTU9SWV9NQU5BR0VNRU5UCiAgUE9JTlRFUiAgICAgQWN0RnJlZTsgLyogY3VycmVudCBibG9jayAqLwoKI2lmZGVmIENIRUNLCiAgTUVNT1JZX0lORk8gSW5mbzsgICAgLyogY3VycmVudCBibG9ja7RzIGRlYnVnIGluZm9ybWF0aW9uICovCiNlbmRpZgoKICAvKiBzaW5jZSB3ZSBkb260dCByZWN5Y2xlIGJsb2NrcyB3aG9zZSBzaXplIGlzCiAgICAgZ3JlYXRlciBvciBlcXVhbCB0byBtZW1vcnlfX0RZTk1BWFNJWkUsIAogICAgIG1lbW9yeV9QcmludEZyZWVkQmxvY2tzIGlzIG1lYW5pbmdsZXNzCiAgICAgZm9yIHN1Y2ggYmxvY2sgc2l6ZXMuCiAgKi8KCiAgLyogdGVzdCBpZiBnaXZlbiBibG9jayBzaXplIGlzIGxlZ2FsICovCiAgaWYgKFNpemUgPj0gbWVtb3J5X19EWU5NQVhTSVpFKSB7CiAgICAvKiBpZiB0aGF0tHMgbm90IHRoZSBjYXNlIHByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGV4aXQgKi8KICAgIG1pc2NfU3RhcnRVc2VyRXJyb3JSZXBvcnQoKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBJbiBtZW1vcnlfUHJpbnRGcmVlZEJsb2Nrcy4iKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBQYXJhbWV0ZXIgU2l6ZSBpcyB0b28gYmlnOiAlZC4iLCAKCQkJIFNpemUpOwogICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIE1heGltYWwgYWxsb3dlZCB2YWx1ZSBpczogJWQuXG4iLCAKCQkJIG1lbW9yeV9fRFlOTUFYU0laRSk7CiAgICBtaXNjX0ZpbmlzaFVzZXJFcnJvclJlcG9ydCgpOwogIH0KICBlbHNlIHsKICAgIC8qIG90aGVyd2lzZSBzaXplIGlzIGxlZ2FsICovCgogICAgLyogc3RhcnQgYXQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGZyZWUgYmxvY2sgbGlzdAogICAgICAgZm9yIHRoZSBnaXZlbiBibG9jayBzaXplCiAgICAqLwogICAgQWN0RnJlZSA9IG1lbW9yeV9BUlJBWVtTaXplXS0+ZnJlZTsKCiAgICAvKiB0ZXN0IGlmIHRoZSBmcmVlIGJsb2NrIGxpc3QgaXMgZW1wdHkgKi8KICAgIGlmICgqKChpbnQgKilBY3RGcmVlKSA9PSBFT0YpIHsKICAgICAgLyogaWYgdGhhdLRzIHRydWUsIHByaW50IHRoYXQgaW5mb3JtYXRpb24gdG8gc3Rkb3V0ICovCiAgICAgIHB1dHMoIlxuXG4gICBObyBmcmVlZCBtZW1vcnkiKTsKICAgIH0KICAgIGVsc2UgewogICAgICAvKiBvdGhlcndpc2UgdHJhdmVyc2UgdGhlIGxpc3Qgb2YgZnJlZWQgYmxvY2tzICovCgogICAgICBmcHV0cygiXG5cbiAgIEZyZWU6ICIsIHN0ZG91dCk7CiAgICAgIHdoaWxlICgqKChpbnQgKilBY3RGcmVlKSAhPSBFT0YpIHsKI2lmZGVmIENIRUNLCgkvKiBpbiBkZWJ1ZyBtb2RlIHByaW50IGN1cnJlbnQgYmxvY2u0cyBhZGRyZXNzCgkgICBhbmQgb3JpZ2luIG9mIChkZSlhbGxvY2F0aW9uCgkqLwoKCS8qIGNoZWNrIGlmIGJsb2NrtHMgc2l6ZSBpcyBjb3JyZWN0ICovIAoJaWYgKCBtZW1vcnlfR2V0QmxvY2tTaXplKEFjdEZyZWUpID09IFNpemUpIHsKCSAgLyogaWYgdGhhdLRzIHRydWUgdGhhbiBwcmludCBibG9ja7RzIGluZm9ybWF0aW9uICovCgkgIEluZm8gPSAoTUVNT1JZX0lORk8pICgoY2hhciAqKSBBY3RGcmVlIC0gbWVtb3J5X09GRlNFVCk7CgkgIHByaW50ZigiXG5cdCVwXHRhbGxvY2F0ZWQgaW4gZmlsZSAlcyBhdCBsaW5lICVkIiwKCQkgQWN0RnJlZSwgIEluZm8tPm1hbGxvY0luRmlsZSwgSW5mby0+bWFsbG9jQXRMaW5lKTsKCSAgcHJpbnRmKCJcblx0XHRmcmVlZCBpbiBmaWxlICVzIGF0IGxpbmUgJWQiLAoJCSBJbmZvLT5mcmVlSW5GaWxlLCBJbmZvLT5mcmVlQXRMaW5lKTsKCX0KCWVsc2UgewoJICAvKiBvdGhlcndpc2UgaWYgd2UgYXJlIHNoYXJpbmcgcGFnZXMgYW1vbmcgZGlmZmVyZW50CgkgICAgIGJsb2NrIHNpemVzLCB0aGUgYmxvY2sgaXMgdW5jb3JydXB0ZWQsIGRlc3BpdGUgbm90IAoJICAgICBtYXRjaGluZyBhc3N1bWVkIGFuZCByZWFsIHNpemUuIEJ1dCBpZiB3ZSBhcmUKCSAgICAgbm90IHNoYXJpbmcgcGFnZXMgdGhlbiB0aGUgYmxvY2sgaXMgcHJvYmFibHkgY29ycnVwdGVkLCAKCSAgICAgc28gcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBhbmQgZXhpdCAKCSAgKi8KCgkgIC8qIHRlc3QgaWYgd2UgYXJlIG5vdCBpbiBwYWdlIHNoYXJpbmcgbW9kZSAqLwoJICBpZiAobWVtb3J5X19TSEFSRURQQUdFUyA9PSAxKSB7CgkgICAgLyogaWYgdGhhdLRzIHRydWUgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBhbmQgZXhpdCAqLwoJICAgIG1pc2NfU3RhcnRVc2VyRXJyb3JSZXBvcnQoKTsKCSAgICBtaXNjX1VzZXJFcnJvclJlcG9ydCgiXG4gSW4gbWVtb3J5X1ByaW50RnJlZWRCbG9ja3M6Iik7CgkgICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIE1lbW9yeSBFcnJvci4gTWVtb3J5IGJsb2NrIHNpemUgbWlzbWF0Y2guIik7CgkgICAgbWlzY19Vc2VyRXJyb3JSZXBvcnQoIlxuIEV4cGVjdGVkICVkIGZvdW5kICVkIGZvciBtZW1vcnkgYmxvY2sgYXQgJXAuXG4iLAoJCQkJIFNpemUsIG1lbW9yeV9HZXRCbG9ja1NpemUoQWN0RnJlZSksIEFjdEZyZWUpOwoJICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBQcm9iYWJseSB0aGUgbWVtb3J5IGJsb2NrIHdhcyBjb3JydXB0ZWQuXG4iKTsJICAgIAoJICAgIG1pc2NfRmluaXNoVXNlckVycm9yUmVwb3J0KCk7CgkgIH0KCX0KCiNlbmRpZgoKCS8qIGdvIHRvIHRoZSBuZXh0IGZyZWUgYmxvY2sgaW4gbGlzdCAqLwoJQWN0RnJlZSA9ICooKFBPSU5URVIgKilBY3RGcmVlKTsKICAgICAgfQogICAgfQogIH0KI2VuZGlmCn0KCgp2b2lkIG1lbW9yeV9QcmludEFsbG9jYXRlZEJpZ0Jsb2Nrcyh2b2lkKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVCAgOiBOb25lLgogIFJFVFVSTlM6IE5vbmUuCiAgU1VNTUFSWTogUHJpbnRzIGFkZHJlc3NlcyBvZiBhbGwgYWxsb2NhdGVkIG1lbW9yeSBibG9ja3MsCiAgICAgICAgICAgdGhhdCBhcmUgZ3JlYXRlciB0aGFuIG1lbW9yeV9EWU5NQVhTSVpFIHRvIHN0ZG91dC4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiNpZm5kZWYgTk9fTUVNT1JZX01BTkFHRU1FTlQKI2lmZGVmIENIRUNLCiAgTUVNT1JZX0JJR0JMT0NLSEVBREVSIFB0cjsgICAgICAgICAvKiBjdXJyZW50IGJpZyBibG9jayBpbiBsaXN0ICovCiAgTUVNT1JZX0lORk8gICAgICAgICAgIEluZm87ICAgICAgICAvKiBibG9ja7RzIGRlYnVnIGluZm9ybWF0aW9uICovCiAgY2hhciAgICAgICAgICAgICAgICAqIEJsb2NrU3RhcnQ7ICAvKiBibG9ja7RzIHN0YXJ0IGFkZHJlc3MgICAgICovCiAgCiAgLyogc3RhcnQgd2l0aCB0aGUgZmlyc3QgYmxvY2sgaW4gdGhlIGJpZyBibG9jayBsaXN0ICovCiAgUHRyID0gbWVtb3J5X0JJR0JMT0NLUzsKCiAgLyogY2hlY2sgd2hldGhlciBiaWcgYmxvY2sgbGlzdCBpc260dCBlbXB0eSAqLwogIGlmIChQdHIgIT0gTlVMTCkgewogICAgLyogaWYgdGhhdLRzIHRoZSBjYXNlIHRyYXZlcnNlIHRocm91Z2ggdGhlIGxpc3QKICAgICAgIGFuZCBwcmludCBlYWNoIGJsb2NrtHMgYWRkcmVzcywgc2l6ZSBhbmQKICAgICAgIG9yaWdpbiBvZiAoZGUpYWxsb2NhdGlvbiBpbmZvcm1hdGlvbgogICAgKi8KICAgIGRvIHsKICAgICAgQmxvY2tTdGFydCA9IChjaGFyICopUHRyICsgbWVtb3J5X09GRlNFVCAKCSsgc2l6ZW9mKE1FTU9SWV9CSUdCTE9DS0hFQURFUk5PREUpOwogICAgICAKICAgICAgSW5mbyA9IChNRU1PUllfSU5GTykgKEJsb2NrU3RhcnQgLSBtZW1vcnlfT0ZGU0VUKTsKICAgICAgcHJpbnRmKCJcblx0JXAgJWQgYnl0ZXMgYWxsb2NhdGVkIGluIGZpbGUgJXMgYXQgbGluZSAlZCAiLCAKCSAgICAgKHZvaWQqKUJsb2NrU3RhcnQsIG1lbW9yeV9HZXRCbG9ja1NpemUoQmxvY2tTdGFydCksCgkgICAgIEluZm8tPm1hbGxvY0luRmlsZSwgSW5mby0+bWFsbG9jQXRMaW5lKTsKICAgICAgUHRyID0gUHRyLT5uZXh0OwogICAgfSB3aGlsZSAoUHRyICE9IE5VTEwpOwogICAgcHV0cygiIik7CiAgfQogIGVsc2UgewogICAgLyogb3RoZXJ3aXNlIHRoZXJlIGFyZSBubyBiaWcgYmxvY2tzIGFsbG9jYXRlZCAqLwogICAgcHV0cygiICAgTm8gcmVxdWVzdCBzbyBmYXIiKTsKICB9CiNlbmRpZgojZW5kaWYKfQoKdm9pZCBtZW1vcnlfUHJpbnREZXRhaWxlZCh2b2lkKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVCAgOiBOb25lLgogIFJFVFVSTlM6IE5vbmUuCiAgU1VNTUFSWTogUHJpbnRzIGFkZHJlc3NlcyBvZiBhbGwgcGFnZXMsIGFuZCBhbGxvY2F0ZWQgYW5kIGZyZWVkIAogICAgICAgICAgIGJsb2NrcyBvbiB0aGVtLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKI2lmbmRlZiBOT19NRU1PUllfTUFOQUdFTUVOVAogIE1FTU9SWV9SRVNPVVJDRSAgKlJlc291cmNlOyAgICAgLyogY3VycmVudCByZXNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAqLwoKICBQT0lOVEVSICAgICAgICAgICBBY3RQYWdlOyAgICAgIC8qIGN1cnJlbnQgcGFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBQT0lOVEVSICAgICAgICAgICBBY3REYXRhOyAgICAgIC8qIGN1cnJlbnQgYmxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBQT0lOVEVSICAgICAgICAgICBBY3RFbmRPZlBhZ2U7IC8qIGVuZCBvZiBjdXJyZW50IHBhZ2UgICAgICAgICAgICAgICAgICAgKi8KICB1bnNpZ25lZCBpbnQgICAgICBCbG9ja1NpemU7ICAgIC8qIHRvdGFsIHNpemUgb2YgYSBibG9jayBvZiBjdXJyZW50IHNpemUgKi8KICB1bnNpZ25lZCBpbnQgICAgICBQYWdlT2Zmc2V0OyAgIC8qIGN1cnJlbnQgcGFnZbRzIG9mZnNldCAgICAgICAgICAgICAgICAgKi8KCiAgdW5zaWduZWQgaW50ICAgICAgaTsKCgogIC8qIHByaW50IGVuZC1vZi1tZW1vcnkgcG9pbnRlcrRzIGFkZHJlc3MgKi8KICBwcmludGYoIlxuXG5FT0YgUG9pbnRlcjogJXBcbiIsICh2b2lkKikmbWVtb3J5X19FT0YpOwoKICAvKiBmb3IgYWxsIGFkbWluaXN0cmF0ZWQgYmxvY2sgc2l6ZXMgcHJpbnQgZGV0YWlsZWQgaW5mb3JtYXRpb24gKi8KICBmb3IgKGk9MTsgaTxtZW1vcnlfX0RZTk1BWFNJWkU7IGkrKykgewogICAgLyogaW5pdGlhbGl6ZSB2YXJpYWJsZXMgZm9yIHJlcXVlc3RlZCBibG9jayBzaXplIGkgKi8KICAgIFJlc291cmNlICAgICA9IG1lbW9yeV9BUlJBWVtpXTsKICAgIEFjdFBhZ2UgICAgICA9IFJlc291cmNlLT5wYWdlOwogICAgQWN0RGF0YSAgICAgID0gUmVzb3VyY2UtPm5leHQ7CiAgICBBY3RFbmRPZlBhZ2UgPSBSZXNvdXJjZS0+ZW5kX29mX3BhZ2U7CiAgICBQYWdlT2Zmc2V0ICAgPSBSZXNvdXJjZS0+b2Zmc2V0OwogICAgQmxvY2tTaXplICAgID0gUmVzb3VyY2UtPnRvdGFsX3NpemU7CgogICAgLyogcHJpbnQgcmVxdWVzdGVkIGJsb2NrIHNpemUsIGFsaWduZWQgYmxvY2sgc2l6ZSAKICAgICAgIGFuZCBibG9jayBzaXplIGluY2x1ZGluZyBkZWJ1ZyBtYXJrcwogICAgKi8KICAgIHByaW50ZigiXG5cbiBFbnRyeTogJWQgYWxpZ25lZCBzaXplOiAlZCB0b3RhbCBzaXplOiAlZFxuIiwgCgkgICBpICwgUmVzb3VyY2UtPmFsaWduZWRfc2l6ZSwgQmxvY2tTaXplKTsKCiAgICAvKiBDaGVjayBpZiB0aGVyZSB3ZXJlIGFueSByZXF1ZXN0cyBmb3IgYmxvY2tzIG9mIHNpemUgaSAqLwogICAgaWYgKCooKGludCAqKUFjdFBhZ2UpID09IEVPRikgewogICAgICAvKiBpZiB0aGF0tHMgbm90IHRoZSBjYXNlIGNoZWNrIGlmIG1lbW9yeSBtYW5hZ2VtZW50IGlzIGNvbnNpc3RlbnQgKi8KICAgICAgaWYgKCooKGludCAqKUFjdERhdGEpID09IEVPRikgewoJLyogaWYgdGhhdLRzIHRydWUsIHByaW50IHRoYXQgbm8gcmVxdWVzdHMgb2NjdXJyZWQgdG8gc3Rkb3V0ICovCglwdXRzKCIgICBObyByZXF1ZXN0IHNvIGZhciIpOwogICAgICB9CiAgICAgIGVsc2UgewoJLyogb3VyIG1lbW9yeSBtYW5hZ2VtZW50IGlzIG5vIGxvbmdlciBjb25zaXN0ZW50LCAKCSAgIHNvIHByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGFib3J0LiBXZSBob3BlIHRoYXQKCSAgIHRoZSBjb3JlIGR1bXAgd2lsbCBoZWxwIHVzIHRvIGZpbmQgdGhlIGJ1ZwoJKi8KCW1pc2NfU3RhcnRFcnJvclJlcG9ydCgpOwoJbWlzY19FcnJvclJlcG9ydCgiXG4gSW4gbWVtb3J5X1ByaW50RGV0YWlsZWQ6Iik7CgltaXNjX0Vycm9yUmVwb3J0KCJcbiBNZW1vcnkgRXJyb3IuIE5vIFBhZ2UgZW50cnkgYnV0IE5leHQgZW50cnkuXG4iKTsKCW1pc2NfRmluaXNoRXJyb3JSZXBvcnQoKTsKICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgIC8qIHdlIGhhdmUgcmVjZWl2ZWQgcmVxdWVzdHMgZm9yIGJsb2NrcyBvZiBzaXplIGkgKi8KCiAgICAgIC8qIHRyYXZlcnNlIHRoZSBsaXN0IG9mIHBhZ2VzIGZvciBzaXplIGkgKi8KICAgICAgd2hpbGUgKCooKGludCAqKUFjdFBhZ2UpICE9IEVPRikgewoJLyogcHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBwYWdlICovCglwcmludGYoIlxuXG4gICBQYWdlOiAlcCBOZXh0IFBhZ2U6ICVwXG4iLAoJICAgICAgIEFjdFBhZ2UsICooKFBPSU5URVIgKilBY3RQYWdlKSk7CgoJLyogaW5pdGlhbGl6ZSB2YXJpYWJsZXMgZm9yIGN1cnJlbnQgcGFnZSAqLwoJQWN0RGF0YSA9ICgoY2hhciAqKUFjdFBhZ2UgKyBzaXplb2YoUE9JTlRFUikgKyBtZW1vcnlfT0ZGU0VUKTsKCUFjdEVuZE9mUGFnZSA9IChjaGFyICopQWN0UGFnZSArIFBhZ2VPZmZzZXQ7CgoJLyogcHJpbnQgYWRkcmVzc2VzIG9mIGFsbCBibG9ja3Mgb24gY3VycmVudCBwYWdlICovCglmcHV0cygiICAgRGF0YTogIiwgc3Rkb3V0KTsKCXdoaWxlIChBY3REYXRhICE9IEFjdEVuZE9mUGFnZSkgewoJICBpbnQgY29sdW1uOwoKCSAgZnB1dHMoIlxuXHRcdCIsIHN0ZG91dCk7CgkgIGZvciAoY29sdW1uID0gMDsgY29sdW1uIDwgNjsgY29sdW1uKyspIHsKCSAgICBwcmludGYoIiVwICIsIEFjdERhdGEpOwoJICAgIEFjdERhdGEgPSAoY2hhciAqKUFjdERhdGEgKyBCbG9ja1NpemU7CgkgICAgaWYgKEFjdERhdGEgPT0gQWN0RW5kT2ZQYWdlKSB7CgkgICAgICBicmVhazsKCSAgICB9CgkgIH0KCX0KCgkvKiBnbyB0byBuZXh0IHBhZ2UgaW4gbGlzdCAqLwoJQWN0UGFnZSA9ICooKFBPSU5URVIgKilBY3RQYWdlKTsKICAgICAgfQoKICAgICAgLyogcHJpbnQgYWxsb2NhdGVkIGFuZCBmcmVlZCBibG9ja3Mgb2Ygc2l6ZSBpICovCiAgICAgIG1lbW9yeV9QcmludEFsbG9jYXRlZEJsb2NrcyhpKTsKICAgICAgbWVtb3J5X1ByaW50RnJlZWRCbG9ja3MoaSk7CiAgICB9CiAgfQoKI2lmZGVmIENIRUNLCiAgLyogcHJpbnQgYWxsb2NhdGVkIGJsb2NrcyBvZiBzaXplID49IG1lbW9yeV9EWU5NQVhTSVpFICovCiAgcHJpbnRmKCJcblxuIEFsbG9jYXRlZCBibG9ja3Mgb2Ygc2l6ZSA+PSAlZFxuIiwgCgkgbWVtb3J5X19EWU5NQVhTSVpFKTsKICBtZW1vcnlfUHJpbnRBbGxvY2F0ZWRCaWdCbG9ja3MoKTsKI2VuZGlmCiNlbmRpZgp9CgoKdm9pZCBtZW1vcnlfUHJpbnRMZWFrcyh2b2lkKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVCAgOiBOb25lLgogIFJFVFVSTlM6IE5vbmUuCiAgU1VNTUFSWTogUHJpbnRzIGFkZHJlc3NlcyBvZiBhbGwgYWxsb2NhdGVkIGJsb2Nrcy4gU2hvdWxkIGJlCiAgICAgICAgICAgdXNlZCBhdCB0aGUgZW5kIG9mIGEgcHJvZ3JhbSBiZWZvcmUgdGhlIGNhbGwgdG8KCSAgIG1lbW9yeV9GcmVlQWxsTWVtLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKI2lmbmRlZiBOT19NRU1PUllfTUFOQUdFTUVOVAogIFBPSU5URVIgICAgICAgICAgIEFjdFBhZ2U7ICAgICAgIC8qIGN1cnJlbnQgcGFnZSAgICAgICAgICAgICAgICAgICAgICovCiAgUE9JTlRFUiAgICAgICAgICAgQWN0TmV4dDsgICAgICAgLyogbmV4dCBmcmVzaCBibG9jayBvbiBjdXJyZW50IHBhZ2UgKi8KICBQT0lOVEVSICAgICAgICAgICBBY3RFbmRPZlBhZ2U7ICAvKiBlbmQgb2YgY3VycmVudCBwYWdlICAgICAgICAgICAgICAqLwogIE1FTU9SWV9SRVNPVVJDRSAgKlJlc291cmNlOyAgICAgIC8qIGN1cnJlbnQgcmVzb3VyY2UgICAgICAgICAgICAgICAgICovCiAgdW5zaWduZWQgaW50ICAgICAgU2l6ZTsgICAgICAgICAgLyogY3VycmVudCBzaXplICAgICAgICAgICAgICAgICAgICAgKi8KICB1bnNpZ25lZCBpbnQgICAgICBCbG9ja1NpemU7ICAgICAvKiB0b3RhbCBibG9jayBzaXplICAgICAgICAgICAgICAgICAqLwoKICAvKiBDaGVjayBpZiBzb21lIG1lbW9yeSBpcyBzdGlsbCBhbGxvY2F0ZWQgKi8gCiAgaWYgKG1lbW9yeV9Vc2VkQnl0ZXMoKSAhPSAwTCkgeyAKCiAgICAvKiBJZiB0aGF0tHMgdHJ1ZSwgcHJpbnQgYWxsIGFsbG9jYXRlZCBibG9ja3MgICovCgogICAgLyogU3RhcnQgd2l0aCBibG9ja3MgYWRtaW5pc3RlcmVkIGJ5IG91ciBtZW1vcnkgbWFuYWdlbWVudCAqLwogICAgZm9yIChTaXplID0gMTsgU2l6ZSA8IG1lbW9yeV9fRFlOTUFYU0laRTsgU2l6ZSsrKSB7CiAgICAgIC8qIEluaXRpYWxpemUgdmFyaWFibGVzIGZvciBjdXJyZW50IGJsb2NrIHNpemUgKi8KICAgICAgUmVzb3VyY2UgICAgID0gbWVtb3J5X0FSUkFZW1NpemVdOwogICAgICBBY3RQYWdlICAgICAgPSBSZXNvdXJjZS0+cGFnZTsKICAgICAgQWN0TmV4dCAgICAgID0gUmVzb3VyY2UtPm5leHQ7CiAgICAgIEFjdEVuZE9mUGFnZSA9IFJlc291cmNlLT5lbmRfb2ZfcGFnZTsKICAgICAgQmxvY2tTaXplICAgID0gUmVzb3VyY2UtPnRvdGFsX3NpemU7CgogICAgICAvKiBDaGVjayBpZiB0aGVyZSB3ZXJlIGFueSByZXF1ZXN0cyBmb3IgCgkgbWVtb3J5IGJsb2NrcyBvZiB0aGF0IHNpemUgKi8KICAgICAgaWYgKCooKGludCAqKUFjdFBhZ2UpICE9IEVPRikgewogICAgICAKCS8qIGlmIHRoYXS0cyB0cnVlLCBicm93c2UgdGhyb3VnaCBhbGwgYmxvY2tzIG9uIGFsbCBwYWdlcwoJICAgdG8gZmluZCBhIGJsb2NrIHRoYXQgaXMgc3RpbGwgYWxsb2NhdGVkCgkqLwojaWZkZWYgQ0hFQ0sKCQoJUE9JTlRFUiBBY3REYXRhOwoJQk9PTCAgICBMZWFrRm91bmQ7CgkKCUxlYWtGb3VuZCA9IEZBTFNFOwoJCgl3aGlsZSAoKigoaW50ICopQWN0UGFnZSkgIT0gRU9GKSB7CgkgIAoJICAvKiBzZWFyY2ggdGhyb3VnaCBhbGwgcGFnZXMgZm9yIGEgYmxvY2sgdGhhdCBpcyBzdGlsbCBhbGxvY2F0ZWQgKi8KCSAgCgkgIEFjdERhdGEgICAgICA9IChjaGFyICopQWN0UGFnZSArIHNpemVvZihQT0lOVEVSKSArIG1lbW9yeV9PRkZTRVQ7CgkgIEFjdEVuZE9mUGFnZSA9IChjaGFyICopQWN0UGFnZSArIFJlc291cmNlLT5vZmZzZXQ7CgkgIAoJICB3aGlsZSAoQWN0RGF0YSAhPSBBY3ROZXh0ICYmIEFjdERhdGEgIT0gQWN0RW5kT2ZQYWdlKSB7CgkgICAgaWYgKG1lbW9yeV9HZXRCbG9ja1N0YXR1cyhBY3REYXRhKSA9PSBtZW1vcnlfTUFHSUNNQUxMT0MpIHsKCSAgICAgIExlYWtGb3VuZCA9IFRSVUU7CgkgICAgICBicmVhazsKCSAgICB9CgkgICAgQWN0RGF0YSA9IChjaGFyICopQWN0RGF0YSArIEJsb2NrU2l6ZTsKCSAgfQoJICAKCSAgaWYgKExlYWtGb3VuZCkgewoJICAgIAoJICAgIC8qIGlmIHdlIGhhdmUgZm91bmQgb25lLCB0aGFuIGNhbGwgbWVtb3J5X1ByaW50QWxsb2NhdGVkQmxvY2tzCgkgICAgICAgdG8gcHJpbnQgaXRzIGFkZHJlc3MgKi8KCSAgICAKCSAgICBwcmludGYoIlxuXG4gIExlYWtlZCBibG9ja3Mgb2Ygc2l6ZSAlZDoiLCBTaXplKTsKCSAgICAKCSAgICBtZW1vcnlfUHJpbnRBbGxvY2F0ZWRCbG9ja3MoU2l6ZSk7CgkgICAgcHV0Y2hhcignXG4nKTsKCSAgICAvKiBzaW5jZSBtZW1vcnlfUHJpbnRBbGxvY2F0ZWRibG9ja3MgcHJpbnRzIAoJICAgICAqYWxsKiBhbGxvY2F0ZWQgYmxvY2tzIG9mIHNwZWNpZmljIHNpemUsIHdlIGNhbgoJICAgICBicmVhayBvdXQgb2YgdGhlIHdoaWxlIGxvb3AKCSAgICAqLwoJICAgIGJyZWFrOwoJICB9CgkgIGVsc2UgewoJICAgIC8qIGdvIHRvIG5leHQgcGFnZSAqLwoJICAgIEFjdFBhZ2UgPSAqKChQT0lOVEVSICopQWN0UGFnZSk7CgkgIH0KCX0KCiNlbmRpZgoKICAgICAgfSAgICAgIAogICAgfQoKI2lmZGVmIENIRUNLCiAgICAvKiBQcmludCBhbGxvY2F0ZWQgYmxvY2tzIG9mIHNpemUgPj0gbWVtb3J5X19EWU5NQVhTSVpFICovCiAgICBpZiAobWVtb3J5X0JJR0JMT0NLUyAhPSBOVUxMKSB7CiAgICAgIHByaW50ZigiXG5cbiAgTGVha2VkIGJsb2NrcyBvZiBzaXplID49ICVkXG4iLCAKCSAgICAgbWVtb3J5X19EWU5NQVhTSVpFKTsKICAgICAgbWVtb3J5X1ByaW50QWxsb2NhdGVkQmlnQmxvY2tzKCk7CiAgICAgIHB1dGNoYXIoJ1xuJyk7CiAgICB9CiNlbmRpZgoKICB9CiNlbmRpZgp9Cg==