LyoKICogQ09NIHByb3h5L3N0dWIgZmFjdG9yeSAoQ1N0ZFBTRmFjdG9yeSkgaW1wbGVtZW50YXRpb24KICoKICogQ29weXJpZ2h0IDIwMDEgT3ZlIEvldmVuLCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2RlZmluZSBDT0JKTUFDUk9TCgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgojaW5jbHVkZSAid2lucmVnLmgiCgojaW5jbHVkZSAib2JqYmFzZS5oIgoKI2luY2x1ZGUgInJwY3Byb3h5LmgiCgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKI2luY2x1ZGUgImNwc2YuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKG9sZSk7CgpzdGF0aWMgQk9PTCBGaW5kUHJveHlJbmZvKGNvbnN0IFByb3h5RmlsZUluZm8gKipwUHJveHlGaWxlTGlzdCwgUkVGSUlEIHJpaWQsIGNvbnN0IFByb3h5RmlsZUluZm8gKipwUHJveHlJbmZvLCBpbnQgKnBJbmRleCkKewogIHdoaWxlICgqcFByb3h5RmlsZUxpc3QpIHsKICAgIGlmICgoKnBQcm94eUZpbGVMaXN0KS0+cElJRExvb2t1cFJ0bihyaWlkLCBwSW5kZXgpKSB7CiAgICAgICpwUHJveHlJbmZvID0gKnBQcm94eUZpbGVMaXN0OwogICAgICBUUkFDRSgiZm91bmQ6IFByb3h5SW5mbyAlcCBJbmRleCAlZFxuIiwgKnBQcm94eUluZm8sICpwSW5kZXgpOwogICAgICByZXR1cm4gVFJVRTsKICAgIH0KICAgIHBQcm94eUZpbGVMaXN0Kys7CiAgfQogIFRSQUNFKCJub3QgZm91bmRcbiIpOwogIHJldHVybiBGQUxTRTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJIENTdGRQU0ZhY3RvcnlfUXVlcnlJbnRlcmZhY2UoTFBQU0ZBQ1RPUllCVUZGRVIgaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEICpvYmopCnsKICBDU3RkUFNGYWN0b3J5QnVmZmVyICpUaGlzID0gKENTdGRQU0ZhY3RvcnlCdWZmZXIgKilpZmFjZTsKICBUUkFDRSgiKCVwKS0+UXVlcnlJbnRlcmZhY2UoJXMsJXApXG4iLGlmYWNlLGRlYnVnc3RyX2d1aWQocmlpZCksb2JqKTsKICBpZiAoSXNFcXVhbEdVSUQoJklJRF9JVW5rbm93bixyaWlkKSB8fAogICAgICBJc0VxdWFsR1VJRCgmSUlEX0lQU0ZhY3RvcnlCdWZmZXIscmlpZCkpIHsKICAgICpvYmogPSBUaGlzOwogICAgVGhpcy0+UmVmQ291bnQrKzsKICAgIHJldHVybiBTX09LOwogIH0KICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKfQoKc3RhdGljIFVMT05HIFdJTkFQSSBDU3RkUFNGYWN0b3J5X0FkZFJlZihMUFBTRkFDVE9SWUJVRkZFUiBpZmFjZSkKewogIENTdGRQU0ZhY3RvcnlCdWZmZXIgKlRoaXMgPSAoQ1N0ZFBTRmFjdG9yeUJ1ZmZlciAqKWlmYWNlOwogIFRSQUNFKCIoJXApLT5BZGRSZWYoKVxuIixpZmFjZSk7CiAgcmV0dXJuICsrKFRoaXMtPlJlZkNvdW50KTsKfQoKc3RhdGljIFVMT05HIFdJTkFQSSBDU3RkUFNGYWN0b3J5X1JlbGVhc2UoTFBQU0ZBQ1RPUllCVUZGRVIgaWZhY2UpCnsKICBDU3RkUFNGYWN0b3J5QnVmZmVyICpUaGlzID0gKENTdGRQU0ZhY3RvcnlCdWZmZXIgKilpZmFjZTsKICBUUkFDRSgiKCVwKS0+UmVsZWFzZSgpXG4iLGlmYWNlKTsKICByZXR1cm4gLS0oVGhpcy0+UmVmQ291bnQpOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgQ1N0ZFBTRmFjdG9yeV9DcmVhdGVQcm94eShMUFBTRkFDVE9SWUJVRkZFUiBpZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFVOS05PV04gcFVua091dGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQUlBDUFJPWFlCVUZGRVIgKnBwUHJveHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEICpwcHYpCnsKICBDU3RkUFNGYWN0b3J5QnVmZmVyICpUaGlzID0gKENTdGRQU0ZhY3RvcnlCdWZmZXIgKilpZmFjZTsKICBjb25zdCBQcm94eUZpbGVJbmZvICpQcm94eUluZm87CiAgaW50IEluZGV4OwogIFRSQUNFKCIoJXApLT5DcmVhdGVQcm94eSglcCwlcywlcCwlcClcbiIsaWZhY2UscFVua091dGVyLAogICAgICAgZGVidWdzdHJfZ3VpZChyaWlkKSxwcFByb3h5LHBwdik7CiAgaWYgKCFGaW5kUHJveHlJbmZvKFRoaXMtPnBQcm94eUZpbGVMaXN0LHJpaWQsJlByb3h5SW5mbywmSW5kZXgpKQogICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7CiAgcmV0dXJuIFN0ZFByb3h5X0NvbnN0cnVjdChyaWlkLCBwVW5rT3V0ZXIsIFByb3h5SW5mby0+cE5hbWVzQXJyYXlbSW5kZXhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJveHlJbmZvLT5wUHJveHlWdGJsTGlzdFtJbmRleF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm94eUluZm8tPnBTdHViVnRibExpc3RbSW5kZXhdLCBpZmFjZSwgcHBQcm94eSwgcHB2KTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJIENTdGRQU0ZhY3RvcnlfQ3JlYXRlU3R1YihMUFBTRkFDVE9SWUJVRkZFUiBpZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBVTktOT1dOIHBVbmtTZXJ2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFJQQ1NUVUJCVUZGRVIgKnBwU3R1YikKewogIENTdGRQU0ZhY3RvcnlCdWZmZXIgKlRoaXMgPSAoQ1N0ZFBTRmFjdG9yeUJ1ZmZlciAqKWlmYWNlOwogIGNvbnN0IFByb3h5RmlsZUluZm8gKlByb3h5SW5mbzsKICBpbnQgSW5kZXg7CiAgVFJBQ0UoIiglcCktPkNyZWF0ZVN0dWIoJXMsJXAsJXApXG4iLGlmYWNlLGRlYnVnc3RyX2d1aWQocmlpZCksCiAgICAgICBwVW5rU2VydmVyLHBwU3R1Yik7CiAgaWYgKCFGaW5kUHJveHlJbmZvKFRoaXMtPnBQcm94eUZpbGVMaXN0LHJpaWQsJlByb3h5SW5mbywmSW5kZXgpKQogICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7CiAgcmV0dXJuIENTdGRTdHViQnVmZmVyX0NvbnN0cnVjdChyaWlkLCBwVW5rU2VydmVyLCBQcm94eUluZm8tPnBOYW1lc0FycmF5W0luZGV4XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3h5SW5mby0+cFN0dWJWdGJsTGlzdFtJbmRleF0sIGlmYWNlLCBwcFN0dWIpOwp9CgpzdGF0aWMgY29uc3QgSVBTRmFjdG9yeUJ1ZmZlclZ0YmwgQ1N0ZFBTRmFjdG9yeV9WdGJsID0KewogIENTdGRQU0ZhY3RvcnlfUXVlcnlJbnRlcmZhY2UsCiAgQ1N0ZFBTRmFjdG9yeV9BZGRSZWYsCiAgQ1N0ZFBTRmFjdG9yeV9SZWxlYXNlLAogIENTdGRQU0ZhY3RvcnlfQ3JlYXRlUHJveHksCiAgQ1N0ZFBTRmFjdG9yeV9DcmVhdGVTdHViCn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5kckRsbEdldENsYXNzT2JqZWN0IFtSUENSVDQuQF0KICovCkhSRVNVTFQgV0lOQVBJIE5kckRsbEdldENsYXNzT2JqZWN0KFJFRkNMU0lEIHJjbHNpZCwgUkVGSUlEIGlpZCwgTFBWT0lEICpwcHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJveHlGaWxlSW5mbyAqKnBQcm94eUZpbGVMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENMU0lEICpwY2xzaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1N0ZFBTRmFjdG9yeUJ1ZmZlciAqcFBTRmFjdG9yeUJ1ZmZlcikKewogIFRSQUNFKCIoJXMsICVzLCAlcCwgJXAsICVzLCAlcClcbiIsIGRlYnVnc3RyX2d1aWQocmNsc2lkKSwKICAgIGRlYnVnc3RyX2d1aWQoaWlkKSwgcHB2LCBwUHJveHlGaWxlTGlzdCwgZGVidWdzdHJfZ3VpZChwY2xzaWQpLAogICAgcFBTRmFjdG9yeUJ1ZmZlcik7CgogICpwcHYgPSBOVUxMOwogIGlmICghcFBTRmFjdG9yeUJ1ZmZlci0+bHBWdGJsKSB7CiAgICBwUFNGYWN0b3J5QnVmZmVyLT5scFZ0YmwgPSAmQ1N0ZFBTRmFjdG9yeV9WdGJsOwogICAgcFBTRmFjdG9yeUJ1ZmZlci0+UmVmQ291bnQgPSAwOwogICAgcFBTRmFjdG9yeUJ1ZmZlci0+cFByb3h5RmlsZUxpc3QgPSBwUHJveHlGaWxlTGlzdDsKICB9CiAgaWYgKElzRXF1YWxHVUlEKHJjbHNpZCwgcGNsc2lkKSkKICAgIHJldHVybiBJUFNGYWN0b3J5QnVmZmVyX1F1ZXJ5SW50ZXJmYWNlKChMUFBTRkFDVE9SWUJVRkZFUilwUFNGYWN0b3J5QnVmZmVyLCBpaWQsIHBwdik7CiAgZWxzZSB7CiAgICBjb25zdCBQcm94eUZpbGVJbmZvICppbmZvOwogICAgaW50IGluZGV4OwogICAgLyogb3RoZXJ3aXNlLCB0aGUgZGxsIG1heSBiZSB1c2luZyB0aGUgaWlkIGFzIHRoZSBjbHNpZCwgc28KICAgICAqIHNlYXJjaCBmb3IgaXQgaW4gdGhlIHByb3h5IGZpbGUgbGlzdCAqLwogICAgaWYgKEZpbmRQcm94eUluZm8ocFByb3h5RmlsZUxpc3QsIHJjbHNpZCwgJmluZm8sICZpbmRleCkpCiAgICAgIHJldHVybiBJUFNGYWN0b3J5QnVmZmVyX1F1ZXJ5SW50ZXJmYWNlKChMUFBTRkFDVE9SWUJVRkZFUilwUFNGYWN0b3J5QnVmZmVyLCBpaWQsIHBwdik7CgogICAgV0FSTigiY2xhc3MgJXMgbm90IGF2YWlsYWJsZVxuIiwgZGVidWdzdHJfZ3VpZChyY2xzaWQpKTsKICAgIHJldHVybiBDTEFTU19FX0NMQVNTTk9UQVZBSUxBQkxFOwogIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOZHJEbGxDYW5VbmxvYWROb3cgW1JQQ1JUNC5AXQogKi8KSFJFU1VMVCBXSU5BUEkgTmRyRGxsQ2FuVW5sb2FkTm93KENTdGRQU0ZhY3RvcnlCdWZmZXIgKnBQU0ZhY3RvcnlCdWZmZXIpCnsKICByZXR1cm4gIShwUFNGYWN0b3J5QnVmZmVyLT5SZWZDb3VudCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRyRGxsUmVnaXN0ZXJQcm94eSBbUlBDUlQ0LkBdCiAqLwpIUkVTVUxUIFdJTkFQSSBOZHJEbGxSZWdpc3RlclByb3h5KEhNT0RVTEUgaERsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb3h5RmlsZUluZm8gKipwUHJveHlGaWxlTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENMU0lEICpwY2xzaWQpCnsKICBMUFNUUiBjbHNpZDsKICBjaGFyIGtleW5hbWVbMTIwXSwgbW9kdWxlW01BWF9QQVRIXTsKICBIS0VZIGtleSwgc3Via2V5OwogIERXT1JEIGxlbjsKCiAgVFJBQ0UoIiglcCwlcCwlcylcbiIsIGhEbGwsIHBQcm94eUZpbGVMaXN0LCBkZWJ1Z3N0cl9ndWlkKHBjbHNpZCkpOwogIFV1aWRUb1N0cmluZ0EoKFVVSUQqKXBjbHNpZCwgKHVuc2lnbmVkIGNoYXIqKikmY2xzaWQpOwoKICAvKiByZWdpc3RlciBpbnRlcmZhY2VzIHRvIHBvaW50IHRvIGNsc2lkICovCiAgd2hpbGUgKCpwUHJveHlGaWxlTGlzdCkgewogICAgdW5zaWduZWQgdTsKICAgIGZvciAodT0wOyB1PCgqcFByb3h5RmlsZUxpc3QpLT5UYWJsZVNpemU7IHUrKykgewogICAgICBDSW50ZXJmYWNlU3R1YlZ0YmwgKnByb3h5ID0gKCpwUHJveHlGaWxlTGlzdCktPnBTdHViVnRibExpc3RbdV07CiAgICAgIFBDSW50ZXJmYWNlTmFtZSBuYW1lID0gKCpwUHJveHlGaWxlTGlzdCktPnBOYW1lc0FycmF5W3VdOwogICAgICBMUFNUUiBpaWQ7CgogICAgICBUUkFDRSgicmVnaXN0ZXJpbmcgJXMgJXMgPT4gJXNcbiIsIG5hbWUsIGRlYnVnc3RyX2d1aWQocHJveHktPmhlYWRlci5waWlkKSwgY2xzaWQpOwoKICAgICAgVXVpZFRvU3RyaW5nQSgoVVVJRCopcHJveHktPmhlYWRlci5waWlkLCAodW5zaWduZWQgY2hhcioqKSZpaWQpOwogICAgICBzbnByaW50ZihrZXluYW1lLCBzaXplb2Yoa2V5bmFtZSksICJJbnRlcmZhY2VcXHslc30iLCBpaWQpOwogICAgICBScGNTdHJpbmdGcmVlQSgodW5zaWduZWQgY2hhcioqKSZpaWQpOwogICAgICBpZiAoUmVnQ3JlYXRlS2V5RXhBKEhLRVlfQ0xBU1NFU19ST09ULCBrZXluYW1lLCAwLCBOVUxMLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9XUklURSwgTlVMTCwgJmtleSwgTlVMTCkgPT0gRVJST1JfU1VDQ0VTUykgewogICAgICAgIGlmIChuYW1lKQogICAgICAgICAgUmVnU2V0VmFsdWVFeEEoa2V5LCBOVUxMLCAwLCBSRUdfU1osIChMUEJZVEUpbmFtZSwgc3RybGVuKG5hbWUpKTsKICAgICAgICBpZiAoUmVnQ3JlYXRlS2V5RXhBKGtleSwgIlByb3h5U3R1YkNsc2lkMzIiLCAwLCBOVUxMLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZX1dSSVRFLCBOVUxMLCAmc3Via2V5LCBOVUxMKSA9PSBFUlJPUl9TVUNDRVNTKSB7CiAgICAgICAgICBzbnByaW50Zihtb2R1bGUsIHNpemVvZihtb2R1bGUpLCAieyVzfSIsIGNsc2lkKTsKICAgICAgICAgIFJlZ1NldFZhbHVlRXhBKHN1YmtleSwgTlVMTCwgMCwgUkVHX1NaLCAoTFBCWVRFKW1vZHVsZSwgc3RybGVuKG1vZHVsZSkpOwogICAgICAgICAgUmVnQ2xvc2VLZXkoc3Via2V5KTsKICAgICAgICB9CiAgICAgICAgUmVnQ2xvc2VLZXkoa2V5KTsKICAgICAgfQogICAgfQogICAgcFByb3h5RmlsZUxpc3QrKzsKICB9CgogIC8qIHJlZ2lzdGVyIGNsc2lkIHRvIHBvaW50IHRvIG1vZHVsZSAqLwogIHNucHJpbnRmKGtleW5hbWUsIHNpemVvZihrZXluYW1lKSwgIkNMU0lEXFx7JXN9IiwgY2xzaWQpOwogIGxlbiA9IEdldE1vZHVsZUZpbGVOYW1lQShoRGxsLCBtb2R1bGUsIHNpemVvZihtb2R1bGUpKTsKICBpZiAobGVuICYmIGxlbiA8IHNpemVvZihtb2R1bGUpKSB7CiAgICBUUkFDRSgicmVnaXN0ZXJpbmcgQ0xTSUQgJXMgPT4gJXNcbiIsIGNsc2lkLCBtb2R1bGUpOwogICAgaWYgKFJlZ0NyZWF0ZUtleUV4QShIS0VZX0NMQVNTRVNfUk9PVCwga2V5bmFtZSwgMCwgTlVMTCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgS0VZX1dSSVRFLCBOVUxMLCAma2V5LCBOVUxMKSA9PSBFUlJPUl9TVUNDRVNTKSB7CiAgICAgIGlmIChSZWdDcmVhdGVLZXlFeEEoa2V5LCAiSW5Qcm9jU2VydmVyMzIiLCAwLCBOVUxMLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9XUklURSwgTlVMTCwgJnN1YmtleSwgTlVMTCkgPT0gRVJST1JfU1VDQ0VTUykgewogICAgICAgIFJlZ1NldFZhbHVlRXhBKHN1YmtleSwgTlVMTCwgMCwgUkVHX1NaLCAoTFBCWVRFKW1vZHVsZSwgc3RybGVuKG1vZHVsZSkpOwogICAgICAgIFJlZ0Nsb3NlS2V5KHN1YmtleSk7CiAgICAgIH0KICAgICAgUmVnQ2xvc2VLZXkoa2V5KTsKICAgIH0KICB9CgogIC8qIGRvbmUgKi8KICBScGNTdHJpbmdGcmVlQSgodW5zaWduZWQgY2hhcioqKSZjbHNpZCk7CiAgcmV0dXJuIFNfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRyRGxsVW5yZWdpc3RlclByb3h5IFtSUENSVDQuQF0KICovCkhSRVNVTFQgV0lOQVBJIE5kckRsbFVucmVnaXN0ZXJQcm94eShITU9EVUxFIGhEbGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb3h5RmlsZUluZm8gKipwUHJveHlGaWxlTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0xTSUQgKnBjbHNpZCkKewogIExQU1RSIGNsc2lkOwogIGNoYXIga2V5bmFtZVsxMjBdLCBtb2R1bGVbTUFYX1BBVEhdOwogIERXT1JEIGxlbjsKCiAgVFJBQ0UoIiglcCwlcCwlcylcbiIsIGhEbGwsIHBQcm94eUZpbGVMaXN0LCBkZWJ1Z3N0cl9ndWlkKHBjbHNpZCkpOwogIFV1aWRUb1N0cmluZ0EoKFVVSUQqKXBjbHNpZCwgKHVuc2lnbmVkIGNoYXIqKikmY2xzaWQpOwoKICAvKiB1bnJlZ2lzdGVyIGludGVyZmFjZXMgKi8KICB3aGlsZSAoKnBQcm94eUZpbGVMaXN0KSB7CiAgICB1bnNpZ25lZCB1OwogICAgZm9yICh1PTA7IHU8KCpwUHJveHlGaWxlTGlzdCktPlRhYmxlU2l6ZTsgdSsrKSB7CiAgICAgIENJbnRlcmZhY2VTdHViVnRibCAqcHJveHkgPSAoKnBQcm94eUZpbGVMaXN0KS0+cFN0dWJWdGJsTGlzdFt1XTsKICAgICAgUENJbnRlcmZhY2VOYW1lIG5hbWUgPSAoKnBQcm94eUZpbGVMaXN0KS0+cE5hbWVzQXJyYXlbdV07CiAgICAgIExQU1RSIGlpZDsKCiAgICAgIFRSQUNFKCJ1bnJlZ2lzdGVyaW5nICVzICVzIDw9ICVzXG4iLCBuYW1lLCBkZWJ1Z3N0cl9ndWlkKHByb3h5LT5oZWFkZXIucGlpZCksIGNsc2lkKTsKCiAgICAgIFV1aWRUb1N0cmluZ0EoKFVVSUQqKXByb3h5LT5oZWFkZXIucGlpZCwgKHVuc2lnbmVkIGNoYXIqKikmaWlkKTsKICAgICAgc25wcmludGYoa2V5bmFtZSwgc2l6ZW9mKGtleW5hbWUpLCAiSW50ZXJmYWNlXFx7JXN9IiwgaWlkKTsKICAgICAgUnBjU3RyaW5nRnJlZUEoKHVuc2lnbmVkIGNoYXIqKikmaWlkKTsKICAgICAgUmVnRGVsZXRlS2V5QShIS0VZX0NMQVNTRVNfUk9PVCwga2V5bmFtZSk7CiAgICB9CiAgICBwUHJveHlGaWxlTGlzdCsrOwogIH0KCiAgLyogdW5yZWdpc3RlciBjbHNpZCAqLwogIHNucHJpbnRmKGtleW5hbWUsIHNpemVvZihrZXluYW1lKSwgIkNMU0lEXFx7JXN9IiwgY2xzaWQpOwogIGxlbiA9IEdldE1vZHVsZUZpbGVOYW1lQShoRGxsLCBtb2R1bGUsIHNpemVvZihtb2R1bGUpKTsKICBpZiAobGVuICYmIGxlbiA8IHNpemVvZihtb2R1bGUpKSB7CiAgICBUUkFDRSgidW5yZWdpc3RlcmluZyBDTFNJRCAlcyA8PSAlc1xuIiwgY2xzaWQsIG1vZHVsZSk7CiAgICBSZWdEZWxldGVLZXlBKEhLRVlfQ0xBU1NFU19ST09ULCBrZXluYW1lKTsKICB9CgogIC8qIGRvbmUgKi8KICBScGNTdHJpbmdGcmVlQSgodW5zaWduZWQgY2hhcioqKSZjbHNpZCk7CiAgcmV0dXJuIFNfT0s7Cn0K