LyoKICogRElTUERJQi5kbGwKICogCiAqIENvcHlyaWdodCAxOTk4IE92ZSBL5XZlbiAod2l0aCBzb21lIGhlbHAgZnJvbSBNYXJjdXMgTWVpc3NuZXIpCiAqCiAqLwoKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSAibWlzY2VtdS5oIgojaW5jbHVkZSAiZGlzcGRpYi5oIgojaW5jbHVkZSAidmdhLmgiCiNpbmNsdWRlICJkZWJ1Zy5oIgoKREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KQoKc3RhdGljIGludCBkaXNwZGliX211bHRpID0gMDsKCnN0YXRpYyBXT1JEIERJU1BESUJfQmVnaW4oV09SRCB3RmxhZ3MpCnsKICAgIHVuc2lnbmVkIFhyZXMsWXJlcyxEZXB0aDsKCiAgICBzd2l0Y2god0ZsYWdzJkRJU1BMQVlESUJfTU9ERSkgewogICAgICAgIGNhc2UgRElTUExBWURJQl9NT0RFX0RFRkFVTFQ6CiAgICAgICAgICAgIC8qIEZJWE1FOiBpcyB0aGlzIHN1cHBvc2VkIHRvIGF1dG9kZXRlY3Q/ICovCiAgICAgICAgY2FzZSBESVNQTEFZRElCX01PREVfMzIweDIwMHg4OgogICAgICAgICAgICBYcmVzPTMyMDsgWXJlcz0yMDA7IERlcHRoPTg7IGJyZWFrOwogICAgICAgIGNhc2UgRElTUExBWURJQl9NT0RFXzMyMHgyNDB4ODoKICAgICAgICAgICAgWHJlcz0zMjA7IFlyZXM9MjQwOyBEZXB0aD04OyBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gRElTUExBWURJQl9OT1RTVVBQT1JURUQ7CiAgICB9CiAgICAvKiBtb3JlIG9yIGxlc3MgZHVtbXkgY2FsbHMgdG8gRGVhdGgvUmVzdXJyZWN0aW9uLCBmb3IgY29tcGxldGVuZXNzICovCiAgICAvKiBGSVhNRTogd2hhdCBhcmd1bWVudHMgc2hvdWxkIHRoZXkgZ2V0PyAqLwogICAgRGVhdGgxNigwKTsKICAgIGlmIChWR0FfU2V0TW9kZShYcmVzLFlyZXMsRGVwdGgpKSB7CiAgICAgICAgIFJlc3VycmVjdGlvbjE2KDAsMCwwLDAsMCwwLDApOwogICAgICAgICByZXR1cm4gRElTUExBWURJQl9OT1RTVVBQT1JURUQ7CiAgICB9CiAgICByZXR1cm4gRElTUExBWURJQl9OT0VSUk9SOwp9CgpzdGF0aWMgdm9pZCBESVNQRElCX0VuZCh2b2lkKQp7CiAgICBSZXN1cnJlY3Rpb24xNigwLDAsMCwwLDAsMCwwKTsgLyogRklYTUU6IGFyZ3VtZW50cyAqLwogICAgVkdBX0V4aXQoKTsKfQoKc3RhdGljIHZvaWQgRElTUERJQl9QYWxldHRlKExQQklUTUFQSU5GTyBscGJpKQp7CiAgICBWR0FfU2V0UXVhZFBhbGV0dGUobHBiaS0+Ym1pQ29sb3JzLDAsMjU2KTsKfQoKc3RhdGljIHZvaWQgRElTUERJQl9TaG93KExQQklUTUFQSU5GT0hFQURFUiBscGJpLExQU1RSIGxwQml0cyxXT1JEIHVGbGFncykKewogICAgaW50IFhvZnMsWW9mcyxXaWR0aD1scGJpLT5iaVdpZHRoLEhlaWdodD1scGJpLT5iaUhlaWdodCxEZWx0YTsKICAgIHVuc2lnbmVkIFBpdGNoPShXaWR0aCszKSZ+MyxzUGl0Y2gsc1dpZHRoLHNIZWlnaHQ7CiAgICBMUFNUUiBzdXJmID0gRE9TTUVNX01hcERvc1RvTGluZWFyKDB4YTAwMDApOwoKICAgIGlmIChWR0FfR2V0TW9kZSgmc0hlaWdodCwmc1dpZHRoLE5VTEwpKSByZXR1cm47CiAgICBzUGl0Y2g9MzIwOwoKICAgIERlbHRhPShIZWlnaHQ8MCkqMi0xOwogICAgSGVpZ2h0Kj0tRGVsdGE7IFBpdGNoKj1EZWx0YTsKCiAgICBpZiAodUZsYWdzJkRJU1BMQVlESUJfTk9DRU5URVIpIHsKICAgICAgICBYb2ZzPTA7IFlvZnM9MDsKICAgIH0gZWxzZSB7CiAgICAgICAgWG9mcz0oc1dpZHRoLVdpZHRoKS8yOwogICAgICAgIFlvZnM9KHNIZWlnaHQtSGVpZ2h0KS8yOwogICAgfQogICAgc3VyZiArPSAoWW9mcypzUGl0Y2gpK1hvZnM7CiAgICBpZiAoUGl0Y2g8MCkgbHBCaXRzLT1QaXRjaCooSGVpZ2h0LTEpOwogICAgZm9yICg7IEhlaWdodDsgSGVpZ2h0LS0sbHBCaXRzKz1QaXRjaCxzdXJmKz1zUGl0Y2gpIHsKICAgICAgICBtZW1jcHkoc3VyZixscEJpdHMsV2lkdGgpOwogICAgfQoKICAgIFZHQV9Qb2xsKDApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCURpc3BsYXlEaWIJKERJU1BESUIuMSkKICoKICogIERpc2FibGVzIEdESSBhbmQgdGFrZXMgb3ZlciB0aGUgVkdBIHNjcmVlbiB0byBzaG93IERJQnMgaW4gZnVsbCBzY3JlZW4uCiAqCiAqIEZMQUdTCiAqCiAqICBESVNQTEFZRElCX05PUEFMRVRURTogZG9uJ3QgY2hhbmdlIHBhbGV0dGUKICogIERJU1BMQVlESUJfTk9DRU5URVI6IGRvbid0IGNlbnRlciBiaXRtYXAKICogIERJU1BMQVlESUJfTk9XQUlUOiBkb24ndCB3YWl0IChmb3Iga2V5cHJlc3MpIGJlZm9yZSByZXR1cm5pbmcKICogIERJU1BMQVlESUJfQkVHSU46IHN0YXJ0IG9mIG11bHRpcGxlIGNhbGxzIChkb2VzIG5vdCByZXN0b3JlIHRoZSBzY3JlZW4pCiAqICBESVNQTEFZRElCX0VORDogZW5kIG9mIG11bHRpcGxlIGNhbGxzIChyZXN0b3JlcyB0aGUgc2NyZWVuKQogKiAgRElTUExBWURJQl9NT0RFX0RFRkFVTFQ6IGRlZmF1bHQgZGlzcGxheSBtb2RlCiAqICBESVNQTEFZRElCX01PREVfMzIweDIwMHg4OiBTdGFuZGFyZCBWR0EgMzIweDIwMCAyNTYgY29sb3JzCiAqICBESVNQTEFZRElCX01PREVfMzIweDI0MHg4OiBUd2Vha2VkIFZHQSAzMjB4MjQwIDI1NiBjb2xvcnMKICoKICogUkVUVVJOUwogKgogKiAgRElTUExBWURJQl9OT0VSUk9SOiBzdWNjZXNzCiAqICBESVNQTEFZRElCX05PVFNVUFBPUlRFRDogZnVuY3Rpb24gbm90IHN1cHBvcnRlZAogKiAgRElTUExBWURJQl9JTlZBTElERElCOiBudWxsIG9yIGludmFsaWQgRElCIGhlYWRlcgogKiAgRElTUExBWURJQl9JTlZBTElERk9STUFUOiBpbnZhbGlkIERJQiBmb3JtYXQKICogIERJU1BMQVlESUJfSU5WQUxJRFRBU0s6IG5vdCBjYWxsZWQgZnJvbSBjdXJyZW50IHRhc2sKICoKICogQlVHUwogKgogKiAgV2FpdGluZyBmb3Iga2V5cHJlc3NlcyBpcyBub3QgaW1wbGVtZW50ZWQuCiAqLwpXT1JEIFdJTkFQSSBEaXNwbGF5RGliKAoJCUxQQklUTUFQSU5GTyBscGJpLCAvKiBESUIgaGVhZGVyIHdpdGggcmVzb2x1dGlvbiBhbmQgcGFsZXR0ZSAqLwoJCUxQU1RSIGxwQml0cywgLyogQml0bWFwIGJpdHMgdG8gc2hvdyAqLwoJCVdPUkQgd0ZsYWdzCgkpCnsKICAgIFdPUkQgcmV0OwoKICAgIGlmICh3RmxhZ3MmRElTUExBWURJQl9FTkQpIHsKICAgICAgICBpZiAoZGlzcGRpYl9tdWx0aSkgRElTUERJQl9FbmQoKTsKICAgICAgICBkaXNwZGliX211bHRpID0gMDsKICAgICAgICByZXR1cm4gRElTUExBWURJQl9OT0VSUk9SOwogICAgfQogICAgaWYgKCFkaXNwZGliX211bHRpKSB7CiAgICAgICAgcmV0PURJU1BESUJfQmVnaW4od0ZsYWdzKTsKICAgICAgICBpZiAocmV0KSByZXR1cm4gcmV0OwogICAgfQogICAgaWYgKHdGbGFncyZESVNQTEFZRElCX0JFR0lOKSBkaXNwZGliX211bHRpID0gMTsKICAgIGlmICghKHdGbGFncyZESVNQTEFZRElCX05PUEFMRVRURSkpIHsKICAgICAgICBESVNQRElCX1BhbGV0dGUobHBiaSk7CiAgICB9CiAgICAvKiBGSVhNRTogbm90IHN1cmUgaWYgaXQncyB2YWxpZCB0byBkcmF3IGltYWdlcyBpbiBESVNQTEFZRElCX0JFR0lOLCBzby4uLiAqLwogICAgaWYgKGxwQml0cykgewogICAgICAgIERJU1BESUJfU2hvdygmKGxwYmktPmJtaUhlYWRlciksbHBCaXRzLHdGbGFncyk7CiAgICB9CiAgICBpZiAoISh3RmxhZ3MmRElTUExBWURJQl9OT1dBSVQpKSB7CiAgICAgICAgRklYTUUoZGRyYXcsIndhaXQgbm90IGltcGxlbWVudGVkXG4iKTsKICAgIH0KICAgIGlmICghZGlzcGRpYl9tdWx0aSkgRElTUERJQl9FbmQoKTsKICAgIHJldHVybiBESVNQTEFZRElCX05PRVJST1I7Cn0K