LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgICAgICAgICAgICAgVE9QIE1PRFVMRSBPRiBTUEFTUyAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICRNb2R1bGU6ICAgVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8gCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxICAgICAgKiAqLwovKiAqICBNUEkgZnVlciBJbmZvcm1hdGlrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICAgKiAqLwovKiAqICBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VICAgICAgICAqICovCi8qICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlICAgICAgICogKi8KLyogKiAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgKiAqLwovKiAqICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCAgKiAqLwovKiAqICBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuICAgICAqICovCi8qICogIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTICAgICogKi8KLyogKiAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgKiAqLwovKiAqICBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgICAgKiAqLwovKiAqICBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAqICovCi8qICogIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSAgICAgICogKi8KLyogKiAgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogJFJldmlzaW9uJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogJFN0YXRlJCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAkRGF0ZSQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogJEF1dGhvciQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgICAgICAgICAgICBDb250YWN0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgIENocmlzdG9waCBXZWlkZW5iYWNoICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgTVBJIGZ1ZXIgSW5mb3JtYXRpayAgICAgICAgICAgICAgICAgICAgICAgICogKi8KLyogKiAgICAgICAgICAgICBTdHVobHNhdHplbmhhdXN3ZWcgODUgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgIDY2MTIzIFNhYXJicnVlY2tlbiAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICogICAgICAgICAgICAgRW1haWw6IHdlaWRlbmJAbXBpLXNiLm1wZy5kZSAgICAgICAgICAgICAgICogKi8KLyogKiAgICAgICAgICAgICBHZXJtYW55ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAqLwovKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICovCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCi8qICRSQ1NmaWxlJCAqLwoKLyoqKiBNQUlOIExPT1AgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgImRmZy5oIgojaW5jbHVkZSAiZGVmcy5oIgojaW5jbHVkZSAiaWEuaCIKI2luY2x1ZGUgInJ1bGVzLWluZi5oIgojaW5jbHVkZSAicnVsZXMtc29ydC5oIgojaW5jbHVkZSAicnVsZXMtc3BsaXQuaCIKI2luY2x1ZGUgInRlcm1pbmF0b3IuaCIKI2luY2x1ZGUgInJ1bGVzLXJlZC5oIgojaW5jbHVkZSAiYW5hbHl6ZS5oIgojaW5jbHVkZSAiY2xvY2suaCIKI2luY2x1ZGUgInN0cmluZ3N4LmgiCiNpbmNsdWRlICJvcHRpb25zLmgiCiNpbmNsdWRlICJjb250ZXh0LmgiCiNpbmNsdWRlICJjbmYuaCIKI2luY2x1ZGUgInNlYXJjaC5oIgojaW5jbHVkZSAiaGFzaGFycmF5LmgiCiNpbmNsdWRlICJjbG9zdXJlLmgiCiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiBUeXBlcyBhbmQgVmFyaWFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBjb25zdCBjaGFyICp0b3BfSW5wdXRGaWxlOwoKc3RhdGljIE9QVElEIHRvcF9SZW1vdmVGaWxlT3B0SWQ7Cgp0eXBlZGVmIGVudW0ge3RvcF9QUk9PRiwgdG9wX0NPTVBMRVRJT04sIHRvcF9SRVNPVVJDRX0gdG9wX1NFQVJDSFJFU1VMVDsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIENhdGNoIFNpZ25hbHMgU2VjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmIChkZWZpbmVkKFNQQVNTX1NJR05BTFMpKQojaW5jbHVkZSA8c2lnbmFsLmg+CgpzdGF0aWMgUFJPT0ZTRUFSQ0ggKnRvcF9QUk9PRlNFQVJDSDsKCnN0YXRpYyB2b2lkIHRvcF9TaWdIYW5kbGVyKGludCBTaWduYWwpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUOiAgIAogIFJFVFVSTlM6IAogIEVGRkVDVDogIAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICBpZiAoU2lnbmFsID09IFNJR1NFR1YgfHwgU2lnbmFsID09IFNJR0JVUykgewogICAgcHV0cygiXG5cblx0U1BBU1MgaXMgZ29pbmcgdG8gY3Jhc2guIFRoaXMgaXMgcHJvYmFibHkgY2F1c2VkIGJ5IGEiKTsKICAgIHB1dHMoIlx0YnVnIGluIFNQQVNTLiAgUGxlYXNlIHNlbmQgYSBjb3B5IG9mIHRoZSBpbnB1dCBmaWxlKHMpIHRvZ2V0aGVyIik7CiAgICBwdXRzKCJcdHdpdGggdGhlIHVzZWQgb3B0aW9ucyB0byB3ZWlkZW5iQG1waS1zYi5tcGcuZGUsIGFuZCBzb21lb25lIHdpbGwiKTsKICAgIHB1dHMoIlx0dHJ5IHRvIGZpeCB0aGUgcHJvYmxlbS5cbiIpOwogICAgYWJvcnQoKTsKICB9CgogIGlmIChTaWduYWwgPT0gU0lHSU5UIHx8IFNpZ25hbCA9PSBTSUdURVJNKSB7CiAgICBjbG9ja19TdG9wUGFzc2VkVGltZShjbG9ja19PVkVSQUxMKTsKICAgIHByaW50ZigiXG5TUEFTUyAlcyAiLCBtaXNjX1ZFUlNJT04pOwogICAgcHV0cygiXG5TUEFTUyBiZWlzZWl0ZTogUmFuIG91dCBvZiB0aW1lLiBTUEFTUyB3YXMga2lsbGVkLiIpOwogICAgcHJpbnRmKCJQcm9ibGVtOiAlcyAiLCAKCSAgICh0b3BfSW5wdXRGaWxlICE9IChjaGFyKilOVUxMID8gdG9wX0lucHV0RmlsZSA6ICJSZWFkIGZyb20gc3RkaW4uIikpOwogICAgcHJpbnRmKCJcblNQQVNTIGRlcml2ZWQgJWQgY2xhdXNlcywgYmFja3RyYWNrZWQgJWQgY2xhdXNlcyAiCgkgICAiYW5kIGtlcHQgJWQgY2xhdXNlcy4iLAoJICAgKCp0b3BfUFJPT0ZTRUFSQ0ggPT0gKFBST09GU0VBUkNIKU5VTEwgPyAwIDogcHJmc19EZXJpdmVkQ2xhdXNlcygqdG9wX1BST09GU0VBUkNIKSksCgkgICAoKnRvcF9QUk9PRlNFQVJDSCA9PSAoUFJPT0ZTRUFSQ0gpTlVMTCA/IDAgOiBwcmZzX0JhY2t0cmFja2VkQ2xhdXNlcygqdG9wX1BST09GU0VBUkNIKSksCgkgICAoKnRvcF9QUk9PRlNFQVJDSCA9PSAoUFJPT0ZTRUFSQ0gpTlVMTCA/IDAgOiBwcmZzX0tlcHRDbGF1c2VzKCp0b3BfUFJPT0ZTRUFSQ0gpKSk7CiAgICBwcmludGYoIlxuU1BBU1MgYWxsb2NhdGVkICVsdSBLQnl0ZXMuIiwgbWVtb3J5X0RlbWFuZGVkQnl0ZXMoKS8xMDI0KTsKICAgIGZwdXRzKCJcblNQQVNTIHNwZW50XHQiLCBzdGRvdXQpOwogICAgY2xvY2tfUHJpbnRUaW1lKGNsb2NrX09WRVJBTEwpOwogICAgZnB1dHMoIiBvbiB0aGUgcHJvYmxlbS5cblx0XHQiLCBzdGRvdXQpOwogICAgY2xvY2tfUHJpbnRUaW1lKGNsb2NrX0lOUFVUKTsKICAgIGZwdXRzKCIgZm9yIHRoZSBpbnB1dC5cblx0XHQiLCBzdGRvdXQpOwogICAgY2xvY2tfUHJpbnRUaW1lKGNsb2NrX0NORik7CiAgICBmcHV0cygiIGZvciB0aGUgRkxPVFRFUiBDTkYgdHJhbnNsYXRpb24uXG5cdFx0Iiwgc3Rkb3V0KTsKICAgIGNsb2NrX1ByaW50VGltZShjbG9ja19JTkZFUkVOQ0UpOwogICAgZnB1dHMoIiBmb3IgaW5mZXJlbmNlcy5cblx0XHQiLCBzdGRvdXQpOwogICAgY2xvY2tfUHJpbnRUaW1lKGNsb2NrX0JBQ0tUUkFDSyk7CiAgICBmcHV0cygiIGZvciB0aGUgYmFja3RyYWNraW5nLlxuXHRcdCIsIHN0ZG91dCk7CiAgICBjbG9ja19QcmludFRpbWUoY2xvY2tfUkVEVUNUSU9OKTsKICAgIHB1dHMoIiBmb3IgdGhlIHJlZHVjdGlvbi4iKTsKICB9CgogIGlmIChvcHRzX0lzU2V0KHRvcF9SZW1vdmVGaWxlT3B0SWQpKQogICAgcmVtb3ZlKHRvcF9JbnB1dEZpbGUpOwoKICBleGl0KEVYSVRfRkFJTFVSRSk7Cn0KCiNlbmRpZgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogQ2xhdXNlIFNlbGVjdGlvbiBGdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgQ0xBVVNFIHRvcF9TZWxlY3RDbGF1c2VEZXB0aChMSVNUIExpc3QsIEZMQUdTVE9SRSBGbGFncykKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQ6ICAgQSBsaXN0IG9mIGNsYXVzZXMgYW5kIGEgZmxhZyBzdG9yZS4KICBSRVRVUk5TOiBBIGNsYXVzZSBzZWxlY3RlZCBmcm9tIHRoZSBsaXN0LgogIEVGRkVDVDogIFRoaXMgZnVuY3Rpb24gc2VsZWN0cyBhIGNsYXVzZSBmcm9tIHRoZSBsaXN0IGFjY29yZGluZwogICAgICAgICAgIHRvIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWE6CgkgICAxLiBtaW5pbWFsIGRlcHRoCiAgICAgICAgICAgMi4gbWluaW1hbCB3ZWlnaHQKCSAgIDNhLiBtYXhpbWFsIG51bWJlciBvZiB2YXJpYWJsZSBvY2N1cnJlbmNlcywgaWYgdGhlIGZsYWcKCSAgICAgICAnUHJlZlZhcicgaXMgVFJVRQoJICAgM2IuIG1pbmltYWwgbnVtYmVyIG9mIHZhcmlhYmxlIG9jY3VycmVuY2VzLCBpZiAnUHJlZlZhcicKCSAgICAgICBpcyBGQUxTRQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICBDTEFVU0UgUmVzdWx0OwogIE5BVCAgICBWYXJzLE5ld1ZhcnMsV2VpZ2h0LERlcHRoLE5ld0RlcHRoOwoKICBSZXN1bHQgPSAoQ0xBVVNFKWxpc3RfQ2FyKExpc3QpOwogIERlcHRoICA9IGNsYXVzZV9EZXB0aChSZXN1bHQpOwogIFdlaWdodCA9IGNsYXVzZV9XZWlnaHQoUmVzdWx0KTsKICBWYXJzICAgPSBjbGF1c2VfTnVtYmVyT2ZWYXJPY2NzKFJlc3VsdCk7CiAgTGlzdCAgID0gbGlzdF9DZHIoTGlzdCk7CgogIHdoaWxlICghbGlzdF9FbXB0eShMaXN0KSkgewogICAgTmV3RGVwdGggPSAgY2xhdXNlX0RlcHRoKGxpc3RfQ2FyKExpc3QpKTsKICAgIGlmIChOZXdEZXB0aCA8PSBEZXB0aCkgewogICAgICBpZiAoTmV3RGVwdGggPCBEZXB0aCB8fCBjbGF1c2VfV2VpZ2h0KGxpc3RfQ2FyKExpc3QpKSA8IFdlaWdodCkgewoJRGVwdGggID0gTmV3RGVwdGg7CglSZXN1bHQgPSAoQ0xBVVNFKWxpc3RfQ2FyKExpc3QpOwoJV2VpZ2h0ID0gY2xhdXNlX1dlaWdodChSZXN1bHQpOwoJVmFycyAgID0gY2xhdXNlX051bWJlck9mVmFyT2NjcyhsaXN0X0NhcihMaXN0KSk7CiAgICAgIH0KICAgICAgZWxzZQoJaWYgKGNsYXVzZV9XZWlnaHQobGlzdF9DYXIoTGlzdCkpID09IFdlaWdodCkgewoJICBOZXdWYXJzID0gY2xhdXNlX051bWJlck9mVmFyT2NjcyhsaXN0X0NhcihMaXN0KSk7CgkgIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19QUkVGVkFSKSkgewoJICAgIGlmIChWYXJzIDwgTmV3VmFycykgewoJICAgICAgRGVwdGggID0gTmV3RGVwdGg7CgkgICAgICBSZXN1bHQgPSAoQ0xBVVNFKWxpc3RfQ2FyKExpc3QpOwoJICAgICAgV2VpZ2h0ID0gY2xhdXNlX1dlaWdodChSZXN1bHQpOwoJICAgICAgVmFycyAgID0gTmV3VmFyczsKCSAgICB9CgkgIH0KCSAgZWxzZQoJICAgIGlmIChWYXJzID4gTmV3VmFycykgewoJICAgICAgRGVwdGggID0gTmV3RGVwdGg7CgkgICAgICBSZXN1bHQgPSAoQ0xBVVNFKWxpc3RfQ2FyKExpc3QpOwoJICAgICAgV2VpZ2h0ID0gY2xhdXNlX1dlaWdodChSZXN1bHQpOwoJICAgICAgVmFycyAgID0gTmV3VmFyczsKCSAgICB9Cgl9CiAgICB9CiAgICBMaXN0ID0gbGlzdF9DZHIoTGlzdCk7CiAgfQoKICByZXR1cm4gUmVzdWx0Owp9CgoKc3RhdGljIENMQVVTRSB0b3BfU2VsZWN0TWluaW1hbFdlaWdodENsYXVzZShMSVNUIExpc3QsIEZMQUdTVE9SRSBGbGFncykKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQ6ICAgQSBsaXN0IG9mIGNsYXVzZXMgYW5kIGEgZmxhZyBzdG9yZS4KICBSRVRVUk5TOiBBIGNsYXVzZSBzZWxlY3RlZCBmcm9tIHRoZSBsaXN0LgogIEVGRkVDVDogIFRoaXMgZnVuY3Rpb24gc2VsZWN0cyBhIGNsYXVzZSB3aXRoIG1pbmltYWwgd2VpZ2h0LgogICAgICAgICAgIElmIG1vcmUgdGhhbiBvbmUgY2xhdXNlIGhhcyBtaW5pbWFsIHdlaWdodCBhbmQgdGhlIGZsYWcKCSAgICdQcmVmVmFyJyBpcyBUUlVFLCBhIGNsYXVzZSB3aXRoIG1heGltYWwgbnVtYmVyIG9mIHZhcmlhYmxlCgkgICBvY2N1cnJlbmNlcyBpcyBzZWxlY3RlZC4gSWYgJ1ByZWZWYXInIGlzIEZBTFNFLCBhIGNsYXVzZSB3aXRoCgkgICBtaW5pbWFsIG51bWJlciBvZiB2YXJpYWJsZSBvY2N1cnJlbmNlcyBpcyBzZWxlY3RlZC4KCSAgIElmIHR3byBjbGF1c2VzIGFyZSBlcXVhbCB3aXRoIHJlc3BlY3QgdG8gdGhlIHR3byBjcml0ZXJpYQoJICAgdGhlIGNsYXVzZSB3aXRoIHRoZSBzbWFsbGVyIGxpc3QgcG9zaXRpb24gaXMgc2VsZWN0ZWQuCiAgQ0FVVElPTjogVEhFIExJU1QgSEFTIFRPIEJZIFNPUlRFRCBCWSBXRUlHSFQgSU4gQVNDRU5ESU5HIE9SREVSIQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICBDTEFVU0UgUmVzdWx0OwogIE5BVCAgICBWYXJzLCBOZXdWYXJzLCBXZWlnaHQ7CgojaWZkZWYgQ0hFQ0sKICAvKiBDaGVjayBpbnZhcmlhbnQ6IExpc3QgaGFzIHRvIGJlIHNvcnRlZCBieSB3ZWlnaHQgKGFzY2VuZGluZykgKi8KICBMSVNUIFNjYW47CiAgV2VpZ2h0ID0gY2xhdXNlX1dlaWdodChsaXN0X0NhcihMaXN0KSk7CiAgZm9yIChTY2FuID0gbGlzdF9DZHIoTGlzdCk7ICFsaXN0X0VtcHR5KFNjYW4pOyBTY2FuID0gbGlzdF9DZHIoU2NhbikpIHsKICAgIE5BVCBOZXdXZWlnaHQ7CiAgICBOZXdXZWlnaHQgPSBjbGF1c2VfV2VpZ2h0KGxpc3RfQ2FyKFNjYW4pKTsKICAgIGlmIChOZXdXZWlnaHQgPCBXZWlnaHQpIHsKICAgICAgbWlzY19TdGFydEVycm9yUmVwb3J0KCk7CiAgICAgIG1pc2NfRXJyb3JSZXBvcnQoIlxuIEluIHRvcF9TZWxlY3RNaW5pbWFsQ29uV2VpZ2h0Q2xhdXNlOiBjbGF1c2UgbGlzdCAiKTsKICAgICAgbWlzY19FcnJvclJlcG9ydCgiaXNuJ3Qgc29ydGVkIGJ5IHdlaWdodCIpOwogICAgICBtaXNjX0ZpbmlzaEVycm9yUmVwb3J0KCk7CiAgICB9CiAgICBXZWlnaHQgPSBOZXdXZWlnaHQ7CiAgfQojZW5kaWYKCiAgUmVzdWx0ID0gKENMQVVTRSlsaXN0X0NhcihMaXN0KTsKICBXZWlnaHQgPSBjbGF1c2VfV2VpZ2h0KFJlc3VsdCk7CiAgVmFycyAgID0gY2xhdXNlX051bWJlck9mVmFyT2NjcyhSZXN1bHQpOwogIExpc3QgICA9IGxpc3RfQ2RyKExpc3QpOwoKICB3aGlsZSAoIWxpc3RfRW1wdHkoTGlzdCkpIHsKICAgIGlmIChjbGF1c2VfV2VpZ2h0KGxpc3RfQ2FyKExpc3QpKSA9PSBXZWlnaHQpIHsKICAgICAgTmV3VmFycyA9IGNsYXVzZV9OdW1iZXJPZlZhck9jY3MobGlzdF9DYXIoTGlzdCkpOwogICAgICBpZiAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfUFJFRlZBUikpIHsKCWlmIChWYXJzIDwgTmV3VmFycykgewoJICBSZXN1bHQgPSAoQ0xBVVNFKWxpc3RfQ2FyKExpc3QpOwoJICBXZWlnaHQgPSBjbGF1c2VfV2VpZ2h0KFJlc3VsdCk7CgkgIFZhcnMgICA9IE5ld1ZhcnM7Cgl9CiAgICAgIH0KICAgICAgZWxzZQoJaWYgKFZhcnMgPiBOZXdWYXJzKSB7CgkgIFJlc3VsdCA9IChDTEFVU0UpbGlzdF9DYXIoTGlzdCk7CgkgIFdlaWdodCA9IGNsYXVzZV9XZWlnaHQoUmVzdWx0KTsKCSAgVmFycyAgID0gTmV3VmFyczsKCX0KICAgIH0KICAgIGVsc2UKICAgICAgcmV0dXJuIFJlc3VsdDsKICAgIExpc3QgPSBsaXN0X0NkcihMaXN0KTsKICB9CiAgcmV0dXJuIFJlc3VsdDsKfQoKCnN0YXRpYyBDTEFVU0UgdG9wX1NlbGVjdE1pbmltYWxDb25XZWlnaHRDbGF1c2UoTElTVCBMaXN0LCBGTEFHU1RPUkUgRmxhZ3MpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUOiAgIEEgbm9uLWVtcHR5IGxpc3Qgb2YgY2xhdXNlcyBhbmQgYSBmbGFnIHN0b3JlLgogIFJFVFVSTlM6IEEgY2xhdXNlIHNlbGVjdGVkIGZyb20gdGhlIGxpc3QuCiAgRUZGRUNUOiAgVGhpcyBmdW5jdGlvbiBzZWxlY3RzIGEgY2xhdXNlIGZyb20gdGhlIGxpc3QgaW4gYQogICAgICAgICAgIHNpbWlsYXIgd2F5IGFzIHRoZSBmdW5jdGlvbiB0b3BfU2VsZWN0TWluaW1hbFdlaWdodENsYXVzZS4KCSAgIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhhdCBjb25qZWN0dXJlIGNsYXVzZXMgYXJlCgkgICBwcmVmZXJyZWQgb3ZlciBheGlvbSBjbGF1c2VzLCBiZWNhdXNlIHRoZWlyIHdlaWdodAoJICAgaXMgZGl2aWRlZCBieSBhIGZhY3RvciBnaXZlbiBieSB0aGUgZmxhZyAnUHJlZkNvbicuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIENMQVVTRSBSZXN1bHQ7CiAgTkFUICAgIE5ld1dlaWdodCxXZWlnaHQsIE5ld1ZhcnMsIFZhcnMsIEZhY3RvcjsKCiAgUmVzdWx0ID0gKENMQVVTRSlsaXN0X0NhcihMaXN0KTsKICBGYWN0b3IgPSBmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19QUkVGQ09OKTsKICBXZWlnaHQgPSBjbGF1c2VfV2VpZ2h0KFJlc3VsdCk7CiAgaWYgKGNsYXVzZV9HZXRGbGFnKFJlc3VsdCwgQ09OQ0xBVVNFKSkKICAgIFdlaWdodCA9IFdlaWdodCAvIEZhY3RvcjsKICBWYXJzICAgPSBjbGF1c2VfTnVtYmVyT2ZWYXJPY2NzKGxpc3RfQ2FyKExpc3QpKTsKICBMaXN0ICAgPSBsaXN0X0NkcihMaXN0KTsKCiAgd2hpbGUgKCFsaXN0X0VtcHR5KExpc3QpKSB7CiAgICBOZXdXZWlnaHQgPSBjbGF1c2VfV2VpZ2h0KGxpc3RfQ2FyKExpc3QpKTsKICAgIGlmIChjbGF1c2VfR2V0RmxhZyhsaXN0X0NhcihMaXN0KSxDT05DTEFVU0UpKQogICAgICBOZXdXZWlnaHQgPSBOZXdXZWlnaHQgLyBGYWN0b3I7CiAgICBpZiAoTmV3V2VpZ2h0IDwgV2VpZ2h0KSB7CiAgICAgIFdlaWdodCA9IE5ld1dlaWdodDsKICAgICAgUmVzdWx0ID0gbGlzdF9DYXIoTGlzdCk7CiAgICAgIFZhcnMgICA9IGNsYXVzZV9OdW1iZXJPZlZhck9jY3MobGlzdF9DYXIoTGlzdCkpOwogICAgfQogICAgZWxzZSB7CiAgICAgIGlmIChOZXdXZWlnaHQgPT0gV2VpZ2h0KSB7CglOZXdWYXJzID0gY2xhdXNlX051bWJlck9mVmFyT2NjcyhsaXN0X0NhcihMaXN0KSk7CglpZiAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfUFJFRlZBUikpIHsKCSAgaWYgKFZhcnMgPCBOZXdWYXJzKSB7CgkgICAgUmVzdWx0ID0gKENMQVVTRSlsaXN0X0NhcihMaXN0KTsKCSAgICBXZWlnaHQgPSBOZXdXZWlnaHQ7CgkgICAgVmFycyAgID0gTmV3VmFyczsKCSAgfQoJfQoJZWxzZQoJICBpZiAoVmFycyA+IE5ld1ZhcnMpIHsKCSAgICBSZXN1bHQgPSAoQ0xBVVNFKWxpc3RfQ2FyKExpc3QpOwoJICAgIFdlaWdodCA9IE5ld1dlaWdodDsKCSAgICBWYXJzICAgPSBOZXdWYXJzOwoJICB9CiAgICAgIH0KICAgIH0KCiAgICBMaXN0ID0gbGlzdF9DZHIoTGlzdCk7CiAgfQogIHJldHVybiBSZXN1bHQ7Cn0KCgovKnN0YXRpYyBDTEFVU0UgdG9wX1NlbGVjdENsYXVzZURlcHRoKExJU1QgTGlzdCkqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVDogICBBIGxpc3Qgb2YgY2xhdXNlcy4KICBSRVRVUk5TOiBBIGNsYXVzZSBzZWxlY3RlZCBmcm9tIHRoZSBsaXN0LgogIEVGRkVDVDogIAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qewogIENMQVVTRSBSZXN1bHQ7CiAgaW50ICAgIE1pbiwgRGVwdGg7CgogIFJlc3VsdCA9IChDTEFVU0UpbGlzdF9DYXIoTGlzdCk7CiAgRGVwdGggID0gY2xhdXNlX0RlcHRoKFJlc3VsdCk7CiAgTWluICAgID0gRGVwdGggKiBjbGF1c2VfV2VpZ2h0KFJlc3VsdCk7CiAgTGlzdCAgID0gbGlzdF9DZHIoTGlzdCk7CgogIGlmIChEZXB0aCA9PSAwKQogICAgcmV0dXJuIFJlc3VsdDsKCiAgd2hpbGUgKCFsaXN0X0VtcHR5KExpc3QpKSB7CiAgICBEZXB0aCA9ICBjbGF1c2VfRGVwdGgobGlzdF9DYXIoTGlzdCkpOwogICAgaWYgKE1pbiA+IERlcHRoICogY2xhdXNlX1dlaWdodChsaXN0X0NhcihMaXN0KSkpIHsKICAgICAgUmVzdWx0ID0gbGlzdF9DYXIoTGlzdCk7CiAgICAgIGlmIChEZXB0aCA9PSAwKQoJcmV0dXJuIFJlc3VsdDsKICAgICAgTWluICAgID0gY2xhdXNlX0RlcHRoKFJlc3VsdCkgKiBjbGF1c2VfV2VpZ2h0KFJlc3VsdCk7CiAgICB9CiAgICBMaXN0ID0gbGlzdF9DZHIoTGlzdCk7CiAgfQoKICByZXR1cm4gUmVzdWx0Owp9Ki8KCgpzdGF0aWMgTElTVCB0b3BfR2V0TGl0ZXJhbHNGb3JTcGxpdHRpbmcoQ0xBVVNFIENsYXVzZSkKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQ6ICAgQSBjbGF1c2UuCiAgUkVUVVJOUzogQSBsaXN0IG9mIHN1Y2NlZGVudCBsaXRlcmFsIGluZGljZXMgd2hlcmUgZXZlcnkgc2luZ2xlCiAgICAgICAgICAgbGl0ZXJhbCBkb2Vzbid0IHNoYXJlIGFueSB2YXJpYWJsZXMgd2l0aCBvdGhlciBsaXRlcmFscy4KCSAgIElmIHRoZSBjbGF1c2UgaXMgaG9ybiwgYW4gZW1wdHkgbGlzdCBpcyByZXR1cm5lZC4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgTElTVCogVmFyaWFibGVzOyAgLyogQW4gYXJyYXksIG1hcHBpbmcgbGl0ZXJhbCBpbmRleCB0byBsaXN0IG9mIHZhcmlhYmxlcyAqLwogIGludCAgIGksIGo7CiAgQk9PTCAgU3RvcDsKICBMSVNUICBGYWlsZWQsIFJlc3VsdDsKCiAgUmVzdWx0ID0gbGlzdF9OaWwoKTsKCiAgLyogU3BlY2lhbCBjYXNlOiBob3JuIGNsYXVzZSAqLwogIGlmIChjbGF1c2VfSXNIb3JuQ2xhdXNlKENsYXVzZSkpCiAgICByZXR1cm4gUmVzdWx0OwoKICAvKiBTcGVjaWFsIGNhc2U6IGNsYXVzZSBpcyBncm91bmQsIHNvIHJldHVybiBhbGwgc3VjY2VkZW50IGxpdGVyYWxzICovCiAgaWYgKGNsYXVzZV9Jc0dyb3VuZChDbGF1c2UpKSB7CiAgICBmb3IgKGkgPSBjbGF1c2VfTGFzdFN1Y2NlZGVudExpdEluZGV4KENsYXVzZSk7CgkgaSA+PSBjbGF1c2VfRmlyc3RTdWNjZWRlbnRMaXRJbmRleChDbGF1c2UpOyBpLS0pCiAgICAgIFJlc3VsdCA9IGxpc3RfQ29ucygoUE9JTlRFUilpLCBSZXN1bHQpOwogICAgcmV0dXJuIFJlc3VsdDsKICB9CgogIFZhcmlhYmxlcyA9IG1lbW9yeV9NYWxsb2Moc2l6ZW9mKExJU1QpICogY2xhdXNlX0xlbmd0aChDbGF1c2UpKTsKICAvKiBJbml0aWFsaXplIHRoZSBhcnJheSAqLwogIGZvciAoaSA9IGNsYXVzZV9GaXJzdExpdEluZGV4KCk7IGkgPD0gY2xhdXNlX0xhc3RMaXRJbmRleChDbGF1c2UpOyBpKyspCiAgICBWYXJpYWJsZXNbaV0gPSB0ZXJtX1ZhcmlhYmxlU3ltYm9scyhjbGF1c2VfR2V0TGl0ZXJhbEF0b20oQ2xhdXNlLCBpKSk7CgogIC8qIDxGYWlsZWQ+IGlzIHRoZSBzZXQgb2YgbGl0ZXJhbHMgdGhhdCBzaGFyZSB2YXJpYWJsZXMgd2l0aCBvdGhlciBsaXRlcmFscyAqLwogIEZhaWxlZCA9IGxpc3RfTmlsKCk7CiAgZm9yIChpID0gY2xhdXNlX0xhc3RTdWNjZWRlbnRMaXRJbmRleChDbGF1c2UpOwogICAgICAgaSA+PSBjbGF1c2VfRmlyc3RTdWNjZWRlbnRMaXRJbmRleChDbGF1c2UpOyBpLS0pIHsKICAgIGlmIChsaXN0X0VtcHR5KFZhcmlhYmxlc1tpXSkpCiAgICAgIFJlc3VsdCA9IGxpc3RfQ29ucygoUE9JTlRFUilpLCBSZXN1bHQpOwogICAgZWxzZSBpZiAoIWxpc3RfUG9pbnRlck1lbWJlcihGYWlsZWQsIChQT0lOVEVSKWkpKSB7CiAgICAgIC8qIFdlIGRvbid0IGtub3cgeWV0IHdoZXRoZXIgdGhlIGxpdGVyYWwgc2hhcmVzIHZhcmlhYmxlcyAqLwogICAgICBTdG9wID0gRkFMU0U7CiAgICAgIGZvciAoaiA9IGNsYXVzZV9GaXJzdExpdEluZGV4KCk7CgkgICBqIDw9IGNsYXVzZV9MYXN0TGl0SW5kZXgoQ2xhdXNlKSAmJiAhU3RvcDsgaisrKSB7CglpZiAoaSAhPSBqICYmIGxpc3RfSGFzSW50ZXJzZWN0aW9uKFZhcmlhYmxlc1tpXSwgVmFyaWFibGVzW2pdKSkgewoJICBTdG9wICAgPSBUUlVFOyAgLyogTGl0ZXJhbCBpc260dCBjYW5kaWRhdGUgZm9yICJvcHRpbWFsIiBzcGxpdHRpbmcgKi8KCSAgRmFpbGVkID0gbGlzdF9Db25zKChQT0lOVEVSKWksIEZhaWxlZCk7CgkgIEZhaWxlZCA9IGxpc3RfQ29ucygoUE9JTlRFUilqLCBGYWlsZWQpOwoJfQogICAgICB9CiAgICAgIGlmICghU3RvcCkKCVJlc3VsdCA9IGxpc3RfQ29ucygoUE9JTlRFUilpLCBSZXN1bHQpOwogICAgfQogIH0KICAKICAvKiBDbGVhbnVwICovCiAgZm9yIChpID0gY2xhdXNlX0ZpcnN0TGl0SW5kZXgoKTsgaSA8PSBjbGF1c2VfTGFzdExpdEluZGV4KENsYXVzZSk7IGkrKykKICAgIGxpc3RfRGVsZXRlKFZhcmlhYmxlc1tpXSk7CiAgbWVtb3J5X0ZyZWUoVmFyaWFibGVzLCBzaXplb2YoTElTVCkgKiBjbGF1c2VfTGVuZ3RoKENsYXVzZSkpOwogIGxpc3RfRGVsZXRlKEZhaWxlZCk7CiAgcmV0dXJuIFJlc3VsdDsKfQoKCnN0YXRpYyBpbnQgdG9wX0dldE9wdGltYWxTcGxpdExpdGVyYWxJbmRleChQUk9PRlNFQVJDSCBTZWFyY2gsIENMQVVTRSBDbGF1c2UsCgkJCQkJICAgQk9PTCBVc2FibGVzKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVDogICBBIHByb29mc2VhcmNoIG9iamVjdCwgYSBjbGF1c2UgYW5kIGEgYm9vbGVhbiBmbGFnLgogIFJFVFVSTlM6IFRoZSBpbmRleCBvZiB0aGUgcG9zaXRpdmUgbGl0ZXJhbCBmcm9tIDxDbGF1c2U+CiAgICAgICAgICAgd2l0aCB0aGUgZ3JlYXRlc3QgbnVtYmVyIG9mIGluc3RhbmNlcyAobWF5YmUgMCkgd2l0aGluCgkgICB0aGUgV29ya2VkT2ZmL1VzYWJsZSBzZXRzIG9mIHRoZSBwcm9vZiBzZWFyY2ggb2JqZWN0LgoJICAgVGhlIGxpdGVyYWwgbXVzdG4ndCBzaGFyZSBhbnkgdmFyaWFibGVzIHdpdGggb3RoZXIgbGl0ZXJhbHMuCgkgICBJZiB0aGUgY2xhdXNlIGRvZXNuJ3QgaGF2ZSBhIHN1aXRhYmxlIGxpdGVyYWwsIGEgbmVnYXRpdmUKCSAgIG51bWJlciBpcyByZXR1cm5lZC4KICBFRkZFQ1Q6ICBJZiA8VXNhYmxlcz4gaXMgRkFMU0UsIG9ubHkgdGhlIG51bWJlciBvZiBpbnN0YW5jZXMKCSAgIHdpdGhpbiB0aGUgV29ya2VkT2ZmIHNldCBpcyBjb25zaWRlcmVkLCBvdGhlcndpc2UKCSAgIHRoZSBudW1iZXIgb2YgaW5zdGFuY2VzIHdpdGhpbiBib3RoIGNsYXVzZSBzZXRzIGlzIGNvbnNpZGVyZWQuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIExJU1QgICAgU3BsaXRMaXRzOwogIExJVEVSQUwgTGl0ZXJhbDsKICBOQVQgICAgIENvdW50LCBNYXhJbnN0YW5jZXM7CiAgaW50ICAgICBSZXN1bHQ7CgogIE1heEluc3RhbmNlcyA9IC0xOwogIFNwbGl0TGl0cyAgICA9IHRvcF9HZXRMaXRlcmFsc0ZvclNwbGl0dGluZyhDbGF1c2UpOwogIFJlc3VsdCAgICAgICA9IC0xOwoKICBmb3IgKCA7ICFsaXN0X0VtcHR5KFNwbGl0TGl0cyk7IFNwbGl0TGl0cyA9IGxpc3RfUG9wKFNwbGl0TGl0cykpIHsKICAgIExpdGVyYWwgPSBjbGF1c2VfR2V0TGl0ZXJhbChDbGF1c2UsIChpbnQpbGlzdF9DYXIoU3BsaXRMaXRzKSk7CiAgICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIGluc3RhbmNlcyAqLwogICAgQ291bnQgPSBwcmZzX0dldE51bWJlck9mSW5zdGFuY2VzKFNlYXJjaCwgTGl0ZXJhbCwgVXNhYmxlcyk7CiAgICBpZiAoQ291bnQgPiBNYXhJbnN0YW5jZXMpIHsKICAgICAgUmVzdWx0ID0gKGludClsaXN0X0NhcihTcGxpdExpdHMpOwogICAgICBNYXhJbnN0YW5jZXMgPSBDb3VudDsKICAgIH0KICB9CiAgcmV0dXJuIFJlc3VsdDsKfQoKCi8qIEVLOiBoaWVyIGxhc3NlbiBvZGVyIG5hY2ggc2VhcmNoLmMgb2RlciBuYWNoIHJ1bGVzLXNwbGl0LmM/ICovCnN0YXRpYyBDTEFVU0UgdG9wX0dldFBvd2VyZnVsU3BsaXRDbGF1c2UoUFJPT0ZTRUFSQ0ggU2VhcmNoLCBCT09MIFVzYWJsZXMsCgkJCQkJIGludCogTGl0SW5kZXgpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUOiAgIEEgcHJvb2ZzZWFyY2ggb2JqZWN0LCBhIGJvb2xlYW4gZmxhZyBhbmQgYSBwb2ludGVyIHRvIGEgbGl0ZXJhbAogICAgICAgICAgIGluZGV4IHdoaWNoIGlzIHVzZWQgYXMgcmV0dXJuIHZhbHVlLgogIFJFVFVSTlM6IEEgY2xhdXNlIGZyb20gdGhlIHVzYWJsZSBzZXQgdGhhdCB3YXMgc2VsZWN0ZWQgYXMgZ2l2ZW4gY2xhdXNlLgogICAgICAgICAgIElmZiBubyBzdWl0YWJsZSBjbGF1c2Ugd2FzIGZvdW5kIE5VTEwgaXMgcmV0dXJuZWQgYW5kIDwqTGl0SW5kZXg+CgkgICBpcyBzZXQgdG8gLTEuCgkgICBJZmYgYSBzdWl0YWJsZSBjbGF1c2Ugd2FzIGZvdW5kLCB0aGlzIGNsYXVzZSBpcyByZXR1cm5lZCBhbmQKCSAgIDwqTGl0SW5kZXg+IGlzIHNldCB0byB0aGUgaW5kZXggb2YgdGhlICJvcHRpbWFsIiBsaXRlcmFsLgogIEVGRkVDVDogIFRoaXMgZnVuY3Rpb24gc2VsZWN0cyBhIGNsYXVzZSBmcm9tIHRoZSAidXNhYmxlIiBzZXQgYW5kCiAgICAgICAgICAgYSBsaXRlcmFsIHRoYXQgYXJlICJvcHRpbWFsIiBmb3IgdGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBzcGxpdHRpbmcKCSAgIHJ1bGUgd2l0aCByZXNwZWN0IHRvIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWE6CiAgICAgICAgICAgMSkgdGhlIGxpdGVyYWwgbXVzdCBvY2N1ciBpbiB0aGUgc3VjY2VkZW50IG9mIHRoZSBub24taG9ybiBjbGF1c2UsCgkgICAyKSB0aGUgbGl0ZXJhbCBtdXN0bid0IHNoYXJlIGFueSB2YXJpYWJsZXMgd2l0aCBvdGhlciBsaXRlcmFscywKICAgICAgICAgICAzKSB0aGUgY2xhdXNlIG11c3QgaGF2ZSBhIHNvbHZlZCBjb25zdHJhaW50LAoJICAgNCkgdGhlIGF0b20gbXVzdCBoYXZlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbnN0YW5jZXMKICAgICAgICAgICAgICBhKSB3aXRoaW4gdGhlIHNldCBvZiAid29ya2Vkb2ZmIiBjbGF1c2VzLCBpZmYgPFVzYWJsZXM+PUZBTFNFCiAgICAgICAgICAgICAgYikgd2l0aGluIHRoZSBzZXQgb2YgInVzYWJsZSIgYW5kICJ3b3JrZWRvZmYiIGNsYXVzZXMsCiAgICAgICAgICAgICAgICAgaWZmICJVc2FibGVzIj1UUlVFCgkgICA1KSB0aGUgYXRvbSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGluc3RhbmNlIGluIGFub3RoZXIgY2xhdXNlLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICBMSVNUICAgU2NhbiwgU3BsaXRMaXRzOwogIE5BVCAgICBNYXhOck9mSW5zdGFuY2VzLCBOck9mSW5zdGFuY2VzOwogIENMQVVTRSBDbGF1c2UsIE9wdGltYWxDbGF1c2U7CiAgVEVSTSAgIEF0b207CiAgU0hBUkVEX0lOREVYIFdPSW5kZXgsIFVzSW5kZXg7CgogIE9wdGltYWxDbGF1c2UgICAgPSBOVUxMOwogICpMaXRJbmRleCAgICAgICAgPSAtMTsKICBNYXhOck9mSW5zdGFuY2VzID0gMDsKICBXT0luZGV4ICAgICAgICAgID0gcHJmc19Xb3JrZWRPZmZTaGFyaW5nSW5kZXgoU2VhcmNoKTsKICBVc0luZGV4ICAgICAgICAgID0gcHJmc19Vc2FibGVTaGFyaW5nSW5kZXgoU2VhcmNoKTsKCiAgLyogUHJlcGFyZSB0aGUgdGVybSBzdGFtcCAqLwogIGlmICh0ZXJtX1N0YW1wT3ZlcmZsb3coc2hhcmluZ19TdGFtcElEKFdPSW5kZXgpKSkKICAgIHNoYXJpbmdfUmVzZXRBbGxUZXJtU3RhbXBzKFdPSW5kZXgpOwogIGlmIChVc2FibGVzICYmIHRlcm1fU3RhbXBPdmVyZmxvdyhzaGFyaW5nX1N0YW1wSUQoVXNJbmRleCkpKQogICAgc2hhcmluZ19SZXNldEFsbFRlcm1TdGFtcHMoVXNJbmRleCk7CiAgdGVybV9TdGFydFN0YW1wKCk7CgogIGZvciAoU2NhbiA9IHByZnNfVXNhYmxlQ2xhdXNlcyhTZWFyY2gpOyAhbGlzdF9FbXB0eShTY2FuKTsKICAgICAgIFNjYW4gPSBsaXN0X0NkcihTY2FuKSkgewogICAgQ2xhdXNlID0gbGlzdF9DYXIoU2Nhbik7CiAgICBpZiAoY2xhdXNlX0hhc1NvbHZlZENvbnN0cmFpbnQoQ2xhdXNlKSAmJiAhY2xhdXNlX0lzSG9ybkNsYXVzZShDbGF1c2UpKSB7CiAgICAgIC8qIEdldCBhIGxpc3Qgb2Ygc3BsaXR0YWJsZSBsaXRlcmFsIGluZGljZXMgKi8KICAgICAgU3BsaXRMaXRzID0gdG9wX0dldExpdGVyYWxzRm9yU3BsaXR0aW5nKENsYXVzZSk7CiAgICAgIGZvciAoIDsgIWxpc3RfRW1wdHkoU3BsaXRMaXRzKTsgU3BsaXRMaXRzID0gbGlzdF9Qb3AoU3BsaXRMaXRzKSkgewoJTElURVJBTCBMaXRlcmFsOwoKCUxpdGVyYWwgPSBjbGF1c2VfR2V0TGl0ZXJhbChDbGF1c2UsIChpbnQpbGlzdF9DYXIoU3BsaXRMaXRzKSk7CglBdG9tICAgID0gY2xhdXNlX0xpdGVyYWxBdG9tKExpdGVyYWwpOwogCWlmICghdGVybV9BbHJlYWR5VmlzaXRlZChBdG9tKSkgewoJICAvKiBEb24ndCB2aXNpdCBhdG9tIG1vcmUgdGhhbiBvbmNlICovCiAJICB0ZXJtX1NldFRlcm1TdGFtcChBdG9tKTsKCSAgLyogQ291bnQgdGhlIG51bWJlciBvZiBpbnN0YW5jZXMgKi8KCSAgTnJPZkluc3RhbmNlcyA9IHByZnNfR2V0TnVtYmVyT2ZJbnN0YW5jZXMoU2VhcmNoLCBMaXRlcmFsLCBVc2FibGVzKTsKCSAgaWYgKE5yT2ZJbnN0YW5jZXMgPiBNYXhOck9mSW5zdGFuY2VzIHx8IE9wdGltYWxDbGF1c2UgPT0gTlVMTCB8fAoJICAgICAgKE5yT2ZJbnN0YW5jZXMgPT0gTWF4TnJPZkluc3RhbmNlcyAmJgoJICAgICAgIC8qIFByZWZlciBzaG9ydGVyIGNsYXVzZXMgZm9yIHNwbGl0dGluZyEgKi8KCSAgICAgICBjbGF1c2VfTGVuZ3RoKENsYXVzZSkgPCBjbGF1c2VfTGVuZ3RoKE9wdGltYWxDbGF1c2UpKSkgewoJICAgIE9wdGltYWxDbGF1c2UgICAgPSBDbGF1c2U7CgkgICAgTWF4TnJPZkluc3RhbmNlcyA9IE5yT2ZJbnN0YW5jZXM7CgkgICAgKkxpdEluZGV4ICAgICAgICA9IChpbnQpbGlzdF9DYXIoU3BsaXRMaXRzKTsKCSAgfQogCX0KICAgICAgfQogICAgfQogIH0KICB0ZXJtX1N0b3BTdGFtcCgpOwoKICAvKiBUaGUgc3BsaXR0YWJsZSBsaXRlcmFsIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgaW5zdGFuY2UgdG8gYmUgdXNlZnVsICovCiAgLyogcmVkdWNpbmcgb3RoZXIgY2xhdXNlcy4gSWYgPFVzYWJsZXM+IGlzIFRSVUUsIHRoZSBsaXRlcmFsIG11c3QgZXZlbiAqLwogIC8qIGhhdmUgdHdvIGluc3RhbmNlcywgc2luY2UgdGhlIGxpdGVyYWwgb2YgdGhlIGdpdmVuIGNsYXVzZSBpcyBpbiB0aGUgKi8KICAvKiB1c2FibGUgaW5kZXgsIHRvby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgaWYgKE1heE5yT2ZJbnN0YW5jZXMgPT0gMCB8fCAoVXNhYmxlcyAmJiBNYXhOck9mSW5zdGFuY2VzID09IDEpKSB7CiAgICAqTGl0SW5kZXggICAgID0gLTE7CiAgICBPcHRpbWFsQ2xhdXNlID0gTlVMTDsKICB9CgogIHJldHVybiBPcHRpbWFsQ2xhdXNlOwp9CgoKc3RhdGljIExJU1QgdG9wX0Z1bGxSZWR1Y3Rpb25TZWxlY3RHaXZlbkNvbXB1dGVEZXJpdmFibGVzKFBST09GU0VBUkNIIFNlYXJjaCwKCQkJCQkJCSAgQ0xBVVNFICpTcGxpdENsYXVzZSwKCQkJCQkJCSAgaW50ICpDb3VudGVyKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVDogICBBIHByb29mIHNlYXJjaCBvYmplY3QsIGEgcG9pbnRlciB0byBhIGNsYXVzZSByZXN1bHRpbmcgZnJvbSBhCiAgICAgICAgICAgcHJldmlvdXMgc3BsaXR0aW5nIHN0ZXAsIGFuZCBhIHBvaW50ZXIgdG8gYW4gaW50ZWdlciBjb3VudGVyLgogIFJFVFVSTlM6IEEgbGlzdCBvZiBkZXJpdmVkIGNsYXVzZXMuCiAgRUZGRUNUOiAgSW4gdGhpcyBmdW5jdGlvbiBhIGNsYXVzZSBpcyBzZWxlY3RlZCBmcm9tIHRoZSBzZXQgb2YKICAgICAgICAgICAidXNhYmxlIiBjbGF1c2VzLiBBZnRlciBhIGNsYXVzZSB3YXMgc2VsZWN0ZWQgYXMgImdpdmVuIGNsYXVzZSIsCgkgICBpbmZlcmVuY2VzIGJldHdlZW4gdGhlIGdpdmVuIGNsYXVzZSBhbmQgdGhlICJ3b3JrZWQgb2ZmIiBjbGF1c2VzCgkgICBhcmUgbWFkZS4gVGhlIHNlbGVjdGlvbiB3b3JrcyBhcyBmb2xsb3dzOgoJICAgMSkgSWYgPCpTcGxpdENsYXVzZT4gaXMgbm90IE5VTEwsIHRoZSBzcGxpdCBjbGF1c2UKCSAgICAgIGlzIHNlbGVjdGVkIGFzICJnaXZlbiBjbGF1c2UiLiA8KlNwbGl0Q2xhdXNlPiBzaG91bGQgcmVzdWx0CgkgICAgICBmcm9tIHNwbGl0dGluZwoJICAgMikgSWYgPCpTcGxpdENsYXVzZT4gaXMgTlVMTCwgd2UgdHJ5IHRvIGZpbmQgYSBjbGF1c2UgdGhhdCBpcwoJICAgICAgIm9wdGltYWwiIGZvciBzcGxpdHRpbmcuIFRoaXMgaXMgZG9uZSBieSBzZWxlY3RpbmcgYSBsaXRlcmFsCgkgICAgICA8TD4gaW4gYSBjbGF1c2UsIHN1Y2ggdGhhdCA8TD4gaXMgdmFyaWFibGUtZGlzam9pbnQgZnJvbQoJICAgICAgdGhlIHJlc3Qgb2YgdGhlIGNsYXVzZSwgYW5kIHRoZSBhdG9tIG9mIDxMPiBoYXMgdGhlIG1heGltdW0KCSAgICAgIG51bWJlciBvZiBpbnN0YW5jZXMgd2l0aGluIHRoZSBzZXQgb2YgInVzYWJsZSIgYW5kICJ3b3Jrb2ZmIgoJICAgICAgY2xhdXNlcy4KCSAgIDMpIElmIHRoZSBwcmV2aW91cyBzdGVwcyBmYWlsZWQsIGEgY2xhdXNlIGlzIHNlbGVjdGVkIGJ5IHdlaWdodAoJICAgICAgb3IgYnkgZGVwdGgsIGRlcGVuZGluZyBvbiB0aGUgcGFyYW1ldGVycyAiV0RSYXRpbyIsICJQcmVmVmFyIgoJICAgICAgYW5kICJQcmVmQ29uIi4gVGhlbiBzcGxpdHRpbmcgaXMgdHJpZWQgb24gdGhlIHNlbGVjdGVkIGNsYXVzZS4KCSAgICAgIElmIHRoZSBjbGF1c2UgaXMgYSBub24taG9ybiBjbGF1c2UsIHdlIHRyeSB0byBmaW5kIGEgcG9zaXRpdmUKCSAgICAgIGxpdGVyYWwgPEw+IGFuZCBhIHNldCBvZiBuZWdhdGl2ZSBsaXRlcmFscyA8Tj4sIHN1Y2ggdGhhdCA8Tj4KCSAgICAgIGFuZCA8TD4gYXJlIHZhcmlhYmxlIGRpc2pvaW50IGZyb20gdGhlIHJlc3Qgb2YgdGhlIGNsYXVzZS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp7CiAgQ0xBVVNFICAgICBHaXZlbkNsYXVzZSwgVGVybWluYXRvckNsYXVzZTsKICBMSVNUICAgICAgIERlcml2YWJsZXMsIFNwbGl0TGl0czsKICBGTEFHU1RPUkUgIEZsYWdzOwogIFBSRUNFREVOQ0UgUHJlY2VkZW5jZTsKICBpbnQgICAgICAgIExpdEluZGV4OwoKICBHaXZlbkNsYXVzZSA9IE5VTEw7CiAgRGVyaXZhYmxlcyAgPSBsaXN0X05pbCgpOwogIEZsYWdzICAgICAgID0gcHJmc19TdG9yZShTZWFyY2gpOwogIFByZWNlZGVuY2UgID0gcHJmc19QcmVjZWRlbmNlKFNlYXJjaCk7CgogIC8qIDEpIElmIHRoZSBsYXN0IGdpdmVuIGNsYXVzZSB3YXMgc3BsaXQgb3IgaWYgYmFja3RyYWNraW5nIHdhcyBhcHBsaWVkLCAqLwogIC8qIHRoZW4gY2hvb3NlIHRoZSBjbGF1c2UgcmVzdWx0aW5nIGZyb20gdGhlIHNwbGl0dGluZyBzdGVwIGFzICAgICAgICAqLwogIC8qIGdpdmVuIGNsYXVzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIEFUVEVOVElPTjogU2luY2UgdGhlIDxTcGxpdENsYXVzZT4gbWlnaHQgaGF2ZSBiZWVuIHJlZHVjZWQgc2luY2UgICAqLwogIC8qIHRoZSB0aW1lIHRoZSB2YXJpYWJsZSB3YXMgc2V0LCB3ZSBoYXZlIHRvIGNoZWNrIHdoZXRoZXIgICAgICAgICAgICAqLwogIC8qIDxTcGxpdENsYXVzZT4gaXMgc3RpbGwgZWxlbWVudCBvZiB0aGUgc2V0IG9mIHVzYWJsZSBjbGF1c2VzLiAgICAgICAqLwogIGlmICgqU3BsaXRDbGF1c2UgIT0gTlVMTCAmJgogICAgICBsaXN0X1BvaW50ZXJNZW1iZXIocHJmc19Vc2FibGVDbGF1c2VzKFNlYXJjaCksICpTcGxpdENsYXVzZSkpCiAgICBHaXZlbkNsYXVzZSA9ICpTcGxpdENsYXVzZTsKICAKICAqU3BsaXRDbGF1c2UgPSBOVUxMOwoKICBpZiAoR2l2ZW5DbGF1c2UgPT0gTlVMTCkgewogICAgaWYgKHByZnNfU3BsaXRDb3VudGVyKFNlYXJjaCkgIT0gMCkKICAgICAgLyogMikgVHJ5IHRvIGZpbmQgYW4gIm9wdGltYWwiIHNwbGl0dGluZyBjbGF1c2UsIHRoYXQgZG9lc24ndCBzaGFyZSAqLwogICAgICAvKiAgICB2YXJpYWJsZXMgd2l0aCBhbnkgb3RoZXIgbGl0ZXJhbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgIEdpdmVuQ2xhdXNlID0gdG9wX0dldFBvd2VyZnVsU3BsaXRDbGF1c2UoU2VhcmNoLCBGQUxTRSwgJkxpdEluZGV4KTsKICAgICAgCiAgICBpZiAoR2l2ZW5DbGF1c2UgIT0gTlVMTCkgewogICAgICAvKiBGb3VuZCAib3B0aW1hbCIgc3BsaXQgY2xhdXNlLCBzbyBhcHBseSBzcGxpdHRpbmcgKi8KICAgICAgU3BsaXRMaXRzID0gbGlzdF9MaXN0KGNsYXVzZV9HZXRMaXRlcmFsKEdpdmVuQ2xhdXNlLCBMaXRJbmRleCkpOwogICAgICAqU3BsaXRDbGF1c2UgPSBwcmZzX0RvU3BsaXR0aW5nKFNlYXJjaCwgR2l2ZW5DbGF1c2UsIFNwbGl0TGl0cyk7CiAgICAgIGxpc3RfRGVsZXRlKFNwbGl0TGl0cyk7ICAgICAgCiAgICB9IGVsc2UgewogICAgICAvKiAzKSBTcGxpdHRpbmcgd2Fzbid0IGFwcGxpZWQsIHNvIHVzZSB0aGUgb3RoZXIgc3RyYXRlZ2llcyAqLwogICAgICBpZiAoKCpDb3VudGVyKSAlIGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX1dEUkFUSU8pID09IDApCglHaXZlbkNsYXVzZSA9IHRvcF9TZWxlY3RDbGF1c2VEZXB0aChwcmZzX1VzYWJsZUNsYXVzZXMoU2VhcmNoKSwgRmxhZ3MpOwogICAgICBlbHNlIHsKCWlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19QUkVGQ09OKSAhPSBmbGFnX1BSRUZDT05VTkNIQU5HRUQpCgkgIEdpdmVuQ2xhdXNlID0gdG9wX1NlbGVjdE1pbmltYWxDb25XZWlnaHRDbGF1c2UocHJmc19Vc2FibGVDbGF1c2VzKFNlYXJjaCksCgkJCQkJCQkgRmxhZ3MpOwoJZWxzZQoJICBHaXZlbkNsYXVzZSA9IHRvcF9TZWxlY3RNaW5pbWFsV2VpZ2h0Q2xhdXNlKHByZnNfVXNhYmxlQ2xhdXNlcyhTZWFyY2gpLAoJCQkJCQkgICAgICBGbGFncyk7CiAgICAgIH0KICAgICAgKCpDb3VudGVyKSsrOyAvKiBFSzogaGllciBsYXNzZW4sIG9kZXIgZWluZSBLbGFtbWVyZWJlbmUgbmFjaCBhdXNzZW4/ICovCiAgICB9CiAgfQoKICBpZiAoKlNwbGl0Q2xhdXNlID09IE5VTEwgJiYgcHJmc19TcGxpdENvdW50ZXIoU2VhcmNoKSAhPSAwKSB7CiAgICAvKiBUcnkgdG8gZmluZCB0aGUgIm9wdGltYWwiIGxpdGVyYWwgZm9yIHNwbGl0dGluZyB0aGUgY2xhdXNlLiAqLwogICAgLyogVGhpcyBtYWtlcyBzZW5zZSBmb3IgYSBjbGF1c2UgdGhhdCBpcyB0aGUgcmlnaHQgcGFydCBvZiBhICAgKi8KICAgIC8qIHNwbGl0dGluZyBzdGVwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBMaXRJbmRleCA9IHRvcF9HZXRPcHRpbWFsU3BsaXRMaXRlcmFsSW5kZXgoU2VhcmNoLCBHaXZlbkNsYXVzZSwgRkFMU0UpOwogICAgaWYgKExpdEluZGV4ID49IDApIHsKICAgICAgU3BsaXRMaXRzID0gbGlzdF9MaXN0KGNsYXVzZV9HZXRMaXRlcmFsKEdpdmVuQ2xhdXNlLCBMaXRJbmRleCkpOwogICAgICAqU3BsaXRDbGF1c2UgPSBwcmZzX0RvU3BsaXR0aW5nKFNlYXJjaCwgR2l2ZW5DbGF1c2UsIFNwbGl0TGl0cyk7CiAgICAgIGxpc3RfRGVsZXRlKFNwbGl0TGl0cyk7CiAgICB9IGVsc2UgewogICAgICAvKiBPcHRpbWFsIHNwbGl0dGluZyB3YXNuJ3QgcG9zc2libGUsIHNvIHRyeSB0aGUgb2xkLXN0eWxlIHNwbGl0dGluZy4gKi8KICAgICAgLyogSGVyZSBhIHNwbGl0IGlzIGRvbmUgaWYgYSBwb3NpdGl2ZSBsaXRlcmFsIGRvZXNuJ3Qgc2hhcmUgdmFyaWFibGVzICovCiAgICAgIC8qIHdpdGggYW5vdGhlciBQT1NJVElWRSBsaXRlcmFsLiAqLwogICAgICAqU3BsaXRDbGF1c2UgPSBwcmZzX1BlcmZvcm1TcGxpdHRpbmcoU2VhcmNoLCBHaXZlbkNsYXVzZSk7CiAgICB9CiAgfQoKICBwcmZzX0V4dHJhY3RVc2FibGUoU2VhcmNoLCBHaXZlbkNsYXVzZSk7CgogIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19QR0lWRU4pKSB7CiAgICBmcHV0cygiXG5cdEdpdmVuIGNsYXVzZTogIiwgc3Rkb3V0KTsKICAgIGNsYXVzZV9QcmludChHaXZlbkNsYXVzZSk7CiAgICBmZmx1c2goc3Rkb3V0KTsKICB9CiAgCiAgaWYgKCpTcGxpdENsYXVzZSAhPSBOVUxMKQogICAgRGVyaXZhYmxlcyA9IGxpc3RfTGlzdCgqU3BsaXRDbGF1c2UpOwogIGVsc2UgewogICAgLyogTm8gc3BsaXR0aW5nIHdhcyBhcHBsaWVkICovCiAgICBpZiAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfUlRFUikgIT0gZmxhZ19SVEVST0ZGKSB7CiAgICAgIGNsb2NrX1N0YXJ0Q291bnRlcihjbG9ja19SRURVQ1RJT04pOwogICAgICBUZXJtaW5hdG9yQ2xhdXNlID0gcmVkX1Rlcm1pbmF0b3IoR2l2ZW5DbGF1c2UsCgkJCQkJZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfUlRFUiksCgkJCQkJcHJmc19Xb3JrZWRPZmZTaGFyaW5nSW5kZXgoU2VhcmNoKSwKCQkJCQlwcmZzX1VzYWJsZVNoYXJpbmdJbmRleChTZWFyY2gpLCBGbGFncywKCQkJCQlQcmVjZWRlbmNlKTsKICAgICAgY2xvY2tfU3RvcEFkZFBhc3NlZFRpbWUoY2xvY2tfUkVEVUNUSU9OKTsKICAgICAgCiAgICAgIGlmIChUZXJtaW5hdG9yQ2xhdXNlICE9IE5VTEwpIHsKCS8qIEFuIGVtcHR5IGNsYXVzZSB3YXMgZGVyaXZlZCBieSB0aGUgInRlcm1pbmF0b3IiIHJ1bGUgKi8KCURlcml2YWJsZXMgPSBsaXN0X0xpc3QoVGVybWluYXRvckNsYXVzZSk7CglwcmZzX0luc2VydFVzYWJsZUNsYXVzZShTZWFyY2gsIEdpdmVuQ2xhdXNlKTsKICAgICAgfQogICAgfQogICAgaWYgKGxpc3RfRW1wdHkoRGVyaXZhYmxlcykpIHsKICAgICAgLyogTm8gc3BsaXR0aW5nIHdhcyBhcHBsaWVkLCBubyBlbXB0eSBjbGF1c2Ugd2FzIGZvdW5kIGJ5IHRlcm1pbmF0b3IgKi8KICAgICAgY2xhdXNlX1NlbGVjdExpdGVyYWwoR2l2ZW5DbGF1c2UsIEZsYWdzKTsKICAgICAgLypjbGF1c2VfU2V0U3BlY2lhbEZsYWdzKEdpdmVuQ2xhdXNlLGFuYV9Tb3J0RGVjcmVhc2luZygpKTsqLwogICAgICBwcmZzX0luc2VydFdvcmtlZE9mZkNsYXVzZShTZWFyY2gsIEdpdmVuQ2xhdXNlKTsKICAgICAgY2xvY2tfU3RhcnRDb3VudGVyKGNsb2NrX0lORkVSRU5DRSk7CiAgICAgIERlcml2YWJsZXMgPSBpbmZfRGVyaXZhYmxlQ2xhdXNlcyhTZWFyY2gsIEdpdmVuQ2xhdXNlKTsKICAgICAgY2xvY2tfU3RvcEFkZFBhc3NlZFRpbWUoY2xvY2tfSU5GRVJFTkNFKTsKICAgIH0KICB9CgogIHByZnNfSW5jRGVyaXZlZENsYXVzZXMoU2VhcmNoLCBsaXN0X0xlbmd0aChEZXJpdmFibGVzKSk7CgogIHJldHVybiBEZXJpdmFibGVzOwp9CgoKc3RhdGljIExJU1QgdG9wX0xhenlSZWR1Y3Rpb25TZWxlY3RHaXZlbkNvbXB1dGVEZXJpdmFibGVzKFBST09GU0VBUkNIIFNlYXJjaCwKCQkJCQkJCSAgQ0xBVVNFICpTcGxpdENsYXVzZSwKCQkJCQkJCSAgaW50ICpDb3VudGVyKQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJTlBVVDogICBBIHByb29mIHNlYXJjaCBvYmplY3QsIGEgcG9pbnRlciB0byBhIGNsYXVzZSByZXN1bHRpbmcgZnJvbSBhCiAgICAgICAgICAgcHJldmlvdXMgc3BsaXR0aW5nIHN0ZXAsIGFuZCBhIHBvaW50ZXIgdG8gYW4gaW50ZWdlciBjb3VudGVyLgogIFJFVFVSTlM6IEEgbGlzdCBvZiBkZXJpdmVkIGNsYXVzZXMuCiAgRUZGRUNUOiAgSW4gdGhpcyBmdW5jdGlvbiBhIGNsYXVzZSBpcyBzZWxlY3RlZCBmcm9tIHRoZSBzZXQgb2YKICAgICAgICAgICAidXNhYmxlIiBjbGF1c2VzLiBBZnRlciBhIGNsYXVzZSB3YXMgc2VsZWN0ZWQgYXMgImdpdmVuIGNsYXVzZSIsCgkgICBpbmZlcmVuY2VzIGJldHdlZW4gdGhlIGdpdmVuIGNsYXVzZSBhbmQgdGhlICJ3b3JrZWQgb2ZmIiBjbGF1c2VzCgkgICBhcmUgbWFkZS4gVGFrZSBhIGxvb2sgYXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmdW5jdGlvbgoJICAgdG9wX0Z1bGxSZWR1Y3Rpb24uLi4gZm9yIG1vcmUgZGV0YWlscy4KCSAgIFRoaXMgZnVuY3Rpb24gaXMgbW9yZSBjb21wbGljYXRlZCB0aGFuIHRoZSBvdGhlciBmdW5jdGlvbiwKCSAgIHNpbmNlIGNsYXVzZXMgaW4gdGhlIHNldCBvZiB1c2FibGUgY2xhdXNlcyBtYXkgYmUgcmVkdWNpYmxlLgoJICAgQmVjYXVzZSBvZiB0aGlzIGZhY3QsIHRoZSBzZWxlY3Rpb24gb2YgdGhlIGdpdmVuIGNsYXVzZQoJICAgaGFzIHRvIGJlIGRvbmUgaW4gYSBsb29wLiBBZnRlciBwaWNraW5nIGEgImNhbmRpZGF0ZSIgY2xhdXNlCgkgICB0aGUgY2xhdXNlIGlzIGludGVyLXJlZHVjZWQgd2l0aCB0aGUgIndvcmtlZCBvZmYiIHNldC4KCSAgIElmIHRoZSBjYW5kaWRhdGUgc3RpbGwgZXhpc3RzIGFmdGVyIHRoZSByZWR1Y3Rpb24gaXQgaXMKCSAgIHNlbGVjdGVkIGFzIGdpdmVuIGNsYXVzZSwgZWxzZSBhbm90aGVyIHVzYWJsZSBjbGF1c2UgaXMgcGlja2VkCgkgICBhcyBjYW5kaWRhdGUuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KewogIENMQVVTRSAgICAgR2l2ZW5DbGF1c2UsIFRlcm1pbmF0b3JDbGF1c2U7CiAgTElTVCAgICAgICBEZXJpdmFibGVzOwogIEZMQUdTVE9SRSAgRmxhZ3M7CiAgUFJFQ0VERU5DRSBQcmVjZWRlbmNlOwogIGludCAgICAgICAgTGl0SW5kZXg7CgogIEdpdmVuQ2xhdXNlICAgICAgPSAoQ0xBVVNFKU5VTEw7CiAgVGVybWluYXRvckNsYXVzZSA9IChDTEFVU0UpTlVMTDsKICBEZXJpdmFibGVzICAgICAgID0gbGlzdF9OaWwoKTsKICBGbGFncyAgICAgICAgICAgID0gcHJmc19TdG9yZShTZWFyY2gpOwogIFByZWNlZGVuY2UgICAgICAgPSBwcmZzX1ByZWNlZGVuY2UoU2VhcmNoKTsKCiAgd2hpbGUgKEdpdmVuQ2xhdXNlID09IChDTEFVU0UpTlVMTCAmJgoJICFsaXN0X0VtcHR5KHByZnNfVXNhYmxlQ2xhdXNlcyhTZWFyY2gpKSkgewogICAgLyogVGhlIHNlbGVjdGVkIGNsYXVzZSBtYXkgYmUgcmVkdW5kYW50ICovCgogICAgaWYgKCpTcGxpdENsYXVzZSAhPSBOVUxMICYmCglsaXN0X1BvaW50ZXJNZW1iZXIocHJmc19Vc2FibGVDbGF1c2VzKFNlYXJjaCksICpTcGxpdENsYXVzZSkpCiAgICAgIEdpdmVuQ2xhdXNlID0gKlNwbGl0Q2xhdXNlOwoKICAgICpTcGxpdENsYXVzZSAgPSBOVUxMOwoKICAgIC8qIFRyeSBzZWxlY3RpbmcgYSBjbGF1c2UgdGhhdCBpcyBvcHRpbWFsIGZvciBzcGxpdHRpbmcgKi8KICAgIGlmIChHaXZlbkNsYXVzZSA9PSBOVUxMKSB7CiAgICAgIGlmIChwcmZzX1NwbGl0Q291bnRlcihTZWFyY2gpICE9IDApIHsKCUdpdmVuQ2xhdXNlID0gdG9wX0dldFBvd2VyZnVsU3BsaXRDbGF1c2UoU2VhcmNoLCBGQUxTRSwgJkxpdEluZGV4KTsKCS8qIFRoZSB2YWx1ZSBvZiA8TGl0SW5kZXg+IGlzbid0IHVzZWQgaGVyZS4gKi8KICAgICAgfQoKICAgICAgaWYgKEdpdmVuQ2xhdXNlID09IE5VTEwpIHsKCS8qIE5vIG9wdGltYWwgY2xhdXNlIGZvciBzcGxpdHRpbmcgZm91bmQgKi8KCWlmICgoKkNvdW50ZXIpICUgZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfV0RSQVRJTykgPT0gMCkKCSAgR2l2ZW5DbGF1c2UgPSB0b3BfU2VsZWN0Q2xhdXNlRGVwdGgocHJmc19Vc2FibGVDbGF1c2VzKFNlYXJjaCksIEZsYWdzKTsKCWVsc2UgewoJICBpZiAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfUFJFRkNPTikgIT0gZmxhZ19QUkVGQ09OVU5DSEFOR0VEKQoJICAgIEdpdmVuQ2xhdXNlID0gdG9wX1NlbGVjdE1pbmltYWxDb25XZWlnaHRDbGF1c2UocHJmc19Vc2FibGVDbGF1c2VzKFNlYXJjaCksCgkJCQkJCQkgICBGbGFncyk7CgkgIGVsc2UKCSAgICBHaXZlbkNsYXVzZSA9IHRvcF9TZWxlY3RNaW5pbWFsV2VpZ2h0Q2xhdXNlKHByZnNfVXNhYmxlQ2xhdXNlcyhTZWFyY2gpLAoJCQkJCQkJRmxhZ3MpOwoJfQoJKCpDb3VudGVyKSsrOwogICAgICB9CiAgICB9CiAgICBwcmZzX0V4dHJhY3RVc2FibGUoU2VhcmNoLCBHaXZlbkNsYXVzZSk7CgogICAgLyogUmVkdWNlIHRoZSBzZWxlY3RlZCBjbGF1c2UgKi8KICAgIGNsb2NrX1N0YXJ0Q291bnRlcihjbG9ja19SRURVQ1RJT04pOwogICAgR2l2ZW5DbGF1c2UgPSByZWRfQ29tcGxldGVSZWR1Y3Rpb25PbkRlcml2ZWRDbGF1c2UoU2VhcmNoLCBHaXZlbkNsYXVzZSwgCgkJCQkJCSAgICAgICByZWRfV09SS0VET0ZGKTsKICAgIGNsb2NrX1N0b3BBZGRQYXNzZWRUaW1lKGNsb2NrX1JFRFVDVElPTik7CiAgfQoKICBpZiAoR2l2ZW5DbGF1c2UgPT0gKENMQVVTRSlOVUxMKQogICAgLyogU2V0IG9mIHVzYWJsZSBjbGF1c2VzIGlzIGVtcHR5ICovCiAgICByZXR1cm4gbGlzdF9OaWwoKTsKCiAgCiAgaWYgKGNsYXVzZV9Jc0VtcHR5Q2xhdXNlKEdpdmVuQ2xhdXNlKSkgewogICAgRGVyaXZhYmxlcyA9IGxpc3RfTGlzdChHaXZlbkNsYXVzZSk7CiAgICByZXR1cm4gRGVyaXZhYmxlczsKICB9CiAgZWxzZSB7CiAgICAvKiBSZWR1Y2UgV29ya2Vkb2ZmIGNsYXVzZXMgd2l0aCBzZWxlY3RlZCBjbGF1c2UgKi8KICAgIGNsb2NrX1N0YXJ0Q291bnRlcihjbG9ja19SRURVQ1RJT04pOwogICAgRGVyaXZhYmxlcyA9IHJlZF9CYWNrUmVkdWN0aW9uKFNlYXJjaCwgR2l2ZW5DbGF1c2UsIHJlZF9XT1JLRURPRkYpOwogICAgY2xvY2tfU3RvcEFkZFBhc3NlZFRpbWUoY2xvY2tfUkVEVUNUSU9OKTsKICB9CgogIC8qIFByaW50IHNlbGVjdGVkIGNsYXVzZSAqLwogIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19QR0lWRU4pKSB7CiAgICBmcHV0cygiXG5cdEdpdmVuIGNsYXVzZTogIiwgc3Rkb3V0KTsKICAgIGNsYXVzZV9QcmludChHaXZlbkNsYXVzZSk7IAogICAgZmZsdXNoKHN0ZG91dCk7CiAgfSAgICAgCgogIC8qIFRyeSBzcGxpdHRpbmcgKi8KICBpZiAocHJmc19TcGxpdENvdW50ZXIoU2VhcmNoKSAhPSAwKSB7CiAgICAvKiBGaXJzdCB0cnkgIm9wdGltYWwiIHNwbGl0dGluZyBvbiB0aGUgc2VsZWN0ZWQgY2xhdXNlICovCiAgICBMaXRJbmRleCA9IHRvcF9HZXRPcHRpbWFsU3BsaXRMaXRlcmFsSW5kZXgoU2VhcmNoLCBHaXZlbkNsYXVzZSwgRkFMU0UpOwoKICAgIGlmIChMaXRJbmRleCA+PSAwKSB7CiAgICAgIExJU1QgU3BsaXRMaXRzOwoKICAgICAgU3BsaXRMaXRzID0gbGlzdF9MaXN0KGNsYXVzZV9HZXRMaXRlcmFsKEdpdmVuQ2xhdXNlLCBMaXRJbmRleCkpOwogICAgICAqU3BsaXRDbGF1c2UgPSBwcmZzX0RvU3BsaXR0aW5nKFNlYXJjaCwgR2l2ZW5DbGF1c2UsIFNwbGl0TGl0cyk7CiAgICAgIGxpc3RfRGVsZXRlKFNwbGl0TGl0cyk7ICAgICAgCiAgICB9IGVsc2UgewogICAgICAvKiBUcnkgdGhlIG9sZCBzcGxpdHRpbmcgdGhhdCBhbGxvd3MgbmVnYXRpdmUgbGl0ZXJhbHMgICAqLwogICAgICAvKiBzaGFyaW5nIHZhcmlhYmxlcyB3aXRoIHRoZSBzZWxlY3RlZCBwb3NpdGl2ZSBsaXRlcmFsLiAqLwogICAgICAqU3BsaXRDbGF1c2UgPSBwcmZzX1BlcmZvcm1TcGxpdHRpbmcoU2VhcmNoLCBHaXZlbkNsYXVzZSk7CiAgICB9CiAgfSAKICAKICBpZiAoKlNwbGl0Q2xhdXNlICE9IE5VTEwpIHsKICAgIERlcml2YWJsZXMgPSBsaXN0X0NvbnMoKlNwbGl0Q2xhdXNlLCBEZXJpdmFibGVzKTsKICB9IGVsc2UgewogICAgLyogVHJ5IHRlcm1pbmF0b3IgcmVkdWN0aW9uIG9ubHkgZm9yIGEgY2xhdXNlIHRoYXQgd2Fzbid0IHNwbGl0dGVkLiAqLwogICAgaWYgKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX1JURVIpICE9IGZsYWdfUlRFUk9GRikgewogICAgICBUZXJtaW5hdG9yQ2xhdXNlID0gcmVkX1Rlcm1pbmF0b3IoR2l2ZW5DbGF1c2UsCgkJCQkJZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfUlRFUiksCgkJCQkJcHJmc19Xb3JrZWRPZmZTaGFyaW5nSW5kZXgoU2VhcmNoKSwKCQkJCQlwcmZzX1VzYWJsZVNoYXJpbmdJbmRleChTZWFyY2gpLAoJCQkJCUZsYWdzLCBQcmVjZWRlbmNlKTsKICAgICAgaWYgKFRlcm1pbmF0b3JDbGF1c2UgIT0gTlVMTCkgewoJRGVyaXZhYmxlcyA9IGxpc3RfQ29ucyhUZXJtaW5hdG9yQ2xhdXNlLCBEZXJpdmFibGVzKTsKCXByZnNfSW5zZXJ0VXNhYmxlQ2xhdXNlKFNlYXJjaCwgR2l2ZW5DbGF1c2UpOwogICAgICB9CiAgICB9CiAgICBpZiAoVGVybWluYXRvckNsYXVzZSA9PSAoQ0xBVVNFKU5VTEwpIHsgICAKICAgICAgY2xhdXNlX1NlbGVjdExpdGVyYWwoR2l2ZW5DbGF1c2UsIEZsYWdzKTsKICAgICAgLyogY2xhdXNlX1NldFNwZWNpYWxGbGFncyhHaXZlbkNsYXVzZSxhbmFfU29ydERlY3JlYXNpbmcoKSk7Ki8KICAgICAgcHJmc19JbnNlcnRXb3JrZWRPZmZDbGF1c2UoU2VhcmNoLCBHaXZlbkNsYXVzZSk7CiAgICAgIGNsb2NrX1N0YXJ0Q291bnRlcihjbG9ja19JTkZFUkVOQ0UpOwogICAgICBEZXJpdmFibGVzID0gbGlzdF9OY29uYyhEZXJpdmFibGVzLAoJCQkgICAgICBpbmZfRGVyaXZhYmxlQ2xhdXNlcyhTZWFyY2gsIEdpdmVuQ2xhdXNlKSk7CiAgICAgIGNsb2NrX1N0b3BBZGRQYXNzZWRUaW1lKGNsb2NrX0lORkVSRU5DRSk7CiAgICB9CiAgfQogIAogIHByZnNfSW5jRGVyaXZlZENsYXVzZXMoU2VhcmNoLCBsaXN0X0xlbmd0aChEZXJpdmFibGVzKSk7CgogIHJldHVybiBEZXJpdmFibGVzOwp9CgoKc3RhdGljIFBST09GU0VBUkNIIHRvcF9Qcm9vZlNlYXJjaChQUk9PRlNFQVJDSCBTZWFyY2gsIExJU1QgUHJvYmxlbUNsYXVzZXMsCgkJCQkgICBGTEFHU1RPUkUgSW5wdXRGbGFncywgTElTVCBVc2VyUHJlY2VkZW5jZSwgaW50ICpCb3VuZEFwcGxpZWQpCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIElOUFVUOiAgIEEgcHJvb2Ygc2VhcmNoIG9iamVjdCwgYSBsaXN0IG9mIGNsYXVzZXMsIGEgZmxhZyBzdG9yZQogICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIGZsYWdzIGZyb20gdGhlIGNvbW1hbmQgbGluZSBhbmQgZnJvbQogICAgICAgICAgIHRoZSBpbnB1dCBmaWxlLCBhIGxpc3QgY29udGFpbmluZyB0aGUgcHJlY2VkZW5jZSBhcwoJICAgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLCBhbmQgYSBwb2ludGVyIHRvIGFuIGludGVnZXIuCiAgUkVUVVJOUzogVGhlIHNhbWUgcHJvb2Ygc2VhcmNoIG9iamVjdAogIEVGRkVDVFM6IAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICBMSVNUICAgICAgIFNjYW4sRW1wdHlDbGF1c2VzLERlcml2YWJsZXM7CiAgTElTVCAgICAgICBVc2VkRW1wdHlDbGF1c2VzOwogIENMQVVTRSAgICAgU3BsaXRDbGF1c2UsSGlnaGVzdExldmVsRW1wdHlDbGF1c2U7CiAgRkxBR1NUT1JFICBGbGFnczsKICBQUkVDRURFTkNFIFByZWNlZGVuY2U7CiAgaW50ICAgICAgICBDb3VudGVyLCBBY3RCb3VuZCwgQm91bmRNb2RlLCBCb3VuZExvb3BzOwoKICBIaWdoZXN0TGV2ZWxFbXB0eUNsYXVzZSA9IChDTEFVU0UpTlVMTDsKICBVc2VkRW1wdHlDbGF1c2VzICAgICAgICA9IGxpc3RfTmlsKCk7CiAgRW1wdHlDbGF1c2VzICAgICAgICAgICAgPSBsaXN0X05pbCgpOwogIERlcml2YWJsZXMgICAgICAgICAgICAgID0gbGlzdF9OaWwoKTsKICBGbGFncyAgICAgICAgICAgICAgICAgICA9IHByZnNfU3RvcmUoU2VhcmNoKTsKICBQcmVjZWRlbmNlICAgICAgICAgICAgICA9IHByZnNfUHJlY2VkZW5jZShTZWFyY2gpOwogIENvdW50ZXIgICAgICAgICAgICAgICAgID0gMTsKCiAgY2xvY2tfSW5pdENvdW50ZXIoY2xvY2tfUkVEVUNUSU9OKTsKICBjbG9ja19Jbml0Q291bnRlcihjbG9ja19CQUNLVFJBQ0spOwogIGNsb2NrX0luaXRDb3VudGVyKGNsb2NrX0lORkVSRU5DRSk7CgogIC8qIEltcG9ydGFudCAhIFJlY29tcHV0ZXMgV2VpZ2h0ICEgKi8KICBhbmFfQW5hbHl6ZVByb2JsZW0oU2VhcmNoLCBQcm9ibGVtQ2xhdXNlcyk7CiAgaWYgKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX0FVVE8pKSB7CiAgICBwcmZzX0luc3RhbGxGaW5pdGVNb25hZGljUHJlZGljYXRlcyhTZWFyY2gsIFByb2JsZW1DbGF1c2VzLCBhbmFfRmluTW9uUHJlZExpc3QoKSk7CiAgICBhbmFfQXV0b0NvbmZpZ3VyYXRpb24oUHJvYmxlbUNsYXVzZXMsIEZsYWdzLCBQcmVjZWRlbmNlKTsKICAgIC8qIEZpbGUgYW5kIGlucHV0IGZsYWdzIGhhdmUgaGlnaGVyIHByZWNlZGVuY2UgKi8KICAgIGZsYWdfVHJhbnNmZXJTZXRGbGFncyhJbnB1dEZsYWdzLCBGbGFncyk7CiAgfQoKICAvKiBSZWFycmFuZ2UgYXV0b21hdGljYWxseSBkZXRlcm1pbmVkIHByZWNlZGVuY2UgYWNjb3JkaW5nIHRvIHVzZXIncyBzcGVjaWZpY2F0aW9uLiAqLwogIHN5bWJvbF9SZWFycmFuZ2VQcmVjZWRlbmNlKFByZWNlZGVuY2UsIFVzZXJQcmVjZWRlbmNlKTsKCiAgZm9yIChTY2FuID0gUHJvYmxlbUNsYXVzZXM7ICFsaXN0X0VtcHR5KFNjYW4pOyBTY2FuID0gbGlzdF9DZHIoU2NhbikpCiAgICBjbGF1c2VfT3JpZW50QW5kUmVJbml0KGxpc3RfQ2FyKFNjYW4pLCBGbGFncywgUHJlY2VkZW5jZSk7CgogIC8qIE11c3QgYmUgY2FsbGVkIGFmdGVyIGFuYV9BbmFseXplUHJvYmxlbSBhbmQgUmVvcmllbnRhdGlvbiAqLwogIGFuYV9BbmFseXplU29ydFN0cnVjdHVyZShQcm9ibGVtQ2xhdXNlcywgRmxhZ3MsIFByZWNlZGVuY2UpOwoKICBpZiAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfQVVUTykpIHsKICAgIGFuYV9FeHBsb2l0U29ydEFuYWx5c2lzKEZsYWdzKTsKICAgIC8qIEZpbGUgYW5kIGlucHV0IGZsYWdzIGhhdmUgaGlnaGVyIHByZWNlZGVuY2UgKi8KICAgIGZsYWdfVHJhbnNmZXJTZXRGbGFncyhJbnB1dEZsYWdzLCBGbGFncyk7CiAgfQogIHByZnNfU2V0U3BsaXRDb3VudGVyKFNlYXJjaCwgZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfU1BMSVRTKSk7CgogIEFjdEJvdW5kICAgICAgID0gZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfQk9VTkRTVEFSVCk7CiAgQm91bmRNb2RlICAgICAgPSBmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19CT1VORE1PREUpOwogIEJvdW5kTG9vcHMgICAgID0gZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfQk9VTkRMT09QUyk7CiAgKkJvdW5kQXBwbGllZCAgPSAtMTsKCiAgaWYgKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX1BQUk9CTEVNKSkgewogICAgcHV0cygiIik7CiAgICBwdXRzKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVNQQVNTLVNUQVJULS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKICAgIHB1dHMoIklucHV0IFByb2JsZW06Iik7CiAgICBjbGF1c2VfTGlzdFByaW50KFByb2JsZW1DbGF1c2VzKTsKICAgIGFuYV9QcmludChGbGFncywgUHJlY2VkZW5jZSk7CiAgfQoKICBpZiAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfU09SVFMpICE9IGZsYWdfU09SVFNPRkYpIHsKICAgIEJPT0wgU3Ryb25nOwogICAgU3Ryb25nID0gKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX1NPUlRTKSA9PSBmbGFnX1NPUlRTTU9OQURJQ0FMTCk7CiAgICBmb3IgKFNjYW4gPSBQcm9ibGVtQ2xhdXNlczsgIWxpc3RfRW1wdHkoU2Nhbik7IFNjYW4gPSBsaXN0X0NkcihTY2FuKSkKICAgICAgY2xhdXNlX1NldFNvcnRDb25zdHJhaW50KChDTEFVU0UpbGlzdF9DYXIoU2NhbiksU3Ryb25nLEZsYWdzLCBQcmVjZWRlbmNlKTsKICB9CgogIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19SSU5QVVQpKSB7CiAgICBjbG9ja19TdGFydENvdW50ZXIoY2xvY2tfUkVEVUNUSU9OKTsKICAgIEVtcHR5Q2xhdXNlcyA9IHJlZF9SZWR1Y2VJbnB1dChTZWFyY2gsIFByb2JsZW1DbGF1c2VzKTsKICAgIGNsb2NrX1N0b3BBZGRQYXNzZWRUaW1lKGNsb2NrX1JFRFVDVElPTik7CiAgICBpZiAobGlzdF9FbXB0eShFbXB0eUNsYXVzZXMpICYmIGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX1NBVElOUFVUKSkKICAgICAgRW1wdHlDbGF1c2VzID0gcmVkX1NhdElucHV0KFNlYXJjaCk7CiAgfQogIGVsc2UgewogICAgZm9yIChTY2FuPVByb2JsZW1DbGF1c2VzOyAhbGlzdF9FbXB0eShTY2FuKTsgU2Nhbj1saXN0X0NkcihTY2FuKSkKICAgICAgcHJmc19JbnNlcnRVc2FibGVDbGF1c2UoU2VhcmNoLCBsaXN0X0NhcihTY2FuKSk7CiAgfQogIERlcml2YWJsZXMgPSBsaXN0X05pbCgpOwoKICBpZiAoYW5hX1NvcnRSZXN0cmljdGlvbnMoKSB8fAogICAgICAoYW5hX1Vuc29sdmVkU29ydFJlc3RyaWN0aW9ucygpICYmCiAgICAgICBmbGFnX0dldEZsYWdWYWx1ZShGbGFncyxmbGFnX1NPUlRTKSA9PSBmbGFnX1NPUlRTTU9OQURJQ0FMTCkpIHsKICAgIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19SU1NUKSkKICAgICAgcHJmc19TZXRTdGF0aWNTb3J0VGhlb3J5KFNlYXJjaCxzb3J0X0FwcHJveFN0YXRpY1NvcnRUaGVvcnkocHJmc19Vc2FibGVDbGF1c2VzKFNlYXJjaCksRmxhZ3MsUHJlY2VkZW5jZSkpOwogICAgcHJmc19TZXREeW5hbWljU29ydFRoZW9yeShTZWFyY2gsc29ydF9UaGVvcnlDcmVhdGUoKSk7CiAgfQoKICAvKiBGaXggbGl0ZXJhbCBvcmRlciBpbiBjbGF1c2VzIGluIHRoZSB1c2FibGUgc2V0LgogICAgIFNpbmNlIHRoZXkgYXJlIHNoYXJlZCwgd2UgaGF2ZSB0byBleHRyYWN0IHRoZW0gZnJvbQogICAgIHRoZSBzaGFyaW5nIGJlZm9yZSBmaXhpbmcgdGhlbS4gQWZ0ZXJ3YXJkcywgd2UgaGF2ZSB0bwogICAgIGluc2VydCB0aGVtIGluIHRoZSBzaGFyaW5nIGFnYWluLgogICovIAogIGZvciAoU2NhbiA9IHByZnNfVXNhYmxlQ2xhdXNlcyhTZWFyY2gpOwogICAgICAgIWxpc3RfRW1wdHkoU2Nhbik7CiAgICAgICBTY2FuID0gbGlzdF9DZHIoU2NhbikpIHsKICAgIENMQVVTRSBjbGF1c2U7CiAgICBjbGF1c2UgPSBsaXN0X0NhcihTY2FuKTsKICAgIGNsYXVzZV9NYWtlVW5zaGFyZWQoY2xhdXNlLHByZnNfVXNhYmxlU2hhcmluZ0luZGV4KFNlYXJjaCkpOwogICAgY2xhdXNlX0ZpeExpdGVyYWxPcmRlcihjbGF1c2UsIEZsYWdzLCBQcmVjZWRlbmNlKTsKICAgIGNsYXVzZV9JbnNlcnRJbnRvU2hhcmluZyhjbGF1c2UsIHByZnNfVXNhYmxlU2hhcmluZ0luZGV4KFNlYXJjaCksCgkJCSAgICAgcHJmc19TdG9yZShTZWFyY2gpLCBwcmZzX1ByZWNlZGVuY2UoU2VhcmNoKSk7CiAgfQoKICAvKiBDYWxjdWxhdGUgdGhlIGZyZXF1ZW5jeSBjb3VudHMgZm9yIHRoZSBzeW1ib2xzIGluIHRoZSB1c2FibGUgc2V0LiAqLwogIGZvciAoU2NhbiA9IHByZnNfVXNhYmxlQ2xhdXNlcyhTZWFyY2gpOwogICAgICAgIWxpc3RfRW1wdHkoU2Nhbik7CiAgICAgICBTY2FuID0gbGlzdF9DZHIoU2NhbikpIHsKICAgIENMQVVTRSBjbGF1c2U7CiAgICBjbGF1c2UgPSBsaXN0X0NhcihTY2FuKTsKCiAgICBjbGF1c2VfQ291bnRTeW1ib2xzKGNsYXVzZSk7CiAgfQoKICAvKiBTb3J0IHVzYWJsZSBzZXQuICovCiAgcHJmc19TZXRVc2FibGVDbGF1c2VzKFNlYXJjaCwgCgkJCWxpc3RfU29ydChwcmZzX1VzYWJsZUNsYXVzZXMoU2VhcmNoKSwgCgkJCQkgIChCT09MICgqKSAodm9pZCAqLCB2b2lkICopKSBjbGF1c2VfQ29tcGFyZUFic3RyYWN0TEVRKSk7CgogIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19TT1MpKSB7CiAgICBEZXJpdmFibGVzID0gbGlzdF9Db3B5KHByZnNfVXNhYmxlQ2xhdXNlcyhTZWFyY2gpKTsKICAgIGZvciAoU2Nhbj1EZXJpdmFibGVzOyFsaXN0X0VtcHR5KFNjYW4pO1NjYW49bGlzdF9DZHIoU2NhbikpCiAgICAgIGlmICghY2xhdXNlX0dldEZsYWcobGlzdF9DYXIoU2NhbiksIENPTkNMQVVTRSkpCglwcmZzX01vdmVVc2FibGVXb3JrZWRPZmYoU2VhcmNoLGxpc3RfQ2FyKFNjYW4pKTsKICAgIGxpc3RfRGVsZXRlKERlcml2YWJsZXMpOwogIH0KCiAgaWYgKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX1BQUk9CTEVNKSkgewogICAgcHV0cygiXG5Qcm9jZXNzZWQgUHJvYmxlbToiKTsKICAgIHB1dHMoIlxuV29ya2VkIE9mZiBDbGF1c2VzOiIpOwogICAgY2xhdXNlX0xpc3RQcmludChwcmZzX1dvcmtlZE9mZkNsYXVzZXMoU2VhcmNoKSk7CiAgICBwdXRzKCJcblVzYWJsZSBDbGF1c2VzOiIpOwogICAgY2xhdXNlX0xpc3RQcmludChwcmZzX1VzYWJsZUNsYXVzZXMoU2VhcmNoKSk7CiAgfQoKICB3aGlsZSAoKGxpc3RfRW1wdHkoRW1wdHlDbGF1c2VzKSB8fCAhcHJmc19TcGxpdFN0YWNrRW1wdHkoU2VhcmNoKSkgJiYgCgkgcHJmc19Mb29wcyhTZWFyY2gpICE9IDAgJiYKCSAoKCpCb3VuZEFwcGxpZWQgIT0gLTEpIHx8ICFsaXN0X0VtcHR5KHByZnNfVXNhYmxlQ2xhdXNlcyhTZWFyY2gpKSkgJiYKCSAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsZmxhZ19USU1FTElNSVQpID09IGZsYWdfVElNRUxJTUlUVU5MSU1JVEVEIHx8CgkgIGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLGZsYWdfVElNRUxJTUlUKSA+IGNsb2NrX0dldFNlY29uZHMoY2xvY2tfT1ZFUkFMTCkpKSB7CgogICAgRGVyaXZhYmxlcyAgICA9IGxpc3RfTmlsKCk7CiAgICBTcGxpdENsYXVzZSAgID0gKENMQVVTRSlOVUxMOwogICAgKkJvdW5kQXBwbGllZCA9IC0xOwoKICAgIHdoaWxlICgobGlzdF9FbXB0eShFbXB0eUNsYXVzZXMpIHx8ICFwcmZzX1NwbGl0U3RhY2tFbXB0eShTZWFyY2gpKSAmJiAKCSAgIHByZnNfTG9vcHMoU2VhcmNoKSAhPSAwICYmCgkgICAoIWxpc3RfRW1wdHkocHJmc19Vc2FibGVDbGF1c2VzKFNlYXJjaCkpIHx8ICFsaXN0X0VtcHR5KEVtcHR5Q2xhdXNlcykpICYmCgkgICAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsZmxhZ19USU1FTElNSVQpID09IGZsYWdfVElNRUxJTUlUVU5MSU1JVEVEIHx8CgkgICAgZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsZmxhZ19USU1FTElNSVQpID4gY2xvY2tfR2V0U2Vjb25kcyhjbG9ja19PVkVSQUxMKSkpIHsKICAgICAgCiAgICAgIGlmICghbGlzdF9FbXB0eShFbXB0eUNsYXVzZXMpKSB7CgkvKiBCYWNrdHJhY2tpbmcgKi8KCWNsb2NrX1N0YXJ0Q291bnRlcihjbG9ja19CQUNLVFJBQ0spOwoJRGVyaXZhYmxlcyA9IHNwbGl0X0JhY2t0cmFjayhTZWFyY2gsIEhpZ2hlc3RMZXZlbEVtcHR5Q2xhdXNlLAoJCQkJICAgICAmU3BsaXRDbGF1c2UpOwoJY2xvY2tfU3RvcEFkZFBhc3NlZFRpbWUoY2xvY2tfQkFDS1RSQUNLKTsKCXByZnNfSW5jQmFja3RyYWNrZWRDbGF1c2VzKFNlYXJjaCwgbGlzdF9MZW5ndGgoRGVyaXZhYmxlcykpOwogICAgICAKCWlmIChwcmZzX1NwbGl0U3RhY2tFbXB0eShTZWFyY2gpKQoJICBEZXJpdmFibGVzID0gbGlzdF9OY29uYyhFbXB0eUNsYXVzZXMsIERlcml2YWJsZXMpOwoJZWxzZSB7CgkgIGZvciAoIDsgIWxpc3RfRW1wdHkoRW1wdHlDbGF1c2VzKTsgRW1wdHlDbGF1c2VzID0gbGlzdF9Qb3AoRW1wdHlDbGF1c2VzKSkKCSAgICBpZiAobGlzdF9DYXIoRW1wdHlDbGF1c2VzKSAhPSBIaWdoZXN0TGV2ZWxFbXB0eUNsYXVzZSkKCSAgICAgIGNsYXVzZV9EZWxldGUobGlzdF9DYXIoRW1wdHlDbGF1c2VzKSk7CgkgIHByZnNfSW5zZXJ0RG9jUHJvb2ZDbGF1c2UoU2VhcmNoLCBIaWdoZXN0TGV2ZWxFbXB0eUNsYXVzZSk7CgkgIC8qIEtlZXAgSGlnaGVzdExldmVsRW1wdHlDbGF1c2UgZm9yIGZpbmRpbmcgdGhlIHRlcm1zIHJlcXVpcmVkICovCgkgIC8qIGZvciB0aGUgcHJvb2YuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgkgIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19ET0NQUk9PRikpCgkgICAgVXNlZEVtcHR5Q2xhdXNlcyA9IGxpc3RfQ29ucyhIaWdoZXN0TGV2ZWxFbXB0eUNsYXVzZSwgVXNlZEVtcHR5Q2xhdXNlcyk7CgkgIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19ET0NTUExJVCkpCgkgICAgcHJpbnRmKCJcblx0IFNwbGl0IEJhY2t0cmFja2luZyBsZXZlbCAlZDoiLHByZnNfVmFsaWRMZXZlbChTZWFyY2gpKTsKCX0KCUVtcHR5Q2xhdXNlcyAgICAgICAgICAgID0gbGlzdF9OaWwoKTsKCUhpZ2hlc3RMZXZlbEVtcHR5Q2xhdXNlID0gKENMQVVTRSlOVUxMOwogICAgICB9CiAgICAgIGVsc2UgeyAgIC8qIG5vIGVtcHR5IGNsYXVzZSBmb3VuZCAqLwoKI2lmZGVmIENIRUNLCglpZiAoIXByZnNfQ2hlY2soU2VhcmNoKSkgewoJICBtaXNjX1N0YXJ0RXJyb3JSZXBvcnQoKTsKCSAgbWlzY19FcnJvclJlcG9ydCgiXG4gSW4gdG9wX1Byb29mU2VhcmNoOiBJbGxlZ2FsIHN0YXRlIG9mIHNlYXJjaCBpbiBTUEFTUy5cbiIpOwoJICBtaXNjX0ZpbmlzaEVycm9yUmVwb3J0KCk7Cgl9CglpZiAoIWFuYV9FcXVhdGlvbnMoKSkKCSAgcmVkX0NoZWNrU3BsaXRTdWJzdW1wdGlvbkNvbmRpdGlvbihTZWFyY2gpOwojZW5kaWYgCgoJaWYgKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX0ZVTExSRUQpKQoJICBEZXJpdmFibGVzID0gdG9wX0Z1bGxSZWR1Y3Rpb25TZWxlY3RHaXZlbkNvbXB1dGVEZXJpdmFibGVzKFNlYXJjaCwgJlNwbGl0Q2xhdXNlLCAmQ291bnRlcik7CgllbHNlCgkgIERlcml2YWJsZXMgPSB0b3BfTGF6eVJlZHVjdGlvblNlbGVjdEdpdmVuQ29tcHV0ZURlcml2YWJsZXMoU2VhcmNoLCAmU3BsaXRDbGF1c2UsICZDb3VudGVyKTsKICAgICAgfQoKICAgICAgLyogUHJpbnQgdGhlIGRlcml2ZWQgY2xhdXNlcywgaWYgcmVxdWlyZWQgKi8KICAgICAgaWYgKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX1BERVIpKQoJZm9yIChTY2FuPURlcml2YWJsZXM7ICFsaXN0X0VtcHR5KFNjYW4pOyBTY2FuPWxpc3RfQ2RyKFNjYW4pKSB7CgkgIGZwdXRzKCJcbkRlcml2ZWQ6ICIsIHN0ZG91dCk7IAoJICBjbGF1c2VfUHJpbnQobGlzdF9DYXIoU2NhbikpOwoJfQoKICAgICAgLyogUGFydGl0aW9uIHRoZSBkZXJpdmVkIGNsYXVzZXMgaW50byBlbXB0eSBhbmQgbm9uLWVtcHR5IGNsYXVzZXMgKi8KICAgICAgRGVyaXZhYmxlcyA9IHNwbGl0X0V4dHJhY3RFbXB0eUNsYXVzZXMoRGVyaXZhYmxlcywgJkVtcHR5Q2xhdXNlcyk7CgogICAgICAvKiBBcHBseSByZWR1Y3Rpb24gcnVsZXMgKi8KICAgICAgY2xvY2tfU3RhcnRDb3VudGVyKGNsb2NrX1JFRFVDVElPTik7CiAgICAgIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19GVUxMUkVEKSkgewoJRW1wdHlDbGF1c2VzID0gCgkgIGxpc3RfTmNvbmMoRW1wdHlDbGF1c2VzLAoJCSAgICAgcmVkX0NvbXBsZXRlUmVkdWN0aW9uT25EZXJpdmVkQ2xhdXNlcyhTZWFyY2gsIERlcml2YWJsZXMsCgkJCQkJCQkgICByZWRfQUxMLCBBY3RCb3VuZCwKCQkJCQkJCSAgIEJvdW5kTW9kZSwKCQkJCQkJCSAgIEJvdW5kQXBwbGllZCkpOwogICAgICB9IGVsc2UgewoJRW1wdHlDbGF1c2VzID0KCSAgbGlzdF9OY29uYyhFbXB0eUNsYXVzZXMsCgkJICAgICByZWRfQ29tcGxldGVSZWR1Y3Rpb25PbkRlcml2ZWRDbGF1c2VzKFNlYXJjaCwgRGVyaXZhYmxlcywKCQkJCQkJCSAgIHJlZF9XT1JLRURPRkYsCgkJCQkJCQkgICBBY3RCb3VuZCwgQm91bmRNb2RlLAoJCQkJCQkJICAgQm91bmRBcHBsaWVkKSk7CiAgICAgIH0KICAgICAgY2xvY2tfU3RvcEFkZFBhc3NlZFRpbWUoY2xvY2tfUkVEVUNUSU9OKTsKICAgICAgCgogICAgICBpZiAoIWxpc3RfRW1wdHkoRW1wdHlDbGF1c2VzKSkgewoJSGlnaGVzdExldmVsRW1wdHlDbGF1c2UgPSBzcGxpdF9TbWFsbGVzdFNwbGl0TGV2ZWxDbGF1c2UoRW1wdHlDbGF1c2VzKTsKCWlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19QRU1QVFlDTEFVU0UpKSB7CgkgIGZwdXRzKCJcbkVtcHR5Q2xhdXNlOiAiLCBzdGRvdXQpOwoJICBjbGF1c2VfUHJpbnQoSGlnaGVzdExldmVsRW1wdHlDbGF1c2UpOwoJfQogICAgICB9CiAgICAgIHByZnNfRGVjTG9vcHMoU2VhcmNoKTsKICAgIH0KICAKICAgIGlmIChBY3RCb3VuZCAhPSBmbGFnX0JPVU5EU1RBUlRVTkxJTUlURUQgJiYKCUJvdW5kTW9kZSAhPSBmbGFnX0JPVU5ETU9ERVVOTElNSVRFRCkgewogICAgICBCb3VuZExvb3BzLS07CiAgICAgIGlmIChCb3VuZExvb3BzID09IGZsYWdfQk9VTkRMT09QU01JTikKCUFjdEJvdW5kID0gZmxhZ19CT1VORFNUQVJUVU5MSU1JVEVEOwogICAgICBlbHNlCglBY3RCb3VuZCA9ICpCb3VuZEFwcGxpZWQ7CiAgICAgIGlmICgqQm91bmRBcHBsaWVkICE9IC0xKSB7CglwcmZzX1N3YXBJbmRleGVzKFNlYXJjaCk7CglpZiAgKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLGZsYWdfUEJJTkMpKQoJICBwcmludGYoIlxuXG5cdCAtLS0tIE5ldyBDbGF1c2UgJXMgQm91bmQ6ICUyZCAtLS0tXG4iLAoJCSAoQm91bmRNb2RlPT1mbGFnX0JPVU5ETU9ERVJFU1RSSUNURURCWURFUFRIKSA/ICJUZXJtIERlcHRoIiA6ICJXZWlnaHQiLEFjdEJvdW5kKTsKICAgICAgfQogICAgfQogIH0KICBwcmZzX1NldEVtcHR5Q2xhdXNlcyhTZWFyY2gsIEVtcHR5Q2xhdXNlcyk7CiAgcHJmc19TZXRVc2VkRW1wdHlDbGF1c2VzKFNlYXJjaCwgVXNlZEVtcHR5Q2xhdXNlcyk7CgogIHJldHVybiBTZWFyY2g7Cn0KCgpzdGF0aWMgdm9pZCB0b3BfRmxvdHRlcihpbnQgYXJnYywgY29uc3QgY2hhciogYXJndltdLCBMSVNUIElucHV0Q2xhdXNlcykKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSU5QVVQ6ICAKICBSRVRVUk5TOiBOb3RoaW5nLgogIEVGRkVDVDogIAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnsKICBGSUxFICpPdXRwdXQ7CiAgY2hhciAqZGVzY3JpcHRpb247CiAgY29uc3QgY2hhciAqY3JlYXRvciA9ICJcblx0Q05GIGdlbmVyYXRlZCBieSBGTE9UVEVSICIgbWlzY19WRVJTSU9OICIgKn0iOwogIGludCAgc2l6ZTsKICBpbnQgIGNyZWF0b3Jfc2l6ZTsKCiAgaWYgKGFyZ2MgPCBvcHRzX0luZGljYXRvcigpKzIpCiAgICBPdXRwdXQgPSBzdGRvdXQ7CiAgZWxzZQogICAgT3V0cHV0ID0gbWlzY19PcGVuRmlsZShhcmd2W29wdHNfSW5kaWNhdG9yKCkrMV0sInciKTsKCiAgY3JlYXRvcl9zaXplID0gKGludClzdHJsZW4oY3JlYXRvcik7CiAgc2l6ZSAgICAgICAgPSAoaW50KXN0cmxlbihkZmdfUHJvYmxlbURlc2NyaXB0aW9uKCkpICsgY3JlYXRvcl9zaXplOwogIGRlc2NyaXB0aW9uID0gKGNoYXIqKW1lbW9yeV9NYWxsb2Moc2l6ZW9mKGNoYXIpKnNpemUpOwogIHN0cm5jcHkoZGVzY3JpcHRpb24sZGZnX1Byb2JsZW1EZXNjcmlwdGlvbigpLHNpemUtY3JlYXRvcl9zaXplLTMpOwogIHN0cmNweShkZXNjcmlwdGlvbitzaXplLWNyZWF0b3Jfc2l6ZS0zLCBjcmVhdG9yKTsKCiAgCiAgY2xhdXNlX0ZQcmludENuZkRGR1Byb2JsZW0oT3V0cHV0LCBkZmdfUHJvYmxlbU5hbWUoKSwgZGZnX1Byb2JsZW1BdXRob3IoKSwgCgkJCSAgICAgZGZnX1Byb2JsZW1TdGF0dXNTdHJpbmcoKSwgZGVzY3JpcHRpb24sIElucHV0Q2xhdXNlcyk7CiAgCiAgZnB1dHMoIlxuRkxPVFRFUiBuZWVkZWRcdCIsIHN0ZG91dCk7CiAgY2xvY2tfUHJpbnRUaW1lKGNsb2NrX0lOUFVUKTsKICBwdXRzKCIgZm9yIHRoZSBpbnB1dC4iKTsKICBmcHV0cygiXHRcdCIsIHN0ZG91dCk7CiAgY2xvY2tfUHJpbnRUaW1lKGNsb2NrX0NORik7CiAgZnB1dHMoIiBmb3IgdGhlICBDTkYgdHJhbnNsYXRpb24uIiwgc3Rkb3V0KTsKICAKCiAgaWYgKE91dHB1dCAhPSBzdGRvdXQpCiAgICBtaXNjX0Nsb3NlRmlsZShPdXRwdXQsYXJndltvcHRzX0luZGljYXRvcigpKzFdKTsKICBtZW1vcnlfRnJlZShkZXNjcmlwdGlvbiwgc2l6ZW9mKGNoYXIpKnNpemUpOwp9CgpzdGF0aWMgQk9PTCB0b3BfQ2FsbGVkRmxvdHRlcihjb25zdCBjaGFyKiBDYWxsKQp7CiAgaW50IGxlbmd0aDsKICBsZW5ndGggPSBzdHJsZW4oQ2FsbCk7CiAgcmV0dXJuIHN0cmluZ19FcXVhbCgoQ2FsbCArIChsZW5ndGggPiA3ID8gbGVuZ3RoIC0gNyA6IDApKSwgIkZMT1RURVIiKTsKfQoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIE1haW4gRnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGFyZ3ZbXSkKewogIExJU1QgICAgICAgICAgICAgIElucHV0Q2xhdXNlcyxTY2FuLEF4aW9tcyxDb25qZWN0dXJlcywgU29ydHMsIFF1ZXJ5Q2xhdXNlcywgCiAgICBMYWJlbENsYXVzZXMsIFF1ZXJ5UGFpciwgUHJvYmxlbUNsYXVzZXMsIExhYmVsbGlzdCwgU29ydGxhYmVsbGlzdCwgCiAgICBTeW1ibGlzdCwgVXNlclByZWNlZGVuY2U7CiAgUFJPT0ZTRUFSQ0ggICAgICAgU2VhcmNoLCBGbG90dGVyU2VhcmNoOwogIC8qIDxJbnB1dEZsYWdzPiBhcmUgdGhlIGZsYWdzIGZyb20gdGhlIHByb2JsZW0gZmlsZSBhbmQgdGhlIGNvbW1hbmQgbGluZS4gKi8KICBGTEFHU1RPUkUgICAgICAgICBJbnB1dEZsYWdzLCBGbGFnczsKICAvKiA8SW5wdXRQcmVjZWRlbmNlPiBpcyB0aGUgcHJlY2VkZW5jZSBhZnRlciByZWFkaW5nIHRoZSBwcm9ibGVtIGZpbGUuICovCiAgUFJFQ0VERU5DRSAgICAgICAgSW5wdXRQcmVjZWRlbmNlLCBQcmVjZWRlbmNlOwogIEZJTEUqICAgICAgICAgICAgIElucHV0U3RyZWFtOyAKICBIQVNIICAgICAgICAgICAgICBUZXJtTGFiZWxUb0NsYXVzZWxpc3QsIENsYXVzZVRvVGVybUxhYmVsbGlzdDsKICB0b3BfU0VBUkNIUkVTVUxUICBSZXN1bHQ7CgogIFNlYXJjaCA9IChQUk9PRlNFQVJDSClOVUxMOwogIAojaWYgKGRlZmluZWQoU1BBU1NfU0lHTkFMUykpCiAgdG9wX1BST09GU0VBUkNIID0gJlNlYXJjaDsKICBzaWduYWwoU0lHSU5ULCB0b3BfU2lnSGFuZGxlcik7CiAgc2lnbmFsKFNJR1RFUk0sIHRvcF9TaWdIYW5kbGVyKTsKICBzaWduYWwoU0lHU0VHViwgdG9wX1NpZ0hhbmRsZXIpOwogIHNpZ25hbChTSUdCVVMsIHRvcF9TaWdIYW5kbGVyKTsKI2VuZGlmCgogIGNsb2NrX0luaXQoKTsKICBjbG9ja19TdGFydENvdW50ZXIoY2xvY2tfT1ZFUkFMTCk7CiAgbWVtb3J5X0luaXQobWVtb3J5X19VTkxJTUlURUQpOwogIGF0ZXhpdChtZW1vcnlfRnJlZUFsbE1lbSk7CiAgc3ltYm9sX0luaXQoVFJVRSk7CiAgc3RhY2tfSW5pdCgpOwogIGhhc2hfSW5pdCgpOwogIHNvcnRfSW5pdCgpOwogIHRlcm1fSW5pdCgpOwoKICBJbnB1dFByZWNlZGVuY2UgPSBzeW1ib2xfQ3JlYXRlUHJlY2VkZW5jZSgpOwogIGZvbF9Jbml0KFRSVUUsIElucHV0UHJlY2VkZW5jZSk7CiAgY29udF9Jbml0KCk7CiAgdW5pZnlfSW5pdCgpOwogIGZsYWdfSW5pdCgpOwogIHN1YnNfSW5pdCgpOwogIGNsYXVzZV9Jbml0KCk7CiAgcmVkX0luaXQoKTsKICByZW5fSW5pdCgpOwogIGRwX0luaXQoKTsKICBvcHRzX0luaXQoKTsKICBhbmFfSW5pdCgpOwogIGNjX0luaXQoKTsKCiAgLyogQnVpbGQgcHJvb2Ygc2VhcmNoIG9iamVjdCB0byBzdG9yZSBkZWZpbml0aW9ucyBpbiAqLwogIFNlYXJjaCAgICAgID0gcHJmc19DcmVhdGUoKTsKICBJbnB1dEZsYWdzICA9IGZsYWdfQ3JlYXRlU3RvcmUoKTsKCiAgLyogZGVjbGFyZSBhbGwgb3B0aW9ucyAqLwogIG9wdHNfRGVjbGFyZVNQQVNTRmxhZ3NBc09wdGlvbnMoKTsKICB0b3BfUmVtb3ZlRmlsZU9wdElkID0gb3B0c19EZWNsYXJlKCJyZiIsIG9wdHNfTk9BUkdUWVBFKTsKCiAgaWYgKCFvcHRzX1JlYWQoYXJnYywgYXJndikpIAogICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKCiAgIC8qIENoZWNrIHdoZXRoZXIgZmxhZ19TVERJTiBpcyBzZXQgaW4gdGhlIGNvbW1hbmQgbGluZSAqLwogIGZsYWdfSW5pdFN0b3JlQnlEZWZhdWx0cyhJbnB1dEZsYWdzKTsKICBvcHRzX1NldEZsYWdzKElucHV0RmxhZ3MpOwoKICBpZiAoYXJnYyA8IG9wdHNfSW5kaWNhdG9yKCkrMSAmJiAhZmxhZ19HZXRGbGFnVmFsdWUoSW5wdXRGbGFncyxmbGFnX1NURElOKSkgewogICAgLyogTm8gaW5wdXQgZmlsZSwgbm8gc3RkaW4gaW5wdXQgKi8KICAgIHByaW50ZigiXG5cdCAgICAgICAgICAlcyAlcyIsYXJndlswXSxtaXNjX1ZFUlNJT04pOwogICAgaWYgKHRvcF9DYWxsZWRGbG90dGVyKGFyZ3ZbMF0pIHx8CglmbGFnX0dldEZsYWdWYWx1ZShJbnB1dEZsYWdzLCBmbGFnX0ZMT1RURVIpKQogICAgICBwdXRzKCJcblx0ICAgICAgIFVzYWdlOiBGTE9UVEVSIFtvcHRpb25zXSBbPGlucHV0LWZpbGU+XSBbPG91dHB1dC1maWxlPl1cbiIpOwogICAgZWxzZQogICAgICBwdXRzKCJcblx0ICAgICAgIFVzYWdlOiBTUEFTUyBbb3B0aW9uc10gWzxpbnB1dC1maWxlPl0gXG4iKTsKICAgIHB1dHMoIlBvc3NpYmxlIG9wdGlvbnM6XG4iKTsKICAgIG9wdHNfUHJpbnRTUEFTU05hbWVzKCk7IAogICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKICB9CiAgRmxvdHRlclNlYXJjaCA9IE5VTEw7CgogIEF4aW9tcyA9IENvbmplY3R1cmVzID0gU29ydHMgPSBMYWJlbGxpc3QgPSBTb3J0bGFiZWxsaXN0ID0gVXNlclByZWNlZGVuY2UgPSBsaXN0X05pbCgpOwogIAogIGlmIChmbGFnX0dldEZsYWdWYWx1ZShJbnB1dEZsYWdzLCBmbGFnX1NURElOKSkgewogICAgdG9wX0lucHV0RmlsZSA9IChjaGFyKilOVUxMOwogICAgSW5wdXRTdHJlYW0gICA9IHN0ZGluOwogIH0gZWxzZSB7CiAgICB0b3BfSW5wdXRGaWxlID0gYXJndltvcHRzX0luZGljYXRvcigpXTsKICAgIElucHV0U3RyZWFtID0gbWlzY19PcGVuRmlsZSh0b3BfSW5wdXRGaWxlLCAiciIpOwogIH0KICAKICBjbG9ja19TdGFydENvdW50ZXIoY2xvY2tfSU5QVVQpOwogIGZsYWdfQ2xlYW5TdG9yZShJbnB1dEZsYWdzKTsgIC8qIE1hcmsgYWxsIGZsYWdzIGFzIHVuc2V0ICovCgogIC8qIE5vdyBhZGQgZmxhZ3MgZnJvbSBmaWxlIHRvIElucHV0RmxhZ3MgYW5kIHNldCBwcmVjZWRlbmNlICovCiAgSW5wdXRDbGF1c2VzID0gZGZnX0RGR1BhcnNlcihJbnB1dFN0cmVhbSwgSW5wdXRGbGFncywgSW5wdXRQcmVjZWRlbmNlLCAmQXhpb21zLAoJCQkgICAgICAgJkNvbmplY3R1cmVzLCAmU29ydHMsICZVc2VyUHJlY2VkZW5jZSk7IAoKICAvKiBBZGQvb3ZlcndyaXRlIHdpdGggY29tbWFuZCBsaW5lIGZsYWdzICovCiAgb3B0c19TZXRGbGFncyhJbnB1dEZsYWdzKTsKICBGbGFncyAgICAgID0gcHJmc19TdG9yZShTZWFyY2gpOwogIFByZWNlZGVuY2UgPSBwcmZzX1ByZWNlZGVuY2UoU2VhcmNoKTsKICAvKiBUaGUgRmxhZ3Mgd2VyZSBpbml0aWFsaXplZCB3aXRoIHRoZSBkZWZhdWx0IGZsYWcgdmFsdWVzLiAgKi8KICAvKiBUaGlzIHZhbHVlcyBhcmUgbm93IG92ZXJ3cml0dGVuIGJ5IGNvbW1hbmQgbGluZSBmbGFncyBhbmQgZmxhZ3MgKi8KICAvKiBmcm9tIHRoZSBpbnB1dCBmaWxlLiAqLwogIGZsYWdfVHJhbnNmZXJTZXRGbGFncyhJbnB1dEZsYWdzLCBGbGFncyk7CiAgLyogRnJvbSBub3cgb24gdGhlIGlucHV0IGZsYWdzIGFyZSBub3QgY2hhbmdlZCEgKi8KCiAgLyogVHJhbnNmZXIgaW5wdXQgcHJlY2VkZW5jZSB0byBzZWFyY2ggb2JqZWN0ICovCiAgc3ltYm9sX1RyYW5zZmVyUHJlY2VkZW5jZShJbnB1dFByZWNlZGVuY2UsIFByZWNlZGVuY2UpOwoKCiAgLyogQ29tcGxhaW4gYWJvdXQgbWlzc2luZyBpbnB1dCBjbGF1c2VzL2Zvcm11bGFlIHdoZW4gaW4gKi8KICAvKiBub24taW50ZXJhY3RpdmUgbW9kZSAqLwogIGlmICghZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfSU5URVJBQ1RJVkUpICYmIGxpc3RfRW1wdHkoQXhpb21zKSAmJgogICAgICBsaXN0X0VtcHR5KENvbmplY3R1cmVzKSAmJiBsaXN0X0VtcHR5KElucHV0Q2xhdXNlcykpIHsKICAgIG1pc2NfU3RhcnRVc2VyRXJyb3JSZXBvcnQoKTsKICAgIG1pc2NfVXNlckVycm9yUmVwb3J0KCJcbiBObyBmb3JtdWxhZSBhbmQgY2xhdXNlcyBmb3VuZCBpbiBpbnB1dCBmaWxlIVxuIik7CiAgICBtaXNjX0ZpbmlzaFVzZXJFcnJvclJlcG9ydCgpOwogIH0KCiAgY25mX0luaXQoRmxhZ3MpOyAgLyogRGVwZW5kcyBvbiBTdHJvbmcgU2tvbGVtaXphdGlvbiBGbGFnICovCgogIC8qIERvY1Byb29mIGlzIHJlcXVpcmVkIGZvciBpbnRlcmFjdGl2ZSBtb2RlICovCiAgaWYgKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX0lOVEVSQUNUSVZFKSkgewogICAgZmxhZ19TZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfRE9DUFJPT0YsIGZsYWdfRE9DUFJPT0ZPTik7CiAgfQoKICBpZiAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfRE9DUFJPT0YpKQogICAgcHJmc19BZGREb2NQcm9vZlNoYXJpbmdJbmRleChTZWFyY2gpOwoKICAvKiBDcmVhdGUgbmVjZXNzYXJ5IGhhc2hhcnJheXMgKi8KICBpZiAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfRE9DUFJPT0YpKSB7CiAgICBUZXJtTGFiZWxUb0NsYXVzZWxpc3QgPSBoc2hfQ3JlYXRlKCk7CiAgICBDbGF1c2VUb1Rlcm1MYWJlbGxpc3QgPSBoc2hfQ3JlYXRlKCk7CiAgfQogIGVsc2UgewogICAgVGVybUxhYmVsVG9DbGF1c2VsaXN0ID0gTlVMTDsKICAgIENsYXVzZVRvVGVybUxhYmVsbGlzdCA9IE5VTEw7CiAgfQogIAogIC8qIEJ1aWxkIGNvbmplY3R1cmUgZm9ybXVsYSBhbmQgbmVnYXRlIGl0OiBDb25qZWN0dXJlcyBhcmUgdGFrZW4gZGlzanVuY3RpdmVseSEhKi8KICBmb3IgKFNjYW4gPSBDb25qZWN0dXJlczsgIWxpc3RfRW1wdHkoU2Nhbik7IFNjYW4gPSBsaXN0X0NkcihTY2FuKSkKICAgIGxpc3RfUnBsYWNkKGxpc3RfQ2FyKFNjYW4pLCAoTElTVCl0ZXJtX0NyZWF0ZShmb2xfTm90KCksIAoJCQkJCQkgIGxpc3RfTGlzdChsaXN0X1BhaXJTZWNvbmQobGlzdF9DYXIoU2NhbikpKSkpOwoKICBjbG9ja19TdG9wUGFzc2VkVGltZShjbG9ja19JTlBVVCk7CgogIGlmICh0b3BfSW5wdXRGaWxlKSB7CiAgICBtaXNjX0Nsb3NlRmlsZShJbnB1dFN0cmVhbSx0b3BfSW5wdXRGaWxlKTsKICAgIGlmIChvcHRzX0lzU2V0KHRvcF9SZW1vdmVGaWxlT3B0SWQpKQogICAgICByZW1vdmUodG9wX0lucHV0RmlsZSk7CiAgfQoKICBjbG9ja19TdGFydENvdW50ZXIoY2xvY2tfQ05GKTsKCiAgaWYgKGxpc3RfRW1wdHkoSW5wdXRDbGF1c2VzKSkgewogICAgTkFUIFRlcm1jb3VudDsKCiAgICBUZXJtY291bnQgID0gMDsKICAgIAogICAgLyogQ3JlYXRlIGxhYmVscyBmb3IgZm9ybXVsYWUgd2l0aG91dCB0aGVtICovCiAgICBmb3IgKFNjYW4gPSBBeGlvbXM7ICFsaXN0X0VtcHR5KFNjYW4pOyBTY2FuID0gbGlzdF9DZHIoU2NhbiksIFRlcm1jb3VudCsrKSB7CiAgICAgIGlmIChsaXN0X1BhaXJGaXJzdChsaXN0X0NhcihTY2FuKSkgPT0gTlVMTCkgewoJY2hhciBMWzEwMF07CgljaGFyKiBMYWJlbDsKCXNwcmludGYoTCwgImF4aW9tJWQiLCBUZXJtY291bnQpOwoJTGFiZWwgPSBzdHJpbmdfU3RyaW5nQ29weShMKTsKCWxpc3RfUnBsYWNhKGxpc3RfQ2FyKFNjYW4pLCBMYWJlbCk7CglpZiAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfRE9DUFJPT0YpICYmCgkgICAgZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfUExBQkVMUykpIHsKCSAgcHJpbnRmKCJcbkFkZGVkIGxhYmVsICVzIGZvciBheGlvbSBcbiIsIExhYmVsKTsKCSAgZm9sX1ByZXR0eVByaW50REZHKChURVJNKSBsaXN0X1BhaXJTZWNvbmQobGlzdF9DYXIoU2NhbikpKTsKCX0KICAgICAgfQogICAgfQogICAgVGVybWNvdW50ICA9IDA7CiAgICBmb3IgKFNjYW4gPSBTb3J0czsgIWxpc3RfRW1wdHkoU2Nhbik7IFNjYW4gPSBsaXN0X0NkcihTY2FuKSkgewogICAgICBjaGFyIExbMTAwXTsKICAgICAgY2hhciogTGFiZWw7CiAgICAgIHNwcmludGYoTCwgImRlY2xhcmF0aW9uJWQiLCBUZXJtY291bnQpOwogICAgICBMYWJlbCA9IHN0cmluZ19TdHJpbmdDb3B5KEwpOwogICAgICBsaXN0X1JwbGFjYShsaXN0X0NhcihTY2FuKSwgTGFiZWwpOwogICAgICBpZiAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfRE9DUFJPT0YpICYmCgkgIGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX1BMQUJFTFMpKSB7CglwcmludGYoIlxuQWRkZWQgbGFiZWwgJXMgZm9yIGRlY2xhcmF0aW9uIFxuIiwgTGFiZWwpOwoJZm9sX1ByZXR0eVByaW50REZHKChURVJNKSBsaXN0X1BhaXJTZWNvbmQobGlzdF9DYXIoU2NhbikpKTsKICAgICAgfQogICAgICBTb3J0bGFiZWxsaXN0ID0gbGlzdF9Db25zKExhYmVsLCBTb3J0bGFiZWxsaXN0KTsKICAgIH0KICAgIEF4aW9tcyA9IGxpc3RfTmNvbmMoQXhpb21zLCBTb3J0cyk7CgoKICAgIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19BUFBMWURFRlMpICE9IGZsYWdfQVBQTFlERUZTT0ZGKSB7CiAgICAgIGRlZl9FeHRyYWN0RGVmc0Zyb21UZXJtbGlzdChTZWFyY2gsIEF4aW9tcywgQ29uamVjdHVyZXMpOyAKICAgICAgQ29uamVjdHVyZXMgPSBkZWZfQXBwbHlEZWZpbml0aW9uVG9UZXJtTGlzdChwcmZzX0RlZmluaXRpb25zKFNlYXJjaCksCgkJCQkJCSAgQ29uamVjdHVyZXMsIEZsYWdzLAoJCQkJCQkgIFByZWNlZGVuY2UpOwogICAgfQoKICAgIC8qIFdlIG11c3Qga2VlcCB0aGUgbGlzdCBvZiBzeW1ib2xzIGJlY2F1c2UgdGhleSBjYW4ndCBiZSBmcmVlZCBpbiBjbmZfRmxvdHRlciAqLwogICAgU3ltYmxpc3QgPSBsaXN0X05pbCgpOwoKICAgIC8qIEF4aW9tcyBpcyBsaXN0IG9mIHBhaXJzLCBjb25qZWN0dXJlcyBpcyBsaXN0IG9mIHRlcm1zICovCiAgICAvKiBBIFByb29mU2VhcmNoIG9iamVjdCBpcyBvbmx5IHJldHVybmVkIGFuZCB0aGUgc3ltYm9scyBrZXB0IGluIFN5bWJsaXN0CiAgICAgICBpZiBmbGFnX0lOVEVSQUNUSVZFIGlzIHNldCAqLwogICAgRmxvdHRlclNlYXJjaCA9IGNuZl9GbG90dGVyKEF4aW9tcyxDb25qZWN0dXJlcywmSW5wdXRDbGF1c2VzLCAmTGFiZWxsaXN0LAoJCQkJVGVybUxhYmVsVG9DbGF1c2VsaXN0LCBDbGF1c2VUb1Rlcm1MYWJlbGxpc3QsCgkJCQlGbGFncywgUHJlY2VkZW5jZSwgJlN5bWJsaXN0KTsKCiAgICBJbnB1dENsYXVzZXMgPSBjbGF1c2VfTGlzdFNvcnRXZWlnaGVkKElucHV0Q2xhdXNlcyk7CiAgICBjbGF1c2VfU2V0Q291bnRlcigxKTsKICAgIGZvciAoU2NhbiA9IElucHV0Q2xhdXNlczsgIWxpc3RfRW1wdHkoU2Nhbik7IFNjYW4gPSBsaXN0X0NkcihTY2FuKSkgewogICAgICBjbGF1c2VfTmV3TnVtYmVyKGxpc3RfQ2FyKFNjYW4pKTsKICAgIH0KICB9CiAgZWxzZSB7CiAgICBkZmdfRGVsZXRlRm9ybXVsYVBhaXJMaXN0KEF4aW9tcyk7CiAgICBkZmdfRGVsZXRlRm9ybXVsYVBhaXJMaXN0KFNvcnRzKTsKICAgIGRmZ19EZWxldGVGb3JtdWxhUGFpckxpc3QoQ29uamVjdHVyZXMpOwogICAgaWYgKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX0FQUExZREVGUykgIT0gZmxhZ19BUFBMWURFRlNPRkYpIHsKICAgICAgLyogRXh0cmFjdCBsaXN0IG9mIGRlZmluaXRpb25zICovCiAgICAgIGRlZl9FeHRyYWN0RGVmc0Zyb21DbGF1c2VsaXN0KFNlYXJjaCwgSW5wdXRDbGF1c2VzKTsKICAgICAgZGVmX0ZsYXR0ZW5EZWZpbml0aW9uc0Rlc3RydWN0aXZlKFNlYXJjaCk7CiAgICAgIGZvciAoU2Nhbj1wcmZzX0RlZmluaXRpb25zKFNlYXJjaCk7ICFsaXN0X0VtcHR5KFNjYW4pOyBTY2FuPWxpc3RfQ2RyKFNjYW4pKQoJSW5wdXRDbGF1c2VzID0gZGVmX0FwcGx5RGVmVG9DbGF1c2VsaXN0KFNlYXJjaCwgKERFRikgbGlzdF9DYXIoU2NhbiksCgkJCQkJCUlucHV0Q2xhdXNlcywgVFJVRSk7CiAgICB9CiAgfQoKICBjbG9ja19TdG9wUGFzc2VkVGltZShjbG9ja19DTkYpOwoKICBpZiAodG9wX0NhbGxlZEZsb3R0ZXIoYXJndlswXSkgfHwgZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfRkxPVFRFUikpIHsKICAgIHRvcF9GbG90dGVyKGFyZ2MsYXJndixJbnB1dENsYXVzZXMpOwogICAgZmxhZ19TZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfVElNRUxJTUlULCAgIDApOyAgICAgICAvKiBFeGl0IE5vIE91dHB1dCAqLwogICAgZmxhZ19TZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfSU5URVJBQ1RJVkUsIGZsYWdfSU5URVJBQ1RJVkVPRkYpOwogICAgZmxhZ19TZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfUFBST0JMRU0sICAgIGZsYWdfUFBST0JMRU1PRkYpOwogIH0KCiAgbWVtb3J5X1Jlc3RyaWN0KGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX01FTU9SWSkpOwoKICBkbyB7CiAgICBMSVNUIGRlZmxpc3Q7CiAgICBpbnQgIEJvdW5kQXBwbGllZDsKICAgIFByb2JsZW1DbGF1c2VzID0gbGlzdF9OaWwoKTsKICAgIExhYmVsQ2xhdXNlcyAgID0gbGlzdF9OaWwoKTsKICAgIFJlc3VsdCAgICAgICAgID0gdG9wX1JFU09VUkNFOwoKICAgIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19JTlRFUkFDVElWRSkpIHsKICAgICAgUXVlcnlQYWlyID0gaWFfR2V0TmV4dFJlcXVlc3QoSW5wdXRTdHJlYW0sIEZsYWdzKTsKICAgICAgLyogQSBwYWlyICg8Zm9ybXVsYSxsYWJlbGxpc3Q+KSAqLwogICAgICAvKiBHZXQgbGlzdCBvZiBjbGF1c2VzIGRlcml2YWJsZSBmcm9tIGZvcm11bGFlIHdpdGggbGFiZWxzIGluIGxhYmVsbGlzdCAqLwogICAgICBpZiAobGlzdF9FbXB0eShRdWVyeVBhaXIpKSB7CglicmVhazsKICAgICAgfQogICAgICBmb3IgKFNjYW49bGlzdF9QYWlyU2Vjb25kKFF1ZXJ5UGFpcik7IWxpc3RfRW1wdHkoU2Nhbik7U2Nhbj1saXN0X0NkcihTY2FuKSkgewoJTElTVCBsOwoJbCA9IGhzaF9HZXRXaXRoQ29tcGFyZUZ1bmMoVGVybUxhYmVsVG9DbGF1c2VsaXN0LCBsaXN0X0NhcihTY2FuKSwKCQkJCSAgIChCT09MICgqKShQT0lOVEVSLCBQT0lOVEVSKSkgY25mX0xhYmVsRXF1YWwsCgkJCQkgICAodW5zaWduZWQgbG9uZyAoKikoUE9JTlRFUikpIGhzaF9TdHJpbmdIYXNoS2V5KTsKCglsID0gbGlzdF9Qb2ludGVyRGVsZXRlRHVwbGljYXRlcyhsaXN0X0NvcHkobCkpOwoJTGFiZWxDbGF1c2VzID0gbGlzdF9OY29uYyhsLCBMYWJlbENsYXVzZXMpOwogICAgICB9CiAgICAgIC8qIEdldCBsaXN0IG9mIGNsYXVzZXMgZGVyaXZhYmxlIGZyb20gc29ydHMgKi8KICAgICAgZm9yIChTY2FuPVNvcnRsYWJlbGxpc3Q7ICFsaXN0X0VtcHR5KFNjYW4pOyBTY2FuPWxpc3RfQ2RyKFNjYW4pKSB7CglMSVNUIGw7CglsID0gaHNoX0dldFdpdGhDb21wYXJlRnVuYyhUZXJtTGFiZWxUb0NsYXVzZWxpc3QsIGxpc3RfQ2FyKFNjYW4pLAoJCQkJICAgKEJPT0wgKCopKFBPSU5URVIsIFBPSU5URVIpKSBjbmZfTGFiZWxFcXVhbCwKCQkJCSAgICh1bnNpZ25lZCBsb25nICgqKShQT0lOVEVSKSkgaHNoX1N0cmluZ0hhc2hLZXkpOwoKCWwgPSBsaXN0X1BvaW50ZXJEZWxldGVEdXBsaWNhdGVzKGxpc3RfQ29weShsKSk7CglMYWJlbENsYXVzZXMgPSBsaXN0X05jb25jKGwsIExhYmVsQ2xhdXNlcyk7CiAgICAgIH0JCgogICAgICAvKiBGb3IgbGFiZWxjbGF1c2VzIGNvcGllcyBhcmUgaW50cm9kdWNlZCAqLwogICAgICAvKiBTbyBhbiB1cGRhdGUgdG8gdGhlIGNsYXVzZSB0byB0ZXJtIG1hcHBpbmcgaXMgbmVjZXNzYXJ5ICovCiAgICAgIGZvciAoU2Nhbj1MYWJlbENsYXVzZXM7ICFsaXN0X0VtcHR5KFNjYW4pOyBTY2FuPWxpc3RfQ2RyKFNjYW4pKSB7CglDTEFVU0UgQzsKCUxJU1QgbDsKCUMgPSAoQ0xBVVNFKSBsaXN0X0NhcihTY2FuKTsKCWwgPSBsaXN0X0NvcHkoaHNoX0dldChDbGF1c2VUb1Rlcm1MYWJlbGxpc3QsIEMpKTsKCWwgPSBjbmZfRGVsZXRlRHVwbGljYXRlTGFiZWxzRnJvbUxpc3QobCk7CglsaXN0X1JwbGFjYShTY2FuLCBjbGF1c2VfQ29weShDKSk7Cgloc2hfUHV0TGlzdChDbGF1c2VUb1Rlcm1MYWJlbGxpc3QsIGxpc3RfQ2FyKFNjYW4pLCBsKTsKICAgICAgfQogICAgICBRdWVyeUNsYXVzZXMgICA9IGNuZl9RdWVyeUZsb3R0ZXIoRmxvdHRlclNlYXJjaCwgbGlzdF9QYWlyRmlyc3QoUXVlcnlQYWlyKSwKCQkJCQkmU3ltYmxpc3QpOwogICAgICBQcm9ibGVtQ2xhdXNlcyA9IGxpc3RfTmNvbmMoUXVlcnlDbGF1c2VzLCBMYWJlbENsYXVzZXMpOwoKICAgICAgZm9yIChTY2FuPWxpc3RfUGFpclNlY29uZChRdWVyeVBhaXIpOyAhbGlzdF9FbXB0eShTY2FuKTsgU2Nhbj0gbGlzdF9DZHIoU2NhbikpCglzdHJpbmdfU3RyaW5nRnJlZShsaXN0X0NhcihTY2FuKSk7IC8qIEZyZWUgdGhlIGxhYmVsIHN0cmluZ3MgKi8KICAgICAgbGlzdF9EZWxldGUobGlzdF9QYWlyU2Vjb25kKFF1ZXJ5UGFpcikpOwogICAgICBsaXN0X1BhaXJGcmVlKFF1ZXJ5UGFpcik7CiAgICAgIGNsb2NrX0luaXRDb3VudGVyKGNsb2NrX09WRVJBTEwpOwogICAgICBjbG9ja19TdGFydENvdW50ZXIoY2xvY2tfT1ZFUkFMTCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgUHJvYmxlbUNsYXVzZXMgPSBJbnB1dENsYXVzZXM7CiAgICAgIElucHV0Q2xhdXNlcyAgID0gbGlzdF9OaWwoKTsKICAgIH0KCgogICAgcHJmc19TZXRTcGxpdENvdW50ZXIoU2VhcmNoLGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX1NQTElUUykpOwogICAgcHJmc19TZXRMb29wcyhTZWFyY2gsZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfTE9PUFMpKTsKICAgIHByZnNfU2V0QmFja3RyYWNrZWRDbGF1c2VzKFNlYXJjaCwgMCk7CiAgICBCb3VuZEFwcGxpZWQgPSAtMTsKICAgIFNlYXJjaCA9IHRvcF9Qcm9vZlNlYXJjaChTZWFyY2gsIFByb2JsZW1DbGF1c2VzLCBJbnB1dEZsYWdzLCBVc2VyUHJlY2VkZW5jZSwgJkJvdW5kQXBwbGllZCk7CiAgCiAgICBpZiAoKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX1RJTUVMSU1JVCkgPT0gZmxhZ19USU1FTElNSVRVTkxJTUlURUQgfHwKCSBmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19USU1FTElNSVQpID4gY2xvY2tfR2V0U2Vjb25kcyhjbG9ja19PVkVSQUxMKSkgJiYKCXByZnNfTG9vcHMoU2VhcmNoKSAhPSAwICYmCgkoQm91bmRBcHBsaWVkID09IC0xIHx8ICFsaXN0X0VtcHR5KHByZnNfRW1wdHlDbGF1c2VzKFNlYXJjaCkpKSkgewogICAgICBpZiAobGlzdF9FbXB0eShwcmZzX0VtcHR5Q2xhdXNlcyhTZWFyY2gpKSkKCVJlc3VsdCA9IHRvcF9DT01QTEVUSU9OOwogICAgICBlbHNlCglSZXN1bHQgPSB0b3BfUFJPT0Y7CiAgICB9CiAgIAogICAgaWYgKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX1RJTUVMSU1JVCkgIT0gMCkgewogICAgICAvKiBTdG9wIFNQQVNTIGltbWVkaWF0ZWx5ICovCiAgICAgIHByaW50ZigiXG5TUEFTUyAlcyAiLCBtaXNjX1ZFUlNJT04pOwogICAgICBmcHV0cygiXG5TUEFTUyBiZWlzZWl0ZTogIiwgc3Rkb3V0KTsKICAgICAgc3dpdGNoIChSZXN1bHQpIHsKICAgICAgY2FzZSB0b3BfUkVTT1VSQ0U6CglpZiAocHJmc19Mb29wcyhTZWFyY2gpICE9IDApCgkgIGZwdXRzKCJSYW4gb3V0IG9mIHRpbWUuIiwgc3Rkb3V0KTsKCWVsc2UKCSAgZnB1dHMoIk1heGltYWwgbnVtYmVyIG9mIGxvb3BzIGV4Y2VlZGVkLiIsIHN0ZG91dCk7CglicmVhazsKICAgICAgY2FzZSB0b3BfUFJPT0Y6CglmcHV0cygiUHJvb2YgZm91bmQuIiwgc3Rkb3V0KTsKCWJyZWFrOwogICAgICBkZWZhdWx0OiAgICAgICAgLyogQ29tcGxldGlvbiAqLwoJZnB1dHMoIkNvbXBsZXRpb24gZm91bmQuIiwgc3Rkb3V0KTsKICAgICAgfQogICAgICBwcmludGYoIlxuUHJvYmxlbTogJXMgIiwKCSAgICAgKHRvcF9JbnB1dEZpbGUgIT0gKGNoYXIqKU5VTEwgPyB0b3BfSW5wdXRGaWxlIDogIlJlYWQgZnJvbSBzdGRpbi4iKSk7CiAgICAgIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19QU1RBVElTVElDKSkgewoJY2xvY2tfU3RvcFBhc3NlZFRpbWUoY2xvY2tfT1ZFUkFMTCk7CglwcmludGYoIlxuU1BBU1MgZGVyaXZlZCAlZCBjbGF1c2VzLCIsIHByZnNfRGVyaXZlZENsYXVzZXMoU2VhcmNoKSk7CglwcmludGYoIiBiYWNrdHJhY2tlZCAlZCBjbGF1c2VzIiwgcHJmc19CYWNrdHJhY2tlZENsYXVzZXMoU2VhcmNoKSk7CglwcmludGYoIiBhbmQga2VwdCAlZCBjbGF1c2VzLiIsIHByZnNfS2VwdENsYXVzZXMoU2VhcmNoKSk7CglwcmludGYoIlxuU1BBU1MgYWxsb2NhdGVkICVsdSBLQnl0ZXMuIiwgbWVtb3J5X0RlbWFuZGVkQnl0ZXMoKS8xMDI0KTsKCWZwdXRzKCJcblNQQVNTIHNwZW50XHQiLCBzdGRvdXQpOwoJY2xvY2tfUHJpbnRUaW1lKGNsb2NrX09WRVJBTEwpOwoJZnB1dHMoIiBvbiB0aGUgcHJvYmxlbS5cblx0XHQiLCBzdGRvdXQpOwoJY2xvY2tfUHJpbnRUaW1lKGNsb2NrX0lOUFVUKTsKCWZwdXRzKCIgZm9yIHRoZSBpbnB1dC5cblx0XHQiLCBzdGRvdXQpOwoJY2xvY2tfUHJpbnRUaW1lKGNsb2NrX0NORik7CglmcHV0cygiIGZvciB0aGUgRkxPVFRFUiBDTkYgdHJhbnNsYXRpb24uXG5cdFx0Iiwgc3Rkb3V0KTsKCWNsb2NrX1ByaW50VGltZShjbG9ja19JTkZFUkVOQ0UpOwoJZnB1dHMoIiBmb3IgaW5mZXJlbmNlcy5cblx0XHQiLCBzdGRvdXQpOwogICAgICAgIGNsb2NrX1ByaW50VGltZShjbG9ja19CQUNLVFJBQ0spOwoJZnB1dHMoIiBmb3IgdGhlIGJhY2t0cmFja2luZy5cblx0XHQiLCBzdGRvdXQpOwoJY2xvY2tfUHJpbnRUaW1lKGNsb2NrX1JFRFVDVElPTik7CglwdXRzKCIgZm9yIHRoZSByZWR1Y3Rpb24uIik7CiAgICAgIH0KICAgICAgaWYgKFJlc3VsdCAhPSB0b3BfUFJPT0YgJiYKCSAgZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfRlBNT0RFTCkgIT0gZmxhZ19GUE1PREVMT0ZGKSB7CglGSUxFICpPdXRwdXQ7CgljaGFyIG5hbWVbMTAwXTsKCWNvbnN0IGNoYXIgKiBjcmVhdG9yID0gInsqU1BBU1MgIiBtaXNjX1ZFUlNJT04gIiAqfSI7CglCT09MIFByaW50UG90UHJvZHVjdGl2ZTsKCglzdHJjcHkobmFtZSwgKHRvcF9JbnB1dEZpbGUgIT0gKGNoYXIqKU5VTEwgPyB0b3BfSW5wdXRGaWxlIDogIlNQQVNTIikpOwoJaWYgKFJlc3VsdCA9PSB0b3BfQ09NUExFVElPTikKCSAgc3RyY2F0KG5hbWUsICIubW9kZWwiKTsKCWVsc2UKCSAgc3RyY2F0KG5hbWUsICIuY2xhdXNlcyIpOwoJT3V0cHV0ID0gbWlzY19PcGVuRmlsZShuYW1lLCJ3Iik7CglQcmludFBvdFByb2R1Y3RpdmUgPSAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfRlBNT0RFTCkgPT0KCQkJICAgICAgZmxhZ19GUE1PREVMUE9URU5USUFMTFlQUk9EVUNUSVZFQ0xBVVNFUyk7CglpZiAoUmVzdWx0ID09IHRvcF9DT01QTEVUSU9OKQoJICBjbGF1c2VfRlByaW50Q25mRm9ybXVsYXNERkdQcm9ibGVtKE91dHB1dCwgUHJpbnRQb3RQcm9kdWN0aXZlLAoJCQkJCSAgICAgInsqQ29tcGxldGlvbl9ieV9TUEFTUyp9IiwKCQkJCQkgICAgIGNyZWF0b3IsICJzYXRpc2ZpYWJsZSIsCgkJCQkJICAgICBkZmdfUHJvYmxlbURlc2NyaXB0aW9uKCksCgkJCQkJICAgICBwcmZzX1dvcmtlZE9mZkNsYXVzZXMoU2VhcmNoKSwKCQkJCQkgICAgIGxpc3RfTmlsKCksIEZsYWdzLCBQcmVjZWRlbmNlKTsKCWVsc2UKCSAgY2xhdXNlX0ZQcmludENuZkZvcm11bGFzREZHUHJvYmxlbShPdXRwdXQsIFByaW50UG90UHJvZHVjdGl2ZSwKCQkJCQkgICAgICJ7KkNsYXVzZXNfZ2VuZXJhdGVkX2J5X1NQQVNTKn0iLAoJCQkJCSAgICAgY3JlYXRvciwgInVua25vd24iLAoJCQkJCSAgICAgZGZnX1Byb2JsZW1EZXNjcmlwdGlvbigpLAoJCQkJCSAgICAgcHJmc19Xb3JrZWRPZmZDbGF1c2VzKFNlYXJjaCksCgkJCQkJICAgICBwcmZzX1VzYWJsZUNsYXVzZXMoU2VhcmNoKSwgRmxhZ3MsCgkJCQkJICAgICBQcmVjZWRlbmNlKTsKCW1pc2NfQ2xvc2VGaWxlKE91dHB1dCwgbmFtZSk7CglpZiAoUmVzdWx0ID09IHRvcF9DT01QTEVUSU9OKQoJICBwcmludGYoIlxuQ29tcGxldGlvbiBwcmludGVkIHRvOiAlc1xuIiwgbmFtZSk7CgllbHNlCgkgIHByaW50ZigiXG5DbGF1c2VzIHByaW50ZWQgdG86ICVzXG4iLCBuYW1lKTsKICAgICAgfQogICAgCiAgICAgIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19ET0NQUk9PRikgJiYgUmVzdWx0ICE9IHRvcF9SRVNPVVJDRSkgewoJaWYgKFJlc3VsdCA9PSB0b3BfQ09NUExFVElPTikgewoJICBwdXRzKCJcblxuIFRoZSBzYXR1cmF0ZWQgc2V0IG9mIHdvcmtlZC1vZmYgY2xhdXNlcyBpcyA6Iik7CgkgIGNsYXVzZV9MaXN0UHJpbnQocHJmc19Xb3JrZWRPZmZDbGF1c2VzKFNlYXJjaCkpOwoJfQoJZWxzZSB7CgkgIExJU1QgVXNlZENsYXVzZXMsIFVzZWRUZXJtczsKCSAgaWYgKCF0b3BfSW5wdXRGaWxlKQoJICAgIHRvcF9JbnB1dEZpbGUgPSAiU1BBU1MiOwoJICBVc2VkQ2xhdXNlcyA9IGRwX1ByaW50UHJvb2YoU2VhcmNoLCBwcmZzX0VtcHR5Q2xhdXNlcyhTZWFyY2gpLAoJCQkJICAgICAgdG9wX0lucHV0RmlsZSk7CgkgIC8qIEZpbmQgdGVybXMgcmVxdWlyZWQgZm9yIHByb29mICovCgkgIFVzZWRUZXJtcyA9IGxpc3RfTmlsKCk7CgoJICBmb3IgKFNjYW4gPSBVc2VkQ2xhdXNlczsgIWxpc3RfRW1wdHkoU2Nhbik7IFNjYW4gPSBsaXN0X0NkcihTY2FuKSkKCSAgICBpZiAoY2xhdXNlX0lzRnJvbUlucHV0KChDTEFVU0UpIGxpc3RfQ2FyKFNjYW4pKSkgewoJICAgICAgTElTVCBMOwoJICAgICAgTCA9IGhzaF9HZXQoQ2xhdXNlVG9UZXJtTGFiZWxsaXN0LCBsaXN0X0NhcihTY2FuKSk7CgkgICAgICBMID0gbGlzdF9Db3B5KEwpOwoJICAgICAgTCA9IGNuZl9EZWxldGVEdXBsaWNhdGVMYWJlbHNGcm9tTGlzdChMKTsKCSAgICAgIFVzZWRUZXJtcyA9IGxpc3RfTmNvbmMoVXNlZFRlcm1zLCBMKTsKCSAgICB9CgkgIGxpc3RfRGVsZXRlKFVzZWRDbGF1c2VzKTsKCSAgVXNlZFRlcm1zID0gY25mX0RlbGV0ZUR1cGxpY2F0ZUxhYmVsc0Zyb21MaXN0KFVzZWRUZXJtcyk7CgkgIGZwdXRzKCJcbkZvcm11bGFlIHVzZWQgaW4gdGhlIHByb29mIDoiLCBzdGRvdXQpOwoJICBmb3IgKFNjYW4gPSBVc2VkVGVybXM7ICFsaXN0X0VtcHR5KFNjYW4pOyBTY2FuID0gbGlzdF9DZHIoU2NhbikpIAoJICAgIGlmICghKHN0cm5jbXAoKGNoYXIqKSBsaXN0X0NhcihTY2FuKSwgIl9TT1JUXyIsIDYpID09IDApKQoJICAgICAgcHJpbnRmKCIgJXMiLCAoY2hhciopIGxpc3RfQ2FyKFNjYW4pKTsKCSAgcHV0Y2hhcignXG4nKTsKCSAgbGlzdF9EZWxldGUoVXNlZFRlcm1zKTsKCX0KICAgICAgfQogICAgfQogICAgCiAgICAvKiBEZWxldGUgbWFwcGluZyBmb3IgdGhlIGNsYXVzZSBjb3BpZXMgb2YgdGhlIGxhYmVsY2xhdXNlcyAqLwogICAgZm9yIChTY2FuID0gTGFiZWxDbGF1c2VzOyAhbGlzdF9FbXB0eShTY2FuKTsgU2Nhbj1saXN0X0NkcihTY2FuKSkKICAgICAgaHNoX0RlbEl0ZW0oQ2xhdXNlVG9UZXJtTGFiZWxsaXN0LCBsaXN0X0NhcihTY2FuKSk7CiAgICAKICAgIGxpc3RfRGVsZXRlKFByb2JsZW1DbGF1c2VzKTsKIAogICAgZmZsdXNoKHN0ZG91dCk7CgogICAgLyogS2VlcCBkZWZpbml0aW9ucyAqLwogICAgZGVmbGlzdCA9IHByZnNfRGVmaW5pdGlvbnMoU2VhcmNoKTsKICAgIHByZnNfU2V0RGVmaW5pdGlvbnMoU2VhcmNoLCBsaXN0X05pbCgpKTsKICAgIHByZnNfQ2xlYW4oU2VhcmNoKTsKICAgIHByZnNfU2V0RGVmaW5pdGlvbnMoU2VhcmNoLCBkZWZsaXN0KTsKCiAgICBzeW1ib2xfVHJhbnNmZXJQcmVjZWRlbmNlKElucHV0UHJlY2VkZW5jZSwgUHJlY2VkZW5jZSk7CiAgICBpZiAoZmxhZ19HZXRGbGFnVmFsdWUoRmxhZ3MsIGZsYWdfUFBST0JMRU0pKQogICAgICBmcHV0cygiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVNQQVNTLVNUT1AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iLCBzdGRvdXQpOwogIH0gd2hpbGUgKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX0lOVEVSQUNUSVZFKSAmJgoJICAgKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX1RJTUVMSU1JVCkgIT0gMCkpOwoKICBmb3IgKFNjYW4gPSBJbnB1dENsYXVzZXM7ICFsaXN0X0VtcHR5KFNjYW4pOyBTY2FuPWxpc3RfQ2RyKFNjYW4pKQogICAgY2xhdXNlX09yaWVudEFuZFJlSW5pdChsaXN0X0NhcihTY2FuKSwgRmxhZ3MsIFByZWNlZGVuY2UpOwoKICAvKiBDbGVhbnVwIEZsb3R0ZXIgZGF0YSBzdHJ1Y3R1cmVzICovCiAgaWYgKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX0lOVEVSQUNUSVZFKSkgewogICAgaWYgKGZsYWdfR2V0RmxhZ1ZhbHVlKEZsYWdzLCBmbGFnX0RPQ1BST09GKSkKICAgICAgbGlzdF9EZWxldGUoU3ltYmxpc3QpOwogICAgZWxzZSAKICAgICAgc3ltYm9sX0RlbGV0ZVN5bWJvbExpc3QoU3ltYmxpc3QpOwogICAgLyogIHN5bWJvbF9SZXNldFNrb2xlbUluZGV4KCk7ICovCiAgICBpZiAoRmxvdHRlclNlYXJjaCAhPSBOVUxMKSAKICAgICAgcHJmc19EZWxldGUoRmxvdHRlclNlYXJjaCk7CiAgfQogIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19QRkxBR1MpKSB7CiAgICBwdXRjaGFyKCdcbicpOwogICAgZmxhZ19QcmludChGbGFncyk7CiAgfQogIGlmIChmbGFnX0dldEZsYWdWYWx1ZShGbGFncywgZmxhZ19ET0NQUk9PRikpIHsKICAgIGhzaF9EZWxldGUoVGVybUxhYmVsVG9DbGF1c2VsaXN0KTsKICAgIGhzaF9EZWxldGUoQ2xhdXNlVG9UZXJtTGFiZWxsaXN0KTsKICB9CiAgZm9yIChTY2FuID0gTGFiZWxsaXN0OyAhbGlzdF9FbXB0eShTY2FuKTsgU2NhbiA9IGxpc3RfQ2RyKFNjYW4pKQogICAgc3RyaW5nX1N0cmluZ0ZyZWUobGlzdF9DYXIoU2NhbikpOwogIGxpc3RfRGVsZXRlKExhYmVsbGlzdCk7CiAgbGlzdF9EZWxldGUoU29ydGxhYmVsbGlzdCk7CiAgbGlzdF9EZWxldGUoVXNlclByZWNlZGVuY2UpOwoKICBjbmZfRnJlZShGbGFncyk7CgogIHByZnNfRGVsZXRlKFNlYXJjaCk7CiAgY2xhdXNlX0RlbGV0ZUNsYXVzZUxpc3QoSW5wdXRDbGF1c2VzKTsKICBmbGFnX0RlbGV0ZVN0b3JlKElucHV0RmxhZ3MpOwogIHN5bWJvbF9EZWxldGVQcmVjZWRlbmNlKElucHV0UHJlY2VkZW5jZSk7CgogIGNjX0ZyZWUoKTsKICBhbmFfRnJlZSgpOwogIHNvcnRfRnJlZSgpOwogIHVuaWZ5X0ZyZWUoKTsKICBjb250X0ZyZWUoKTsKICBmb2xfRnJlZSgpOwogIHN5bWJvbF9GcmVlQWxsU3ltYm9scygpOwogIGRmZ19GcmVlKCk7CiAgb3B0c19GcmVlKCk7CiNpZmRlZiBDSEVDSwogIG1lbW9yeV9QcmludCgpOwogIG1lbW9yeV9QcmludExlYWtzKCk7CiNlbmRpZgogIHB1dGNoYXIoJ1xuJyk7CiAgcmV0dXJuIDA7Cn0K