LyoKKiBDb3B5cmlnaHQgqSB7MTk5OX0sIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKiAgIDExLzE3Lzk5ICAgIGFsaXUgICAgICAgIENyZWF0aW9uLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiovCiNpZm5kZWYgUkJUX0RBVEFfSAojZGVmaW5lIFJCVF9EQVRBX0gKCiNpbmNsdWRlICJyYnRfc2V0LmgiCgpjbGFzcyBVbmljb2RlU3RyaW5nOwpjbGFzcyBVbmljb2RlU2V0OwpjbGFzcyBIYXNodGFibGU7CgovKioKICogVGhlIHJ1bGUgZGF0YSBmb3IgYSBSdWxlQmFzZWRUcmFuc2xpdGVyYXRvcnMuICBSQlQgb2JqZWN0cyBob2xkCiAqIGEgY29uc3QgcG9pbnRlciB0byBhIFRSRCBvYmplY3QgdGhhdCB0aGV5IGRvIG5vdCBvd24uICBUUkQgb2JqZWN0cwogKiBhcmUgZXNzZW50aWFsbHkgdGhlIHBhcnNlZCBydWxlcyBpbiBjb21wYWN0LCB1c2FibGUgZm9ybS4gIFRoZQogKiBUUkQgb2JqZWN0cyB0aGVtc2VsdmVzIGFyZSBoZWxkIGZvciB0aGUgbGlmZSBvZiB0aGUgcHJvY2VzcyBpbgogKiBhIHN0YXRpYyBjYWNoZSBvd25lZCBieSBUcmFuc2xpdGVyYXRvci4KICoKICogVGhpcyBjbGFzcycgQVBJIGlzIGEgbGl0dGxlIGFzeW1tZXRyaWMuICBUaGVyZSBpcyBhIG1ldGhvZCB0bwogKiBkZWZpbmUgYSB2YXJpYWJsZSwgYnV0IG5vIHdheSB0byBkZWZpbmUgYSBzZXQuICBUaGlzIGlzIGJlY2F1c2UgdGhlCiAqIHNldHMgYXJlIGRlZmluZWQgYnkgdGhlIHBhcnNlciBpbiBhIFVWZWN0b3IsIGFuZCB0aGUgdmVjdG9yIGlzCiAqIGNvcGllZCBpbnRvIGEgZml4ZWQtc2l6ZSBhcnJheSBoZXJlLiAgT25jZSB0aGlzIGlzIGRvbmUsIG5vIG5ldwogKiBzZXRzIG1heSBiZSBkZWZpbmVkLiAgSW4gcHJhY3RpY2UsIHRoZXJlIGlzIG5vIG5lZWQgdG8gZG8gc28sIHNpbmNlCiAqIGdlbmVyYXRpbmcgdGhlIGRhdGEgYW5kIHVzaW5nIGl0IGFyZSBkaXNjcmV0ZSBwaGFzZXMuICBXaGVuIHRoZXJlCiAqIGlzIGEgbmVlZCB0byBhY2Nlc3MgdGhlIHNldCBkYXRhIGR1cmluZyB0aGUgcGFyc2UgcGhhc2UsIGFub3RoZXIKICogZGF0YSBzdHJ1Y3R1cmUgaGFuZGxlcyB0aGlzLiAgU2VlIHRoZSBwYXJzaW5nIGNvZGUgZm9yIG1vcmUKICogZGV0YWlscy4KICovCmNsYXNzIFRyYW5zbGl0ZXJhdGlvblJ1bGVEYXRhIHsKCnB1YmxpYzoKCiAgICAvLyBQVUJMSUMgREFUQSBNRU1CRVJTCgogICAgLyoqCiAgICAgKiBSdWxlIHRhYmxlLiAgTWF5IGJlIGVtcHR5LgogICAgICovCiAgICBUcmFuc2xpdGVyYXRpb25SdWxlU2V0IHJ1bGVTZXQ7CgogICAgLyoqCiAgICAgKiBNYXAgdmFyaWFibGUgbmFtZSAoU3RyaW5nKSB0byB2YXJpYWJsZSAoVW5pY29kZVN0cmluZykuICBBIHZhcmlhYmxlIG5hbWUKICAgICAqIGNvcnJlc3BvbmRzIHRvIHplcm8gb3IgbW9yZSBjaGFyYWN0ZXJzLCBzdG9yZWQgaW4gYSBVbmljb2RlU3RyaW5nIGluCiAgICAgKiB0aGlzIGhhc2guICBPbmUgb3IgbW9yZSBvZiB0aGVzZSBjaGFycyBtYXkgYWxzbyBjb3JyZXNwb25kIHRvIGEKICAgICAqIFVuaWNvZGVTZXQsIGluIHdoaWNoIGNhc2UgdGhlIGNoYXJhY3RlciBpbiB0aGUgVW5pY29kZVN0cmluZyBpbiB0aGlzIGhhc2ggaXMKICAgICAqIGEgc3RhbmQtaW46IGl0IGlzIGFuIGluZGV4IGZvciBhIHNlY29uZGFyeSBsb29rdXAgaW4KICAgICAqIGRhdGEuc2V0VmFyaWFibGVzLiAgVGhlIHN0YW5kLWluIGFsc28gcmVwcmVzZW50cyB0aGUgVW5pY29kZVNldCBpbgogICAgICogdGhlIHN0b3JlZCBydWxlcy4KICAgICAqLwogICAgSGFzaHRhYmxlKiB2YXJpYWJsZU5hbWVzOwogICAgCiAgICAvKioKICAgICAqIE1hcCBjYXRlZ29yeSB2YXJpYWJsZSAoVUNoYXIpIHRvIHNldCAoVW5pY29kZVNldCkuCiAgICAgKiBWYXJpYWJsZXMgdGhhdCBjb3JyZXNwb25kIHRvIGEgc2V0IG9mIGNoYXJhY3RlcnMgYXJlIG1hcHBlZAogICAgICogZnJvbSB2YXJpYWJsZSBuYW1lIHRvIGEgc3RhbmQtaW4gY2hhcmFjdGVyIGluIGRhdGEudmFyaWFibGVOYW1lcy4KICAgICAqIFRoZSBzdGFuZC1pbiB0aGVuIHNlcnZlcyBhcyBhIGtleSBpbiB0aGlzIGhhc2ggdG8gbG9va3VwIHRoZQogICAgICogYWN0dWFsIFVuaWNvZGVTZXQgb2JqZWN0LiAgSW4gYWRkaXRpb24sIHRoZSBzdGFuZC1pbiBpcwogICAgICogc3RvcmVkIGluIHRoZSBydWxlIHRleHQgdG8gcmVwcmVzZW50IHRoZSBzZXQgb2YgY2hhcmFjdGVycy4KICAgICAqIHNldFZhcmlhYmxlc1tpXSByZXByZXNlbnRzIGNoYXJhY3RlciAoc2V0VmFyaWFibGVzQmFzZSArIGkpLgogICAgICovCiAgICBVbmljb2RlU2V0Kiogc2V0VmFyaWFibGVzOwogICAgCiAgICAvKioKICAgICAqIFRoZSBjaGFyYWN0ZXIgdGhhdCByZXByZXNlbnRzIHNldFZhcmlhYmxlc1swXS4gIENoYXJhY3RlcnMKICAgICAqIHNldFZhcmlhYmxlc0Jhc2UgdGhyb3VnaCBzZXRWYXJpYWJsZXNCYXNlICsKICAgICAqIHNldFZhcmlhYmxlcy5sZW5ndGggLSAxIHJlcHJlc2VudCBVbmljb2RlU2V0IG9iamVjdHMuCiAgICAgKi8KICAgIFVDaGFyIHNldFZhcmlhYmxlc0Jhc2U7CgogICAgLyoqCiAgICAgKiBUaGUgbGVuZ3RoIG9mIHNldFZhcmlhYmxlcy4KICAgICAqLwogICAgaW50MzJfdCBzZXRWYXJpYWJsZXNMZW5ndGg7CgogICAgLyoqCiAgICAgKiBUaGUgY2hhcmFjdGVyIHRoYXQgcmVwcmVzZW50cyBzZWdtZW50IDEuICBDaGFyYWN0ZXJzIHNlZ21lbnRCYXNlCiAgICAgKiB0aHJvdWdoIHNlZ21lbnRCYXNlICsgOCByZXByZXNlbnQgc2VnbWVudHMgMSB0aHJvdWdoIDkuCiAgICAgKi8KICAgIFVDaGFyIHNlZ21lbnRCYXNlOwoKcHVibGljOgoKICAgIFRyYW5zbGl0ZXJhdGlvblJ1bGVEYXRhKFVFcnJvckNvZGUmIHN0YXR1cyk7CgogICAgflRyYW5zbGl0ZXJhdGlvblJ1bGVEYXRhKCk7CiAgICAKCWNvbnN0IFVuaWNvZGVTZXQqIGxvb2t1cFNldChVQ2hhciBzdGFuZEluKSBjb25zdDsKCiAgICAvKioKICAgICAqIFJldHVybiB0aGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgc2VnbWVudCByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4KICAgICAqIGNoYXJhY3Rlciwgb3IgLTEgaWYgbm9uZS4gIFJlcGVhdDogVGhpcyBpcyBhIHplcm8tYmFzZWQgcmV0dXJuIHZhbHVlLAogICAgICogMC4uOCwgZXZlbiB0aG91Z2ggdGhlc2UgYXJlIG5vdGF0ZWQgIiQxIi4uIiQ5Ii4KICAgICAqLwogICAgaW50MzJfdCBsb29rdXBTZWdtZW50UmVmZXJlbmNlKFVDaGFyIGMpIGNvbnN0OwoKICAgIC8qKgogICAgICogUmV0dXJuIHRoZSBjaGFyYWN0ZXIgdXNlZCB0byBzdGFuZCBmb3IgdGhlIGdpdmVuIHNlZ21lbnQgcmVmZXJlbmNlLgogICAgICogVGhlIHJlZmVyZW5jZSBtdXN0IGJlIGluIHRoZSByYW5nZSAxLi45LgogICAgICovCiAgICBVQ2hhciBnZXRTZWdtZW50U3RhbmRpbihpbnQzMl90IHJlZikgY29uc3QgewogICAgICAgIHJldHVybiBzZWdtZW50QmFzZSArIHJlZiAtIDE7CiAgICB9Cn07CgojZW5kaWYK