LyoKICogQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4KICoKICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogKi8KCiNpZm5kZWYgR3JDYWNoZUlEX0RFRklORUQKI2RlZmluZSBHckNhY2hlSURfREVGSU5FRAoKI2luY2x1ZGUgIkdyVHlwZXMuaCIKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KI2RlZmluZSBHUl9ERUNMQVJFX1JFU09VUkNFX0NBQ0hFX1RZUEUoKSAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBzdGF0aWMgaW50OF90IEdldFJlc291cmNlVHlwZSgpOwoKI2RlZmluZSBHUl9ERUZJTkVfUkVTT1VSQ0VfQ0FDSEVfVFlQRShDbGFzc05hbWUpICAgICAgICAgICAgICAgICBcCiAgICBpbnQ4X3QgQ2xhc3NOYW1lOjpHZXRSZXNvdXJjZVR5cGUoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHN0YXRpYyBpbnQ4X3Qga1Jlc291cmNlVHlwZUlEID0gMDsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpZiAoMCA9PSBrUmVzb3VyY2VUeXBlSUQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIGtSZXNvdXJjZVR5cGVJRCA9IEdyQ2FjaGVJRDo6R2V0TmV4dFJlc291cmNlVHlwZSgpOyAgXAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICByZXR1cm4ga1Jlc291cmNlVHlwZUlEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB9CgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwojZGVmaW5lIEdSX0RFQ0xBUkVfUkVTT1VSQ0VfQ0FDSEVfRE9NQUlOKEFjY2Vzc29yTmFtZSkgICAgICAgICAgIFwKICAgIHN0YXRpYyBpbnQ4X3QgQWNjZXNzb3JOYW1lKCk7CgojZGVmaW5lIEdSX0RFRklORV9SRVNPVVJDRV9DQUNIRV9ET01BSU4oQ2xhc3NOYW1lLCBBY2Nlc3Nvck5hbWUpIFwKICAgIGludDhfdCBDbGFzc05hbWU6OkFjY2Vzc29yTmFtZSgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgc3RhdGljIGludDhfdCBrRG9tYWluSUQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGlmICgwID09IGtEb21haW5JRCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAga0RvbWFpbklEID0gR3JDYWNoZUlEOjpHZXROZXh0RG9tYWluKCk7ICAgICAgICAgICAgICBcCiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHJldHVybiBrRG9tYWluSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0KCi8qKgogKiBUaGUgY2FjaGUgSUQgYWRkcyBzdHJ1Y3R1cmUgdG8gdGhlIElEcyB1c2VkIGZvciBjYWNoaW5nIEdQVSByZXNvdXJjZXMuIEl0CiAqIGlzIGJyb2tlbiBpbnRvIHRocmVlIHBvcnRpb25zOgogKiAgICAgIHRoZSBwdWJsaWMgcG9ydGlvbiAtIHdoaWNoIGlzIGZpbGxlZCBpbiBieSBTa2lhIGNsaWVudHMKICogICAgICB0aGUgcHJpdmF0ZSBwb3J0aW9uIC0gd2hpY2ggaXMgdXNlZCBieSB0aGUgY2FjaGUgKGRvbWFpbiAmIHR5cGUpCiAqICAgICAgdGhlIHJlc291cmNlLXNwZWNpZmljIHBvcnRpb24gLSB3aGljaCBpcyBmaWxsZWQgaW4gYnkgZWFjaCBHclJlc291cmNlLQogKiAgICAgICAgICAgICAgZGVyaXZlZCBjbGFzcy4KICoKICogRm9yIHRoZSBwdWJsaWMgcG9ydGlvbiBlYWNoIGNsaWVudCBvZiB0aGUgY2FjaGUgbWFrZXMgdXAgaXRzIG93bgogKiB1bmlxdWUtcGVyLXJlc291cmNlIGlkZW50aWZpZXIgKGUuZy4sIGJpdG1hcCBnZW5JRCkuIEEgcHVibGljIElEIG9mCiAqICdrU2NyYXRjaF9DYWNoZUlEJyBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVzb3VyY2UgaXMgYSAic2NyYXRjaCIgcmVzb3VyY2UuCiAqIFdoZW4gdXNlZCB0byBhY3F1aXJlIGEgcmVzb3VyY2UgaXQgaW5kaWNhdGVzIHRoZSBjYWNoZSB1c2VyIGlzCiAqIGxvb2tpbmcgZm9yIGEgcmVzb3VyY2UgdGhhdCBtYXRjaGVzIGEgcmVzb3VyY2Utc3ViY2xhc3Mtc3BlY2lmaWMgc2V0IG9mCiAqIJNkaW1lbnNpb25zlCBzdWNoIGFzIHdpZHRoLCBoZWlnaHQsIGJ1ZmZlciBzaXplLCBvciBwaXhlbCBjb25maWcsIGJ1dCBub3QKICogZm9yIHBhcnRpY3VsYXIgcmVzb3VyY2UgY29udGVudHMgKGUuZy4sIHRleGVsIG9yIHZlcnRleCB2YWx1ZXMpLiBUaGUgcHVibGljCiAqIElEcyBhcmUgdW5pcXVlIHdpdGhpbiBhIHByaXZhdGUgSUQgdmFsdWUgYnV0IG5vdCBuZWNlc3NhcmlseSBhY3Jvc3MKICogcHJpdmF0ZSBJRHMuCiAqCiAqIFRoZSBkb21haW4gcG9ydGlvbiBpZGVudGlmaWVzIHRoZSBjYWNoZSBjbGllbnQgd2hpbGUgdGhlIHR5cGUgZmllbGQKICogaW5kaWNhdGVzIHRoZSByZXNvdXJjZSB0eXBlLiBXaGVuIHRoZSBwdWJsaWMgcG9ydGlvbiBpbmRpY2F0ZXMgdGhhdCB0aGUKICogcmVzb3VyY2UgaXMgYSBzY3JhdGNoIHJlc291cmNlLCB0aGUgZG9tYWluIGZpZWxkIHNob3VsZCBiZSBrVW5yZXN0cmljdGVkCiAqIHNvIHRoYXQgc2NyYXRjaCByZXNvdXJjZXMgY2FuIGJlIHJlY3ljbGVkIGFjcm9zcyBkb21haW5zLgogKi8KY2xhc3MgR3JDYWNoZUlEIHsKcHVibGljOgogICAgdWludDY0X3QgICAgIGZQdWJsaWNJRDsKCiAgICB1aW50MzJfdCAgICAgZlJlc291cmNlU3BlY2lmaWMzMjsKCiAgICB1aW50OF90ICAgICAgZkRvbWFpbjsKcHJpdmF0ZToKICAgIHVpbnQ4X3QgICAgICBmUmVzb3VyY2VUeXBlOwoKcHVibGljOgogICAgdWludDE2X3QgICAgIGZSZXNvdXJjZVNwZWNpZmljMTY7CgogICAgR3JDYWNoZUlEKHVpbnQ4X3QgcmVzb3VyY2VUeXBlKQogICAgICAgIDogZlB1YmxpY0lEKGtEZWZhdWx0UHVibGljQ2FjaGVJRCkKICAgICAgICAsIGZEb21haW4oR3JDYWNoZURhdGE6OmtTY3JhdGNoX1Jlc291cmNlRG9tYWluKQogICAgICAgICwgZlJlc291cmNlVHlwZShyZXNvdXJjZVR5cGUpIHsKICAgIH0KCiAgICB2b2lkIHRvUmF3KHVpbnQzMl90IHZbNF0pOwoKICAgIHVpbnQ4X3QgZ2V0UmVzb3VyY2VUeXBlKCkgY29uc3QgeyByZXR1cm4gZlJlc291cmNlVHlwZTsgfQoKICAgIC8qCiAgICAgKiBEZWZhdWx0IHZhbHVlIGZvciBwdWJsaWMgcG9ydGlvbiBvZiBHckNhY2hlSUQKICAgICAqLwogICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IGtEZWZhdWx0UHVibGljQ2FjaGVJRCA9IDA7CgogICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0ludmFsaWRfUmVzb3VyY2VUeXBlID0gMDsKCiAgICBzdGF0aWMgdWludDhfdCAgICBHZXROZXh0RG9tYWluKCk7CiAgICBzdGF0aWMgdWludDhfdCAgICBHZXROZXh0UmVzb3VyY2VUeXBlKCk7CgoKfTsKCiNlbmRpZiAvLyBHckNhY2hlSURfREVGSU5FRAo=