LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioqCioqICAgSVRVLVQgRy43MjIuMSAoMjAwNS0wNSkgLSBGaXhlZCBwb2ludCBpbXBsZW1lbnRhdGlvbiBmb3IgbWFpbiBib2R5IGFuZCBBbm5leCBDCioqICAgPiBTb2Z0d2FyZSBSZWxlYXNlIDIuMSAoMjAwOC0wNikKKiogICAgIChTaW1wbGUgcmVwYWNrYWdpbmc7IG5vIGNoYW5nZSBmcm9tIDIwMDUtMDUgUmVsZWFzZSAyLjAgY29kZSkKKioKKiogICCpIDIwMDQgUG9seWNvbSwgSW5jLgoqKgoqKiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCioqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgImc3MjIxL2NvbW1vbi90eXBlZGVmLmgiCiNpbmNsdWRlICJnNzIyMS9jb21tb24vYmFzaWNfb3AuaCIKCiNkZWZpbmUgIFBJICAgICAgICAgICAgIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyCgojZGVmaW5lIE1BWF9EQ1RfTEVOR1RIICAgICAgNjQwCiNkZWZpbmUgRENUX0xFTkdUSCAgICAgICAgICAzMjAKI2RlZmluZSBEQ1RfTEVOR1RIX0RJVl8yICAgIDE2MAojZGVmaW5lIERDVF9MRU5HVEhfRElWXzQgICAgIDgwCiNkZWZpbmUgRENUX0xFTkdUSF9ESVZfOCAgICAgNDAKI2RlZmluZSBEQ1RfTEVOR1RIX0RJVl8xNiAgICAyMAojZGVmaW5lIERDVF9MRU5HVEhfRElWXzMyICAgIDEwCiNkZWZpbmUgRENUX0xFTkdUSF9ESVZfNjQgICAgIDUKCgojZGVmaW5lIE1BWChhLGIpIChhID4gYiA/IGEgOiBiKQojZGVmaW5lIE1JTihhLGIpIChhIDwgYiA/IGEgOiBiKQoKI2RlZmluZSBOVU1fQ0FURUdPUklFUyAgICAgICAgICAgICAgICAgIDgKI2RlZmluZSBOVU1fQ0FURUdPUklaQVRJT05fQ09OVFJPTF9CSVRTICAgICAgICAgICA0CiNkZWZpbmUgTlVNX0NBVEVHT1JJWkFUSU9OX0NPTlRST0xfUE9TU0lCSUxJVElFUyAgMTYKI2RlZmluZSBDT1JFX1NJWkUgICAgICAgMTAKI2RlZmluZSBEQ1RfTEVOR1RIX0xPRyAgNgojZGVmaW5lIE1BWF9EQ1RfTEVOR1RIX0xPRyAgNwoKLyogIHJlZ2lvbl9zaXplID0gKEJMT0NLX1NJWkUgKiAwLjg3NSkvTlVNX1JFR0lPTlM7ICovCiNkZWZpbmUgTlVNQkVSX09GX1JFR0lPTlMgICAgICAgMTQKI2RlZmluZSBNQVhfTlVNQkVSX09GX1JFR0lPTlMgICAyOAojZGVmaW5lIFJFR0lPTl9TSVpFICAgICAgICAgICAgIDIwCiNkZWZpbmUgTlVNQkVSX09GX1ZBTElEX0NPRUZTICAgKE5VTUJFUl9PRl9SRUdJT05TICogUkVHSU9OX1NJWkUpCiNkZWZpbmUgTUFYX05VTUJFUl9PRl9WQUxJRF9DT0VGUyAgIChNQVhfTlVNQkVSX09GX1JFR0lPTlMgKiBSRUdJT05fU0laRSkKCiNkZWZpbmUgUkVHSU9OX1BPV0VSX1RBQkxFX1NJWkUgNjQKI2RlZmluZSBSRUdJT05fUE9XRVJfVEFCTEVfTlVNX05FR0FUSVZFUyAyNAoKI2RlZmluZSBNQVhfTlVNX0NBVEVHT1JJWkFUSU9OX0NPTlRST0xfQklUUyA1CiNkZWZpbmUgTUFYX05VTV9DQVRFR09SSVpBVElPTl9DT05UUk9MX1BPU1NJQklMSVRJRVMgMzIKCiNkZWZpbmUgRU5DT0RFUl9TQ0FMRV9GQUNUT1IgMTgzMTguMAoKLyogVGhlIE1MVCBvdXRwdXQgaXMgaW5jb3JyZWN0bHkgc2NhbGVkIGJ5IHRoZSBmYWN0b3IKICAgcHJvZHVjdCBvZiBFTkNPREVSX1NDQUxFX0ZBQ1RPUiBhbmQgc3FydCgxNjAuKQogICBUaGlzIGlzIG5vdyAoOS8zMC85NikgMS4wLzJeKDQuNSkgb3IgMS8yMi42MjcuCiAgIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHRoaXMgIAogICBtdXN0IGJlIGFuIGludGVnZXIgcG93ZXIgb2Ygc3FydCgyKS4gVGhlCiAgIGludGVnZXIgcG93ZXIgaXMgRVNGX0FESlVTVE1FTlRfVE9fUk1TX0lOREVYLgogICBUaGUgLTIgaXMgdG8gY29uZm9ybSB3aXRoIHRoZSByYW5nZSBkZWZpbmVkIGluIHRoZSBzcGVjLiAqLwoKIAojZGVmaW5lIEVTRl9BREpVU1RNRU5UX1RPX1JNU19JTkRFWCAoOS0yKQogCgojZGVmaW5lIElOVEVSTUVESUFURV9GSUxFU19GTEFHIDAKCi8qIE1heCBiaXQgcmF0ZSBpcyA0ODAwMCBiaXRzL3NlYy4gKi8KI2RlZmluZSBNQVhfQklUU19QRVJfRlJBTUUgOTYwCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogVHlwZSBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgV29yZDE2IGNvZGVfYml0X2NvdW50OyAgICAgIC8qIGJpdCBjb3VudCBvZiB0aGUgY3VycmVudCB3b3JkICovCiAgICBXb3JkMTYgY3VycmVudF93b3JkOyAgICAgICAgLyogY3VycmVudCB3b3JkIGluIHRoZSBiaXRzdHJlYW0gYmVpbmcgcHJvY2Vzc2VkICovCiAgICBXb3JkMTYgKmNvZGVfd29yZF9wdHI7ICAgICAgLyogcG9pbnRlciB0byB0aGUgYml0c3RyZWFtICovCiAgICBXb3JkMTYgbnVtYmVyX29mX2JpdHNfbGVmdDsgLyogbnVtYmVyIG9mIGJpdHMgbGVmdCBpbiB0aGUgY3VycmVudCB3b3JkICovCiAgICBXb3JkMTYgbmV4dF9iaXQ7ICAgICAgICAgICAgLyogbmV4dCBiaXQgaW4gdGhlIGN1cnJlbnQgd29yZCAqLwp9Qml0X09iajsKCnR5cGVkZWYgc3RydWN0CnsKICAgIFdvcmQxNiBzZWVkMDsKICAgIFdvcmQxNiBzZWVkMTsKICAgIFdvcmQxNiBzZWVkMjsKICAgIFdvcmQxNiBzZWVkMzsKfVJhbmRfT2JqOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogRnVuY3Rpb24gZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZXh0ZXJuIFdvcmQxNiAgY29tcHV0ZV9yZWdpb25fcG93ZXJzKFdvcmQxNiAgKm1sdF9jb2VmcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgIG1hZ19zaGlmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICpkcnBfbnVtX2JpdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVdvcmQxNiAqZHJwX2NvZGVfYml0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICphYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBudW1iZXJfb2ZfcmVnaW9ucyk7Cgp2b2lkICAgIHZlY3Rvcl9xdWFudGl6ZV9tbHRzKFdvcmQxNiBudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IG51bWJlcl9vZl9yZWdpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqbWx0X2NvZWZzLAogICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqYWJzb2x1dGVfcmVnaW9uX3Bvd2VyX2luZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcG93ZXJfY2F0ZWdvcmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmNhdGVnb3J5X2JhbGFuY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcF9jYXRlZ29yaXphdGlvbl9jb250cm9sLAogICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcmVnaW9uX21sdF9iaXRfY291bnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgIFVXb3JkMzIgKnJlZ2lvbl9tbHRfYml0cyk7CgpXb3JkMTYgIHZlY3Rvcl9odWZmbWFuKFdvcmQxNiBjYXRlZ29yeSwKICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBwb3dlcl9pbmRleCwKICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcmF3X21sdF9wdHIsCiAgICAgICAgICAgICAgICAgICAgICBVV29yZDMyICp3b3JkX3B0cik7CgoKdm9pZCAgICBhZGp1c3RfYWJzX3JlZ2lvbl9wb3dlcl9pbmRleChXb3JkMTYgKmFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleCxXb3JkMTYgKm1sdF9jb2VmcyxXb3JkMTYgbnVtYmVyX29mX3JlZ2lvbnMpOwoKdm9pZCAgICBiaXRzX3RvX3dvcmRzKFVXb3JkMzIgKnJlZ2lvbl9tbHRfYml0cyxXb3JkMTYgKnJlZ2lvbl9tbHRfYml0X2NvdW50cywKICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqZHJwX251bV9iaXRzLFVXb3JkMTYgKmRycF9jb2RlX2JpdHMsV29yZDE2ICpvdXRfd29yZHMsCiAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgY2F0ZWdvcml6YXRpb25fY29udHJvbCwgV29yZDE2ICBudW1iZXJfb2ZfcmVnaW9ucywKICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgbnVtX2NhdGVnb3JpemF0aW9uX2NvbnRyb2xfYml0cywgV29yZDE2IG51bWJlcl9vZl9iaXRzX3Blcl9mcmFtZSk7Cgp2b2lkICAgIGVuY29kZXIoV29yZDE2ICBudW1iZXJfb2ZfYXZhaWxhYmxlX2JpdHMsCiAgICAgICAgICAgICAgICBXb3JkMTYgIG51bWJlcl9vZl9yZWdpb25zLAogICAgICAgICAgICAgICAgV29yZDE2ICAqbWx0X2NvZWZzLAogICAgICAgICAgICAgICAgV29yZDE2ICBtYWdfc2hpZnQsCiAgICAgICAgICAgICAgICBXb3JkMTYgICpvdXRfd29yZHMpOwoKdm9pZCBkZWNvZGVyKEJpdF9PYmogKmJpdG9iaiwKICAgIAkgICAgIFJhbmRfT2JqICpyYW5kb2JqLAogICAgICAgICAgICAgV29yZDE2IG51bWJlcl9vZl9yZWdpb25zLAogICAgICAgICAgICAgV29yZDE2ICpkZWNvZGVyX21sdF9jb2VmcywKCSAgICAgICAgIFdvcmQxNiAqcF9tYWdfc2hpZnQsCgkgICAgICAgICBXb3JkMTYgKnBfb2xkX21hZ19zaGlmdCwKCSAgICAgICAgIFdvcmQxNiAqb2xkX2RlY29kZXJfbWx0X2NvZWZzLAoJICAgICAgICAgV29yZDE2IGZyYW1lX2Vycm9yX2ZsYWcpOwoKV29yZDE2ICBzYW1wbGVzX3RvX3JtbHRfY29lZnMoY29uc3QgV29yZDE2ICpuZXdfc2FtcGxlcyxXb3JkMTYgKmhpc3RvcnksV29yZDE2ICpjb2VmcyxXb3JkMTYgZGN0X2xlbmd0aCk7CnZvaWQgcm1sdF9jb2Vmc190b19zYW1wbGVzKFdvcmQxNiAqY29lZnMsICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpvbGRfc2FtcGxlcywgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKm91dF9zYW1wbGVzLCAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBkY3RfbGVuZ3RoLCAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBtYWdfc2hpZnQpOwoKV29yZDE2ICBpbmRleF90b19hcnJheShXb3JkMTYgaW5kZXgsV29yZDE2ICphcnJheSxXb3JkMTYgY2F0ZWdvcnkpOwp2b2lkICAgIGNhdGVnb3JpemUoV29yZDE2IG51bWJlcl9vZl9hdmFpbGFibGVfYml0cywKICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1iZXJfb2ZfcmVnaW9ucywKCQkJCSAgIFdvcmQxNiBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzLAoJCSAgICAgICAgICAgV29yZDE2ICpybXNfaW5kZXgsCgkJICAgICAgICAgICBXb3JkMTYgKnBvd2VyX2NhdGVnb3JpZXMsCgkJICAgICAgICAgICBXb3JkMTYgKmNhdGVnb3J5X2JhbGFuY2VzKTsKCldvcmQxNiBjYWxjX29mZnNldChXb3JkMTYgKnJtc19pbmRleCxXb3JkMTYgbnVtYmVyX29mX3JlZ2lvbnMsV29yZDE2IGF2YWlsYWJsZV9iaXRzKTsgICAgCnZvaWQgICBjb21wdXRlX3Jhd19wb3dfY2F0ZWdvcmllcyhXb3JkMTYgKnBvd2VyX2NhdGVnb3JpZXMsV29yZDE2ICpybXNfaW5kZXgsV29yZDE2IG51bWJlcl9vZl9yZWdpb25zLFdvcmQxNiBvZmZzZXQpOwp2b2lkICAgY29tcF9wb3dlcmNhdF9hbmRfY2F0YmFsYW5jZShXb3JkMTYgKnBvd2VyX2NhdGVnb3JpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqY2F0ZWdvcnlfYmFsYW5jZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcm1zX2luZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtYmVyX29mX2F2YWlsYWJsZV9iaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgbnVtYmVyX29mX3JlZ2lvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgb2Zmc2V0KTsKIAp2b2lkIGRjdF90eXBlX2l2X2EgKFdvcmQxNiAqaW5wdXQsV29yZDE2ICpvdXRwdXQsV29yZDE2IGRjdF9sZW5ndGgpOwp2b2lkIGRjdF90eXBlX2l2X3MoV29yZDE2ICppbnB1dCxXb3JkMTYgKm91dHB1dCxXb3JkMTYgZGN0X2xlbmd0aCk7CnZvaWQgZGVjb2RlX2VudmVsb3BlKEJpdF9PYmogKmJpdG9iaiwKICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICBudW1iZXJfb2ZfcmVnaW9ucywKICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICAqZGVjb2Rlcl9yZWdpb25fc3RhbmRhcmRfZGV2aWF0aW9uLAoJCSAgICAgICAgICAgICBXb3JkMTYgICphYnNvbHV0ZV9yZWdpb25fcG93ZXJfaW5kZXgsCgkJICAgICAgICAgICAgIFdvcmQxNiAgKnBfbWFnX3NoaWZ0KTsKCnZvaWQgZGVjb2RlX3ZlY3Rvcl9xdWFudGl6ZWRfbWx0X2luZGljZXMoQml0X09iaiAgKmJpdG9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYW5kX09iaiAqcmFuZG9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICBudW1iZXJfb2ZfcmVnaW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAqZGVjb2Rlcl9yZWdpb25fc3RhbmRhcmRfZGV2aWF0aW9uLAoJCQkJCSAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiAgICpkZWRlY29kZXJfcG93ZXJfY2F0ZWdvcmllcywKCQkJCQkgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgICAqZGVkZWNvZGVyX21sdF9jb2Vmcyk7Cgp2b2lkIHJhdGVfYWRqdXN0X2NhdGVnb3JpZXMoV29yZDE2IGNhdGVnb3JpemF0aW9uX2NvbnRyb2wsCgkJCSAgICAgICAgICAgICAgICBXb3JkMTYgKmRlY29kZXJfcG93ZXJfY2F0ZWdvcmllcywKCQkJICAgICAgICAgICAgICAgIFdvcmQxNiAqZGVjb2Rlcl9jYXRlZ29yeV9iYWxhbmNlcyk7Cgp2b2lkIGdldF9uZXh0X2JpdChCaXRfT2JqICpiaXRvYmopOwpXb3JkMTYgZ2V0X3JhbmQoUmFuZF9PYmogKnJhbmRvYmopOwoKdm9pZCB0ZXN0XzRfZnJhbWVfZXJyb3JzKEJpdF9PYmogKmJpdG9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1iZXJfb2ZfcmVnaW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmQxNiBudW1fY2F0ZWdvcml6YXRpb25fY29udHJvbF9wb3NzaWJpbGl0aWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpmcmFtZV9lcnJvcl9mbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgV29yZDE2IGNhdGVnb3JpemF0aW9uX2NvbnRyb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmFic29sdXRlX3JlZ2lvbl9wb3dlcl9pbmRleCk7Cgp2b2lkIGVycm9yX2hhbmRsaW5nKFdvcmQxNiBudW1iZXJfb2ZfY29lZnMsCiAgICAgICAgICAgICAgICAgICAgV29yZDE2IG51bWJlcl9vZl92YWxpZF9jb2VmcywKICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKmZyYW1lX2Vycm9yX2ZsYWcsCiAgICAgICAgICAgICAgICAgICAgV29yZDE2ICpkZWNvZGVyX21sdF9jb2VmcywKICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKm9sZF9kZWNvZGVyX21sdF9jb2VmcywKICAgICAgICAgICAgICAgICAgICBXb3JkMTYgKnBfbWFnX3NoaWZ0LAogICAgICAgICAgICAgICAgICAgIFdvcmQxNiAqcF9vbGRfbWFnX3NoaWZ0KTsKCgo=