IyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQojIHB5c3FsaXRlMi9kYmFwaTIucHk6IHRoZSBEQi1BUEkgMi4wIGludGVyZmFjZQojCiMgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgojCiMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAojIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgojCiMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAojIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKIwojIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CiMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgojIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgojIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCgppbXBvcnQgY29sbGVjdGlvbnMKaW1wb3J0IGRhdGV0aW1lCmltcG9ydCB0aW1lCgpmcm9tIF9zcWxpdGUzIGltcG9ydCAqCgpwYXJhbXN0eWxlID0gInFtYXJrIgoKdGhyZWFkc2FmZXR5ID0gMQoKYXBpbGV2ZWwgPSAiMi4wIgoKRGF0ZSA9IGRhdGV0aW1lLmRhdGUKClRpbWUgPSBkYXRldGltZS50aW1lCgpUaW1lc3RhbXAgPSBkYXRldGltZS5kYXRldGltZQoKZGVmIERhdGVGcm9tVGlja3ModGlja3MpOgogICAgcmV0dXJuIERhdGUoKnRpbWUubG9jYWx0aW1lKHRpY2tzKVs6M10pCgpkZWYgVGltZUZyb21UaWNrcyh0aWNrcyk6CiAgICByZXR1cm4gVGltZSgqdGltZS5sb2NhbHRpbWUodGlja3MpWzM6Nl0pCgpkZWYgVGltZXN0YW1wRnJvbVRpY2tzKHRpY2tzKToKICAgIHJldHVybiBUaW1lc3RhbXAoKnRpbWUubG9jYWx0aW1lKHRpY2tzKVs6Nl0pCgp2ZXJzaW9uX2luZm8gPSB0dXBsZShbaW50KHgpIGZvciB4IGluIHZlcnNpb24uc3BsaXQoIi4iKV0pCnNxbGl0ZV92ZXJzaW9uX2luZm8gPSB0dXBsZShbaW50KHgpIGZvciB4IGluIHNxbGl0ZV92ZXJzaW9uLnNwbGl0KCIuIildKQoKQmluYXJ5ID0gYnVmZmVyCmNvbGxlY3Rpb25zLlNlcXVlbmNlLnJlZ2lzdGVyKFJvdykKCmRlZiByZWdpc3Rlcl9hZGFwdGVyc19hbmRfY29udmVydGVycygpOgogICAgZGVmIGFkYXB0X2RhdGUodmFsKToKICAgICAgICByZXR1cm4gdmFsLmlzb2Zvcm1hdCgpCgogICAgZGVmIGFkYXB0X2RhdGV0aW1lKHZhbCk6CiAgICAgICAgcmV0dXJuIHZhbC5pc29mb3JtYXQoIiAiKQoKICAgIGRlZiBjb252ZXJ0X2RhdGUodmFsKToKICAgICAgICByZXR1cm4gZGF0ZXRpbWUuZGF0ZSgqbWFwKGludCwgdmFsLnNwbGl0KCItIikpKQoKICAgIGRlZiBjb252ZXJ0X3RpbWVzdGFtcCh2YWwpOgogICAgICAgIGRhdGVwYXJ0LCB0aW1lcGFydCA9IHZhbC5zcGxpdCgiICIpCiAgICAgICAgeWVhciwgbW9udGgsIGRheSA9IG1hcChpbnQsIGRhdGVwYXJ0LnNwbGl0KCItIikpCiAgICAgICAgdGltZXBhcnRfZnVsbCA9IHRpbWVwYXJ0LnNwbGl0KCIuIikKICAgICAgICBob3VycywgbWludXRlcywgc2Vjb25kcyA9IG1hcChpbnQsIHRpbWVwYXJ0X2Z1bGxbMF0uc3BsaXQoIjoiKSkKICAgICAgICBpZiBsZW4odGltZXBhcnRfZnVsbCkgPT0gMjoKICAgICAgICAgICAgbWljcm9zZWNvbmRzID0gaW50KCd7OjA8Ni42fScuZm9ybWF0KHRpbWVwYXJ0X2Z1bGxbMV0uZGVjb2RlKCkpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1pY3Jvc2Vjb25kcyA9IDAKCiAgICAgICAgdmFsID0gZGF0ZXRpbWUuZGF0ZXRpbWUoeWVhciwgbW9udGgsIGRheSwgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG1pY3Jvc2Vjb25kcykKICAgICAgICByZXR1cm4gdmFsCgoKICAgIHJlZ2lzdGVyX2FkYXB0ZXIoZGF0ZXRpbWUuZGF0ZSwgYWRhcHRfZGF0ZSkKICAgIHJlZ2lzdGVyX2FkYXB0ZXIoZGF0ZXRpbWUuZGF0ZXRpbWUsIGFkYXB0X2RhdGV0aW1lKQogICAgcmVnaXN0ZXJfY29udmVydGVyKCJkYXRlIiwgY29udmVydF9kYXRlKQogICAgcmVnaXN0ZXJfY29udmVydGVyKCJ0aW1lc3RhbXAiLCBjb252ZXJ0X3RpbWVzdGFtcCkKCnJlZ2lzdGVyX2FkYXB0ZXJzX2FuZF9jb252ZXJ0ZXJzKCkKCiMgQ2xlYW4gdXAgbmFtZXNwYWNlCgpkZWwocmVnaXN0ZXJfYWRhcHRlcnNfYW5kX2NvbnZlcnRlcnMpCg==