LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA4IGNvbXBlb3BsZSBBRyBhbmQgb3RoZXJzLgogKgogKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvCiAqCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCiAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgY29tcGVvcGxlIEFHIChTdGVmYW4gTGllYmlnKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgojaWYgX01TQ19WRVIgPiAxMDAwCiNwcmFnbWEgb25jZQojZW5kaWYgLy8gX01TQ19WRVIgPiAxMDAwCgoKI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCQoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHdpbmRvd3MuaD4KI2luY2x1ZGUgPHdpbmh0dHAuaD4KI2luY2x1ZGUgPG9iamJhc2UuaD4KCiNpbmNsdWRlICJqV2luSHR0cC5oIgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vIFJlbWVtYmVyIHRoZSBHZXRMYXN0RXJyb3IoKSBhZnRlciBhIGZhaWxlZCBXaW5IdHRwLi4uIGNhbGwuCnN0YXRpYyBpbnQgbGFzdEVycm9yOwoKQk9PTCBBUElFTlRSWSBEbGxNYWluKCBIQU5ETEUgaE1vZHVsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgIHVsX3JlYXNvbl9mb3JfY2FsbCwgCiAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwUmVzZXJ2ZWQKCQkJCQkgKSB7CiAgICBzd2l0Y2ggKHVsX3JlYXNvbl9mb3JfY2FsbCkgewoJCWNhc2UgRExMX1BST0NFU1NfQVRUQUNIOgoJCQkjaWZkZWYgX0RFQlVHCgkJCQljb3V0IDw8ICJETExfUFJPQ0VTU19BVFRBQ0ggLSBqV2luSHR0cCIgPDwgZW5kbDsKCQkJI2VuZGlmCgkJCWJyZWFrOwoJCWNhc2UgRExMX1RIUkVBRF9BVFRBQ0g6CgkJCSNpZmRlZiBfREVCVUcKCQkJCWNvdXQgPDwgIkRMTF9USFJFQURfQVRUQUNIIC0galdpbkh0dHAiIDw8IGVuZGw7CgkJCSNlbmRpZgoJCQlicmVhazsKCQljYXNlIERMTF9USFJFQURfREVUQUNIOgoJCQkjaWZkZWYgX0RFQlVHCgkJCQljb3V0IDw8ICJETExfVEhSRUFEX0RFVEFDSCAtIGpXaW5IdHRwIiA8PCBlbmRsOwoJCQkjZW5kaWYKCQkJYnJlYWs7CgkJY2FzZSBETExfUFJPQ0VTU19ERVRBQ0g6CgkJCSNpZmRlZiBfREVCVUcKCQkJCWNvdXQgPDwgIkRMTF9QUk9DRVNTX0RFVEFDSCAtIGpXaW5IdHRwIiA8PCBlbmRsOwoJCQkjZW5kaWYKCQkJYnJlYWs7CiAgICB9CiAgICByZXR1cm4gVFJVRTsKfQoKCi8qCiAqIEhlbHBlciBmb3Igc29tZSB1Z2x5IHRoaW5ncyEKICogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgogKi8KCmNvbnN0IGpjaGFyICogZ2V0U3RyaW5nQ2hhcnMoIEpOSUVudiAqIGVudiwganN0cmluZyBqU3RyaW5nICkgewoJaWYgKCBqU3RyaW5nICE9IE5VTEwgKSB7CgkJcmV0dXJuIGVudi0+R2V0U3RyaW5nQ2hhcnMoIGpTdHJpbmcsIE5VTEwgKTsKCX0gZWxzZSB7CgkJcmV0dXJuIE5VTEw7Cgl9Cn0KCnZvaWQgcmVsZWFzZVN0cmluZ0NoYXJzKCBKTklFbnYgKiBlbnYsIGpzdHJpbmcgalN0cmluZywgY29uc3QgamNoYXIgKiBqQ2hhclN0cmluZyApIHsKCWlmICggalN0cmluZyAhPSBOVUxMICkgewoJCWVudi0+UmVsZWFzZVN0cmluZ0NoYXJzKCBqU3RyaW5nLCBqQ2hhclN0cmluZyApOwoJfQp9Cgpqb2JqZWN0IG5ld1N0cmluZyggSk5JRW52ICogZW52LCBMUFdTVFIgc3RyaW5nICkgewoJcmV0dXJuIGVudi0+TmV3U3RyaW5nKCAoY29uc3QgamNoYXIgKilzdHJpbmcsIGxzdHJsZW5XKCBzdHJpbmcgKSApOwp9Cgp2b2lkIHNldFN0cmluZ0ZpZWxkKCBKTklFbnYgKiBlbnYsIGpjbGFzcyBqQ2xhc3MsIGpvYmplY3Qgak9iamVjdCwgY29uc3QgY2hhciAqIGZpZWxkLCBMUFdTVFIgdmFsdWUgKSB7CglpZiAoIHZhbHVlICE9IE5VTEwgKSB7CgkJamZpZWxkSUQgakZpZWxkSWQgPSBlbnYtPkdldEZpZWxkSUQoIGpDbGFzcywgZmllbGQsICJMamF2YS9sYW5nL1N0cmluZzsiICk7CgkJZW52LT5TZXRPYmplY3RGaWVsZCggak9iamVjdCwgakZpZWxkSWQsIG5ld1N0cmluZyggZW52LCB2YWx1ZSApICk7CgkJR2xvYmFsRnJlZSggdmFsdWUgKTsKCX0KfQoKanN0cmluZyBnZXRTdHJpbmdGaWVsZCggSk5JRW52ICogZW52LCBqY2xhc3MgakNsYXNzLCBqb2JqZWN0IGpPYmplY3QsIGNvbnN0IGNoYXIgKiBmaWVsZCApIHsKCWpmaWVsZElEIGpGaWVsZElkID0gZW52LT5HZXRGaWVsZElEKCBqQ2xhc3MsIGZpZWxkLCAiTGphdmEvbGFuZy9TdHJpbmc7IiApOwoJcmV0dXJuIChqc3RyaW5nKWVudi0+R2V0T2JqZWN0RmllbGQoIGpPYmplY3QsIGpGaWVsZElkICk7Cn0KCnZvaWQgc2V0Qm9vbGVhbkZpZWxkKCBKTklFbnYgKiBlbnYsIGpjbGFzcyBqQ2xhc3MsIGpvYmplY3Qgak9iamVjdCwgY29uc3QgY2hhciAqIGZpZWxkLCBCT09MIHZhbHVlICkgewoJamZpZWxkSUQgakZpZWxkSWQgPSBlbnYtPkdldEZpZWxkSUQoIGpDbGFzcywgZmllbGQsICJaIiApOwoJZW52LT5TZXRCb29sZWFuRmllbGQoIGpPYmplY3QsIGpGaWVsZElkLCB2YWx1ZSApOwp9CgpqYm9vbGVhbiBnZXRCb29sZWFuRmllbGQoIEpOSUVudiAqIGVudiwgamNsYXNzIGpDbGFzcywgam9iamVjdCBqT2JqZWN0LCBjb25zdCBjaGFyICogZmllbGQgKSB7CglqZmllbGRJRCBqRmllbGRJZCA9IGVudi0+R2V0RmllbGRJRCggakNsYXNzLCBmaWVsZCwgIloiICk7CglyZXR1cm4gZW52LT5HZXRCb29sZWFuRmllbGQoIGpPYmplY3QsIGpGaWVsZElkICk7Cn0KCnZvaWQgc2V0SW50RmllbGQoIEpOSUVudiAqIGVudiwgamNsYXNzIGpDbGFzcywgam9iamVjdCBqT2JqZWN0LCBjb25zdCBjaGFyICogZmllbGQsIGppbnQgdmFsdWUgKSB7CglqZmllbGRJRCBqRmllbGRJZCA9IGVudi0+R2V0RmllbGRJRCggakNsYXNzLCBmaWVsZCwgIkkiICk7CgllbnYtPlNldEludEZpZWxkKCBqT2JqZWN0LCBqRmllbGRJZCwgdmFsdWUgKTsKfQoKamludCBnZXRJbnRGaWVsZCggSk5JRW52ICogZW52LCBqY2xhc3MgakNsYXNzLCBqb2JqZWN0IGpPYmplY3QsIGNvbnN0IGNoYXIgKiBmaWVsZCApIHsKCWpmaWVsZElEIGpGaWVsZElkID0gZW52LT5HZXRGaWVsZElEKCBqQ2xhc3MsIGZpZWxkLCAiSSIgKTsKCXJldHVybiBlbnYtPkdldEludEZpZWxkKCBqT2JqZWN0LCBqRmllbGRJZCApOwp9CgojaWZkZWYgX0RFQlVHCglMUENXU1RSIG51bGwoIGNvbnN0IExQQ1dTVFIgc3RyaW5nICkgewoJCWlmICggc3RyaW5nID09IE5VTEwgKSB7CgkJCXJldHVybiAoTFBDV1NUUikgTCJudWxsIjsKCQl9IGVsc2UgewoJCQlyZXR1cm4gc3RyaW5nOwoJCX0KCX0KCglMUFdTVFIgbnVsbCggY29uc3QgTFBXU1RSIHN0cmluZyApIHsKCQlpZiAoIHN0cmluZyA9PSBOVUxMICkgewoJCQlyZXR1cm4gKExQV1NUUikgTCJudWxsIjsKCQl9IGVsc2UgewoJCQlyZXR1cm4gc3RyaW5nOwoJCX0KCX0KI2VuZGlmCgovKgogKiBUaGUgcmVhbCB1Z2x5IHdvcmsgZ29lcyBvbiBoZXJlIQogKiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgogKi8KCgovKgogKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX2NvcmVfaW50ZXJuYWxfbmV0X3Byb3h5X3dpbjMyX3dpbmh0dHBfV2luSHR0cAogKiBNZXRob2Q6ICAgIG9wZW4KICogU2lnbmF0dXJlOiAoTGphdmEvbGFuZy9TdHJpbmc7SUxqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0kpSQogKi8KSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2NvcmVfaW50ZXJuYWxfbmV0X3Byb3h5X3dpbjMyX3dpbmh0dHBfV2luSHR0cF9vcGVuCiAgKEpOSUVudiAqIGVudiwgamNsYXNzIGpDbGFzcywganN0cmluZyBqVXNlckFnZW50LCBqaW50IGpBY2Nlc3NUeXBlLCBqc3RyaW5nIGpQcm94eU5hbWUsIGpzdHJpbmcgalByb3h5QnlwYXNzLCBqaW50IGpGbGFncyApIHsKCgkjaWZkZWYgX0RFQlVHCgkJY291dCA8PCAiV2luSHR0cF9vcGVuIC0gZW50ZXJlZCIgPDwgZW5kbDsKCSNlbmRpZgoKCWNvbnN0IGpjaGFyICogdXNlckFnZW50ID0gKGNvbnN0IGpjaGFyICopIEwialdpbkh0dHAgSmF2YSBXcmFwcGVyIjsKCWNvbnN0IGpjaGFyICogcHJveHlOYW1lID0gTlVMTDsKCWNvbnN0IGpjaGFyICogcHJveHlCeXBhc3MgPSBOVUxMOwoKCXVzZXJBZ2VudCA9IGdldFN0cmluZ0NoYXJzKCBlbnYsIGpVc2VyQWdlbnQgKTsKCXByb3h5TmFtZSA9IGdldFN0cmluZ0NoYXJzKCBlbnYsIGpQcm94eU5hbWUgKTsKCXByb3h5QnlwYXNzID0gZ2V0U3RyaW5nQ2hhcnMoIGVudiwgalByb3h5QnlwYXNzICk7CgoJQ29Jbml0aWFsaXplKCBOVUxMICk7ICAgIC8vIC0tPiBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tLz9rYmlkPTgzNDc0MgoKCWludCBoSW50ZXJuZXQgPSAoaW50KSBXaW5IdHRwT3BlbiggKExQQ1dTVFIpdXNlckFnZW50LCBqQWNjZXNzVHlwZSwgKExQQ1dTVFIpcHJveHlOYW1lLCAoTFBDV1NUUilwcm94eUJ5cGFzcywgakZsYWdzICk7CgoJaWYgKCBoSW50ZXJuZXQgPT0gTlVMTCApIHsKCQlsYXN0RXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKCQkjaWZkZWYgX0RFQlVHCgkJCWNvdXQgPDwgIldpbkh0dHBPcGVuKCkgZmFpbGVkIHdpdGggIiA8PCBsYXN0RXJyb3IgPDwgZW5kbDsgCgkJI2VuZGlmCgl9IGVsc2UgewoJCWxhc3RFcnJvciA9IDA7Cgl9CgoKCSNpZmRlZiBfREVCVUcKCQljb3V0IDw8ICJXaW5IdHRwT3BlbigpIHJldHVybmVkOiAiIDw8IGhJbnRlcm5ldCA8PCBlbmRsOwoJI2VuZGlmCgkKCglyZWxlYXNlU3RyaW5nQ2hhcnMoIGVudiwgalVzZXJBZ2VudCwgdXNlckFnZW50ICk7CglyZWxlYXNlU3RyaW5nQ2hhcnMoIGVudiwgalByb3h5TmFtZSwgcHJveHlOYW1lICk7CglyZWxlYXNlU3RyaW5nQ2hhcnMoIGVudiwgalByb3h5QnlwYXNzLCBwcm94eUJ5cGFzcyApOwoJCgkjaWZkZWYgX0RFQlVHCgkJY291dCA8PCAiV2luSHR0cF9vcGVuIC0gZXhpdCIgPDwgZW5kbDsKCSNlbmRpZgoKCXJldHVybiBoSW50ZXJuZXQ7Cn0KCi8qCiAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfY29yZV9pbnRlcm5hbF9uZXRfcHJveHlfd2luMzJfd2luaHR0cF9XaW5IdHRwCiAqIE1ldGhvZDogICAgY2xvc2VIYW5kbGUKICogU2lnbmF0dXJlOiAoSSlaCiAqLwpKTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2NvcmVfaW50ZXJuYWxfbmV0X3Byb3h5X3dpbjMyX3dpbmh0dHBfV2luSHR0cF9jbG9zZUhhbmRsZQogIChKTklFbnYgKiBlbnYsIGpjbGFzcyBqQ2xhc3MsIGppbnQgakludGVybmV0KSB7CgoJI2lmZGVmIF9ERUJVRwoJCWNvdXQgPDwgIldpbkh0dHBfY2xvc2VIYW5kbGUgLSBlbnRlcmVkIiA8PCBlbmRsOwoJI2VuZGlmCgoJQk9PTCBvayA9IFdpbkh0dHBDbG9zZUhhbmRsZSggKHZvaWQgKikgakludGVybmV0ICk7CgoJaWYgKCAhIG9rICkgewoJCWxhc3RFcnJvciA9IEdldExhc3RFcnJvcigpOwoJCSNpZmRlZiBfREVCVUcKCQkJY291dCA8PCAiV2luSHR0cENsb3NlKCkgZmFpbGVkIHdpdGggIiA8PCBsYXN0RXJyb3IgPDwgZW5kbDsgCgkJI2VuZGlmCgl9IGVsc2UgewoJCWxhc3RFcnJvciA9IDA7Cgl9CgoJQ29VbmluaXRpYWxpemUoKTsKCgkjaWZkZWYgX0RFQlVHCgkJY291dCA8PCAiV2luSHR0cF9jbG9zZUhhbmRsZSAtIGV4aXQiIDw8IGVuZGw7CgkjZW5kaWYKCglyZXR1cm4gb2s7Cn0KCi8qCiAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfY29yZV9pbnRlcm5hbF9uZXRfcHJveHlfd2luMzJfd2luaHR0cF9XaW5IdHRwCiAqIE1ldGhvZDogICAgZ2V0SUVQcm94eUNvbmZpZ0ZvckN1cnJlbnRVc2VyCiAqIFNpZ25hdHVyZTogKExvcmcvZWNsaXBzZS9jb3JlL2ludGVybmFsL25ldC9wcm94eS93aW4zMi93aW5odHRwL1dpbkh0dHBDdXJyZW50VXNlcklFUHJveHlDb25maWc7KVoKICovCkpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfY29yZV9pbnRlcm5hbF9uZXRfcHJveHlfd2luMzJfd2luaHR0cF9XaW5IdHRwX2dldElFUHJveHlDb25maWdGb3JDdXJyZW50VXNlcgogIChKTklFbnYgKiBlbnYsIGpjbGFzcyBqQ2xhc3MsIGpvYmplY3Qgaldpbkh0dHBDdXJyZW50VXNlcklFUHJveHlDb25maWcpICB7CgoJI2lmZGVmIF9ERUJVRwoJCWNvdXQgPDwgIldpbkh0dHBfZ2V0SUVQcm94eUNvbmZpZ0ZvckN1cnJlbnRVc2VyIC0gZW50ZXJlZCIgPDwgZW5kbDsKCSNlbmRpZgoKCVdJTkhUVFBfQ1VSUkVOVF9VU0VSX0lFX1BST1hZX0NPTkZJRyBwcm94eUNvbmZpZzsKCVplcm9NZW1vcnkoICZwcm94eUNvbmZpZywgc2l6ZW9mKCBwcm94eUNvbmZpZyApICk7CgoJQk9PTCBvayA9IFdpbkh0dHBHZXRJRVByb3h5Q29uZmlnRm9yQ3VycmVudFVzZXIoICZwcm94eUNvbmZpZyApOwoKCWlmICggISBvayApIHsKCQlsYXN0RXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKCQkjaWZkZWYgX0RFQlVHCgkJCWNvdXQgPDwgIkh0dHBHZXRJRVByb3h5Q29uZmlnRm9yQ3VycmVudFVzZXIoKSBmYWlsZWQgd2l0aCAiIDw8IGxhc3RFcnJvciA8PCBlbmRsOyAKCQkjZW5kaWYKCX0KCglpZiAoIG9rICkgewoKCQkjaWZkZWYgX0RFQlVHCgkJCWNvdXQgPDwgInByb3h5Q29uZmlnLmZBdXRvRGV0ZWN0OiAiIDw8IHByb3h5Q29uZmlnLmZBdXRvRGV0ZWN0IDw8IGVuZGw7CgkJCXdjb3V0IDw8IEwicHJveHlDb25maWcubHBzelByb3h5OiAiIDw8IG51bGwoIHByb3h5Q29uZmlnLmxwc3pQcm94eSApIDw8IGVuZGw7CgkJCXdjb3V0IDw8IEwicHJveHlDb25maWcubHBzelByb3h5QnlwYXNzOiAiIDw8IG51bGwoIHByb3h5Q29uZmlnLmxwc3pQcm94eUJ5cGFzcyApIDw8IGVuZGw7CgkJI2VuZGlmCgoJCWxhc3RFcnJvciA9IDA7CgkJamNsYXNzIGpXaW5IdHRwQ3VycmVudFVzZXJJRVByb3h5Q29uZmlnQ2xhc3MgPSBlbnYtPkdldE9iamVjdENsYXNzKCBqV2luSHR0cEN1cnJlbnRVc2VySUVQcm94eUNvbmZpZyApOwoJCXNldEJvb2xlYW5GaWVsZCggZW52LGpXaW5IdHRwQ3VycmVudFVzZXJJRVByb3h5Q29uZmlnQ2xhc3MsIGpXaW5IdHRwQ3VycmVudFVzZXJJRVByb3h5Q29uZmlnLCAiaXNBdXRvRGV0ZWN0IiwgcHJveHlDb25maWcuZkF1dG9EZXRlY3QgKTsKCQlzZXRTdHJpbmdGaWVsZCggZW52LCBqV2luSHR0cEN1cnJlbnRVc2VySUVQcm94eUNvbmZpZ0NsYXNzLCBqV2luSHR0cEN1cnJlbnRVc2VySUVQcm94eUNvbmZpZywgImF1dG9Db25maWdVcmwiLCBwcm94eUNvbmZpZy5scHN6QXV0b0NvbmZpZ1VybCApOwoJCXNldFN0cmluZ0ZpZWxkKCBlbnYsIGpXaW5IdHRwQ3VycmVudFVzZXJJRVByb3h5Q29uZmlnQ2xhc3MsIGpXaW5IdHRwQ3VycmVudFVzZXJJRVByb3h5Q29uZmlnLCAicHJveHkiLCBwcm94eUNvbmZpZy5scHN6UHJveHkgKTsKCQlzZXRTdHJpbmdGaWVsZCggZW52LCBqV2luSHR0cEN1cnJlbnRVc2VySUVQcm94eUNvbmZpZ0NsYXNzLCBqV2luSHR0cEN1cnJlbnRVc2VySUVQcm94eUNvbmZpZywgInByb3h5QnlwYXNzIiwgcHJveHlDb25maWcubHBzelByb3h5QnlwYXNzICk7Cgl9CgoKCSNpZmRlZiBfREVCVUcKCQljb3V0IDw8ICJXaW5IdHRwX2dldElFUHJveHlDb25maWdGb3JDdXJyZW50VXNlciAtIGV4aXQiIDw8IGVuZGw7CgkjZW5kaWYKCglyZXR1cm4gb2s7Cn0KCi8qCiAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfY29yZV9pbnRlcm5hbF9uZXRfcHJveHlfd2luMzJfd2luaHR0cF9XaW5IdHRwCiAqIE1ldGhvZDogICAgZ2V0UHJveHlGb3JVcmwKICogU2lnbmF0dXJlOiAoSUxqYXZhL2xhbmcvU3RyaW5nO0xvcmcvZWNsaXBzZS9jb3JlL2ludGVybmFsL25ldC9wcm94eS93aW4zMi93aW5odHRwL1dpbkh0dHBBdXRvUHJveHlPcHRpb25zO0xvcmcvZWNsaXBzZS9jb3JlL2ludGVybmFsL25ldC9wcm94eS93aW4zMi93aW5odHRwL1dpbkh0dHBQcm94eUluZm87KVoKICovCkpOSUVYUE9SVCBqYm9vbGVhbiBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfY29yZV9pbnRlcm5hbF9uZXRfcHJveHlfd2luMzJfd2luaHR0cF9XaW5IdHRwX2dldFByb3h5Rm9yVXJsCiAgKEpOSUVudiAqIGVudiwgamNsYXNzIGpDbGFzcywgamludCBqSW50ZXJuZXQsIGpzdHJpbmcgalVybCwgam9iamVjdCBqV2luSHR0cEF1dG9Qcm94eU9wdGlvbnMsIGpvYmplY3Qgaldpbkh0dHBQcm94eUluZm8gKSAgewoKCSNpZmRlZiBfREVCVUcKCQljb3V0IDw8ICJXaW5IdHRwX2dldFByb3h5Rm9yVXJsIC0gZW50ZXJlZCIgPDwgZW5kbDsKCSNlbmRpZgoKCVdJTkhUVFBfQVVUT1BST1hZX09QVElPTlMgYXV0b1Byb3h5T3B0aW9uczsKCVplcm9NZW1vcnkoICZhdXRvUHJveHlPcHRpb25zLCBzaXplb2YoIGF1dG9Qcm94eU9wdGlvbnMgKSApOwoKCWpjbGFzcyBqV2luSHR0cEF1dG9Qcm94eU9wdGlvbnNDbGFzcyA9IGVudi0+R2V0T2JqZWN0Q2xhc3MoIGpXaW5IdHRwQXV0b1Byb3h5T3B0aW9ucyApOwoKCWF1dG9Qcm94eU9wdGlvbnMuZHdGbGFncyA9IGdldEludEZpZWxkKCBlbnYsIGpXaW5IdHRwQXV0b1Byb3h5T3B0aW9uc0NsYXNzLCBqV2luSHR0cEF1dG9Qcm94eU9wdGlvbnMsICJmbGFncyIgKTsKCWF1dG9Qcm94eU9wdGlvbnMuZHdBdXRvRGV0ZWN0RmxhZ3MgPSBnZXRJbnRGaWVsZCggZW52LCBqV2luSHR0cEF1dG9Qcm94eU9wdGlvbnNDbGFzcywgaldpbkh0dHBBdXRvUHJveHlPcHRpb25zLCAiYXV0b0RldGVjdEZsYWdzIiApOwoJanN0cmluZyBqQXV0b0NvbmZpZ1VybCA9IGdldFN0cmluZ0ZpZWxkKCBlbnYsIGpXaW5IdHRwQXV0b1Byb3h5T3B0aW9uc0NsYXNzLCBqV2luSHR0cEF1dG9Qcm94eU9wdGlvbnMsICJhdXRvQ29uZmlnVXJsIiApOwoJYXV0b1Byb3h5T3B0aW9ucy5scHN6QXV0b0NvbmZpZ1VybCA9IChMUENXU1RSKWdldFN0cmluZ0NoYXJzKCBlbnYsIGpBdXRvQ29uZmlnVXJsICk7CgoJLy8gVGhlILRyZXNlcnZlZLQgZmllbGRzIHdpbGwgbm90IGJlIHRyYW5zZmVyZWQhCgkvLyAtIFN0cmluZyByZXNlcnZlZFBvaW50ZXIKCS8vIC0gaW50IHJlc2VydmVkSW50CgoJYXV0b1Byb3h5T3B0aW9ucy5mQXV0b0xvZ29uSWZDaGFsbGVuZ2VkID0gZ2V0Qm9vbGVhbkZpZWxkKCBlbnYsIGpXaW5IdHRwQXV0b1Byb3h5T3B0aW9uc0NsYXNzLCBqV2luSHR0cEF1dG9Qcm94eU9wdGlvbnMsICJhdXRvTG9nb25JZkNoYWxsZW5nZWQiICk7CgoJI2lmZGVmIF9ERUJVRwoJCWNvdXQgPDwgImF1dG9Qcm94eU9wdGlvbnMuZHdGbGFnczogIiA8PCBhdXRvUHJveHlPcHRpb25zLmR3RmxhZ3MgPDwgZW5kbDsKCQljb3V0IDw8ICJhdXRvUHJveHlPcHRpb25zLmR3QXV0b0RldGVjdEZsYWdzOiAiIDw8IGF1dG9Qcm94eU9wdGlvbnMuZHdBdXRvRGV0ZWN0RmxhZ3MgPDwgZW5kbDsKCQl3Y291dCA8PCBMImF1dG9Qcm94eU9wdGlvbnMubHBzekF1dG9Db25maWdVcmw6ICIgPDwgbnVsbCggYXV0b1Byb3h5T3B0aW9ucy5scHN6QXV0b0NvbmZpZ1VybCApIDw8IGVuZGw7CgkJY291dCA8PCAiYXV0b1Byb3h5T3B0aW9ucy5mQXV0b0xvZ29uSWZDaGFsbGVuZ2VkOiAiIDw8IGF1dG9Qcm94eU9wdGlvbnMuZkF1dG9Mb2dvbklmQ2hhbGxlbmdlZCA8PCBlbmRsOwoJI2VuZGlmCgoJV0lOSFRUUF9QUk9YWV9JTkZPIHByb3h5SW5mbzsKCVplcm9NZW1vcnkoICZwcm94eUluZm8sIHNpemVvZiggcHJveHlJbmZvICkgKTsKCgljb25zdCBqY2hhciAqIHVybCA9IGdldFN0cmluZ0NoYXJzKCBlbnYsIGpVcmwgKTsKCglCT09MIG9rID0gV2luSHR0cEdldFByb3h5Rm9yVXJsKCAodm9pZCAqKWpJbnRlcm5ldCwgKExQQ1dTVFIpdXJsLCAmYXV0b1Byb3h5T3B0aW9ucywgJnByb3h5SW5mbyApOwoKCWlmICggISBvayApIHsKCQlsYXN0RXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKCQkjaWZkZWYgX0RFQlVHCgkJCWNvdXQgPDwgIldpbkh0dHBHZXRQcm94eUZvclVybCgpIGZhaWxlZCB3aXRoICIgPDwgbGFzdEVycm9yIDw8IGVuZGw7IAoJCSNlbmRpZgoJfQoKCXJlbGVhc2VTdHJpbmdDaGFycyggZW52LCBqVXJsLCB1cmwgKTsKCXJlbGVhc2VTdHJpbmdDaGFycyggZW52LCBqQXV0b0NvbmZpZ1VybCwgKGNvbnN0IGpjaGFyICopYXV0b1Byb3h5T3B0aW9ucy5scHN6QXV0b0NvbmZpZ1VybCApOwoKCWlmICggb2sgKSB7CgkJbGFzdEVycm9yID0gMDsKCQlqY2xhc3Mgaldpbkh0dHBQcm94eUluZm9DbGFzcyA9IGVudi0+R2V0T2JqZWN0Q2xhc3MoIGpXaW5IdHRwUHJveHlJbmZvICk7CgoJCSNpZmRlZiBfREVCVUcKCQkJY291dCA8PCAicHJveHlJbmZvLmR3QWNjZXNzVHlwZTogIiA8PCBwcm94eUluZm8uZHdBY2Nlc3NUeXBlIDw8IGVuZGw7CgkJCXdjb3V0IDw8IEwicHJveHlJbmZvLmxwc3pQcm94eTogIiA8PCBudWxsKCBwcm94eUluZm8ubHBzelByb3h5ICkgPDwgZW5kbDsKCQkJd2NvdXQgPDwgTCJwcm94eUluZm8ubHBzelByb3h5QnlwYXNzOiAiIDw8IG51bGwoIHByb3h5SW5mby5scHN6UHJveHlCeXBhc3MgKSA8PCBlbmRsOwoJCSNlbmRpZgoKCQlzZXRJbnRGaWVsZCggZW52LCBqV2luSHR0cFByb3h5SW5mb0NsYXNzLCBqV2luSHR0cFByb3h5SW5mbywgImFjY2Vzc1R5cGUiLCBwcm94eUluZm8uZHdBY2Nlc3NUeXBlICk7CgkJc2V0U3RyaW5nRmllbGQoIGVudiwgaldpbkh0dHBQcm94eUluZm9DbGFzcywgaldpbkh0dHBQcm94eUluZm8sICJwcm94eSIsIHByb3h5SW5mby5scHN6UHJveHkgKTsKCQlzZXRTdHJpbmdGaWVsZCggZW52LCBqV2luSHR0cFByb3h5SW5mb0NsYXNzLCBqV2luSHR0cFByb3h5SW5mbywgInByb3h5QnlwYXNzIiwgcHJveHlJbmZvLmxwc3pQcm94eUJ5cGFzcyApOwoJfQoKCSNpZmRlZiBfREVCVUcKCQljb3V0IDw8ICJXaW5IdHRwX2dldFByb3h5Rm9yVXJsIC0gZXhpdCIgPDwgZW5kbDsKCSNlbmRpZgoKCXJldHVybiBvazsKfQoKLyoKICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV9jb3JlX2ludGVybmFsX25ldF9wcm94eV93aW4zMl93aW5odHRwX1dpbkh0dHAKICogTWV0aG9kOiAgICBkZXRlY3RBdXRvUHJveHlDb25maWdVcmwKICogU2lnbmF0dXJlOiAoTG9yZy9lY2xpcHNlL2NvcmUvaW50ZXJuYWwvbmV0L3Byb3h5L3dpbjMyL3dpbmh0dHAvQXV0b1Byb3h5SG9sZGVyOylaCiAqLwpKTklFWFBPUlQgamJvb2xlYW4gSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2NvcmVfaW50ZXJuYWxfbmV0X3Byb3h5X3dpbjMyX3dpbmh0dHBfV2luSHR0cF9kZXRlY3RBdXRvUHJveHlDb25maWdVcmwKICAoSk5JRW52ICogZW52LCBqY2xhc3MgakNsYXNzLCBqb2JqZWN0IGpBdXRvUHJveHlIb2xkZXIpIHsKCgkjaWZkZWYgX0RFQlVHCgkJY291dCA8PCAiV2luSHR0cF9kZXRlY3RBdXRvUHJveHlDb25maWdVcmwgLSBlbnRlcmVkIiA8PCBlbmRsOwoJI2VuZGlmCgoJamNsYXNzIGpBdXRvUHJveHlIb2xkZXJDbGFzcyA9IGVudi0+R2V0T2JqZWN0Q2xhc3MoIGpBdXRvUHJveHlIb2xkZXIgKTsKCURXT1JEIGR3QXV0b0RldGVjdEZsYWdzID0gZ2V0SW50RmllbGQoIGVudiwgakF1dG9Qcm94eUhvbGRlckNsYXNzLCBqQXV0b1Byb3h5SG9sZGVyLCAiYXV0b0RldGVjdEZsYWdzIiApOwoKCSNpZmRlZiBfREVCVUcKCQljb3V0IDw8ICJhdXRvUHJveHlIb2xkZXIuYXV0b0RldGVjdEZsYWdzOiAiIDw8IGR3QXV0b0RldGVjdEZsYWdzIDw8IGVuZGw7CgkjZW5kaWYKCglMUFdTVFIgcHdzekF1dG9Db25maWdVcmw7CgoJQk9PTCBvayA9IFdpbkh0dHBEZXRlY3RBdXRvUHJveHlDb25maWdVcmwoIGR3QXV0b0RldGVjdEZsYWdzLCAmcHdzekF1dG9Db25maWdVcmwgKTsKCglpZiAoICEgb2sgKSB7CgkJbGFzdEVycm9yID0gR2V0TGFzdEVycm9yKCk7CgkJI2lmZGVmIF9ERUJVRwoJCQljb3V0IDw8ICJXaW5IdHRwRGV0ZWN0QXV0b1Byb3h5Q29uZmlnVXJsKCkgZmFpbGVkIHdpdGggIiA8PCBsYXN0RXJyb3IgPDwgZW5kbDsgCgkJI2VuZGlmCgl9CgoJaWYgKCBvayApIHsKCQlsYXN0RXJyb3IgPSAwOwoKCQkjaWZkZWYgX0RFQlVHCgkJCXdjb3V0IDw8IEwiYXV0b0NvbmZpZ1VybDogIiA8PCBudWxsKCBwd3N6QXV0b0NvbmZpZ1VybCApIDw8IGVuZGw7CgkJI2VuZGlmCgoJCXNldFN0cmluZ0ZpZWxkKCBlbnYsIGpBdXRvUHJveHlIb2xkZXJDbGFzcywgakF1dG9Qcm94eUhvbGRlciwgImF1dG9Db25maWdVcmwiLCBwd3N6QXV0b0NvbmZpZ1VybCApOwoJfQoKCSNpZmRlZiBfREVCVUcKCQljb3V0IDw8ICJXaW5IdHRwX2RldGVjdEF1dG9Qcm94eUNvbmZpZ1VybCAtIGV4aXQiIDw8IGVuZGw7CgkjZW5kaWYKCglyZXR1cm4gb2s7Cn0KCgovKgogKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX2NvcmVfaW50ZXJuYWxfbmV0X3Byb3h5X3dpbjMyX3dpbmh0dHBfV2luSHR0cAogKiBNZXRob2Q6ICAgIGdldExhc3RFcnJvcgogKiBTaWduYXR1cmU6ICgpSQogKi8KSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2NvcmVfaW50ZXJuYWxfbmV0X3Byb3h5X3dpbjMyX3dpbmh0dHBfV2luSHR0cF9nZXRMYXN0RXJyb3IKICAoSk5JRW52ICogZW52LCBqY2xhc3MgakNsYXNzKSB7CgoJI2lmZGVmIF9ERUJVRwoJCWNvdXQgPDwgIldpbkh0dHBfZ2V0TGFzdEVycm9yIC0gZW50ZXJlZCIgPDwgZW5kbDsKCSNlbmRpZgoKCSNpZmRlZiBfREVCVUcKCQljb3V0IDw8ICJXaW5IdHRwX2dldExhc3RFcnJvciAtIGV4aXQiIDw8IGVuZGw7CgkjZW5kaWYKCglyZXR1cm4gbGFzdEVycm9yOwp9CgovKgogKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX2NvcmVfaW50ZXJuYWxfbmV0X3Byb3h5X3dpbjMyX3dpbmh0dHBfV2luSHR0cAogKiBNZXRob2Q6ICAgIGdldExhc3RFcnJvck1lc3NhZ2UKICogU2lnbmF0dXJlOiAoKUxqYXZhL2xhbmcvU3RyaW5nOwogKi8KSk5JRVhQT1JUIGpzdHJpbmcgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX2NvcmVfaW50ZXJuYWxfbmV0X3Byb3h5X3dpbjMyX3dpbmh0dHBfV2luSHR0cF9nZXRMYXN0RXJyb3JNZXNzYWdlCiAgKEpOSUVudiAqIGVudiwgamNsYXNzIGpDbGFzcykgewoKCSNpZmRlZiBfREVCVUcKCQljb3V0IDw8ICJXaW5IdHRwX2dldExhc3RFcnJvck1lc3NhZ2UgLSBlbnRlcmVkIiA8PCBlbmRsOwoJI2VuZGlmCgoJTFBWT0lEIGxwTXNnQnVmID0gTlVMTDsKCURXT1JEIHJlc3VsdCA9IDA7CgoJaWYgKCBsYXN0RXJyb3IgPj0gV0lOSFRUUF9FUlJPUl9CQVNFICYmIGxhc3RFcnJvciA8PSBXSU5IVFRQX0VSUk9SX0xBU1QgKSB7CgkJSE1PRFVMRSBoTW9kdWxlID0gR2V0TW9kdWxlSGFuZGxlKCAid2luaHR0cC5kbGwiICk7CgoJCWlmICggaE1vZHVsZSA9PSBOVUxMICkgewoJCQlscE1zZ0J1ZiA9ICJDb3VsZCBub3QgcmV0cmlldmUgZXJyb3IgbWVzc2FnZSwgYmVjYXVzZSC0R2V0TW9kdWxlSGFuZGxlKCBcIndpbmh0dHAuZGxsXCIgKbQgZmFpbGVkLiI7CgkJfSBlbHNlIHsKCQkJcmVzdWx0ID0gRm9ybWF0TWVzc2FnZSggRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSIHwgCgkJCQkJCQkJCUZPUk1BVF9NRVNTQUdFX0ZST01fSE1PRFVMRSB8IAoJCQkJCQkJCQlGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUywKCQkJCQkJCQkJaE1vZHVsZSwKCQkJCQkJCQkJbGFzdEVycm9yLAoJCQkJCQkJCQlNQUtFTEFOR0lEKCBMQU5HX05FVVRSQUwsIFNVQkxBTkdfREVGQVVMVCApLCAvLyBEZWZhdWx0IGxhbmd1YWdlCgkJCQkJIAkJCQkoTFBUU1RSKSAmbHBNc2dCdWYsCgkJCQkJCQkJCTAsCgkJCQkJCQkJCU5VTEwgKTsKCQl9CgoJfSBlbHNlIHsKCQlyZXN1bHQgPSBGb3JtYXRNZXNzYWdlKCBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfCAKCQkJCQkJCQlGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSB8IAoJCQkJCQkJCUZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTLAoJCQkJCQkJCU5VTEwsCgkJCQkJCQkJbGFzdEVycm9yLAoJCQkJCQkJCU1BS0VMQU5HSUQoIExBTkdfTkVVVFJBTCwgU1VCTEFOR19ERUZBVUxUICksIC8vIERlZmF1bHQgbGFuZ3VhZ2UKCQkJCQkgCQkJKExQVFNUUikgJmxwTXNnQnVmLAoJCQkJCQkJCTAsCgkJCQkJCQkJTlVMTCApOwoJfQoJCQoJaWYgKCBscE1zZ0J1ZiA9PSBOVUxMICkgewkKCQkjaWZkZWYgX0RFQlVHCgkJCWNvdXQgPDwgIldpbkh0dHBfZ2V0TGFzdEVycm9yTWVzc2FnZSgpIGZhaWxlZCB3aXRoICIgPDwgR2V0TGFzdEVycm9yKCkgPDwgIiBmb3IgZXJyb3IgY29kZSAiIDw8IGxhc3RFcnJvciA8PCBlbmRsOyAKCQkjZW5kaWYKCgkJbHBNc2dCdWYgPSAiQ291bGQgbm90IHJldHJpZXZlIGVycm9yIG1lc3NhZ2UuIjsKCX0KCglqc3RyaW5nIHN0cmluZyA9IGVudi0+TmV3U3RyaW5nVVRGKCAoY2hhciAqKSBscE1zZ0J1ZiApOwoKCWlmICggcmVzdWx0ID4gMCApIHsKCQkvLyBGcmVlIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBidWZmZXIKCQlMb2NhbEZyZWUoIGxwTXNnQnVmICk7Cgl9CgoJI2lmZGVmIF9ERUJVRwoJCWNvdXQgPDwgIldpbkh0dHBfZ2V0TGFzdEVycm9yTWVzc2FnZSAtIGV4aXQiIDw8IGVuZGw7CgkjZW5kaWYKCglyZXR1cm4gc3RyaW5nOwp9Cgo=