Iy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCiMgcHlzcWxpdGUyL2RiYXBpMi5weTogdGhlIERCLUFQSSAyLjAgaW50ZXJmYWNlCiMKIyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiMKIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KIwojIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCiMgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwojIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCiMKIyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKIyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CiMgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgojCiMgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKIyAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQojICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQojICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiMgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKIyAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCiMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KCmltcG9ydCBkYXRldGltZQppbXBvcnQgdGltZQoKZnJvbSBfc3FsaXRlMyBpbXBvcnQgKgoKcGFyYW1zdHlsZSA9ICJxbWFyayIKCnRocmVhZHNhZmV0eSA9IDEKCmFwaWxldmVsID0gIjIuMCIKCkRhdGUgPSBkYXRldGltZS5kYXRlCgpUaW1lID0gZGF0ZXRpbWUudGltZQoKVGltZXN0YW1wID0gZGF0ZXRpbWUuZGF0ZXRpbWUKCmRlZiBEYXRlRnJvbVRpY2tzKHRpY2tzKToKICAgIHJldHVybiBEYXRlKCp0aW1lLmxvY2FsdGltZSh0aWNrcylbOjNdKQoKZGVmIFRpbWVGcm9tVGlja3ModGlja3MpOgogICAgcmV0dXJuIFRpbWUoKnRpbWUubG9jYWx0aW1lKHRpY2tzKVszOjZdKQoKZGVmIFRpbWVzdGFtcEZyb21UaWNrcyh0aWNrcyk6CiAgICByZXR1cm4gVGltZXN0YW1wKCp0aW1lLmxvY2FsdGltZSh0aWNrcylbOjZdKQoKdmVyc2lvbl9pbmZvID0gdHVwbGUoW2ludCh4KSBmb3IgeCBpbiB2ZXJzaW9uLnNwbGl0KCIuIildKQpzcWxpdGVfdmVyc2lvbl9pbmZvID0gdHVwbGUoW2ludCh4KSBmb3IgeCBpbiBzcWxpdGVfdmVyc2lvbi5zcGxpdCgiLiIpXSkKCkJpbmFyeSA9IG1lbW9yeXZpZXcKCmRlZiByZWdpc3Rlcl9hZGFwdGVyc19hbmRfY29udmVydGVycygpOgogICAgZGVmIGFkYXB0X2RhdGUodmFsKToKICAgICAgICByZXR1cm4gdmFsLmlzb2Zvcm1hdCgpCgogICAgZGVmIGFkYXB0X2RhdGV0aW1lKHZhbCk6CiAgICAgICAgcmV0dXJuIHZhbC5pc29mb3JtYXQoIiAiKQoKICAgIGRlZiBjb252ZXJ0X2RhdGUodmFsKToKICAgICAgICByZXR1cm4gZGF0ZXRpbWUuZGF0ZSgqbWFwKGludCwgdmFsLnNwbGl0KGIiLSIpKSkKCiAgICBkZWYgY29udmVydF90aW1lc3RhbXAodmFsKToKICAgICAgICBkYXRlcGFydCwgdGltZXBhcnQgPSB2YWwuc3BsaXQoYiIgIikKICAgICAgICB5ZWFyLCBtb250aCwgZGF5ID0gbWFwKGludCwgZGF0ZXBhcnQuc3BsaXQoYiItIikpCiAgICAgICAgdGltZXBhcnRfZnVsbCA9IHRpbWVwYXJ0LnNwbGl0KGIiLiIpCiAgICAgICAgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMgPSBtYXAoaW50LCB0aW1lcGFydF9mdWxsWzBdLnNwbGl0KGIiOiIpKQogICAgICAgIGlmIGxlbih0aW1lcGFydF9mdWxsKSA9PSAyOgogICAgICAgICAgICBtaWNyb3NlY29uZHMgPSBpbnQodGltZXBhcnRfZnVsbFsxXSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBtaWNyb3NlY29uZHMgPSAwCgogICAgICAgIHZhbCA9IGRhdGV0aW1lLmRhdGV0aW1lKHllYXIsIG1vbnRoLCBkYXksIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBtaWNyb3NlY29uZHMpCiAgICAgICAgcmV0dXJuIHZhbAoKCiAgICByZWdpc3Rlcl9hZGFwdGVyKGRhdGV0aW1lLmRhdGUsIGFkYXB0X2RhdGUpCiAgICByZWdpc3Rlcl9hZGFwdGVyKGRhdGV0aW1lLmRhdGV0aW1lLCBhZGFwdF9kYXRldGltZSkKICAgIHJlZ2lzdGVyX2NvbnZlcnRlcigiZGF0ZSIsIGNvbnZlcnRfZGF0ZSkKICAgIHJlZ2lzdGVyX2NvbnZlcnRlcigidGltZXN0YW1wIiwgY29udmVydF90aW1lc3RhbXApCgpyZWdpc3Rlcl9hZGFwdGVyc19hbmRfY29udmVydGVycygpCgojIENsZWFuIHVwIG5hbWVzcGFjZQoKZGVsKHJlZ2lzdGVyX2FkYXB0ZXJzX2FuZF9jb252ZXJ0ZXJzKQo=