LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIENvcHlyaWdodCCpIHsxOTk3LTE5OTl9LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiogTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CioKKiAgIERhdGUgICAgICAgIE5hbWUgICAgICAgIERlc2NyaXB0aW9uCiogICAwNi8yNC85OSAgICBoZWxlbmEgICAgICBJbnRlZ3JhdGVkIEFsYW4ncyBORiBlbmhhbmNlbWVudHMgYW5kIEphdmEyIGJ1ZyBmaXhlcwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCgojaWZuZGVmIF9VTlVNCiNkZWZpbmUgX1VOVU0KCiNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgojaW5jbHVkZSAidW5pY29kZS91bWlzYy5oIgoKLyoqCiAqIFxmaWxlCiAqIFxicmllZiBDIEFQSTogTnVtYmVyRm9ybWF0CiAqCiAqIDxoMj4gTnVtYmVyIEZvcm1hdCBDIEFQSSA8L2gyPgogKgogKiBOdW1iZXIgRm9ybWF0IEMgQVBJICBQcm92aWRlcyBmdW5jdGlvbnMgZm9yCiAqIGZvcm1hdHRpbmcgYW5kIHBhcnNpbmcgYSBudW1iZXIuICBBbHNvIHByb3ZpZGVzIG1ldGhvZHMgZm9yCiAqIGRldGVybWluaW5nIHdoaWNoIGxvY2FsZXMgaGF2ZSBudW1iZXIgZm9ybWF0cywgYW5kIHdoYXQgdGhlaXIgbmFtZXMKICogYXJlLgogKiA8UD4KICogVU51bWJlckZvcm1hdCBoZWxwcyB5b3UgdG8gZm9ybWF0IGFuZCBwYXJzZSBudW1iZXJzIGZvciBhbnkgbG9jYWxlLgogKiBZb3VyIGNvZGUgY2FuIGJlIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQgb2YgdGhlIGxvY2FsZSBjb252ZW50aW9ucwogKiBmb3IgZGVjaW1hbCBwb2ludHMsIHRob3VzYW5kcy1zZXBhcmF0b3JzLCBvciBldmVuIHRoZSBwYXJ0aWN1bGFyCiAqIGRlY2ltYWwgZGlnaXRzIHVzZWQsIG9yIHdoZXRoZXIgdGhlIG51bWJlciBmb3JtYXQgaXMgZXZlbiBkZWNpbWFsLgogKiBUaGVyZSBhcmUgZGlmZmVyZW50IG51bWJlciBmb3JtYXQgc3R5bGVzIGxpa2UgZGVjaW1hbCwgY3VycmVuY3ksCiAqIHBlcmNlbnQgYW5kIHNwZWxsb3V0LiAKICogPFA+CiAqIFRvIGZvcm1hdCBhIG51bWJlciBmb3IgdGhlIGN1cnJlbnQgTG9jYWxlLCB1c2Ugb25lIG9mIHRoZSBzdGF0aWMKICogZmFjdG9yeSBtZXRob2RzOgogKiA8cHJlPgogKiBcY29kZQogKiAgICBVQ2hhciBteVN0cmluZ1syMF07CiAqICAgIFVGaWVsZFBvc2l0aW9uIHBvcz0wOwogKiAgICBkb3VibGUgbXlOdW1iZXIgPSA3LjA7CiAqICAgIFVFcnJvckNvZGUgc3VjY2VzcyA9IFVfWkVST19FUlJPUjsKICogICAgVU51bWJlckZvcm1hdCogbmYgPSB1bnVtX29wZW4oVU5VTV9ERUZBVUxULCBOVUxMLCAmc3VjY2VzcykKICogICAgdW51bV9mb3JtYXREb3VibGUobmYsIG15TnVtYmVyLCBteVN0cmluZywgdV9zdHJsZW4obXlTdHJpbmcpLCAmcG9zLCAmc3RhdHVzKTsKICogICAgcHJpbnRmKCIgRXhhbXBsZSAxOiAlc1xuIiwgYXVzdHJkdXAobXlTdHJpbmcpICk7IC8vYXVzdHJkdXAoIGEgZnVuY3Rpb24gdXNlZCB0byBjb252ZXJ0IFVDaGFyKiB0byBjaGFyKikKICogXGVuZGNvZGUKICogPC9wcmU+CiAqIElmIHlvdSBhcmUgZm9ybWF0dGluZyBtdWx0aXBsZSBudW1iZXJzLCBpdCBpcyBtb3JlIGVmZmljaWVudCB0byBnZXQKICogdGhlIGZvcm1hdCBhbmQgdXNlIGl0IG11bHRpcGxlIHRpbWVzIHNvIHRoYXQgdGhlIHN5c3RlbSBkb2Vzbid0CiAqIGhhdmUgdG8gZmV0Y2ggdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2NhbCBsYW5ndWFnZSBhbmQgY291bnRyeQogKiBjb252ZW50aW9ucyBtdWx0aXBsZSB0aW1lcy4KICogPHByZT4KICogXGNvZGUKICogICAgIFVDaGFyKiBteVN0cmluZzsKICogICAgIHRfaW50MzIgaSwgcmVzdWx0bGVuZ3RoLCByZXNsZW5uZWVkZWQ7CiAqICAgICBVRXJyb3JDb2RlIHN1Y2Nlc3MgPSBVX1pFUk9fRVJST1I7CiAqICAgICBVRmllbGRQb3NpdGlvbiBwb3M9MDsKICogICAgIHRfaW50MzIgYVtdID0geyAxMjMsIDMzMzMsIC0xMjM0NTY3IH07CiAqICAgICBjb25zdCB0X2ludDMyIGFfbGVuID0gc2l6ZW9mKGEpIC8gc2l6ZW9mKGFbMF0pOwogKiAgICAgVU51bWJlckZvcm1hdCogbmYgPSB1bnVtX29wZW4oVU5VTV9ERUZBVUxULCBOVUxMLCAmc3VjY2VzcykKICogICAgIGZvciAoaSA9IDA7IGkgPCBhX2xlbjsgaSsrKSB7CiAqICAgICByZXN1bHRsZW5ndGg9MDsKICogICAgIHJlc2xlbm5lZWRlZD11bnVtX2Zvcm1hdChuZiwgYVtpXSwgTlVMTCwgcmVzdWx0bGVuZ3RoLCAmcG9zLCAmc3RhdHVzKTsKICogICAgIGlmKHN0YXR1cz09VV9CVUZGRVJfT1ZFUkZMT1dfRVJST1IpewogKiAgICAgICAgIHN0YXR1cz1VX1pFUk9fRVJST1I7CiAqICAgICAgICAgcmVzdWx0bGVuZ3RoPXJlc3VsdGxlbmd0aG5lZWRlZCsxOwogKiAgICAgICAgIHJlc3VsdD0oVUNoYXIqKW1hbGxvYyhzaXplb2YoVUNoYXIpICogcmVzdWx0bGVuZ3RoKTsKICogICAgICAgICB1bnVtX2Zvcm1hdChuZiwgYVtpXSwgcmVzdWx0LCByZXN1bHRsZW5ndGgsICZwb3MsICZzdGF0dXMpOwogKiAgICAgfQogKiAgICAgcHJpbnRmKCIgRXhhbXBsZSAyOiAlc1xuIiwgYXVzdHJkdXAocmVzdWx0KSApOwogKiAgICAgZnJlZShyZXN1bHQpOwogKiAgICAgfQogKiBcZW5kY29kZQogKiA8L3ByZT4KICogVG8gZm9ybWF0IGEgbnVtYmVyIGZvciBhIGRpZmZlcmVudCBMb2NhbGUsIHNwZWNpZnkgaXQgaW4gdGhlCiAqIGNhbGwgdG8gdW51bV9vcGVuKCkuCiAqIDxwcmU+CiAqIFxjb2RlCiAqICAgICBVTnVtYmVyRm9ybWF0KiBuZiA9IHVudW1fb3BlbihVTlVNX0RFRkFVTFQsICJmcl9GUiIsICZzdWNjZXNzKQogKiBcZW5kY29kZQogKiA8L3ByZT4KICogWW91IGNhbiB1c2UgYSBOdW1iZXJGb3JtYXQgQVBJIHVudW1fcGFyc2UoKSB0byBwYXJzZS4KICogPHByZT4KICogXGNvZGUKICogICAgVUVycm9yQ29kZSBzdWNjZXNzOwogKiAgICB0X2ludDMyIHBvcz0wOwogKiAgICB1bnVtX3BhcnNlKG5mLCByZXN1bHQsIHVfc3RybGVuKHJlc3VsdCksICZwb3MsICZzdWNjZXNzKTsKICogXGVuZGNvZGUKICogPC9wcmU+CiAqIFVzZSBVQ0FMX0RFQ0lNQUwgdG8gZ2V0IHRoZSBub3JtYWwgbnVtYmVyIGZvcm1hdCBmb3IgdGhhdCBjb3VudHJ5LgogKiBUaGVyZSBhcmUgb3RoZXIgc3RhdGljIG9wdGlvbnMgYXZhaWxhYmxlLiAgVXNlIFVDQUxfQ1VSUkVOQ1kKICogdG8gZ2V0IHRoZSBjdXJyZW5jeSBudW1iZXIgZm9ybWF0IGZvciB0aGF0IGNvdW50cnkuICBVc2UgVUNBTF9QRVJDRU5UCiAqIHRvIGdldCBhIGZvcm1hdCBmb3IgZGlzcGxheWluZyBwZXJjZW50YWdlcy4gV2l0aCB0aGlzIGZvcm1hdCwgYQogKiBmcmFjdGlvbiBmcm9tIDAuNTMgaXMgZGlzcGxheWVkIGFzIDUzJS4KICogPFA+CiAqIFlvdSBjYW4gYWxzbyBjb250cm9sIHRoZSBkaXNwbGF5IG9mIG51bWJlcnMgd2l0aCBzdWNoIGZ1bmN0aW9uIGFzCiAqIHVudW1fZ2V0QXR0cmlidWVzKCkgYW5kIHVudW1fc2V0QXRyaWJ1dGVzKCkuICB3aGVyZSBpbiB5b3UgY2FuIHNldCB0aGUKICogbWltaW51bSBmcmFjdGlvbiBkaWdpdHMsIGdyb3VwaW5nIHVzZWQgZXRjLgogKiBAc2VlIFVOdW1iZXJGb3JtYXRBdHRyaWJ1dGVzIGZvciBtb3JlIGRldGFpbHMKICogPFA+CiAqIFlvdSBjYW4gYWxzbyB1c2UgZm9ybXMgb2YgdGhlIHBhcnNlIGFuZCBmb3JtYXQgbWV0aG9kcyB3aXRoCiAqIFBhcnNlUG9zaXRpb24gYW5kIFVGaWVsZFBvc2l0aW9uIHRvIGFsbG93IHlvdSB0bzoKICogPHVsIHR5cGU9cm91bmQ+CiAqICAgPGxpPihhKSBwcm9ncmVzc2l2ZWx5IHBhcnNlIHRocm91Z2ggcGllY2VzIG9mIGEgc3RyaW5nLgogKiAgIDxsaT4oYikgYWxpZ24gdGhlIGRlY2ltYWwgcG9pbnQgYW5kIG90aGVyIGFyZWFzLgogKiA8L3VsPgogKiA8cD4KICogSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBjaGFuZ2Ugb3Igc2V0IHRoZSBzeW1ib2xzIHVzZWQgZm9yIGEgcGFydGljdWxhcgogKiBsb2NhbGUgbGlrZSB0aGUgY3VycmVuY3kgc3ltYm9sLCB0aGUgZ3JvdXBpbmcgc2VwZXJhdG9yICwgbW9uZXRhcnkgc2VwZXJhdG9yIAogKiBldGMgYnkgbWFraW5nIHVzZSBvZiBmdW5jdGlvbnMgdW51bV9zZXRTeW1ib2xzKCkgYW5kIHVudW1fZ2V0U3ltYm9scygpLgogKi8KCi8qKiBBIG51bWJlciBmb3JtYXR0ZXIuIAogKiAgRm9yIHVzYWdlIGluIEMgcHJvZ3JhbXMuCiAqLwp0eXBlZGVmIHZvaWQqIFVOdW1iZXJGb3JtYXQ7CgovKiogVGhlIHBvc3NpYmxlIG51bWJlciBmb3JtYXQgc3R5bGVzLiAqLwplbnVtIFVOdW1iZXJGb3JtYXRTdHlsZSB7CiAgICAvKiogRGVjaW1hbCBmb3JtYXQgKi8KICAgIFVOVU1fREVDSU1BTCwKICAgIC8qKiBDdXJyZW5jeSBmb3JtYXQgKi8KICAgIFVOVU1fQ1VSUkVOQ1ksCiAgICAvKiogUGVyY2VudCBmb3JtYXQgKi8KICAgIFVOVU1fUEVSQ0VOVCwKICAgIC8qKiBTcGVsbG91dCBmb3JtYXQgKi8KICAgIFVOVU1fU1BFTExPVVQsCiAgICAvKiogRGVmYXVsdCBmb3JtYXQgKi8KICAgIFVOVU1fREVGQVVMVCA9IFVOVU1fREVDSU1BTAp9Owp0eXBlZGVmIGVudW0gVU51bWJlckZvcm1hdFN0eWxlIFVOdW1iZXJGb3JtYXRTdHlsZTsKCmVudW0gVU51bWJlckZvcm1hdFJvdW5kaW5nTW9kZSB7CiAgICBVTlVNX1JPVU5EX0NFSUxJTkcsCiAgICBVTlVNX1JPVU5EX0ZMT09SLAogICAgVU5VTV9ST1VORF9ET1dOLAogICAgVU5VTV9ST1VORF9VUCwKICAgIFVOVU1fRk9VTkRfSEFMRkVWRU4sCiAgICBVTlVNX1JPVU5EX0hBTEZET1dOLAogICAgVU5VTV9ST1VORF9IQUxGVVAKfTsKdHlwZWRlZiBlbnVtIFVOdW1iZXJGb3JtYXRSb3VuZGluZ01vZGUgVU51bWJlckZvcm1hdFJvdW5kaW5nTW9kZTsKCmVudW0gVU51bWJlckZvcm1hdFBhZFBvc2l0aW9uIHsKICAgIFVOVU1fUEFEX0JFRk9SRV9QUkVGSVgsCiAgICBVTlVNX1BBRF9BRlRFUl9QUkVGSVgsCiAgICBVTlVNX1BBRF9CRUZPUkVfU1VGRklYLAogICAgVU5VTV9QQURfQUZURVJfU1VGRklYCn07CnR5cGVkZWYgZW51bSBVTnVtYmVyRm9ybWF0UGFkUG9zaXRpb24gVU51bWJlckZvcm1hdFBhZFBvc2l0aW9uOwoKLyoqCiogT3BlbiBhIG5ldyBVTnVtYmVyRm9ybWF0IGZvciBmb3JtYXR0aW5nIGFuZCBwYXJzaW5nIG51bWJlcnMuCiogQSBVTnVtYmVyRm9ybWF0IG1heSBiZSB1c2VkIHRvIGZvcm1hdCBudW1iZXJzIGluIGNhbGxzIHRvIFxSZWZ7dW51bV9mb3JtYXR9LAoqIGFuZCB0byBwYXJzZSBudW1iZXJzIGluIGNhbGxzIHRvIFxSZWZ7dW51bV9wYXJzZX0uCiogQHBhcmFtIHN0eWxlIFRoZSB0eXBlIG9mIG51bWJlciBmb3JtYXQgdG8gb3Blbjogb25lIG9mIFVOVU1fREVDSU1BTCwgVU5VTV9DVVJSRU5DWSwKKiBVTlVNX1BFUkNFTlQsIFVOVU1fU1BFTExPVVQsIG9yIFVOVU1fREVGQVVMVAoqIEBwYXJhbSBsb2NhbGUgVGhlIGxvY2FsZSBzcGVjaWZ5aW5nIHRoZSBmb3JtYXR0aW5nIGNvbnZlbnRpb25zCiogQHBhcmFtIHN0YXR1cyBBIHBvaW50ZXIgdG8gYW4gVUVycm9yQ29kZSB0byByZWNlaXZlIGFueSBlcnJvcnMKKiBAcmV0dXJuIEEgcG9pbnRlciB0byBhIFVOdW1iZXJGb3JtYXQgdG8gdXNlIGZvciBmb3JtYXR0aW5nIG51bWJlcnMsIG9yIDAgaWYKKiBhbiBlcnJvciBvY2N1cnJlZC4KKiBAc2VlIHVudW1fb3BlblBhdHRlcm4KKiBAc3RhYmxlCiovClVfQ0FQSSBVTnVtYmVyRm9ybWF0Kgp1bnVtX29wZW4oVU51bWJlckZvcm1hdFN0eWxlICAgIHN0eWxlLAogICAgICBjb25zdCAgIGNoYXIqICAgICAgICBsb2NhbGUsCiAgICAgIFVFcnJvckNvZGUqICAgICAgICBzdGF0dXMpOwoKLyoqCiogT3BlbiBhIG5ldyBVTnVtYmVyRm9ybWF0IGZvciBmb3JtYXR0aW5nIGFuZCBwYXJzaW5nIG51bWJlcnMuCiogQSBVTnVtYmVyRm9ybWF0IG1heSBiZSB1c2VkIHRvIGZvcm1hdCBudW1iZXJzIGluIGNhbGxzIHRvIFxSZWZ7dW51bV9mb3JtYXR9LAoqIGFuZCB0byBwYXJzZSBudW1iZXJzIGluIGNhbGxzIHRvIFxSZWZ7dW51bV9wYXJzZX0uCiogQHBhcmFtIHBhdHRlcm4gQSBwYXR0ZXJuIHNwZWNpZnlpbmcgdGhlIGZvcm1hdCB0byB1c2UuCiogQHBhcmFtIHBhdHRlcm5MZW5ndGggVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBwYXR0ZXJuLCBvciAtMSBpZiBudWxsLXRlcm1pbmF0ZWQuCiogQHBhcmFtIGxvY2FsZSBUaGUgbG9jYWxlIHNwZWNpZnlpbmcgdGhlIGZvcm1hdHRpbmcgY29udmVudGlvbnMKKiBAcGFyYW0gc3RhdHVzIEEgcG9pbnRlciB0byBhbiBVRXJyb3JDb2RlIHRvIHJlY2VpdmUgYW55IGVycm9ycwoqIEByZXR1cm4gQSBwb2ludGVyIHRvIGEgVU51bWJlckZvcm1hdCB0byB1c2UgZm9yIGZvcm1hdHRpbmcgbnVtYmVycywgb3IgMCBpZgoqIGFuIGVycm9yIG9jY3VycmVkLgoqIEBzZWUgdW51bV9vcGVuCiogQGRyYWZ0CiovClVfQ0FQSSBVTnVtYmVyRm9ybWF0Kgp1bnVtX29wZW5QYXR0ZXJuKCAgICBjb25zdCAgICBVQ2hhciogICAgICAgIHBhdHRlcm4sCiAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICBwYXR0ZXJuTGVuZ3RoLAogICAgICAgICAgICBjb25zdCAgICBjaGFyKiAgICAgICAgbG9jYWxlLAogICAgICAgICAgICBVRXJyb3JDb2RlKiAgICAgICAgc3RhdHVzKTsKCi8qKgoqIENsb3NlIGEgVU51bWJlckZvcm1hdC4KKiBPbmNlIGNsb3NlZCwgYSBVTnVtYmVyRm9ybWF0IG1heSBubyBsb25nZXIgYmUgdXNlZC4KKiBAcGFyYW0gZm10IFRoZSBmb3JtYXR0ZXIgdG8gY2xvc2UuCiogQHN0YWJsZQoqLwpVX0NBUEkgdm9pZAp1bnVtX2Nsb3NlKFVOdW1iZXJGb3JtYXQqIGZtdCk7CgovKioKICogT3BlbiBhIGNvcHkgb2YgYSBVTnVtYmVyRm9ybWF0LgogKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgZGVlcCBjb3B5LgogKiBAcGFyYW0gZm10IFRoZSBmb3JtYXQgdG8gY29weQogKiBAcGFyYW0gc3RhdHVzIEEgcG9pbnRlciB0byBhbiBVRXJyb3JDb2RlIHRvIHJlY2VpdmUgYW55IGVycm9ycy4KICogQHJldHVybiBBIHBvaW50ZXIgdG8gYSBVTnVtYmVyRm9ybWF0IGlkZW50aWNhbCB0byBmbXQuCiAqIEBzdGFibGUKICovClVfQ0FQSSBVTnVtYmVyRm9ybWF0Kgp1bnVtX2Nsb25lKGNvbnN0IFVOdW1iZXJGb3JtYXQgKmZtdCwKICAgICAgIFVFcnJvckNvZGUgKnN0YXR1cyk7CgovKioKKiBGb3JtYXQgYW4gaW50ZWdlciB1c2luZyBhIFVOdW1iZXJGb3JtYXQuCiogVGhlIGludGVnZXIgd2lsbCBiZSBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBVTnVtYmVyRm9ybWF0J3MgbG9jYWxlLgoqIEBwYXJhbSBmbXQgVGhlIGZvcm1hdHRlciB0byB1c2UuCiogQHBhcmFtIG51bWJlciBUaGUgbnVtYmVyIHRvIGZvcm1hdC4KKiBAcGFyYW0gcmVzdWx0IEEgcG9pbnRlciB0byBhIGJ1ZmZlciB0byByZWNlaXZlIHRoZSBmb3JtYXR0ZWQgbnVtYmVyLgoqIEBwYXJhbSByZXN1bHRMZW5ndGggVGhlIG1heGltdW0gc2l6ZSBvZiByZXN1bHQuCiogQHBhcmFtIHBvcyBJZiBub3QgMCwgYSBVRmllbGRQb3NpdGlvbiB3aGljaCB3aWxsIHJlY2VpdmUgdGhlIGluZm9ybWF0aW9uIG9uIGEgc3BlY2lmaWMgZmllbGQuCiogQHBhcmFtIHN0YXR1cyBBIHBvaW50ZXIgdG8gYW4gVUVycm9yQ29kZSB0byByZWNlaXZlIGFueSBlcnJvcnMKKiBAcmV0dXJuIFRoZSB0b3RhbCBidWZmZXIgc2l6ZSBuZWVkZWQ7IGlmIGdyZWF0ZXIgdGhhbiByZXN1bHRMZW5ndGgsIHRoZSBvdXRwdXQgd2FzIHRydW5jYXRlZC4KKiBAc2VlIHVudW1fZm9ybWF0RG91YmxlCiogQHNlZSB1bnVtX3BhcnNlCiogQHNlZSB1bnVtX3BhcnNlRG91YmxlCiogQGRyYWZ0CiovClVfQ0FQSSBpbnQzMl90CnVudW1fZm9ybWF0KCAgICBjb25zdCAgICBVTnVtYmVyRm9ybWF0KiAgICBmbXQsCiAgICAgICAgaW50MzJfdCAgICAgICAgICAgIG51bWJlciwKICAgICAgICBVQ2hhciogICAgICAgICAgICByZXN1bHQsCiAgICAgICAgaW50MzJfdCAgICAgICAgICAgIHJlc3VsdExlbmd0aCwKICAgICAgICBVRmllbGRQb3NpdGlvbiAgICAqcG9zLAogICAgICAgIFVFcnJvckNvZGUqICAgICAgICBzdGF0dXMpOwoKLyoqCiogRm9ybWF0IGEgZG91YmxlIHVzaW5nIGEgVU51bWJlckZvcm1hdC4KKiBUaGUgZG91YmxlIHdpbGwgYmUgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgVU51bWJlckZvcm1hdCdzIGxvY2FsZS4KKiBAcGFyYW0gZm10IFRoZSBmb3JtYXR0ZXIgdG8gdXNlLgoqIEBwYXJhbSBudW1iZXIgVGhlIG51bWJlciB0byBmb3JtYXQuCiogQHBhcmFtIHJlc3VsdCBBIHBvaW50ZXIgdG8gYSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgZm9ybWF0dGVkIG51bWJlci4KKiBAcGFyYW0gcmVzdWx0TGVuZ3RoIFRoZSBtYXhpbXVtIHNpemUgb2YgcmVzdWx0LgoqIEBwYXJhbSBwb3MgSWYgbm90IDAsIGEgVUZpZWxkUG9zaXRpb24gd2hpY2ggd2lsbCByZWNlaXZlIHRoZSBpbmZvcm1hdGlvbiBvbiBhIHNwZWNpZmljIGZpZWxkLgoqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzCiogQHJldHVybiBUaGUgdG90YWwgYnVmZmVyIHNpemUgbmVlZGVkOyBpZiBncmVhdGVyIHRoYW4gcmVzdWx0TGVuZ3RoLCB0aGUgb3V0cHV0IHdhcyB0cnVuY2F0ZWQuCiogQHNlZSB1bnVtX2Zvcm1hdAoqIEBzZWUgdW51bV9wYXJzZQoqIEBzZWUgdW51bV9wYXJzZURvdWJsZQoqIEBkcmFmdAoqLwpVX0NBUEkgaW50MzJfdAp1bnVtX2Zvcm1hdERvdWJsZSggICAgY29uc3QgICAgVU51bWJlckZvcm1hdCogIGZtdCwKICAgICAgICAgICAgZG91YmxlICAgICAgICAgIG51bWJlciwKICAgICAgICAgICAgVUNoYXIqICAgICAgICAgIHJlc3VsdCwKICAgICAgICAgICAgaW50MzJfdCAgICAgICAgIHJlc3VsdExlbmd0aCwKICAgICAgICAgICAgVUZpZWxkUG9zaXRpb24gICpwb3MsIC8qIDAgaWYgaWdub3JlICovCiAgICAgICAgICAgIFVFcnJvckNvZGUqICAgICBzdGF0dXMpOwoKLyoqCiogUGFyc2UgYSBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHVzaW5nIGEgVU51bWJlckZvcm1hdC4KKiBUaGUgc3RyaW5nIHdpbGwgYmUgcGFyc2VkIGFjY29yZGluZyB0byB0aGUgVU51bWJlckZvcm1hdCdzIGxvY2FsZS4KKiBAcGFyYW0gZm10IFRoZSBmb3JtYXR0ZXIgdG8gdXNlLgoqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IHRvIHBhcnNlLgoqIEBwYXJhbSB0ZXh0TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGV4dCwgb3IgLTEgaWYgbnVsbC10ZXJtaW5hdGVkLgoqIEBwYXJhbSBwYXJzZVBvcyBJZiBub3QgMCwgb24gaW5wdXQgYSBwb2ludGVyIHRvIGFuIGludGVnZXIgc3BlY2lmeWluZyB0aGUgb2Zmc2V0IGF0IHdoaWNoCiogdG8gYmVnaW4gcGFyc2luZy4gIElmIG5vdCAwLCBvbiBvdXRwdXQgdGhlIG9mZnNldCBhdCB3aGljaCBwYXJzaW5nIGVuZGVkLgoqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzCiogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIHBhcnNlZCBpbnRlZ2VyCiogQHNlZSB1bnVtX3BhcnNlRG91YmxlCiogQHNlZSB1bnVtX2Zvcm1hdAoqIEBzZWUgdW51bV9mb3JtYXREb3VibGUKKiBAZHJhZnQKKi8KVV9DQVBJIGludDMyX3QKdW51bV9wYXJzZSggICAgY29uc3QgICBVTnVtYmVyRm9ybWF0KiAgZm10LAogICAgICAgIGNvbnN0ICAgVUNoYXIqICAgICAgICAgIHRleHQsCiAgICAgICAgaW50MzJfdCAgICAgICAgIHRleHRMZW5ndGgsCiAgICAgICAgaW50MzJfdCAgICAgICAgICpwYXJzZVBvcyAvKiAwID0gc3RhcnQgKi8sCiAgICAgICAgVUVycm9yQ29kZSAgICAgICpzdGF0dXMpOwoKLyoqCiogUGFyc2UgYSBzdHJpbmcgaW50byBhIGRvdWJsZSB1c2luZyBhIFVOdW1iZXJGb3JtYXQuCiogVGhlIHN0cmluZyB3aWxsIGJlIHBhcnNlZCBhY2NvcmRpbmcgdG8gdGhlIFVOdW1iZXJGb3JtYXQncyBsb2NhbGUuCiogQHBhcmFtIGZtdCBUaGUgZm9ybWF0dGVyIHRvIHVzZS4KKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCB0byBwYXJzZS4KKiBAcGFyYW0gdGV4dExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRleHQsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KKiBAcGFyYW0gcGFyc2VQb3MgSWYgbm90IDAsIG9uIGlucHV0IGEgcG9pbnRlciB0byBhbiBpbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIG9mZnNldCBhdCB3aGljaAoqIHRvIGJlZ2luIHBhcnNpbmcuICBJZiBub3QgMCwgb24gb3V0cHV0IHRoZSBvZmZzZXQgYXQgd2hpY2ggcGFyc2luZyBlbmRlZC4KKiBAcGFyYW0gc3RhdHVzIEEgcG9pbnRlciB0byBhbiBVRXJyb3JDb2RlIHRvIHJlY2VpdmUgYW55IGVycm9ycwoqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBwYXJzZWQgZG91YmxlCiogQHNlZSB1bnVtX3BhcnNlCiogQHNlZSB1bnVtX2Zvcm1hdAoqIEBzZWUgdW51bV9mb3JtYXREb3VibGUKKiBAZHJhZnQKKi8KVV9DQVBJIGRvdWJsZQp1bnVtX3BhcnNlRG91YmxlKCAgICBjb25zdCAgIFVOdW1iZXJGb3JtYXQqICBmbXQsCiAgICAgICAgICAgIGNvbnN0ICAgVUNoYXIqICAgICAgICAgIHRleHQsCiAgICAgICAgICAgIGludDMyX3QgICAgICAgICB0ZXh0TGVuZ3RoLAogICAgICAgICAgICBpbnQzMl90ICAgICAgICAgKnBhcnNlUG9zIC8qIDAgPSBzdGFydCAqLywKICAgICAgICAgICAgVUVycm9yQ29kZSAgICAgICpzdGF0dXMpOwoKLyoqCiogU2V0IHRoZSBwYXR0ZXJuIHVzZWQgYnkgYW4gVU51bWJlckZvcm1hdC4KKiBUaGUgcGF0dGVybiBzaG91bGQgZm9sbG93IHRoZSBwYXR0ZXJuIHN5bnRheCBydWxlcy4KKiBAcGFyYW0gZm10IFRoZSBmb3JtYXR0ZXIgdG8gc2V0LgoqIEBwYXJhbSBsb2NhbGl6ZWQgVFJVRSBpZiB0aGUgcGF0dGVybiBpcyBsb2NhbGl6ZWQsIEZBTFNFIG90aGVyd2lzZS4KKiBAcGFyYW0gcGF0dGVybiBUaGUgbmV3IHBhdHRlcm4KKiBAcGFyYW0gcGF0dGVybkxlbmd0aCBUaGUgbGVuZ3RoIG9mIHBhdHRlcm4sIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KKiBAc2VlIHVudW1fdG9QYXR0ZXJuCiogQGRyYWZ0CiovClVfQ0FQSSB2b2lkCnVudW1fYXBwbHlQYXR0ZXJuKCAgICAgICAgICBVTnVtYmVyRm9ybWF0ICAqZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVUJvb2wgICAgICAgICAgbG9jYWxpemVkLAogICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgVUNoYXIgICAgICAgICAgKnBhdHRlcm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgcGF0dGVybkxlbmd0aCk7Ci8qKgoqIEdldCBhIGxvY2FsZSBmb3Igd2hpY2ggbnVtYmVyIGZvcm1hdHRpbmcgcGF0dGVybnMgYXJlIGF2YWlsYWJsZS4KKiBBIFVOdW1iZXJGb3JtYXQgaW4gYSBsb2NhbGUgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiB3aWxsIHBlcmZvcm0gdGhlIGNvcnJlY3QKKiBmb3JtYXR0aW5nIGFuZCBwYXJzaW5nIGZvciB0aGUgbG9jYWxlLgoqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGRlc2lyZWQgbG9jYWxlLgoqIEByZXR1cm4gQSBsb2NhbGUgZm9yIHdoaWNoIG51bWJlciBmb3JtYXR0aW5nIHBhdHRlcm5zIGFyZSBhdmFpbGFibGUsIG9yIDAgaWYgbm9uZS4KKiBAc2VlIHVudW1fY291bnRBdmFpbGFibGUKKiBAc3RhYmxlCiovClVfQ0FQSSBjb25zdCBjaGFyKgp1bnVtX2dldEF2YWlsYWJsZShpbnQzMl90IGluZGV4KTsKCi8qKgoqIERldGVybWluZSBob3cgbWFueSBsb2NhbGVzIGhhdmUgbnVtYmVyIGZvcm1hdHRpbmcgcGF0dGVybnMgYXZhaWxhYmxlLgoqIFRoaXMgZnVuY3Rpb24gaXMgbW9zdCB1c2VmdWwgYXMgZGV0ZXJtaW5pbmcgdGhlIGxvb3AgZW5kaW5nIGNvbmRpdGlvbiBmb3IKKiBjYWxscyB0byBcUmVme3VudW1fZ2V0QXZhaWxhYmxlfS4KKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgbG9jYWxlcyBmb3Igd2hpY2ggbnVtYmVyIGZvcm1hdHRpbmcgcGF0dGVybnMgYXJlIGF2YWlsYWJsZS4KKiBAc2VlIHVudW1fZ2V0QXZhaWxhYmxlCiogQHN0YWJsZQoqLwpVX0NBUEkgaW50MzJfdAp1bnVtX2NvdW50QXZhaWxhYmxlKHZvaWQpOwoKLyoqIFRoZSBwb3NzaWJsZSBVTnVtYmVyRm9ybWF0IG51bWVyaWMgYXR0cmlidXRlcyAqLwplbnVtIFVOdW1iZXJGb3JtYXRBdHRyaWJ1dGUgeyAKICAvKiogUGFyc2UgaW50ZWdlcnMgb25seSAqLwogIFVOVU1fUEFSU0VfSU5UX09OTFksCiAgLyoqIFVzZSBncm91cGluZyBzZXBhcmF0b3IgKi8KICBVTlVNX0dST1VQSU5HX1VTRUQsCiAgLyoqIEFsd2F5cyBzaG93IGRlY2ltYWwgcG9pbnQgKi8KICBVTlVNX0RFQ0lNQUxfQUxXQVlTX1NIT1dOLAogIC8qKiBNYXhpbXVtIGludGVnZXIgZGlnaXRzICovCiAgVU5VTV9NQVhfSU5URUdFUl9ESUdJVFMsCiAgLyoqIE1pbmltdW0gaW50ZWdlciBkaWdpdHMgKi8KICBVTlVNX01JTl9JTlRFR0VSX0RJR0lUUywKICAvKiogSW50ZWdlciBkaWdpdHMgKi8KICBVTlVNX0lOVEVHRVJfRElHSVRTLAogIC8qKiBNYXhpbXVtIGZyYWN0aW9uIGRpZ2l0cyAqLwogIFVOVU1fTUFYX0ZSQUNUSU9OX0RJR0lUUywKICAvKiogTWluaW11bSBmcmFjdGlvbiBkaWdpdHMgKi8KICBVTlVNX01JTl9GUkFDVElPTl9ESUdJVFMsCiAgLyoqIEZyYWN0aW9uIGRpZ2l0cyAqLwogIFVOVU1fRlJBQ1RJT05fRElHSVRTLAogIC8qKiBNdWx0aXBsaWVyICovCiAgVU5VTV9NVUxUSVBMSUVSLAogIC8qKiBHcm91cGluZyBzaXplICovCiAgVU5VTV9HUk9VUElOR19TSVpFLAogIC8qKiBSb3VuZGluZyBNb2RlICovCiAgVU5VTV9ST1VORElOR19NT0RFLAogIC8qKiBSb3VuZGluZyBpbmNyZW1lbnQgKi8KICBVTlVNX1JPVU5ESU5HX0lOQ1JFTUVOVCwKICAvKiogVGhlIHdpZHRoIHRvIHdoaWNoIHRoZSBvdXRwdXQgb2YgPGNvZGU+Zm9ybWF0KCk8L2NvZGU+IGlzIHBhZGRlZC4gKi8KICBVTlVNX0ZPUk1BVF9XSURUSCwKICAvKiogVGhlIHBvc2l0aW9uIGF0IHdoaWNoIHBhZGRpbmcgd2lsbCB0YWtlIHBsYWNlLiAqLwogIFVOVU1fUEFERElOR19QT1NJVElPTiwKICAvKiogU2Vjb25kYXJ5IGdyb3VwaW5nIHNpemUgKi8KICBVTlVNX1NFQ09OREFSWV9HUk9VUElOR19TSVpFCn07CnR5cGVkZWYgZW51bSBVTnVtYmVyRm9ybWF0QXR0cmlidXRlIFVOdW1iZXJGb3JtYXRBdHRyaWJ1dGU7CgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAtLS0+IEFkZCB0byBVRXJyb3JDb2RlICEhISEgLS0tPgp0eXBlZGVmIGVudW0gewogICAgQXR0cmlidXRlTm90U3VwcG9ydGVkLCAKICAgIFByb3BlcnR5Tm90U3VwcG9ydGVkICAKfSBVRXJyb3JDb2RlOwogICAgLS0tPiBBZGQgdG8gVUVycm9yQ29kZSAhISEhIC0tLT4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqCiogR2V0IGEgbnVtZXJpYyBhdHRyaWJ1dGUgYXNzb2NpYXRlZCB3aXRoIGEgVU51bWJlckZvcm1hdC4KKiBBbiBleGFtcGxlIG9mIGEgbnVtZXJpYyBhdHRyaWJ1dGUgaXMgdGhlIG51bWJlciBvZiBpbnRlZ2VyIGRpZ2l0cyBhIGZvcm1hdHRlciB3aWxsIHByb2R1Y2UuCiogQHBhcmFtIGZtdCBUaGUgZm9ybWF0dGVyIHRvIHF1ZXJ5LgoqIEBwYXJhbSBhdHRyIFRoZSBhdHRyaWJ1dGUgdG8gcXVlcnk7IG9uZSBvZiBVTlVNX1BBUlNFX0lOVF9PTkxZLCBVTlVNX0dST1VQSU5HX1VTRUQsIAoqIFVOVU1fREVDSU1BTF9BTFdBWVNfU0hPV04sIFVOVU1fTUFYX0lOVEVHRVJfRElHSVRTLCBVTlVNX01JTl9JTlRFR0VSX0RJR0lUUywgVU5VTV9JTlRFR0VSX0RJR0lUUywKKiBVTlVNX01BWF9GUkFDVElPTl9ESUdJVFMsIFVOVU1fTUlOX0ZSQUNUSU9OX0RJR0lUUywgVU5VTV9GUkFDVElPTl9ESUdJVFMsIFVOVU1fTVVMVElQTElFUiwgCiogVU5VTV9HUk9VUElOR19TSVpFLCBVTlVNX1JPVU5ESU5HX01PREUsIFVOVU1fRk9STUFUX1dJRFRILCBVTlVNX1BBRERJTkdfUE9TSVRJT04sIFVOVU1fU0VDT05EQVJZX0dST1VQSU5HX1NJWkUuCiogQHJldHVybiBUaGUgdmFsdWUgb2YgYXR0ci4KKiBAc2VlIHVudW1fc2V0QXR0cmlidXRlCiogQHNlZSB1bnVtX2dldERvdWJsZUF0dHJpYnV0ZQoqIEBzZWUgdW51bV9zZXREb3VibGVBdHRyaWJ1dGUKKiBAc2VlIHVudW1fZ2V0VGV4dEF0dHJpYnV0ZQoqIEBzZWUgdW51bV9zZXRUZXh0QXR0cmlidXRlCiogQHN0YWJsZQoqLwpVX0NBUEkgaW50MzJfdAp1bnVtX2dldEF0dHJpYnV0ZShjb25zdCBVTnVtYmVyRm9ybWF0KiAgICAgICAgICBmbXQsCiAgICAgICAgICBVTnVtYmVyRm9ybWF0QXR0cmlidXRlICBhdHRyKTsKCi8qKgoqIFNldCBhIG51bWVyaWMgYXR0cmlidXRlIGFzc29jaWF0ZWQgd2l0aCBhIFVOdW1iZXJGb3JtYXQuCiogQW4gZXhhbXBsZSBvZiBhIG51bWVyaWMgYXR0cmlidXRlIGlzIHRoZSBudW1iZXIgb2YgaW50ZWdlciBkaWdpdHMgYSBmb3JtYXR0ZXIgd2lsbCBwcm9kdWNlLgoqIEBwYXJhbSBmbXQgVGhlIGZvcm1hdHRlciB0byBzZXQuCiogQHBhcmFtIGF0dHIgVGhlIGF0dHJpYnV0ZSB0byBzZXQ7IG9uZSBvZiBVTlVNX1BBUlNFX0lOVF9PTkxZLCBVTlVNX0dST1VQSU5HX1VTRUQsIAoqIFVOVU1fREVDSU1BTF9BTFdBWVNfU0hPV04sIFVOVU1fTUFYX0lOVEVHRVJfRElHSVRTLCBVTlVNX01JTl9JTlRFR0VSX0RJR0lUUywgVU5VTV9JTlRFR0VSX0RJR0lUUywKKiBVTlVNX01BWF9GUkFDVElPTl9ESUdJVFMsIFVOVU1fTUlOX0ZSQUNUSU9OX0RJR0lUUywgVU5VTV9GUkFDVElPTl9ESUdJVFMsIFVOVU1fTVVMVElQTElFUiwgCiogVU5VTV9HUk9VUElOR19TSVpFLCBVTlVNX1JPVU5ESU5HX01PREUsIFVOVU1fRk9STUFUX1dJRFRILCBVTlVNX1BBRERJTkdfUE9TSVRJT04sIFVOVU1fU0VDT05EQVJZX0dST1VQSU5HX1NJWkUuCiogQHBhcmFtIG5ld1ZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgYXR0ci4KKiBAc2VlIHVudW1fZ2V0QXR0cmlidXRlCiogQHNlZSB1bnVtX2dldERvdWJsZUF0dHJpYnV0ZQoqIEBzZWUgdW51bV9zZXREb3VibGVBdHRyaWJ1dGUKKiBAc2VlIHVudW1fZ2V0VGV4dEF0dHJpYnV0ZQoqIEBzZWUgdW51bV9zZXRUZXh0QXR0cmlidXRlCiogQHN0YWJsZQoqLwpVX0NBUEkgdm9pZAp1bnVtX3NldEF0dHJpYnV0ZSggICAgVU51bWJlckZvcm1hdCogICAgICAgICAgZm10LAogICAgICAgICAgICBVTnVtYmVyRm9ybWF0QXR0cmlidXRlICBhdHRyLAogICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBuZXdWYWx1ZSk7CgoKLyoqCiogR2V0IGEgbnVtZXJpYyBhdHRyaWJ1dGUgYXNzb2NpYXRlZCB3aXRoIGEgVU51bWJlckZvcm1hdC4KKiBBbiBleGFtcGxlIG9mIGEgbnVtZXJpYyBhdHRyaWJ1dGUgaXMgdGhlIG51bWJlciBvZiBpbnRlZ2VyIGRpZ2l0cyBhIGZvcm1hdHRlciB3aWxsIHByb2R1Y2UuCiogQHBhcmFtIGZtdCBUaGUgZm9ybWF0dGVyIHRvIHF1ZXJ5LgoqIEBwYXJhbSBhdHRyIFRoZSBhdHRyaWJ1dGUgdG8gcXVlcnk7IGUuZy4gVU5VTV9ST1VORElOR19JTkNSRU1FTlQuCiogQHJldHVybiBUaGUgdmFsdWUgb2YgYXR0ci4KKiBAc2VlIHVudW1fZ2V0QXR0cmlidXRlCiogQHNlZSB1bnVtX3NldEF0dHJpYnV0ZQoqIEBzZWUgdW51bV9zZXREb3VibGVBdHRyaWJ1dGUKKiBAc2VlIHVudW1fZ2V0VGV4dEF0dHJpYnV0ZQoqIEBzZWUgdW51bV9zZXRUZXh0QXR0cmlidXRlCiogQHN0YWJsZQoqLwpVX0NBUEkgZG91YmxlCnVudW1fZ2V0RG91YmxlQXR0cmlidXRlKGNvbnN0IFVOdW1iZXJGb3JtYXQqICAgICAgICAgIGZtdCwKICAgICAgICAgIFVOdW1iZXJGb3JtYXRBdHRyaWJ1dGUgIGF0dHIpOwoKLyoqCiogU2V0IGEgbnVtZXJpYyBhdHRyaWJ1dGUgYXNzb2NpYXRlZCB3aXRoIGEgVU51bWJlckZvcm1hdC4KKiBBbiBleGFtcGxlIG9mIGEgbnVtZXJpYyBhdHRyaWJ1dGUgaXMgdGhlIG51bWJlciBvZiBpbnRlZ2VyIGRpZ2l0cyBhIGZvcm1hdHRlciB3aWxsIHByb2R1Y2UuCiogQHBhcmFtIGZtdCBUaGUgZm9ybWF0dGVyIHRvIHNldC4KKiBAcGFyYW0gYXR0ciBUaGUgYXR0cmlidXRlIHRvIHNldDsgZS5nLiBVTlVNX1JPVU5ESU5HX0lOQ1JFTUVOVC4KKiBAcGFyYW0gbmV3VmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiBhdHRyLgoqIEBzZWUgdW51bV9nZXRBdHRyaWJ1dGUKKiBAc2VlIHVudW1fc2V0QXR0cmlidXRlCiogQHNlZSB1bnVtX2dldERvdWJsZUF0dHJpYnV0ZQoqIEBzZWUgdW51bV9nZXRUZXh0QXR0cmlidXRlCiogQHNlZSB1bnVtX3NldFRleHRBdHRyaWJ1dGUKKiBAc3RhYmxlCiovClVfQ0FQSSB2b2lkCnVudW1fc2V0RG91YmxlQXR0cmlidXRlKCAgICBVTnVtYmVyRm9ybWF0KiAgICAgICAgICBmbXQsCiAgICAgICAgICAgIFVOdW1iZXJGb3JtYXRBdHRyaWJ1dGUgIGF0dHIsCiAgICAgICAgICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgbmV3VmFsdWUpOwoKLyoqIFRoZSBwb3NzaWJsZSBVTnVtYmVyRm9ybWF0IHRleHQgYXR0cmlidXRlcyAqLwplbnVtIFVOdW1iZXJGb3JtYXRUZXh0QXR0cmlidXRlewogIC8qKiBQb3NpdGl2ZSBwcmVmaXggKi8KICBVTlVNX1BPU0lUSVZFX1BSRUZJWCwKICAvKiogUG9zaXRpdmUgc3VmZml4ICovCiAgVU5VTV9QT1NJVElWRV9TVUZGSVgsCiAgLyoqIE5lZ2F0aXZlIHByZWZpeCAqLwogIFVOVU1fTkVHQVRJVkVfUFJFRklYLAogIC8qKiBOZWdhdGl2ZSBzdWZmaXggKi8KICBVTlVNX05FR0FUSVZFX1NVRkZJWCwKICAvKiogVGhlIGNoYXJhY3RlciB1c2VkIHRvIHBhZCB0byB0aGUgZm9ybWF0IHdpZHRoLiAqLwogIFVOVU1fUEFERElOR19DSEFSQUNURVIKfTsKdHlwZWRlZiBlbnVtIFVOdW1iZXJGb3JtYXRUZXh0QXR0cmlidXRlIFVOdW1iZXJGb3JtYXRUZXh0QXR0cmlidXRlOwoKLyoqCiogR2V0IGEgdGV4dCBhdHRyaWJ1dGUgYXNzb2NpYXRlZCB3aXRoIGEgVU51bWJlckZvcm1hdC4KKiBBbiBleGFtcGxlIG9mIGEgdGV4dCBhdHRyaWJ1dGUgaXMgdGhlIHN1ZmZpeCBmb3IgcG9zaXRpdmUgbnVtYmVycy4KKiBAcGFyYW0gZm10IFRoZSBmb3JtYXR0ZXIgdG8gcXVlcnkuCiogQHBhcmFtIGF0dHIgVGhlIGF0dHJpYnV0ZSB0byBxdWVyeTsgb25lIG9mIFVOVU1fUE9TSVRJVkVfUFJFRklYLCBVTlVNX1BPU0lUSVZFX1NVRkZJWCwgCiogVU5VTV9ORUdBVElWRV9QUkVGSVgsIFVOVU1fTkVHQVRJVkVfU1VGRklYCiogQHBhcmFtIHJlc3VsdCBBIHBvaW50ZXIgdG8gYSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgYXR0cmlidXRlLgoqIEBwYXJhbSByZXN1bHRMZW5ndGggVGhlIG1heGltdW0gc2l6ZSBvZiByZXN1bHQuCiogQHBhcmFtIHN0YXR1cyBBIHBvaW50ZXIgdG8gYW4gVUVycm9yQ29kZSB0byByZWNlaXZlIGFueSBlcnJvcnMKKiBAcmV0dXJuIFRoZSB0b3RhbCBidWZmZXIgc2l6ZSBuZWVkZWQ7IGlmIGdyZWF0ZXIgdGhhbiByZXN1bHRMZW5ndGgsIHRoZSBvdXRwdXQgd2FzIHRydW5jYXRlZC4KKiBAc2VlIHVudW1fc2V0VGV4dEF0dHJpYnV0ZQoqIEBzZWUgdW51bV9nZXRBdHRyaWJ1dGUKKiBAc2VlIHVudW1fc2V0QXR0cmlidXRlCiogQGRyYWZ0CiovClVfQ0FQSSBpbnQzMl90CnVudW1fZ2V0VGV4dEF0dHJpYnV0ZSggICAgY29uc3QgICAgVU51bWJlckZvcm1hdCogICAgICAgICAgICAgICAgICAgIGZtdCwKICAgICAgICAgICAgVU51bWJlckZvcm1hdFRleHRBdHRyaWJ1dGUgICAgICB0YWcsCiAgICAgICAgICAgIFVDaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQsCiAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGVuZ3RoLAogICAgICAgICAgICBVRXJyb3JDb2RlKiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7CgovKioKKiBTZXQgYSB0ZXh0IGF0dHJpYnV0ZSBhc3NvY2lhdGVkIHdpdGggYSBVTnVtYmVyRm9ybWF0LgoqIEFuIGV4YW1wbGUgb2YgYSB0ZXh0IGF0dHJpYnV0ZSBpcyB0aGUgc3VmZml4IGZvciBwb3NpdGl2ZSBudW1iZXJzLgoqIEBwYXJhbSBmbXQgVGhlIGZvcm1hdHRlciB0byBzZXQuCiogQHBhcmFtIGF0dHIgVGhlIGF0dHJpYnV0ZSB0byBzZXQ7IG9uZSBvZiBVTlVNX1BPU0lUSVZFX1BSRUZJWCwgVU5VTV9QT1NJVElWRV9TVUZGSVgsIAoqIFVOVU1fTkVHQVRJVkVfUFJFRklYLCBVTlVNX05FR0FUSVZFX1NVRkZJWAoqIEBwYXJhbSBuZXdWYWx1ZSBUaGUgbmV3IHZhbHVlIG9mIGF0dHIuCiogQHBhcmFtIG5ld1ZhbHVlTGVuZ3RoIFRoZSBsZW5ndGggb2YgbmV3VmFsdWUsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KKiBAcGFyYW0gc3RhdHVzIEEgcG9pbnRlciB0byBhbiBVRXJyb3JDb2RlIHRvIHJlY2VpdmUgYW55IGVycm9ycwoqIEBzZWUgdW51bV9nZXRUZXh0QXR0cmlidXRlCiogQHNlZSB1bnVtX2dldEF0dHJpYnV0ZQoqIEBzZWUgdW51bV9zZXRBdHRyaWJ1dGUKKiBAZHJhZnQKKi8KVV9DQVBJIHZvaWQKdW51bV9zZXRUZXh0QXR0cmlidXRlKCAgICBVTnVtYmVyRm9ybWF0KiAgICAgICAgICAgICAgICAgICAgZm10LAogICAgICAgICAgICBVTnVtYmVyRm9ybWF0VGV4dEF0dHJpYnV0ZSAgICAgIHRhZywKICAgICAgICAgICAgY29uc3QgICAgVUNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlLAogICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlTGVuZ3RoLAogICAgICAgICAgICBVRXJyb3JDb2RlICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXR1cyk7CgovKioKKiBFeHRyYWN0IHRoZSBwYXR0ZXJuIGZyb20gYSBVTnVtYmVyRm9ybWF0LgoqIFRoZSBwYXR0ZXJuIHdpbGwgZm9sbG93IHRoZSBwYXR0ZXJuIHN5bnRheC4KKiBAcGFyYW0gZm10IFRoZSBmb3JtYXR0ZXIgdG8gcXVlcnkuCiogQHBhcmFtIGlzUGF0dGVybkxvY2FsaXplZCBUUlVFIGlmIHRoZSBwYXR0ZXJuIHNob3VsZCBiZSBsb2NhbGl6ZWQsIEZBTFNFIG90aGVyd2lzZS4KKiBAcGFyYW0gcmVzdWx0IEEgcG9pbnRlciB0byBhIGJ1ZmZlciB0byByZWNlaXZlIHRoZSBwYXR0ZXJuLgoqIEBwYXJhbSByZXN1bHRMZW5ndGggVGhlIG1heGltdW0gc2l6ZSBvZiByZXN1bHQuCiogQHBhcmFtIHN0YXR1cyBBIHBvaW50ZXIgdG8gYW4gVUVycm9yQ29kZSB0byByZWNlaXZlIGFueSBlcnJvcnMKKiBAcmV0dXJuIFRoZSB0b3RhbCBidWZmZXIgc2l6ZSBuZWVkZWQ7IGlmIGdyZWF0ZXIgdGhhbiByZXN1bHRMZW5ndGgsIHRoZSBvdXRwdXQgd2FzIHRydW5jYXRlZC4KKiBAZHJhZnQKKi8KVV9DQVBJIGludDMyX3QKdW51bV90b1BhdHRlcm4oICAgIGNvbnN0ICAgIFVOdW1iZXJGb3JtYXQqICAgICAgICAgIGZtdCwKICAgICAgICBVQm9vbCAgICAgICAgICAgICAgICAgIGlzUGF0dGVybkxvY2FsaXplZCwKICAgICAgICBVQ2hhciogICAgICAgICAgICAgICAgICByZXN1bHQsCiAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgcmVzdWx0TGVuZ3RoLAogICAgICAgIFVFcnJvckNvZGUqICAgICAgICAgICAgIHN0YXR1cyk7CgovKiBUaGUgbWF4aW11bSBzaXplIGZvciBhIHRleHR1YWwgbnVtYmVyIGZvcm1hdCBzeW1ib2wuICovCiNkZWZpbmUgVU5GU1lNQk9MU01BWFNJWkUgMTAKCi8qKiBUaGUgVU51bWJlckZvcm1hdFN5bWJvbHMgc3RydWN0IAogKiBAZGVwcmVjYXRlZCByZW1vdmUgYWZ0ZXIgMjAwMC1kZWMtMzEuIFNlZSBVTnVtYmVyRm9ybWF0U3ltYm9sIGFuZCB1bnVtX2dldFN5bWJvbCgpIGZvciBhIHJlcGxhY2VtZW50LgogKi8Kc3RydWN0IFVOdW1iZXJGb3JtYXRTeW1ib2xzewogIC8qKiBUaGUgZGVjaW1hbCBzZXBhcmF0b3IgKi8KICBVQ2hhciBkZWNpbWFsU2VwYXJhdG9yOwogIC8qKiBUaGUgZ3JvdXBpbmcgc2VwYXJhdG9yICovCiAgVUNoYXIgZ3JvdXBpbmdTZXBhcmF0b3I7CiAgLyoqIFRoZSBwYXR0ZXJuIHNlcGFyYXRvciAqLwogIFVDaGFyIHBhdHRlcm5TZXBhcmF0b3I7CiAgLyoqIFRoZSBwZXJjZW50IHNpZ24gKi8KICBVQ2hhciBwZXJjZW50OwogIC8qKiBaZXJvKi8KICBVQ2hhciB6ZXJvRGlnaXQ7CiAgLyoqIENoYXJhY3RlciByZXByZXNlbnRpbmcgYSBkaWdpdCBpbiB0aGUgcGF0dGVybiAqLwogIFVDaGFyIGRpZ2l0OwogIC8qKiBUaGUgbWludXMgc2lnbiAqLwogIFVDaGFyIG1pbnVzU2lnbjsKICAvKiogVGhlIHBsdXMgc2lnbiAqLwogIFVDaGFyIHBsdXNTaWduOwogIC8qKiBUaGUgY3VycmVuY3kgc3ltYm9sICovCiAgVUNoYXIgY3VycmVuY3kgICAgICBbVU5GU1lNQk9MU01BWFNJWkVdOwogIC8qKiBUaGUgaW50ZXJuYXRpb25hbCBjdXJyZW5jeSBzeW1ib2wgKi8KICBVQ2hhciBpbnRsQ3VycmVuY3kgIFtVTkZTWU1CT0xTTUFYU0laRV07CiAgLyoqIFRoZSBtb25ldGFyeSBzZXBhcmF0b3IgKi8KICBVQ2hhciBtb25ldGFyeVNlcGFyYXRvcjsKICAvKiogVGhlIGV4cG9uZW50aWFsIHN5bWJvbCAqLwogIFVDaGFyIGV4cG9uZW50aWFsOyAgCiAgLyoqIFBlciBtaWxsIHN5bWJvbCAqLwogIFVDaGFyIHBlck1pbGw7CiAgLyoqIEVzY2FwZSBwYWRkaW5nIGNoYXJhY3RlciAqLwogIFVDaGFyIHBhZEVzY2FwZTsKICAvKiogSW5maW5pdHkgc3ltYm9sICovCiAgVUNoYXIgaW5maW5pdHkgICAgICBbVU5GU1lNQk9MU01BWFNJWkVdOwogIC8qKiBOYW4gc3ltYm9sICovCiAgVUNoYXIgbmFOICAgICAgICAgICBbVU5GU1lNQk9MU01BWFNJWkVdOyAgCn07CnR5cGVkZWYgc3RydWN0IFVOdW1iZXJGb3JtYXRTeW1ib2xzIFVOdW1iZXJGb3JtYXRTeW1ib2xzOwoKLyoqCiogR2V0IHRoZSBzeW1ib2xzIGFzc29jaWF0ZWQgd2l0aCBhIFVOdW1iZXJGb3JtYXQuCiogQSBVTnVtYmVyRm9ybWF0IHVzZXMgc3ltYm9scyB0byByZXByZXNlbnQgdGhlIHNwZWNpYWwgbG9jYWxlLWRlcGVuZGVudCAKKiBjaGFyYWN0ZXJzIGluIGEgbnVtYmVyLCBmb3IgZXhhbXBsZSB0aGUgcGVyY2VudCBzaWduLgoqIEBwYXJhbSBmbXQgVGhlIGZvcm1hdHRlciB0byBxdWVyeS4KKiBAcGFyYW0gc3ltcyBBIHBvaW50ZXIgdG8gYSBVTnVtYmVyRm9ybWF0U3ltYm9scyB0byByZWNlaXZlIHRoZSBzeW1ib2xzIGFzc29jaWF0ZWQgd2l0aCBmbXQuCiogQHNlZSB1bnVtX3NldFN5bWJvbHMKKiBAZGVwcmVjYXRlZCByZW1vdmUgYWZ0ZXIgMjAwMC1kZWMtMzEuIFNlZSBVTnVtYmVyRm9ybWF0U3ltYm9sIGFuZCB1bnVtX2dldFN5bWJvbCgpIGZvciBhIHJlcGxhY2VtZW50LgoqLwpVX0NBUEkgdm9pZAp1bnVtX2dldFN5bWJvbHMoICAgIGNvbnN0ICAgIFVOdW1iZXJGb3JtYXQgICAgICAgICAgICAqZm10LAogICAgICAgICAgICBVTnVtYmVyRm9ybWF0U3ltYm9scyAgICAqc3ltcyk7CgovKioKKiBTZXQgdGhlIHN5bWJvbHMgYXNzb2NpYXRlZCB3aXRoIGEgVU51bWJlckZvcm1hdC4KKiBBIFVOdW1iZXJGb3JtYXQgdXNlcyBzeW1ib2xzIHRvIHJlcHJlc2VudCB0aGUgc3BlY2lhbCBsb2NhbGUtZGVwZW5kZW50IAoqIGNoYXJhY3RlcnMgaW4gYSBudW1iZXIsIGZvciBleGFtcGxlIHRoZSBwZXJjZW50IHNpZ24uCiogQHBhcmFtIGZtdCBUaGUgZm9ybWF0dGVyIHRvIHNldC4KKiBAcGFyYW0gc3ltYm9sc1RvU2V0IFRoZSBVTnVtYmVyRm9ybWF0U3ltYm9scyB0byBhc3NvY2lhdGUgd2l0aCBmbXQuCiogQHBhcmFtIHN0YXR1cyBBIHBvaW50ZXIgdG8gYW4gVUVycm9yQ29kZSB0byByZWNlaXZlIGFueSBlcnJvcnMuCiogQHNlZSB1bnVtX2dldFN5bWJvbHMKKiBAZGVwcmVjYXRlZCByZW1vdmUgYWZ0ZXIgMjAwMC1kZWMtMzEuIFNlZSBVTnVtYmVyRm9ybWF0U3ltYm9sIGFuZCB1bnVtX2dldFN5bWJvbCgpIGZvciBhIHJlcGxhY2VtZW50LgoqLwpVX0NBUEkgdm9pZAp1bnVtX3NldFN5bWJvbHMoICAgIFVOdW1iZXJGb3JtYXQqICAgICAgICAgIGZtdCwKICAgICAgICAgICAgY29uc3QgICBVTnVtYmVyRm9ybWF0U3ltYm9scyogICBzeW1ib2xzVG9TZXQsCiAgICAgICAgICAgIFVFcnJvckNvZGUgICAgICAgICAgICAgICAgKnN0YXR1cyk7CgovKioKICogQ29uc3RhbnRzIGZvciBzcGVjaWZ5aW5nIGEgbnVtYmVyIGZvcm1hdCBzeW1ib2wuCiAqIEBkcmFmdAogKi8KZW51bSBVTnVtYmVyRm9ybWF0U3ltYm9sIHsKICAvKiogVGhlIGRlY2ltYWwgc2VwYXJhdG9yICovCiAgVU5VTV9ERUNJTUFMX1NFUEFSQVRPUl9TWU1CT0wsCiAgLyoqIFRoZSBncm91cGluZyBzZXBhcmF0b3IgKi8KICBVTlVNX0dST1VQSU5HX1NFUEFSQVRPUl9TWU1CT0wsCiAgLyoqIFRoZSBwYXR0ZXJuIHNlcGFyYXRvciAqLwogIFVOVU1fUEFUVEVSTl9TRVBBUkFUT1JfU1lNQk9MLAogIC8qKiBUaGUgcGVyY2VudCBzaWduICovCiAgVU5VTV9QRVJDRU5UX1NZTUJPTCwKICAvKiogWmVybyovCiAgVU5VTV9aRVJPX0RJR0lUX1NZTUJPTCwKICAvKiogQ2hhcmFjdGVyIHJlcHJlc2VudGluZyBhIGRpZ2l0IGluIHRoZSBwYXR0ZXJuICovCiAgVU5VTV9ESUdJVF9TWU1CT0wsCiAgLyoqIFRoZSBtaW51cyBzaWduICovCiAgVU5VTV9NSU5VU19TSUdOX1NZTUJPTCwKICAvKiogVGhlIHBsdXMgc2lnbiAqLwogIFVOVU1fUExVU19TSUdOX1NZTUJPTCwKICAvKiogVGhlIGN1cnJlbmN5IHN5bWJvbCAqLwogIFVOVU1fQ1VSUkVOQ1lfU1lNQk9MLAogIC8qKiBUaGUgaW50ZXJuYXRpb25hbCBjdXJyZW5jeSBzeW1ib2wgKi8KICBVTlVNX0lOVExfQ1VSUkVOQ1lfU1lNQk9MLAogIC8qKiBUaGUgbW9uZXRhcnkgc2VwYXJhdG9yICovCiAgVU5VTV9NT05FVEFSWV9TRVBBUkFUT1JfU1lNQk9MLAogIC8qKiBUaGUgZXhwb25lbnRpYWwgc3ltYm9sICovCiAgVU5VTV9FWFBPTkVOVElBTF9TWU1CT0wsCiAgLyoqIFBlciBtaWxsIHN5bWJvbCAqLwogIFVOVU1fUEVSTUlMTF9TWU1CT0wsCiAgLyoqIEVzY2FwZSBwYWRkaW5nIGNoYXJhY3RlciAqLwogIFVOVU1fUEFEX0VTQ0FQRV9TWU1CT0wsCiAgLyoqIEluZmluaXR5IHN5bWJvbCAqLwogIFVOVU1fSU5GSU5JVFlfU1lNQk9MLAogIC8qKiBOYW4gc3ltYm9sICovCiAgVU5VTV9OQU5fU1lNQk9MLAogIC8qKiBjb3VudCBzeW1ib2wgY29uc3RhbnRzICovCiAgVU5VTV9GT1JNQVRfU1lNQk9MX0NPVU5UCn07CnR5cGVkZWYgZW51bSBVTnVtYmVyRm9ybWF0U3ltYm9sIFVOdW1iZXJGb3JtYXRTeW1ib2w7CgovKioKKiBHZXQgYSBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGEgVU51bWJlckZvcm1hdC4KKiBBIFVOdW1iZXJGb3JtYXQgdXNlcyBzeW1ib2xzIHRvIHJlcHJlc2VudCB0aGUgc3BlY2lhbCBsb2NhbGUtZGVwZW5kZW50IAoqIGNoYXJhY3RlcnMgaW4gYSBudW1iZXIsIGZvciBleGFtcGxlIHRoZSBwZXJjZW50IHNpZ24uCiogQHBhcmFtIGZtdCBUaGUgZm9ybWF0dGVyIHRvIHF1ZXJ5LgoqIEBwYXJhbSBzeW1ib2wgVGhlIFVOdW1iZXJGb3JtYXRTeW1ib2wgY29uc3RhbnQgZm9yIHRoZSBzeW1ib2wgdG8gZ2V0CiogQHBhcmFtIGJ1ZmZlciBUaGUgc3RyaW5nIGJ1ZmZlciB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUgc3ltYm9sIHN0cmluZzsKKiAgICAgICAgICAgICAgIGlmIGl0IGlzIE5VTEwsIHRoZW4gb25seSB0aGUgbGVuZ3RoIG9mIHRoZSBzeW1ib2wgaXMgcmV0dXJuZWQKKiBAcGFyYW0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgc3RyaW5nIGJ1ZmZlcgoqIEByZXR1cm4gVGhlIGxlbmd0aCBvZiB0aGUgc3ltYm9sOyB0aGUgYnVmZmVyIGlzIG5vdCBtb2RpZmllZCBpZgoqICAgICAgICAgPGNvZGU+bGVuZ3RoJmd0Oz1zaXplPC9jb2RlPgoqIEBzZWUgdW51bV9zZXRTeW1ib2wKKiBAZHJhZnQKKi8KVV9DQVBJIGludDMyX3QgVV9FWFBPUlQyCnVudW1fZ2V0U3ltYm9sKFVOdW1iZXJGb3JtYXQgKmZtdCwKICAgICAgICAgICAgICAgVU51bWJlckZvcm1hdFN5bWJvbCBzeW1ib2wsCiAgICAgICAgICAgICAgIFVDaGFyICpidWZmZXIsCiAgICAgICAgICAgICAgIGludDMyX3Qgc2l6ZSwKICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqc3RhdHVzKTsKCi8qKgoqIFNldCBhIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggYSBVTnVtYmVyRm9ybWF0LgoqIEEgVU51bWJlckZvcm1hdCB1c2VzIHN5bWJvbHMgdG8gcmVwcmVzZW50IHRoZSBzcGVjaWFsIGxvY2FsZS1kZXBlbmRlbnQgCiogY2hhcmFjdGVycyBpbiBhIG51bWJlciwgZm9yIGV4YW1wbGUgdGhlIHBlcmNlbnQgc2lnbi4KKiBAcGFyYW0gZm10IFRoZSBmb3JtYXR0ZXIgdG8gc2V0LgoqIEBwYXJhbSBzeW1ib2wgVGhlIFVOdW1iZXJGb3JtYXRTeW1ib2wgY29uc3RhbnQgZm9yIHRoZSBzeW1ib2wgdG8gc2V0CiogQHBhcmFtIHZhbHVlIFRoZSBzdHJpbmcgdG8gc2V0IHRoZSBzeW1ib2wgdG8KKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZywgb3IgLTEgZm9yIGEgemVyby10ZXJtaW5hdGVkIHN0cmluZwoqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzLgoqIEBzZWUgdW51bV9nZXRTeW1ib2wKKiBAZHJhZnQKKi8KVV9DQVBJIHZvaWQgVV9FWFBPUlQyCnVudW1fc2V0U3ltYm9sKFVOdW1iZXJGb3JtYXQgKmZtdCwKICAgICAgICAgICAgICAgVU51bWJlckZvcm1hdFN5bWJvbCBzeW1ib2wsCiAgICAgICAgICAgICAgIGNvbnN0IFVDaGFyICp2YWx1ZSwKICAgICAgICAgICAgICAgaW50MzJfdCBsZW5ndGgsCiAgICAgICAgICAgICAgIFVFcnJvckNvZGUgKnN0YXR1cyk7CgojZW5kaWYK