Lyogc3RhdGVtZW50LmggLSBkZWZpbml0aW9ucyBmb3IgdGhlIHN0YXRlbWVudCB0eXBlCiAqCiAqIENvcHlyaWdodCAoQykgMjAwNS0yMDEwIEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KICoKICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiAqCiAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCiAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KICoKICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKICogZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgogKgogKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAogKiAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQogKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KICogMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgogKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgogKi8KCiNpZm5kZWYgUFlTUUxJVEVfU1RBVEVNRU5UX0gKI2RlZmluZSBQWVNRTElURV9TVEFURU1FTlRfSAojaW5jbHVkZSAiUHl0aG9uLmgiCgojaW5jbHVkZSAiY29ubmVjdGlvbi5oIgojaW5jbHVkZSAic3FsaXRlMy5oIgoKI2RlZmluZSBQWVNRTElURV9UT09fTVVDSF9TUUwgKC0xMDApCiNkZWZpbmUgUFlTUUxJVEVfU1FMX1dST05HX1RZUEUgKC0xMDEpCgp0eXBlZGVmIHN0cnVjdAp7CiAgICBQeU9iamVjdF9IRUFECiAgICBzcWxpdGUzKiBkYjsKICAgIHNxbGl0ZTNfc3RtdCogc3Q7CiAgICBQeU9iamVjdCogc3FsOwogICAgaW50IGluX3VzZTsKICAgIFB5T2JqZWN0KiBpbl93ZWFrcmVmbGlzdDsgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KfSBweXNxbGl0ZV9TdGF0ZW1lbnQ7CgpleHRlcm4gUHlUeXBlT2JqZWN0IHB5c3FsaXRlX1N0YXRlbWVudFR5cGU7CgppbnQgcHlzcWxpdGVfc3RhdGVtZW50X2NyZWF0ZShweXNxbGl0ZV9TdGF0ZW1lbnQqIHNlbGYsIHB5c3FsaXRlX0Nvbm5lY3Rpb24qIGNvbm5lY3Rpb24sIFB5T2JqZWN0KiBzcWwpOwp2b2lkIHB5c3FsaXRlX3N0YXRlbWVudF9kZWFsbG9jKHB5c3FsaXRlX1N0YXRlbWVudCogc2VsZik7CgppbnQgcHlzcWxpdGVfc3RhdGVtZW50X2JpbmRfcGFyYW1ldGVyKHB5c3FsaXRlX1N0YXRlbWVudCogc2VsZiwgaW50IHBvcywgUHlPYmplY3QqIHBhcmFtZXRlciwgaW50IGFsbG93XzhiaXRfY2hhcnMpOwp2b2lkIHB5c3FsaXRlX3N0YXRlbWVudF9iaW5kX3BhcmFtZXRlcnMocHlzcWxpdGVfU3RhdGVtZW50KiBzZWxmLCBQeU9iamVjdCogcGFyYW1ldGVycywgaW50IGFsbG93XzhiaXRfY2hhcnMpOwoKaW50IHB5c3FsaXRlX3N0YXRlbWVudF9yZWNvbXBpbGUocHlzcWxpdGVfU3RhdGVtZW50KiBzZWxmLCBQeU9iamVjdCogcGFyYW1ldGVycyk7CmludCBweXNxbGl0ZV9zdGF0ZW1lbnRfZmluYWxpemUocHlzcWxpdGVfU3RhdGVtZW50KiBzZWxmKTsKaW50IHB5c3FsaXRlX3N0YXRlbWVudF9yZXNldChweXNxbGl0ZV9TdGF0ZW1lbnQqIHNlbGYpOwp2b2lkIHB5c3FsaXRlX3N0YXRlbWVudF9tYXJrX2RpcnR5KHB5c3FsaXRlX1N0YXRlbWVudCogc2VsZik7CgppbnQgcHlzcWxpdGVfc3RhdGVtZW50X3NldHVwX3R5cGVzKHZvaWQpOwoKI2VuZGlmCg==