LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgoKLy8gTUFSS0VSKHVwZGF0ZV9wcmVjb21wLnB5KTogYXV0b2dlbiBpbmNsdWRlIHN0YXRlbWVudCwgZG8gbm90IHJlbW92ZQojaW5jbHVkZSAicHJlY29tcGlsZWRfYXV0b21hdGlvbi5oeHgiCiNpbmNsdWRlIDxzdmwvaW50aXRlbS5oeHg+CiNpbmNsdWRlIDxzdmwvc3RyaXRlbS5oeHg+CiNpbmNsdWRlIDxzdmwvZWl0ZW0uaHh4PgojaW5jbHVkZSAic2NtZHN0cm0uaHh4IgojaW5jbHVkZSAic3Zjb21tc3RyZWFtLmh4eCIKI2luY2x1ZGUgInJjb250cm9sLmh4eCIKCiNpZiBPU0xfREVCVUdfTEVWRUwgPiAxCiNpbmNsdWRlICJlZGl0d2luLmh4eCIKI2luY2x1ZGUgInN0YXRlbW50Lmh4eCIKI2VuZGlmCgpTQ21kU3RyZWFtOjpTQ21kU3RyZWFtKFN2U3RyZWFtICpwSW4pCnsKCXBTYW1tZWwgPSBwSW47CglwQ29tbVN0cmVhbSA9IG5ldyBTdkNvbW1TdHJlYW0oIHBTYW1tZWwgKTsKLy8JU2V0Q29tbVN0cmVhbSggcENvbW1TdHJlYW0gKTsKfQoKU0NtZFN0cmVhbTo6flNDbWRTdHJlYW0oKQp7CglkZWxldGUgcENvbW1TdHJlYW07Cn0KCnZvaWQgU0NtZFN0cmVhbTo6UmVhZCAoU3RyaW5nKiAmcFN0cmluZykKewogICAgaWYgKCAhcFN0cmluZyApCiAgICAgICAgcFN0cmluZyA9IG5ldyBTdHJpbmcoKTsKCWNvbW1fVW5pQ2hhciogcFN0cjsKCXNhbF91SW50MTYgbkxlbkluQ2hhcnM7CglDbWRCYXNlU3RyZWFtOjpSZWFkKCBwU3RyLCBuTGVuSW5DaGFycyApOwoKCSpwU3RyaW5nID0gU3RyaW5nKCBwU3RyLCBuTGVuSW5DaGFycyApOwoJZGVsZXRlIFtdIHBTdHI7Cn0KCnZvaWQgU0NtZFN0cmVhbTo6UmVhZCAoU3RyaW5nICZhU3RyaW5nKQp7Cgljb21tX1VuaUNoYXIqIHBTdHI7CglzYWxfdUludDE2IG5MZW5JbkNoYXJzOwoJQ21kQmFzZVN0cmVhbTo6UmVhZCggcFN0ciwgbkxlbkluQ2hhcnMgKTsKCglhU3RyaW5nID0gU3RyaW5nKCBwU3RyLCBuTGVuSW5DaGFycyApOwoJZGVsZXRlIFtdIHBTdHI7Cn0KCnZvaWQgU0NtZFN0cmVhbTo6UmVhZCAoIFNmeFBvb2xJdGVtIComcEl0ZW0gKQp7CglzYWxfdUludDE2IG5UeXBlOwoJc2FsX3VJbnQxNiBuSWQ7CglSZWFkKG5JZCk7CiNpZiBPU0xfREVCVUdfTEVWRUwgPiAxCgkJU3RhdGVtZW50TGlzdDo6bV9wRGJnV2luLT5BZGRUZXh0KCAiUGFyYW1ldGVyOiAiICk7CgkJU3RhdGVtZW50TGlzdDo6bV9wRGJnV2luLT5BZGRUZXh0KCBTdHJpbmc6OkNyZWF0ZUZyb21JbnQzMiggbklkICkgKTsKCQlTdGF0ZW1lbnRMaXN0OjptX3BEYmdXaW4tPkFkZFRleHQoICIgIiApOwojZW5kaWYKICAgIFJlYWQoIG5UeXBlICk7Cglzd2l0Y2ggKG5UeXBlKQoJewoJCWNhc2UgQmluVVNIT1JUOgoJCQl7CgkJCQljb21tX1VTSE9SVCBuTnI7CiAgICAgICAgICAgICAgICBSZWFkIChuTnIgKTsKCQkJCXBJdGVtID0gbmV3IFNmeFVJbnQxNkl0ZW0obklkLG5Ocik7CiNpZiBPU0xfREVCVUdfTEVWRUwgPiAxCgkJCQlTdGF0ZW1lbnRMaXN0OjptX3BEYmdXaW4tPkFkZFRleHQoICJVU0hPUlQ6IiApOwoJCQkJU3RhdGVtZW50TGlzdDo6bV9wRGJnV2luLT5BZGRUZXh0KCBTdHJpbmc6OkNyZWF0ZUZyb21JbnQzMiggbk5yICkgKTsKI2VuZGlmCgkJCX0KCQkJYnJlYWs7CgkJY2FzZSBCaW5VTE9ORzoKCQkJewoJCQkJY29tbV9VTE9ORyBuTnI7CiAgICAgICAgICAgICAgICBSZWFkIChuTnIgKTsKCQkJCXBJdGVtID0gbmV3IFNmeFVJbnQzMkl0ZW0obklkLG5Ocik7CiNpZiBPU0xfREVCVUdfTEVWRUwgPiAxCgkJCQlTdGF0ZW1lbnRMaXN0OjptX3BEYmdXaW4tPkFkZFRleHQoICJVTE9ORzoiICk7CgkJCQlTdGF0ZW1lbnRMaXN0OjptX3BEYmdXaW4tPkFkZFRleHQoIFN0cmluZzo6Q3JlYXRlRnJvbUludDY0KCBuTnIgKSApOwojZW5kaWYKCQkJfQoJCQlicmVhazsKCQljYXNlIEJpblN0cmluZzoKCQkJewoJCQkJU3RyaW5nIGFTdHJpbmc7CiAgICAgICAgICAgICAgICBSZWFkIChhU3RyaW5nKTsKCgkJCQlwSXRlbSA9IG5ldyBTZnhTdHJpbmdJdGVtKG5JZCxhU3RyaW5nKTsKI2lmIE9TTF9ERUJVR19MRVZFTCA+IDEKCQkJCVN0YXRlbWVudExpc3Q6Om1fcERiZ1dpbi0+QWRkVGV4dCggIlN0cmluZzoiICk7CgkJCQlTdGF0ZW1lbnRMaXN0OjptX3BEYmdXaW4tPkFkZFRleHQoIGFTdHJpbmcgKTsKI2VuZGlmCgkJCX0KCQkJYnJlYWs7CgkJY2FzZSBCaW5Cb29sOgoJCQl7CgkJCQljb21tX0JPT0wgYkJvb2w7CiAgICAgICAgICAgICAgICBSZWFkIChiQm9vbCk7CgkJCQlwSXRlbSA9IG5ldyBTZnhCb29sSXRlbShuSWQsYkJvb2wpOwojaWYgT1NMX0RFQlVHX0xFVkVMID4gMQoJCQkJU3RhdGVtZW50TGlzdDo6bV9wRGJnV2luLT5BZGRUZXh0KCAiQk9PTDoiICk7CgkJCQlTdGF0ZW1lbnRMaXN0OjptX3BEYmdXaW4tPkFkZFRleHQoIGJCb29sID8gIlRSVUUiIDogIkZBTFNFIiApOwojZW5kaWYKCQkJfQoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlEQkdfRVJST1IxKCAiVW5n/Gx0aWdlciBUeXAgaW0gU3RyZWFtOiVodSIsIG5UeXBlICk7CiNpZiBPU0xfREVCVUdfTEVWRUwgPiAxCgkJCVN0YXRlbWVudExpc3Q6Om1fcERiZ1dpbi0+QWRkVGV4dCggIlVuZ/xsdGlnZXIgVHlwICEhISEgIiApOwojZW5kaWYKCQkJYnJlYWs7Cgl9CiNpZiBPU0xfREVCVUdfTEVWRUwgPiAxCgkJU3RhdGVtZW50TGlzdDo6bV9wRGJnV2luLT5BZGRUZXh0KCAiXG4iICk7CiNlbmRpZgp9Cgp2b2lkIFNDbWRTdHJlYW06OlJlYWQgKCA6OmNvbTo6c3VuOjpzdGFyOjpiZWFuczo6UHJvcGVydHlWYWx1ZSAmckl0ZW0gKQp7CglzYWxfdUludDE2IG5UeXBlOwoJU3RyaW5nIGFJZDsKCVJlYWQoYUlkKTsKICAgIHJJdGVtLk5hbWUgPSBydGw6Ok9VU3RyaW5nKCBhSWQgKTsKI2lmIE9TTF9ERUJVR19MRVZFTCA+IDEKCQlTdGF0ZW1lbnRMaXN0OjptX3BEYmdXaW4tPkFkZFRleHQoICJQYXJhbWV0ZXI6ICIgKTsKCQlTdGF0ZW1lbnRMaXN0OjptX3BEYmdXaW4tPkFkZFRleHQoIGFJZCApOwoJCVN0YXRlbWVudExpc3Q6Om1fcERiZ1dpbi0+QWRkVGV4dCggIiAiICk7CiNlbmRpZgogICAgblR5cGUgPSBHZXROZXh0VHlwZSgpOwoJc3dpdGNoIChuVHlwZSkKCXsKCQljYXNlIEJpblVTSE9SVDoKCQkJewoJCQkJY29tbV9VU0hPUlQgbk5yOwogICAgICAgICAgICAgICAgUmVhZCAobk5yICk7CiAgICAgICAgICAgICAgICBySXRlbS5WYWx1ZSA8PD0gbk5yOwojaWYgT1NMX0RFQlVHX0xFVkVMID4gMQoJCQkJU3RhdGVtZW50TGlzdDo6bV9wRGJnV2luLT5BZGRUZXh0KCAiVVNIT1JUOiIgKTsKCQkJCVN0YXRlbWVudExpc3Q6Om1fcERiZ1dpbi0+QWRkVGV4dCggU3RyaW5nOjpDcmVhdGVGcm9tSW50MzIoIG5OciApICk7CiNlbmRpZgoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgQmluVUxPTkc6CgkJCXsKCQkJCWNvbW1fVUxPTkcgbk5yOwogICAgICAgICAgICAgICAgUmVhZCAobk5yICk7CiAgICAgICAgICAgICAgICBySXRlbS5WYWx1ZSA8PD0gbk5yOwojaWYgT1NMX0RFQlVHX0xFVkVMID4gMQoJCQkJU3RhdGVtZW50TGlzdDo6bV9wRGJnV2luLT5BZGRUZXh0KCAiVUxPTkc6IiApOwoJCQkJU3RhdGVtZW50TGlzdDo6bV9wRGJnV2luLT5BZGRUZXh0KCBTdHJpbmc6OkNyZWF0ZUZyb21JbnQ2NCggbk5yICkgKTsKI2VuZGlmCgkJCX0KCQkJYnJlYWs7CgkJY2FzZSBCaW5TdHJpbmc6CgkJCXsKCQkJCVN0cmluZyBhU3RyaW5nOwogICAgICAgICAgICAgICAgUmVhZCAoYVN0cmluZyk7CiAgICAgICAgICAgICAgICBySXRlbS5WYWx1ZSA8PD0gOjpydGw6Ok9VU3RyaW5nKCBhU3RyaW5nICk7CiNpZiBPU0xfREVCVUdfTEVWRUwgPiAxCgkJCQlTdGF0ZW1lbnRMaXN0OjptX3BEYmdXaW4tPkFkZFRleHQoICJTdHJpbmc6IiApOwoJCQkJU3RhdGVtZW50TGlzdDo6bV9wRGJnV2luLT5BZGRUZXh0KCBhU3RyaW5nICk7CiNlbmRpZgoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgQmluQm9vbDoKCQkJewoJCQkJY29tbV9CT09MIGJCb29sOwogICAgICAgICAgICAgICAgUmVhZCAoYkJvb2wpOwogICAgICAgICAgICAgICAgckl0ZW0uVmFsdWUgPDw9IGJCb29sOwojaWYgT1NMX0RFQlVHX0xFVkVMID4gMQoJCQkJU3RhdGVtZW50TGlzdDo6bV9wRGJnV2luLT5BZGRUZXh0KCAiQk9PTDoiICk7CgkJCQlTdGF0ZW1lbnRMaXN0OjptX3BEYmdXaW4tPkFkZFRleHQoIGJCb29sID8gIlRSVUUiIDogIkZBTFNFIiApOwojZW5kaWYKCQkJfQoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlEQkdfRVJST1IxKCAiVW5n/Gx0aWdlciBUeXAgaW0gU3RyZWFtOiVodSIsIG5UeXBlICk7CiNpZiBPU0xfREVCVUdfTEVWRUwgPiAxCgkJCVN0YXRlbWVudExpc3Q6Om1fcERiZ1dpbi0+QWRkVGV4dCggIlVuZ/xsdGlnZXIgVHlwICEhISEgIiApOwojZW5kaWYKCQkJYnJlYWs7Cgl9CiNpZiBPU0xfREVCVUdfTEVWRUwgPiAxCgkJU3RhdGVtZW50TGlzdDo6bV9wRGJnV2luLT5BZGRUZXh0KCAiXG4iICk7CiNlbmRpZgp9Cgo=