LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIENvcHlyaWdodCCpIHsxOTk3LTE5OTl9LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiogTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CioKKiAgIERhdGUgICAgICAgIE5hbWUgICAgICAgIERlc2NyaXB0aW9uCiogICAwNi8yNC85OSAgICBoZWxlbmEgICAgICBJbnRlZ3JhdGVkIEFsYW4ncyBORiBlbmhhbmNlbWVudHMgYW5kIEphdmEyIGJ1ZyBmaXhlcwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCgojaWZuZGVmIF9VTlVNCiNkZWZpbmUgX1VOVU0KCiNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgojaW5jbHVkZSAidW5pY29kZS91bWlzYy5oIgoKLyoqCiAqIEBuYW1lIE51bWJlciBGb3JtYXQgQyBBUEkKICoKICogTnVtYmVyIEZvcm1hdCBDIEFQSSAgUHJvdmlkZXMgZnVuY3Rpb25zIGZvcgogKiBmb3JtYXR0aW5nIGFuZCBwYXJzaW5nIGEgbnVtYmVyLiAgQWxzbyBwcm92aWRlcyBtZXRob2RzIGZvcgogKiBkZXRlcm1pbmluZyB3aGljaCBsb2NhbGVzIGhhdmUgbnVtYmVyIGZvcm1hdHMsIGFuZCB3aGF0IHRoZWlyIG5hbWVzCiAqIGFyZS4KICogPFA+CiAqIFVOdW1iZXJGb3JtYXQgaGVscHMgeW91IHRvIGZvcm1hdCBhbmQgcGFyc2UgbnVtYmVycyBmb3IgYW55IGxvY2FsZS4KICogWW91ciBjb2RlIGNhbiBiZSBjb21wbGV0ZWx5IGluZGVwZW5kZW50IG9mIHRoZSBsb2NhbGUgY29udmVudGlvbnMKICogZm9yIGRlY2ltYWwgcG9pbnRzLCB0aG91c2FuZHMtc2VwYXJhdG9ycywgb3IgZXZlbiB0aGUgcGFydGljdWxhcgogKiBkZWNpbWFsIGRpZ2l0cyB1c2VkLCBvciB3aGV0aGVyIHRoZSBudW1iZXIgZm9ybWF0IGlzIGV2ZW4gZGVjaW1hbC4KICogVGhlcmUgYXJlIGRpZmZlcmVudCBudW1iZXIgZm9ybWF0IHN0eWxlcyBsaWtlIGRlY2ltYWwsIGN1cnJlbmN5LAogKiBwZXJjZW50IGFuZCBzcGVsbG91dC4gCiAqIDxQPgogKiBUbyBmb3JtYXQgYSBudW1iZXIgZm9yIHRoZSBjdXJyZW50IExvY2FsZSwgdXNlIG9uZSBvZiB0aGUgc3RhdGljCiAqIGZhY3RvcnkgbWV0aG9kczoKICogPHByZT4KICogLiAgIFVDaGFyIG15U3RyaW5nWzIwXTsKICogLiAgIFVGaWVsZFBvc2l0aW9uIHBvcz0wOwogKiAuICAgZG91YmxlIG15TnVtYmVyID0gNy4wOwogKiAuICAgVUVycm9yQ29kZSBzdWNjZXNzID0gVV9aRVJPX0VSUk9SOwogKiAuICAgVU51bWJlckZvcm1hdCogbmYgPSB1bnVtX29wZW4oVU5VTV9ERUZBVUxULCBOVUxMLCAmc3VjY2VzcykKICogLiAgIHVudW1fZm9ybWF0RG91YmxlKG5mLCBteU51bWJlciwgbXlTdHJpbmcsIHVfc3RybGVuKG15U3RyaW5nKSwgJnBvcywgJnN0YXR1cyk7CiAqIC4gICBwcmludGYoIiBFeGFtcGxlIDE6ICVzXG4iLCBhdXN0cmR1cChteVN0cmluZykgKTsgLy9hdXN0cmR1cCggYSBmdW5jdGlvbiB1c2VkIHRvIGNvbnZlcnQgVUNoYXIqIHRvIGNoYXIqKQogKiA8L3ByZT4KICogSWYgeW91IGFyZSBmb3JtYXR0aW5nIG11bHRpcGxlIG51bWJlcnMsIGl0IGlzIG1vcmUgZWZmaWNpZW50IHRvIGdldAogKiB0aGUgZm9ybWF0IGFuZCB1c2UgaXQgbXVsdGlwbGUgdGltZXMgc28gdGhhdCB0aGUgc3lzdGVtIGRvZXNuJ3QKICogaGF2ZSB0byBmZXRjaCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvY2FsIGxhbmd1YWdlIGFuZCBjb3VudHJ5CiAqIGNvbnZlbnRpb25zIG11bHRpcGxlIHRpbWVzLgogKiA8cHJlPgogKiAuICAgIFVDaGFyKiBteVN0cmluZzsKICogLiAgICB0X2ludDMyIGksIHJlc3VsdGxlbmd0aCwgcmVzbGVubmVlZGVkOwogKiAuICAgIFVFcnJvckNvZGUgc3VjY2VzcyA9IFVfWkVST19FUlJPUjsKICogLiAgICBVRmllbGRQb3NpdGlvbiBwb3M9MDsKICogLiAgICB0X2ludDMyIGFbXSA9IHsgMTIzLCAzMzMzLCAtMTIzNDU2NyB9OwogKiAuICAgIGNvbnN0IHRfaW50MzIgYV9sZW4gPSBzaXplb2YoYSkgLyBzaXplb2YoYVswXSk7CiAqIC4gICAgVU51bWJlckZvcm1hdCogbmYgPSB1bnVtX29wZW4oVU5VTV9ERUZBVUxULCBOVUxMLCAmc3VjY2VzcykKICogLiAgICBmb3IgKGkgPSAwOyBpIDwgYV9sZW47IGkrKykgewogKiAuICAgIHJlc3VsdGxlbmd0aD0wOwogKiAuICAgIHJlc2xlbm5lZWRlZD11bnVtX2Zvcm1hdChuZiwgYVtpXSwgTlVMTCwgcmVzdWx0bGVuZ3RoLCAmcG9zLCAmc3RhdHVzKTsKICogLiAgICBpZihzdGF0dXM9PVVfQlVGRkVSX09WRVJGTE9XX0VSUk9SKXsKICogLiAgICAgICAgc3RhdHVzPVVfWkVST19FUlJPUjsKICogLiAgICAgICAgcmVzdWx0bGVuZ3RoPXJlc3VsdGxlbmd0aG5lZWRlZCsxOwogKiAuICAgICAgICByZXN1bHQ9KFVDaGFyKiltYWxsb2Moc2l6ZW9mKFVDaGFyKSAqIHJlc3VsdGxlbmd0aCk7CiAqIC4gICAgICAgIHVudW1fZm9ybWF0KG5mLCBhW2ldLCByZXN1bHQsIHJlc3VsdGxlbmd0aCwgJnBvcywgJnN0YXR1cyk7CiAqIC4gICAgfQogKiAuICAgIHByaW50ZigiIEV4YW1wbGUgMjogJXNcbiIsIGF1c3RyZHVwKHJlc3VsdCkgKTsKICogLiAgICBmcmVlKHJlc3VsdCk7CiAqIC4gICAgfQogKiA8L3ByZT4KICogVG8gZm9ybWF0IGEgbnVtYmVyIGZvciBhIGRpZmZlcmVudCBMb2NhbGUsIHNwZWNpZnkgaXQgaW4gdGhlCiAqIGNhbGwgdG8gdW51bV9vcGVuKCkuCiAqIDxwcmU+CiAqIC4gICAgVU51bWJlckZvcm1hdCogbmYgPSB1bnVtX29wZW4oVU5VTV9ERUZBVUxULCAiZnJfRlIiLCAmc3VjY2VzcykKICogPC9wcmU+CiAqIFlvdSBjYW4gdXNlIGEgTnVtYmVyRm9ybWF0IEFQSSB1bnVtX3BhcnNlKCkgdG8gcGFyc2UuCiAqIDxwcmU+CiAqIC4gICBVRXJyb3JDb2RlIHN1Y2Nlc3M7CiAqIC4gICB0X2ludDMyIHBvcz0wOwogKiAuICAgdW51bV9wYXJzZShuZiwgcmVzdWx0LCB1X3N0cmxlbihyZXN1bHQpLCAmcG9zLCAmc3VjY2Vzcyk7CiAqIDwvcHJlPgogKiBVc2UgVUNBTF9ERUNJTUFMIHRvIGdldCB0aGUgbm9ybWFsIG51bWJlciBmb3JtYXQgZm9yIHRoYXQgY291bnRyeS4KICogVGhlcmUgYXJlIG90aGVyIHN0YXRpYyBvcHRpb25zIGF2YWlsYWJsZS4gIFVzZSBVQ0FMX0NVUlJFTkNZCiAqIHRvIGdldCB0aGUgY3VycmVuY3kgbnVtYmVyIGZvcm1hdCBmb3IgdGhhdCBjb3VudHJ5LiAgVXNlIFVDQUxfUEVSQ0VOVAogKiB0byBnZXQgYSBmb3JtYXQgZm9yIGRpc3BsYXlpbmcgcGVyY2VudGFnZXMuIFdpdGggdGhpcyBmb3JtYXQsIGEKICogZnJhY3Rpb24gZnJvbSAwLjUzIGlzIGRpc3BsYXllZCBhcyA1MyUuCiAqIDxQPgogKiBZb3UgY2FuIGFsc28gY29udHJvbCB0aGUgZGlzcGxheSBvZiBudW1iZXJzIHdpdGggc3VjaCBmdW5jdGlvbiBhcwogKiB1bnVtX2dldEF0dHJpYnVlcygpIGFuZCB1bnVtX3NldEF0cmlidXRlcygpLiAgd2hlcmUgaW4geW91IGNhbiBzZXQgdGhlCiAqIG1pbWludW0gZnJhY3Rpb24gZGlnaXRzLCBncm91cGluZyB1c2VkIGV0Yy4KICogQHNlZSBVTnVtYmVyRm9ybWF0QXR0cmlidXRlcyBmb3IgbW9yZSBkZXRhaWxzCiAqIDxQPgogKiBZb3UgY2FuIGFsc28gdXNlIGZvcm1zIG9mIHRoZSBwYXJzZSBhbmQgZm9ybWF0IG1ldGhvZHMgd2l0aAogKiBQYXJzZVBvc2l0aW9uIGFuZCBVRmllbGRQb3NpdGlvbiB0byBhbGxvdyB5b3UgdG86CiAqIDx1bCB0eXBlPXJvdW5kPgogKiAgIDxsaT4oYSkgcHJvZ3Jlc3NpdmVseSBwYXJzZSB0aHJvdWdoIHBpZWNlcyBvZiBhIHN0cmluZy4KICogICA8bGk+KGIpIGFsaWduIHRoZSBkZWNpbWFsIHBvaW50IGFuZCBvdGhlciBhcmVhcy4KICogPC91bD4KICogPHA+CiAqIEl0IGlzIGFsc28gcG9zc2libGUgdG8gY2hhbmdlIG9yIHNldCB0aGUgc3ltYm9scyB1c2VkIGZvciBhIHBhcnRpY3VsYXIKICogbG9jYWxlIGxpa2UgdGhlIGN1cnJlbmN5IHN5bWJvbCwgdGhlIGdyb3VwaW5nIHNlcGVyYXRvciAsIG1vbmV0YXJ5IHNlcGVyYXRvciAKICogZXRjIGJ5IG1ha2luZyB1c2Ugb2YgZnVuY3Rpb25zIHVudW1fc2V0U3ltYm9scygpIGFuZCB1bnVtX2dldFN5bWJvbHMoKS4KICovCgovKiogQSBudW1iZXIgZm9ybWF0dGVyLiAKICogIEZvciB1c2FnZSBpbiBDIHByb2dyYW1zLgogKi8KdHlwZWRlZiB2b2lkKiBVTnVtYmVyRm9ybWF0OwoKLyoqIFRoZSBwb3NzaWJsZSBudW1iZXIgZm9ybWF0IHN0eWxlcy4gKi8KZW51bSBVTnVtYmVyRm9ybWF0U3R5bGUgewogICAgLyoqIERlY2ltYWwgZm9ybWF0ICovCiAgICBVTlVNX0RFQ0lNQUwsCiAgICAvKiogQ3VycmVuY3kgZm9ybWF0ICovCiAgICBVTlVNX0NVUlJFTkNZLAogICAgLyoqIFBlcmNlbnQgZm9ybWF0ICovCiAgICBVTlVNX1BFUkNFTlQsCiAgICAvKiogU3BlbGxvdXQgZm9ybWF0ICovCiAgICBVTlVNX1NQRUxMT1VULAogICAgLyoqIERlZmF1bHQgZm9ybWF0ICovCiAgICBVTlVNX0RFRkFVTFQgPSBVTlVNX0RFQ0lNQUwKfTsKdHlwZWRlZiBlbnVtIFVOdW1iZXJGb3JtYXRTdHlsZSBVTnVtYmVyRm9ybWF0U3R5bGU7CgplbnVtIFVOdW1iZXJGb3JtYXRSb3VuZGluZ01vZGUgewogICAgVU5VTV9ST1VORF9DRUlMSU5HLAogICAgVU5VTV9ST1VORF9GTE9PUiwKICAgIFVOVU1fUk9VTkRfRE9XTiwKICAgIFVOVU1fUk9VTkRfVVAsCiAgICBVTlVNX0ZPVU5EX0hBTEZFVkVOLAogICAgVU5VTV9ST1VORF9IQUxGRE9XTiwKICAgIFVOVU1fUk9VTkRfSEFMRlVQCn07CnR5cGVkZWYgZW51bSBVTnVtYmVyRm9ybWF0Um91bmRpbmdNb2RlIFVOdW1iZXJGb3JtYXRSb3VuZGluZ01vZGU7CgplbnVtIFVOdW1iZXJGb3JtYXRQYWRQb3NpdGlvbiB7CiAgICBVTlVNX1BBRF9CRUZPUkVfUFJFRklYLAogICAgVU5VTV9QQURfQUZURVJfUFJFRklYLAogICAgVU5VTV9QQURfQkVGT1JFX1NVRkZJWCwKICAgIFVOVU1fUEFEX0FGVEVSX1NVRkZJWAp9Owp0eXBlZGVmIGVudW0gVU51bWJlckZvcm1hdFBhZFBvc2l0aW9uIFVOdW1iZXJGb3JtYXRQYWRQb3NpdGlvbjsKCi8qKgoqIE9wZW4gYSBuZXcgVU51bWJlckZvcm1hdCBmb3IgZm9ybWF0dGluZyBhbmQgcGFyc2luZyBudW1iZXJzLgoqIEEgVU51bWJlckZvcm1hdCBtYXkgYmUgdXNlZCB0byBmb3JtYXQgbnVtYmVycyBpbiBjYWxscyB0byBcUmVme3VudW1fZm9ybWF0fSwKKiBhbmQgdG8gcGFyc2UgbnVtYmVycyBpbiBjYWxscyB0byBcUmVme3VudW1fcGFyc2V9LgoqIEBwYXJhbSBzdHlsZSBUaGUgdHlwZSBvZiBudW1iZXIgZm9ybWF0IHRvIG9wZW46IG9uZSBvZiBVTlVNX0RFQ0lNQUwsIFVOVU1fQ1VSUkVOQ1ksCiogVU5VTV9QRVJDRU5ULCBVTlVNX1NQRUxMT1VULCBvciBVTlVNX0RFRkFVTFQKKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUgc3BlY2lmeWluZyB0aGUgZm9ybWF0dGluZyBjb252ZW50aW9ucwoqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzCiogQHJldHVybiBBIHBvaW50ZXIgdG8gYSBVTnVtYmVyRm9ybWF0IHRvIHVzZSBmb3IgZm9ybWF0dGluZyBudW1iZXJzLCBvciAwIGlmCiogYW4gZXJyb3Igb2NjdXJyZWQuCiogQHNlZSB1bnVtX29wZW5QYXR0ZXJuCiovClVfQ0FQSSBVTnVtYmVyRm9ybWF0Kgp1bnVtX29wZW4oVU51bWJlckZvcm1hdFN0eWxlICAgIHN0eWxlLAogICAgICBjb25zdCAgIGNoYXIqICAgICAgICBsb2NhbGUsCiAgICAgIFVFcnJvckNvZGUqICAgICAgICBzdGF0dXMpOwoKLyoqCiogT3BlbiBhIG5ldyBVTnVtYmVyRm9ybWF0IGZvciBmb3JtYXR0aW5nIGFuZCBwYXJzaW5nIG51bWJlcnMuCiogQSBVTnVtYmVyRm9ybWF0IG1heSBiZSB1c2VkIHRvIGZvcm1hdCBudW1iZXJzIGluIGNhbGxzIHRvIFxSZWZ7dW51bV9mb3JtYXR9LAoqIGFuZCB0byBwYXJzZSBudW1iZXJzIGluIGNhbGxzIHRvIFxSZWZ7dW51bV9wYXJzZX0uCiogQHBhcmFtIHBhdHRlcm4gQSBwYXR0ZXJuIHNwZWNpZnlpbmcgdGhlIGZvcm1hdCB0byB1c2UuCiogQHBhcmFtIHBhdHRlcm5MZW5ndGggVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBwYXR0ZXJuLCBvciAtMSBpZiBudWxsLXRlcm1pbmF0ZWQuCiogQHBhcmFtIGxvY2FsZSBUaGUgbG9jYWxlIHNwZWNpZnlpbmcgdGhlIGZvcm1hdHRpbmcgY29udmVudGlvbnMKKiBAcGFyYW0gc3RhdHVzIEEgcG9pbnRlciB0byBhbiBVRXJyb3JDb2RlIHRvIHJlY2VpdmUgYW55IGVycm9ycwoqIEByZXR1cm4gQSBwb2ludGVyIHRvIGEgVU51bWJlckZvcm1hdCB0byB1c2UgZm9yIGZvcm1hdHRpbmcgbnVtYmVycywgb3IgMCBpZgoqIGFuIGVycm9yIG9jY3VycmVkLgoqIEBzZWUgdW51bV9vcGVuCiovClVfQ0FQSSBVTnVtYmVyRm9ybWF0Kgp1bnVtX29wZW5QYXR0ZXJuKCAgICBjb25zdCAgICBVQ2hhciogICAgICAgIHBhdHRlcm4sCiAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICBwYXR0ZXJuTGVuZ3RoLAogICAgICAgICAgICBjb25zdCAgICBjaGFyKiAgICAgICAgbG9jYWxlLAogICAgICAgICAgICBVRXJyb3JDb2RlKiAgICAgICAgc3RhdHVzKTsKCi8qKgoqIENsb3NlIGEgVU51bWJlckZvcm1hdC4KKiBPbmNlIGNsb3NlZCwgYSBVTnVtYmVyRm9ybWF0IG1heSBubyBsb25nZXIgYmUgdXNlZC4KKiBAcGFyYW0gZm10IFRoZSBmb3JtYXR0ZXIgdG8gY2xvc2UuCiovClVfQ0FQSSB2b2lkCnVudW1fY2xvc2UoVU51bWJlckZvcm1hdCogZm10KTsKCi8qKgogKiBPcGVuIGEgY29weSBvZiBhIFVOdW1iZXJGb3JtYXQuCiAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSBkZWVwIGNvcHkuCiAqIEBwYXJhbSBmbXQgVGhlIGZvcm1hdCB0byBjb3B5CiAqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzLgogKiBAcmV0dXJuIEEgcG9pbnRlciB0byBhIFVOdW1iZXJGb3JtYXQgaWRlbnRpY2FsIHRvIGZtdC4KICovClVfQ0FQSSBVTnVtYmVyRm9ybWF0Kgp1bnVtX2Nsb25lKGNvbnN0IFVOdW1iZXJGb3JtYXQgKmZtdCwKICAgICAgIFVFcnJvckNvZGUgKnN0YXR1cyk7CgovKioKKiBGb3JtYXQgYW4gaW50ZWdlciB1c2luZyBhIFVOdW1iZXJGb3JtYXQuCiogVGhlIGludGVnZXIgd2lsbCBiZSBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBVTnVtYmVyRm9ybWF0J3MgbG9jYWxlLgoqIEBwYXJhbSBmbXQgVGhlIGZvcm1hdHRlciB0byB1c2UuCiogQHBhcmFtIG51bWJlciBUaGUgbnVtYmVyIHRvIGZvcm1hdC4KKiBAcGFyYW0gcmVzdWx0IEEgcG9pbnRlciB0byBhIGJ1ZmZlciB0byByZWNlaXZlIHRoZSBmb3JtYXR0ZWQgbnVtYmVyLgoqIEBwYXJhbSByZXN1bHRMZW5ndGggVGhlIG1heGltdW0gc2l6ZSBvZiByZXN1bHQuCiogQHBhcmFtIHBvcyBJZiBub3QgMCwgYSBVRmllbGRQb3NpdGlvbiB3aGljaCB3aWxsIHJlY2VpdmUgdGhlIGluZm9ybWF0aW9uIG9uIGEgc3BlY2lmaWMgZmllbGQuCiogQHBhcmFtIHN0YXR1cyBBIHBvaW50ZXIgdG8gYW4gVUVycm9yQ29kZSB0byByZWNlaXZlIGFueSBlcnJvcnMKKiBAcmV0dXJuIFRoZSB0b3RhbCBidWZmZXIgc2l6ZSBuZWVkZWQ7IGlmIGdyZWF0ZXIgdGhhbiByZXN1bHRMZW5ndGgsIHRoZSBvdXRwdXQgd2FzIHRydW5jYXRlZC4KKiBAc2VlIHVudW1fZm9ybWF0RG91YmxlCiogQHNlZSB1bnVtX3BhcnNlCiogQHNlZSB1bnVtX3BhcnNlRG91YmxlCiovClVfQ0FQSSBpbnQzMl90CnVudW1fZm9ybWF0KCAgICBjb25zdCAgICBVTnVtYmVyRm9ybWF0KiAgICBmbXQsCiAgICAgICAgaW50MzJfdCAgICAgICAgICAgIG51bWJlciwKICAgICAgICBVQ2hhciogICAgICAgICAgICByZXN1bHQsCiAgICAgICAgaW50MzJfdCAgICAgICAgICAgIHJlc3VsdExlbmd0aCwKICAgICAgICBVRmllbGRQb3NpdGlvbiAgICAqcG9zLAogICAgICAgIFVFcnJvckNvZGUqICAgICAgICBzdGF0dXMpOwoKLyoqCiogRm9ybWF0IGEgZG91YmxlIHVzaW5nIGEgVU51bWJlckZvcm1hdC4KKiBUaGUgZG91YmxlIHdpbGwgYmUgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgVU51bWJlckZvcm1hdCdzIGxvY2FsZS4KKiBAcGFyYW0gZm10IFRoZSBmb3JtYXR0ZXIgdG8gdXNlLgoqIEBwYXJhbSBudW1iZXIgVGhlIG51bWJlciB0byBmb3JtYXQuCiogQHBhcmFtIHJlc3VsdCBBIHBvaW50ZXIgdG8gYSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgZm9ybWF0dGVkIG51bWJlci4KKiBAcGFyYW0gcmVzdWx0TGVuZ3RoIFRoZSBtYXhpbXVtIHNpemUgb2YgcmVzdWx0LgoqIEBwYXJhbSBwb3MgSWYgbm90IDAsIGEgVUZpZWxkUG9zaXRpb24gd2hpY2ggd2lsbCByZWNlaXZlIHRoZSBpbmZvcm1hdGlvbiBvbiBhIHNwZWNpZmljIGZpZWxkLgoqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzCiogQHJldHVybiBUaGUgdG90YWwgYnVmZmVyIHNpemUgbmVlZGVkOyBpZiBncmVhdGVyIHRoYW4gcmVzdWx0TGVuZ3RoLCB0aGUgb3V0cHV0IHdhcyB0cnVuY2F0ZWQuCiogQHNlZSB1bnVtX2Zvcm1hdAoqIEBzZWUgdW51bV9wYXJzZQoqIEBzZWUgdW51bV9wYXJzZURvdWJsZQoqLwpVX0NBUEkgaW50MzJfdAp1bnVtX2Zvcm1hdERvdWJsZSggICAgY29uc3QgICAgVU51bWJlckZvcm1hdCogIGZtdCwKICAgICAgICAgICAgZG91YmxlICAgICAgICAgIG51bWJlciwKICAgICAgICAgICAgVUNoYXIqICAgICAgICAgIHJlc3VsdCwKICAgICAgICAgICAgaW50MzJfdCAgICAgICAgIHJlc3VsdExlbmd0aCwKICAgICAgICAgICAgVUZpZWxkUG9zaXRpb24gICpwb3MsIC8qIDAgaWYgaWdub3JlICovCiAgICAgICAgICAgIFVFcnJvckNvZGUqICAgICBzdGF0dXMpOwoKLyoqCiogUGFyc2UgYSBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHVzaW5nIGEgVU51bWJlckZvcm1hdC4KKiBUaGUgc3RyaW5nIHdpbGwgYmUgcGFyc2VkIGFjY29yZGluZyB0byB0aGUgVU51bWJlckZvcm1hdCdzIGxvY2FsZS4KKiBAcGFyYW0gZm10IFRoZSBmb3JtYXR0ZXIgdG8gdXNlLgoqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IHRvIHBhcnNlLgoqIEBwYXJhbSB0ZXh0TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGV4dCwgb3IgLTEgaWYgbnVsbC10ZXJtaW5hdGVkLgoqIEBwYXJhbSBwYXJzZVBvcyBJZiBub3QgMCwgb24gaW5wdXQgYSBwb2ludGVyIHRvIGFuIGludGVnZXIgc3BlY2lmeWluZyB0aGUgb2Zmc2V0IGF0IHdoaWNoCiogdG8gYmVnaW4gcGFyc2luZy4gIElmIG5vdCAwLCBvbiBvdXRwdXQgdGhlIG9mZnNldCBhdCB3aGljaCBwYXJzaW5nIGVuZGVkLgoqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzCiogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIHBhcnNlZCBpbnRlZ2VyCiogQHNlZSB1bnVtX3BhcnNlRG91YmxlCiogQHNlZSB1bnVtX2Zvcm1hdAoqIEBzZWUgdW51bV9mb3JtYXREb3VibGUKKi8KVV9DQVBJIGludDMyX3QKdW51bV9wYXJzZSggICAgY29uc3QgICBVTnVtYmVyRm9ybWF0KiAgZm10LAogICAgICAgIGNvbnN0ICAgVUNoYXIqICAgICAgICAgIHRleHQsCiAgICAgICAgaW50MzJfdCAgICAgICAgIHRleHRMZW5ndGgsCiAgICAgICAgaW50MzJfdCAgICAgICAgICpwYXJzZVBvcyAvKiAwID0gc3RhcnQgKi8sCiAgICAgICAgVUVycm9yQ29kZSAgICAgICpzdGF0dXMpOwoKLyoqCiogUGFyc2UgYSBzdHJpbmcgaW50byBhIGRvdWJsZSB1c2luZyBhIFVOdW1iZXJGb3JtYXQuCiogVGhlIHN0cmluZyB3aWxsIGJlIHBhcnNlZCBhY2NvcmRpbmcgdG8gdGhlIFVOdW1iZXJGb3JtYXQncyBsb2NhbGUuCiogQHBhcmFtIGZtdCBUaGUgZm9ybWF0dGVyIHRvIHVzZS4KKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCB0byBwYXJzZS4KKiBAcGFyYW0gdGV4dExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRleHQsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KKiBAcGFyYW0gcGFyc2VQb3MgSWYgbm90IDAsIG9uIGlucHV0IGEgcG9pbnRlciB0byBhbiBpbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIG9mZnNldCBhdCB3aGljaAoqIHRvIGJlZ2luIHBhcnNpbmcuICBJZiBub3QgMCwgb24gb3V0cHV0IHRoZSBvZmZzZXQgYXQgd2hpY2ggcGFyc2luZyBlbmRlZC4KKiBAcGFyYW0gc3RhdHVzIEEgcG9pbnRlciB0byBhbiBVRXJyb3JDb2RlIHRvIHJlY2VpdmUgYW55IGVycm9ycwoqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBwYXJzZWQgZG91YmxlCiogQHNlZSB1bnVtX3BhcnNlCiogQHNlZSB1bnVtX2Zvcm1hdAoqIEBzZWUgdW51bV9mb3JtYXREb3VibGUKKi8KVV9DQVBJIGRvdWJsZQp1bnVtX3BhcnNlRG91YmxlKCAgICBjb25zdCAgIFVOdW1iZXJGb3JtYXQqICBmbXQsCiAgICAgICAgICAgIGNvbnN0ICAgVUNoYXIqICAgICAgICAgIHRleHQsCiAgICAgICAgICAgIGludDMyX3QgICAgICAgICB0ZXh0TGVuZ3RoLAogICAgICAgICAgICBpbnQzMl90ICAgICAgICAgKnBhcnNlUG9zIC8qIDAgPSBzdGFydCAqLywKICAgICAgICAgICAgVUVycm9yQ29kZSAgICAgICpzdGF0dXMpOwoKLyoqCiogR2V0IGEgbG9jYWxlIGZvciB3aGljaCBudW1iZXIgZm9ybWF0dGluZyBwYXR0ZXJucyBhcmUgYXZhaWxhYmxlLgoqIEEgVU51bWJlckZvcm1hdCBpbiBhIGxvY2FsZSByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIHdpbGwgcGVyZm9ybSB0aGUgY29ycmVjdAoqIGZvcm1hdHRpbmcgYW5kIHBhcnNpbmcgZm9yIHRoZSBsb2NhbGUuCiogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZGVzaXJlZCBsb2NhbGUuCiogQHJldHVybiBBIGxvY2FsZSBmb3Igd2hpY2ggbnVtYmVyIGZvcm1hdHRpbmcgcGF0dGVybnMgYXJlIGF2YWlsYWJsZSwgb3IgMCBpZiBub25lLgoqIEBzZWUgdW51bV9jb3VudEF2YWlsYWJsZQoqLwpVX0NBUEkgY29uc3QgY2hhcioKdW51bV9nZXRBdmFpbGFibGUoaW50MzJfdCBpbmRleCk7CgovKioKKiBEZXRlcm1pbmUgaG93IG1hbnkgbG9jYWxlcyBoYXZlIG51bWJlciBmb3JtYXR0aW5nIHBhdHRlcm5zIGF2YWlsYWJsZS4KKiBUaGlzIGZ1bmN0aW9uIGlzIG1vc3QgdXNlZnVsIGFzIGRldGVybWluaW5nIHRoZSBsb29wIGVuZGluZyBjb25kaXRpb24gZm9yCiogY2FsbHMgdG8gXFJlZnt1bnVtX2dldEF2YWlsYWJsZX0uCiogQHJldHVybiBUaGUgbnVtYmVyIG9mIGxvY2FsZXMgZm9yIHdoaWNoIG51bWJlciBmb3JtYXR0aW5nIHBhdHRlcm5zIGFyZSBhdmFpbGFibGUuCiogQHNlZSB1bnVtX2dldEF2YWlsYWJsZQoqLwpVX0NBUEkgaW50MzJfdAp1bnVtX2NvdW50QXZhaWxhYmxlKHZvaWQpOwoKLyoqIFRoZSBwb3NzaWJsZSBVTnVtYmVyRm9ybWF0IG51bWVyaWMgYXR0cmlidXRlcyAqLwplbnVtIFVOdW1iZXJGb3JtYXRBdHRyaWJ1dGUgeyAKICAvKiogUGFyc2UgaW50ZWdlcnMgb25seSAqLwogIFVOVU1fUEFSU0VfSU5UX09OTFksCiAgLyoqIFVzZSBncm91cGluZyBzZXBhcmF0b3IgKi8KICBVTlVNX0dST1VQSU5HX1VTRUQsCiAgLyoqIEFsd2F5cyBzaG93IGRlY2ltYWwgcG9pbnQgKi8KICBVTlVNX0RFQ0lNQUxfQUxXQVlTX1NIT1dOLAogIC8qKiBNYXhpbXVtIGludGVnZXIgZGlnaXRzICovCiAgVU5VTV9NQVhfSU5URUdFUl9ESUdJVFMsCiAgLyoqIE1pbmltdW0gaW50ZWdlciBkaWdpdHMgKi8KICBVTlVNX01JTl9JTlRFR0VSX0RJR0lUUywKICAvKiogSW50ZWdlciBkaWdpdHMgKi8KICBVTlVNX0lOVEVHRVJfRElHSVRTLAogIC8qKiBNYXhpbXVtIGZyYWN0aW9uIGRpZ2l0cyAqLwogIFVOVU1fTUFYX0ZSQUNUSU9OX0RJR0lUUywKICAvKiogTWluaW11bSBmcmFjdGlvbiBkaWdpdHMgKi8KICBVTlVNX01JTl9GUkFDVElPTl9ESUdJVFMsCiAgLyoqIEZyYWN0aW9uIGRpZ2l0cyAqLwogIFVOVU1fRlJBQ1RJT05fRElHSVRTLAogIC8qKiBNdWx0aXBsaWVyICovCiAgVU5VTV9NVUxUSVBMSUVSLAogIC8qKiBHcm91cGluZyBzaXplICovCiAgVU5VTV9HUk9VUElOR19TSVpFLAogIC8qKiBSb3VuZGluZyBNb2RlICovCiAgVU5VTV9ST1VORElOR19NT0RFLAogIC8qKiBSb3VuZGluZyBpbmNyZW1lbnQgKi8KICBVTlVNX1JPVU5ESU5HX0lOQ1JFTUVOVCwKICAvKiogVGhlIHdpZHRoIHRvIHdoaWNoIHRoZSBvdXRwdXQgb2YgPGNvZGU+Zm9ybWF0KCk8L2NvZGU+IGlzIHBhZGRlZC4gKi8KICBVTlVNX0ZPUk1BVF9XSURUSCwKICAvKiogVGhlIHBvc2l0aW9uIGF0IHdoaWNoIHBhZGRpbmcgd2lsbCB0YWtlIHBsYWNlLiAqLwogIFVOVU1fUEFERElOR19QT1NJVElPTgp9Owp0eXBlZGVmIGVudW0gVU51bWJlckZvcm1hdEF0dHJpYnV0ZSBVTnVtYmVyRm9ybWF0QXR0cmlidXRlOwoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLS0tPiBBZGQgdG8gVUVycm9yQ29kZSAhISEhIC0tLT4KdHlwZWRlZiBlbnVtIHsKICAgIEF0dHJpYnV0ZU5vdFN1cHBvcnRlZCwgCiAgICBQcm9wZXJ0eU5vdFN1cHBvcnRlZCAgCn0gVUVycm9yQ29kZTsKICAgIC0tLT4gQWRkIHRvIFVFcnJvckNvZGUgISEhISAtLS0+Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKgoqIEdldCBhIG51bWVyaWMgYXR0cmlidXRlIGFzc29jaWF0ZWQgd2l0aCBhIFVOdW1iZXJGb3JtYXQuCiogQW4gZXhhbXBsZSBvZiBhIG51bWVyaWMgYXR0cmlidXRlIGlzIHRoZSBudW1iZXIgb2YgaW50ZWdlciBkaWdpdHMgYSBmb3JtYXR0ZXIgd2lsbCBwcm9kdWNlLgoqIEBwYXJhbSBmbXQgVGhlIGZvcm1hdHRlciB0byBxdWVyeS4KKiBAcGFyYW0gYXR0ciBUaGUgYXR0cmlidXRlIHRvIHF1ZXJ5OyBvbmUgb2YgVU5VTV9QQVJTRV9JTlRfT05MWSwgVU5VTV9HUk9VUElOR19VU0VELCAKKiBVTlVNX0RFQ0lNQUxfQUxXQVlTX1NIT1dOLCBVTlVNX01BWF9JTlRFR0VSX0RJR0lUUywgVU5VTV9NSU5fSU5URUdFUl9ESUdJVFMsIFVOVU1fSU5URUdFUl9ESUdJVFMsCiogVU5VTV9NQVhfRlJBQ1RJT05fRElHSVRTLCBVTlVNX01JTl9GUkFDVElPTl9ESUdJVFMsIFVOVU1fRlJBQ1RJT05fRElHSVRTLCBVTlVNX01VTFRJUExJRVIsIAoqIFVOVU1fR1JPVVBJTkdfU0laRSwgVU5VTV9ST1VORElOR19NT0RFLCBVTlVNX0ZPUk1BVF9XSURUSCwgVU5VTV9QQURESU5HX1BPU0lUSU9OLgoqIEByZXR1cm4gVGhlIHZhbHVlIG9mIGF0dHIuCiogQHNlZSB1bnVtX3NldEF0dHJpYnV0ZQoqIEBzZWUgdW51bV9nZXREb3VibGVBdHRyaWJ1dGUKKiBAc2VlIHVudW1fc2V0RG91YmxlQXR0cmlidXRlCiogQHNlZSB1bnVtX2dldFRleHRBdHRyaWJ1dGUKKiBAc2VlIHVudW1fc2V0VGV4dEF0dHJpYnV0ZQoqLwpVX0NBUEkgaW50MzJfdAp1bnVtX2dldEF0dHJpYnV0ZShjb25zdCBVTnVtYmVyRm9ybWF0KiAgICAgICAgICBmbXQsCiAgICAgICAgICBVTnVtYmVyRm9ybWF0QXR0cmlidXRlICBhdHRyKTsKCi8qKgoqIFNldCBhIG51bWVyaWMgYXR0cmlidXRlIGFzc29jaWF0ZWQgd2l0aCBhIFVOdW1iZXJGb3JtYXQuCiogQW4gZXhhbXBsZSBvZiBhIG51bWVyaWMgYXR0cmlidXRlIGlzIHRoZSBudW1iZXIgb2YgaW50ZWdlciBkaWdpdHMgYSBmb3JtYXR0ZXIgd2lsbCBwcm9kdWNlLgoqIEBwYXJhbSBmbXQgVGhlIGZvcm1hdHRlciB0byBzZXQuCiogQHBhcmFtIGF0dHIgVGhlIGF0dHJpYnV0ZSB0byBzZXQ7IG9uZSBvZiBVTlVNX1BBUlNFX0lOVF9PTkxZLCBVTlVNX0dST1VQSU5HX1VTRUQsIAoqIFVOVU1fREVDSU1BTF9BTFdBWVNfU0hPV04sIFVOVU1fTUFYX0lOVEVHRVJfRElHSVRTLCBVTlVNX01JTl9JTlRFR0VSX0RJR0lUUywgVU5VTV9JTlRFR0VSX0RJR0lUUywKKiBVTlVNX01BWF9GUkFDVElPTl9ESUdJVFMsIFVOVU1fTUlOX0ZSQUNUSU9OX0RJR0lUUywgVU5VTV9GUkFDVElPTl9ESUdJVFMsIFVOVU1fTVVMVElQTElFUiwgCiogVU5VTV9HUk9VUElOR19TSVpFLCBVTlVNX1JPVU5ESU5HX01PREUsIFVOVU1fRk9STUFUX1dJRFRILCBVTlVNX1BBRERJTkdfUE9TSVRJT04uCiogQHBhcmFtIG5ld1ZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgYXR0ci4KKiBAc2VlIHVudW1fZ2V0QXR0cmlidXRlCiogQHNlZSB1bnVtX2dldERvdWJsZUF0dHJpYnV0ZQoqIEBzZWUgdW51bV9zZXREb3VibGVBdHRyaWJ1dGUKKiBAc2VlIHVudW1fZ2V0VGV4dEF0dHJpYnV0ZQoqIEBzZWUgdW51bV9zZXRUZXh0QXR0cmlidXRlCiovClVfQ0FQSSB2b2lkCnVudW1fc2V0QXR0cmlidXRlKCAgICBVTnVtYmVyRm9ybWF0KiAgICAgICAgICBmbXQsCiAgICAgICAgICAgIFVOdW1iZXJGb3JtYXRBdHRyaWJ1dGUgIGF0dHIsCiAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG5ld1ZhbHVlKTsKCgovKioKKiBHZXQgYSBudW1lcmljIGF0dHJpYnV0ZSBhc3NvY2lhdGVkIHdpdGggYSBVTnVtYmVyRm9ybWF0LgoqIEFuIGV4YW1wbGUgb2YgYSBudW1lcmljIGF0dHJpYnV0ZSBpcyB0aGUgbnVtYmVyIG9mIGludGVnZXIgZGlnaXRzIGEgZm9ybWF0dGVyIHdpbGwgcHJvZHVjZS4KKiBAcGFyYW0gZm10IFRoZSBmb3JtYXR0ZXIgdG8gcXVlcnkuCiogQHBhcmFtIGF0dHIgVGhlIGF0dHJpYnV0ZSB0byBxdWVyeTsgZS5nLiBVTlVNX1JPVU5ESU5HX0lOQ1JFTUVOVC4KKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiBhdHRyLgoqIEBzZWUgdW51bV9nZXRBdHRyaWJ1dGUKKiBAc2VlIHVudW1fc2V0QXR0cmlidXRlCiogQHNlZSB1bnVtX3NldERvdWJsZUF0dHJpYnV0ZQoqIEBzZWUgdW51bV9nZXRUZXh0QXR0cmlidXRlCiogQHNlZSB1bnVtX3NldFRleHRBdHRyaWJ1dGUKKi8KVV9DQVBJIGRvdWJsZQp1bnVtX2dldERvdWJsZUF0dHJpYnV0ZShjb25zdCBVTnVtYmVyRm9ybWF0KiAgICAgICAgICBmbXQsCiAgICAgICAgICBVTnVtYmVyRm9ybWF0QXR0cmlidXRlICBhdHRyKTsKCi8qKgoqIFNldCBhIG51bWVyaWMgYXR0cmlidXRlIGFzc29jaWF0ZWQgd2l0aCBhIFVOdW1iZXJGb3JtYXQuCiogQW4gZXhhbXBsZSBvZiBhIG51bWVyaWMgYXR0cmlidXRlIGlzIHRoZSBudW1iZXIgb2YgaW50ZWdlciBkaWdpdHMgYSBmb3JtYXR0ZXIgd2lsbCBwcm9kdWNlLgoqIEBwYXJhbSBmbXQgVGhlIGZvcm1hdHRlciB0byBzZXQuCiogQHBhcmFtIGF0dHIgVGhlIGF0dHJpYnV0ZSB0byBzZXQ7IGUuZy4gVU5VTV9ST1VORElOR19JTkNSRU1FTlQuCiogQHBhcmFtIG5ld1ZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgYXR0ci4KKiBAc2VlIHVudW1fZ2V0QXR0cmlidXRlCiogQHNlZSB1bnVtX3NldEF0dHJpYnV0ZQoqIEBzZWUgdW51bV9nZXREb3VibGVBdHRyaWJ1dGUKKiBAc2VlIHVudW1fZ2V0VGV4dEF0dHJpYnV0ZQoqIEBzZWUgdW51bV9zZXRUZXh0QXR0cmlidXRlCiovClVfQ0FQSSB2b2lkCnVudW1fc2V0RG91YmxlQXR0cmlidXRlKCAgICBVTnVtYmVyRm9ybWF0KiAgICAgICAgICBmbXQsCiAgICAgICAgICAgIFVOdW1iZXJGb3JtYXRBdHRyaWJ1dGUgIGF0dHIsCiAgICAgICAgICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgbmV3VmFsdWUpOwoKLyoqIFRoZSBwb3NzaWJsZSBVTnVtYmVyRm9ybWF0IHRleHQgYXR0cmlidXRlcyAqLwplbnVtIFVOdW1iZXJGb3JtYXRUZXh0QXR0cmlidXRlewogIC8qKiBQb3NpdGl2ZSBwcmVmaXggKi8KICBVTlVNX1BPU0lUSVZFX1BSRUZJWCwKICAvKiogUG9zaXRpdmUgc3VmZml4ICovCiAgVU5VTV9QT1NJVElWRV9TVUZGSVgsCiAgLyoqIE5lZ2F0aXZlIHByZWZpeCAqLwogIFVOVU1fTkVHQVRJVkVfUFJFRklYLAogIC8qKiBOZWdhdGl2ZSBzdWZmaXggKi8KICBVTlVNX05FR0FUSVZFX1NVRkZJWCwKICAvKiogVGhlIGNoYXJhY3RlciB1c2VkIHRvIHBhZCB0byB0aGUgZm9ybWF0IHdpZHRoLiAqLwogIFVOVU1fUEFERElOR19DSEFSQUNURVIKfTsKdHlwZWRlZiBlbnVtIFVOdW1iZXJGb3JtYXRUZXh0QXR0cmlidXRlIFVOdW1iZXJGb3JtYXRUZXh0QXR0cmlidXRlOwoKLyoqCiogR2V0IGEgdGV4dCBhdHRyaWJ1dGUgYXNzb2NpYXRlZCB3aXRoIGEgVU51bWJlckZvcm1hdC4KKiBBbiBleGFtcGxlIG9mIGEgdGV4dCBhdHRyaWJ1dGUgaXMgdGhlIHN1ZmZpeCBmb3IgcG9zaXRpdmUgbnVtYmVycy4KKiBAcGFyYW0gZm10IFRoZSBmb3JtYXR0ZXIgdG8gcXVlcnkuCiogQHBhcmFtIGF0dHIgVGhlIGF0dHJpYnV0ZSB0byBxdWVyeTsgb25lIG9mIFVOVU1fUE9TSVRJVkVfUFJFRklYLCBVTlVNX1BPU0lUSVZFX1NVRkZJWCwgCiogVU5VTV9ORUdBVElWRV9QUkVGSVgsIFVOVU1fTkVHQVRJVkVfU1VGRklYCiogQHBhcmFtIHJlc3VsdCBBIHBvaW50ZXIgdG8gYSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgYXR0cmlidXRlLgoqIEBwYXJhbSByZXN1bHRMZW5ndGggVGhlIG1heGltdW0gc2l6ZSBvZiByZXN1bHQuCiogQHBhcmFtIHN0YXR1cyBBIHBvaW50ZXIgdG8gYW4gVUVycm9yQ29kZSB0byByZWNlaXZlIGFueSBlcnJvcnMKKiBAcmV0dXJuIFRoZSB0b3RhbCBidWZmZXIgc2l6ZSBuZWVkZWQ7IGlmIGdyZWF0ZXIgdGhhbiByZXN1bHRMZW5ndGgsIHRoZSBvdXRwdXQgd2FzIHRydW5jYXRlZC4KKiBAc2VlIHVudW1fc2V0VGV4dEF0dHJpYnV0ZQoqIEBzZWUgdW51bV9nZXRBdHRyaWJ1dGUKKiBAc2VlIHVudW1fc2V0QXR0cmlidXRlCiovClVfQ0FQSSBpbnQzMl90CnVudW1fZ2V0VGV4dEF0dHJpYnV0ZSggICAgY29uc3QgICAgVU51bWJlckZvcm1hdCogICAgICAgICAgICAgICAgICAgIGZtdCwKICAgICAgICAgICAgVU51bWJlckZvcm1hdFRleHRBdHRyaWJ1dGUgICAgICB0YWcsCiAgICAgICAgICAgIFVDaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQsCiAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TGVuZ3RoLAogICAgICAgICAgICBVRXJyb3JDb2RlKiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7CgovKioKKiBTZXQgYSB0ZXh0IGF0dHJpYnV0ZSBhc3NvY2lhdGVkIHdpdGggYSBVTnVtYmVyRm9ybWF0LgoqIEFuIGV4YW1wbGUgb2YgYSB0ZXh0IGF0dHJpYnV0ZSBpcyB0aGUgc3VmZml4IGZvciBwb3NpdGl2ZSBudW1iZXJzLgoqIEBwYXJhbSBmbXQgVGhlIGZvcm1hdHRlciB0byBzZXQuCiogQHBhcmFtIGF0dHIgVGhlIGF0dHJpYnV0ZSB0byBzZXQ7IG9uZSBvZiBVTlVNX1BPU0lUSVZFX1BSRUZJWCwgVU5VTV9QT1NJVElWRV9TVUZGSVgsIAoqIFVOVU1fTkVHQVRJVkVfUFJFRklYLCBVTlVNX05FR0FUSVZFX1NVRkZJWAoqIEBwYXJhbSBuZXdWYWx1ZSBUaGUgbmV3IHZhbHVlIG9mIGF0dHIuCiogQHBhcmFtIG5ld1ZhbHVlTGVuZ3RoIFRoZSBsZW5ndGggb2YgbmV3VmFsdWUsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KKiBAcGFyYW0gc3RhdHVzIEEgcG9pbnRlciB0byBhbiBVRXJyb3JDb2RlIHRvIHJlY2VpdmUgYW55IGVycm9ycwoqIEBzZWUgdW51bV9nZXRUZXh0QXR0cmlidXRlCiogQHNlZSB1bnVtX2dldEF0dHJpYnV0ZQoqIEBzZWUgdW51bV9zZXRBdHRyaWJ1dGUKKi8KVV9DQVBJIHZvaWQKdW51bV9zZXRUZXh0QXR0cmlidXRlKCAgICBVTnVtYmVyRm9ybWF0KiAgICAgICAgICAgICAgICAgICAgZm10LAogICAgICAgICAgICBVTnVtYmVyRm9ybWF0VGV4dEF0dHJpYnV0ZSAgICAgIHRhZywKICAgICAgICAgICAgY29uc3QgICAgVUNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlLAogICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlTGVuZ3RoLAogICAgICAgICAgICBVRXJyb3JDb2RlICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXR1cyk7CgovKioKKiBFeHRyYWN0IHRoZSBwYXR0ZXJuIGZyb20gYSBVTnVtYmVyRm9ybWF0LgoqIFRoZSBwYXR0ZXJuIHdpbGwgZm9sbG93IHRoZSBwYXR0ZXJuIHN5bnRheC4KKiBAcGFyYW0gZm10IFRoZSBmb3JtYXR0ZXIgdG8gcXVlcnkuCiogQHBhcmFtIGlzUGF0dGVybkxvY2FsaXplZCBUUlVFIGlmIHRoZSBwYXR0ZXJuIHNob3VsZCBiZSBsb2NhbGl6ZWQsIEZBTFNFIG90aGVyd2lzZS4KKiBAcGFyYW0gcmVzdWx0IEEgcG9pbnRlciB0byBhIGJ1ZmZlciB0byByZWNlaXZlIHRoZSBwYXR0ZXJuLgoqIEBwYXJhbSByZXN1bHRMZW5ndGggVGhlIG1heGltdW0gc2l6ZSBvZiByZXN1bHQuCiogQHBhcmFtIHN0YXR1cyBBIHBvaW50ZXIgdG8gYW4gVUVycm9yQ29kZSB0byByZWNlaXZlIGFueSBlcnJvcnMKKiBAcmV0dXJuIFRoZSB0b3RhbCBidWZmZXIgc2l6ZSBuZWVkZWQ7IGlmIGdyZWF0ZXIgdGhhbiByZXN1bHRMZW5ndGgsIHRoZSBvdXRwdXQgd2FzIHRydW5jYXRlZC4KKi8KVV9DQVBJIGludDMyX3QKdW51bV90b1BhdHRlcm4oICAgIGNvbnN0ICAgIFVOdW1iZXJGb3JtYXQqICAgICAgICAgIGZtdCwKICAgICAgICBib29sX3QgICAgICAgICAgICAgICAgICBpc1BhdHRlcm5Mb2NhbGl6ZWQsCiAgICAgICAgVUNoYXIqICAgICAgICAgICAgICAgICAgcmVzdWx0LAogICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgIHJlc3VsdExlbmd0aCwKICAgICAgICBVRXJyb3JDb2RlKiAgICAgICAgICAgICBzdGF0dXMpOwoKLyogVGhlIG1heGltdW0gc2l6ZSBmb3IgYSB0ZXh0dWFsIG51bWJlciBmb3JtYXQgc3ltYm9sLiAqLwojZGVmaW5lIFVORlNZTUJPTFNNQVhTSVpFIDEwCgovKiogVGhlIFVOdW1iZXJGb3JtYXRTeW1ib2xzIHN0cnVjdCAqLwpzdHJ1Y3QgVU51bWJlckZvcm1hdFN5bWJvbHN7CiAgLyoqIFRoZSBkZWNpbWFsIHNlcGFyYXRvciAqLwogIFVDaGFyIGRlY2ltYWxTZXBhcmF0b3I7CiAgLyoqIFRoZSBncm91cGluZyBzZXBhcmF0b3IgKi8KICBVQ2hhciBncm91cGluZ1NlcGFyYXRvcjsKICAvKiogVGhlIHBhdHRlcm4gc2VwYXJhdG9yICovCiAgVUNoYXIgcGF0dGVyblNlcGFyYXRvcjsKICAvKiogVGhlIHBlcmNlbnQgc2lnbiAqLwogIFVDaGFyIHBlcmNlbnQ7CiAgLyoqIFplcm8qLwogIFVDaGFyIHplcm9EaWdpdDsKICAvKiogQ2hhcmFjdGVyIHJlcHJlc2VudGluZyBhIGRpZ2l0IGluIHRoZSBwYXR0ZXJuICovCiAgVUNoYXIgZGlnaXQ7CiAgLyoqIFRoZSBtaW51cyBzaWduICovCiAgVUNoYXIgbWludXNTaWduOwogIC8qKiBUaGUgcGx1cyBzaWduICovCiAgVUNoYXIgcGx1c1NpZ247CiAgLyoqIFRoZSBjdXJyZW5jeSBzeW1ib2wgKi8KICBVQ2hhciBjdXJyZW5jeSAgICAgIFtVTkZTWU1CT0xTTUFYU0laRV07CiAgLyoqIFRoZSBpbnRlcm5hdGlvbmFsIGN1cnJlbmN5IHN5bWJvbCAqLwogIFVDaGFyIGludGxDdXJyZW5jeSAgW1VORlNZTUJPTFNNQVhTSVpFXTsKICAvKiogVGhlIG1vbmV0YXJ5IHNlcGFyYXRvciAqLwogIFVDaGFyIG1vbmV0YXJ5U2VwYXJhdG9yOwogIC8qKiBUaGUgZXhwb25lbnRpYWwgc3ltYm9sICovCiAgVUNoYXIgZXhwb25lbnRpYWw7ICAKICAvKiogUGVyIG1pbGwgc3ltYm9sICovCiAgVUNoYXIgcGVyTWlsbDsKICAvKiogRXNjYXBlIHBhZGRpbmcgY2hhcmFjdGVyICovCiAgVUNoYXIgcGFkRXNjYXBlOwogIC8qKiBJbmZpbml0eSBzeW1ib2wgKi8KICBVQ2hhciBpbmZpbml0eSAgICAgIFtVTkZTWU1CT0xTTUFYU0laRV07CiAgLyoqIE5hbiBzeW1ib2wgKi8KICBVQ2hhciBuYU4gICAgICAgICAgIFtVTkZTWU1CT0xTTUFYU0laRV07ICAKfTsKdHlwZWRlZiBzdHJ1Y3QgVU51bWJlckZvcm1hdFN5bWJvbHMgVU51bWJlckZvcm1hdFN5bWJvbHM7CgovKioKKiBHZXQgdGhlIHN5bWJvbHMgYXNzb2NpYXRlZCB3aXRoIGEgVU51bWJlckZvcm1hdC4KKiBBIFVOdW1iZXJGb3JtYXQgdXNlcyBzeW1ib2xzIHRvIHJlcHJlc2VudCB0aGUgc3BlY2lhbCBsb2NhbGUtZGVwZW5kZW50IAoqIGNoYXJhY3RlcnMgaW4gYSBudW1iZXIsIGZvciBleGFtcGxlIHRoZSBwZXJjZW50IHNpZ24uCiogQHBhcmFtIGZtdCBUaGUgZm9ybWF0dGVyIHRvIHF1ZXJ5LgoqIEBwYXJhbSBzeW1zIEEgcG9pbnRlciB0byBhIFVOdW1iZXJGb3JtYXRTeW1ib2xzIHRvIHJlY2VpdmUgdGhlIHN5bWJvbHMgYXNzb2NpYXRlZCB3aXRoIGZtdC4KKiBAc2VlIHVudW1fc2V0U3ltYm9scwoqLwpVX0NBUEkgdm9pZAp1bnVtX2dldFN5bWJvbHMoICAgIGNvbnN0ICAgIFVOdW1iZXJGb3JtYXQgICAgICAgICAgICAqZm10LAogICAgICAgICAgICBVTnVtYmVyRm9ybWF0U3ltYm9scyAgICAqc3ltcyk7CgovKioKKiBTZXQgdGhlIHN5bWJvbHMgYXNzb2NpYXRlZCB3aXRoIGEgVU51bWJlckZvcm1hdC4KKiBBIFVOdW1iZXJGb3JtYXQgdXNlcyBzeW1ib2xzIHRvIHJlcHJlc2VudCB0aGUgc3BlY2lhbCBsb2NhbGUtZGVwZW5kZW50IAoqIGNoYXJhY3RlcnMgaW4gYSBudW1iZXIsIGZvciBleGFtcGxlIHRoZSBwZXJjZW50IHNpZ24uCiogQHBhcmFtIGZtdCBUaGUgZm9ybWF0dGVyIHRvIHNldC4KKiBAcGFyYW0gc3ltYm9sc1RvU2V0IFRoZSBVTnVtYmVyRm9ybWF0U3ltYm9scyB0byBhc3NvY2lhdGUgd2l0aCBmbXQuCiogQHBhcmFtIHN0YXR1cyBBIHBvaW50ZXIgdG8gYW4gVUVycm9yQ29kZSB0byByZWNlaXZlIGFueSBlcnJvcnMuCiogQHNlZSB1bnVtX2dldFN5bWJvbHMKKi8KVV9DQVBJIHZvaWQKdW51bV9zZXRTeW1ib2xzKCAgICBVTnVtYmVyRm9ybWF0KiAgICAgICAgICBmbXQsCiAgICAgICAgICAgIGNvbnN0ICAgVU51bWJlckZvcm1hdFN5bWJvbHMqICAgc3ltYm9sc1RvU2V0LAogICAgICAgICAgICBVRXJyb3JDb2RlICAgICAgICAgICAgICAgICpzdGF0dXMpOwoKI2VuZGlmCg==