LyoKICogVmVyeSBiYXNpYyB1bml0IHRlc3QgZm9yIGxvY2FsZSBmdW5jdGlvbnMKICogVGVzdCBydW4gb24gd2luMksgKEZyZW5jaCkKICoKICogQ29weXJpZ2h0IChjKSAyMDAyIFlBU0FSIE1laG1ldAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSAid2luZS90ZXN0LmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgojaW5jbHVkZSAid2lubmxzLmgiCgojZGVmaW5lIGVxKHJlY2VpdmVkLCBleHBlY3RlZCwgbGFiZWwsIHR5cGUpIFwKICAgICAgICBvaygocmVjZWl2ZWQpID09IChleHBlY3RlZCksICIlczogZ290ICIgdHlwZSAiIGluc3RlYWQgb2YgIiB0eXBlLCAobGFiZWwpLChyZWNlaXZlZCksKGV4cGVjdGVkKSkKCiNkZWZpbmUgQlVGRkVSX1NJWkUJCTEyOAovKiBCdWZmZXIgdXNlZCBieSBjYWxsYmFjayBmdW5jdGlvbiAqLwpjaGFyIEdsb2JhbEJ1ZmZlcltCVUZGRVJfU0laRV07CiNkZWZpbmUgQ09VTlRPRih4KSAoc2l6ZW9mKHgpL3NpemVvZih4KVswXSkKCi8qIFRPRE8gOgogKiBVbmljb2RlIHZlcnNpb25zCiAqIEVudW1UaW1lRm9ybWF0c0EKICogRW51bURhdGVGb3JtYXRzQQogKiBMQ01hcFN0cmluZ0EKICogR2V0VXNlckRlZmF1bHRMYW5nSUQKICogLi4uCiAqLwoKdm9pZCBUZXN0R2V0TG9jYWxlSW5mb0EoKQp7CglpbnQgcmV0LCBjbXA7CiAgCUxDSUQgbGNpZDsKICAJY2hhciBidWZmZXJbQlVGRkVSX1NJWkVdLCBFeHBlY3RlZFtCVUZGRVJfU0laRV07CgoJc3RyY3B5KEV4cGVjdGVkLCAiTW9uZGF5Iik7CglsY2lkID0gTUFLRUxDSUQoTUFLRUxBTkdJRChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUyksIFNPUlRfREVGQVVMVCApOwoJb2sgKGxjaWQgPT0gMHg0MDksICJ3cm9uZyBMQ0lEIGNhbGN1bGF0ZWQiKTsKCgkvKiBIVE1MS2l0IGFuZCAiRm9udCB4cGxvcmVyIGxpdGUiIGV4cGVjdCBHZXRMb2NhbGVJbmZvQSB0bwoJKiBwYXJ0aWFsbHkgZmlsbCB0aGUgYnVmZmVyIGV2ZW4gaWYgaXQgaXMgdG9vIHNob3J0LiBTZWUgYnVnIDYzNy4KCSovCglzdHJjcHkoRXhwZWN0ZWQsICJ4eHh4eCIpOwoJbWVtc2V0KCBidWZmZXIsICd4Jywgc2l6ZW9mKGJ1ZmZlcikgKTsKCXJldCA9IEdldExvY2FsZUluZm9BKGxjaWQsIExPQ0FMRV9TREFZTkFNRTEsIGJ1ZmZlciwgMCk7CgljbXAgPSBzdHJuY21wIChidWZmZXIsIEV4cGVjdGVkLCBzdHJsZW4oRXhwZWN0ZWQpKTsKCW9rIChjbXAgPT0gMCwgIkdldExvY2FsZUluZm9BIGdvdCAlcyBpbnN0ZWFkIG9mICVzIiwgYnVmZmVyLCBFeHBlY3RlZCk7CgllcSAocmV0LCBsc3RybGVuQSgiTW9uZGF5IikgKyAxLCAiR2V0TG9jYWxlSW5mb0Egd2l0aCBsZW49MCIsICIlZCIpOwoKCXN0cmNweShFeHBlY3RlZCwgIk1vbnh4Iik7CgltZW1zZXQoIGJ1ZmZlciwgJ3gnLCBzaXplb2YoYnVmZmVyKSApOwoJcmV0ID0gR2V0TG9jYWxlSW5mb0EobGNpZCwgTE9DQUxFX1NEQVlOQU1FMSwgYnVmZmVyLCAzKTsKCWNtcCA9IHN0cm5jbXAgKGJ1ZmZlciwgRXhwZWN0ZWQsIHN0cmxlbihFeHBlY3RlZCkpOwoJb2sgKGNtcCA9PSAwLCAiR2V0TG9jYWxlSW5mb0EgZ290ICVzIGluc3RlYWQgb2YgJXMiLCBidWZmZXIsIEV4cGVjdGVkKTsKCWVxIChyZXQsIDAsICJHZXRMb2NhbGVJbmZvQSB3aXRoIGxlbiA9IDMiLCAiJWQiKTsKCglzdHJjcHkoRXhwZWN0ZWQsICJNb25kYXkiKTsKCW1lbXNldCggYnVmZmVyLCAneCcsIHNpemVvZihidWZmZXIpICk7CglyZXQgPSBHZXRMb2NhbGVJbmZvQShsY2lkLCBMT0NBTEVfU0RBWU5BTUUxLCBidWZmZXIsIDEwKTsKCS8qIFdlIGNoZWNrIGFsc28gcHJlc2VuY2Ugb2YgJ1wwJyAqLwoJY21wID0gc3RybmNtcCAoYnVmZmVyLCBFeHBlY3RlZCwgc3RybGVuKEV4cGVjdGVkKSArIDEpOwoJb2sgKGNtcCA9PSAwLCAiR2V0TG9jYWxlSW5mb0EgZ290ICVzIGluc3RlYWQgb2YgJXMiLCBidWZmZXIsIEV4cGVjdGVkKTsKCWVxIChyZXQsIGxzdHJsZW5BKEV4cGVjdGVkKSsxLCAiR2V0TG9jYWxlSW5mb0Egd2l0aCBsZW4gPSAxMCIsICIlZCIgKTsKCgkvKiBXZSBjaGVjayB0aGUgd2hvbGUgYnVmZmVyIHdpdGggc3RybmNtcCAqLwoJbWVtc2V0KCBFeHBlY3RlZCwgJ3gnLCBzaXplb2YoRXhwZWN0ZWQpICk7CglzdHJjcHkoRXhwZWN0ZWQsICJNb25kYXkiKTsKCW1lbXNldCggYnVmZmVyLCAneCcsIHNpemVvZihidWZmZXIpICk7CglyZXQgPSBHZXRMb2NhbGVJbmZvQShsY2lkLCBMT0NBTEVfU0RBWU5BTUUxLCBidWZmZXIsIEJVRkZFUl9TSVpFKTsKCWNtcCA9IHN0cm5jbXAgKGJ1ZmZlciwgRXhwZWN0ZWQsIEJVRkZFUl9TSVpFKTsKCW9rIChjbXAgPT0gMCwgIkdldExvY2FsZUluZm9BIGdvdCAlcyBpbnN0ZWFkIG9mICVzIiwgYnVmZmVyLCBFeHBlY3RlZCk7CgllcSAocmV0LCBsc3RybGVuQShFeHBlY3RlZCkrMSwgIkdldExvY2FsZUluZm9BIHdpdGggbGVuID0gMTAiLCAiJWQiICk7Cgp9CgoKdm9pZCBUZXN0R2V0VGltZUZvcm1hdEEoKQp7CiAgaW50IHJldCwgZXJyb3IsIGNtcDsKICBTWVNURU1USU1FICBjdXJ0aW1lOwogIGNoYXIgYnVmZmVyW0JVRkZFUl9TSVpFXSwgZm9ybWF0W0JVRkZFUl9TSVpFXSwgRXhwZWN0ZWRbQlVGRkVSX1NJWkVdOwogIExDSUQgbGNpZDsKCiAgbGNpZCA9IE1BS0VMQ0lEKE1BS0VMQU5HSUQoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfVVMpLCBTT1JUX0RFRkFVTFQgKTsKICBzdHJjcHkoZm9ybWF0LCAidHQgSEgnOidtbSdAJ3NzIik7CgogIC8qIGZpbGwgY3VydGltZSB3aXRoIGR1bW15IGRhdGEgKi8KICBtZW1zZXQoJmN1cnRpbWUsIDIsIHNpemVvZihTWVNURU1USU1FKSk7CiAgbWVtc2V0KGJ1ZmZlciwgJzAnLCBzaXplb2YoYnVmZmVyKSk7CiAgcmV0ID0gR2V0VGltZUZvcm1hdEEobGNpZCwgVElNRV9GT1JDRTI0SE9VUkZPUk1BVCwgJmN1cnRpbWUsIGZvcm1hdCwgYnVmZmVyLCBDT1VOVE9GKGJ1ZmZlcikpOwogIGVycm9yID0gR2V0TGFzdEVycm9yICgpOwogIG9rIChyZXQgPT0gMCwgIkdldFRpbWVGb3JtYXQgc2hvdWxkIGZhaWwgb24gZHVtbXkgZGF0YSIpOwogIGVxIChlcnJvciwgRVJST1JfSU5WQUxJRF9QQVJBTUVURVIsICJHZXRUaW1lRm9ybWF0IEdldExhc3RFcnJvcigpIiwgIiVkIik7CiAgU2V0TGFzdEVycm9yKE5PX0VSUk9SKTsgICAvKiBjbGVhciBvdXQgdGhlIGxhc3QgZXJyb3IgKi8KCiAgLyogdGVzdCB0aGF0IHdlIGNhbiBjb3JyZWN0bHkgcHJvZHVjZSB0aGUgZXhwZWN0ZWQgb3V0cHV0LCBub3QgYSB2ZXJ5ICovCiAgLyogZGVtYW5kaW5nIHRlc3QgOy0pICovCiAgc3RyY3B5KEV4cGVjdGVkLCAiQU0gMDg6NTZAMTMiKTsKICBjdXJ0aW1lLndIb3VyID0gODsgIGN1cnRpbWUud01pbnV0ZSA9IDU2OwogIGN1cnRpbWUud1NlY29uZCA9IDEzOyBjdXJ0aW1lLndNaWxsaXNlY29uZHMgPSAyMjsKICBtZW1zZXQoYnVmZmVyLCAnMCcsIHNpemVvZihidWZmZXIpKTsKICByZXQgPSBHZXRUaW1lRm9ybWF0QShsY2lkLCBUSU1FX0ZPUkNFMjRIT1VSRk9STUFULCAmY3VydGltZSwgZm9ybWF0LCBidWZmZXIsIENPVU5UT0YoYnVmZmVyKSk7CiAgY21wID0gc3RybmNtcCAoRXhwZWN0ZWQsIGJ1ZmZlciwgc3RybGVuKEV4cGVjdGVkKSsxKTsKICBvayAoY21wID09IDAsICJHZXRUaW1lRm9ybWF0IGdvdCAlcyBpbnN0ZWFkIG9mICVzIiwgYnVmZmVyLCBFeHBlY3RlZCk7CiAgZXEgKHJldCwgbHN0cmxlbkEoRXhwZWN0ZWQpKzEsICJHZXRUaW1lRm9ybWF0IiwgIiVkIik7CgogIC8qIGNoZWNrIHRoYXQgdGhlIHNpemUgcmVwb3J0ZWQgYnkgdGhlIGFib3ZlIGNhbGwgaXMgYWNjdWF0ZSAqLwogIG1lbXNldChidWZmZXIsICd4Jywgc2l6ZW9mKGJ1ZmZlcikpOwogIHJldCA9IEdldFRpbWVGb3JtYXRBKGxjaWQsIFRJTUVfRk9SQ0UyNEhPVVJGT1JNQVQsICZjdXJ0aW1lLCBmb3JtYXQsIGJ1ZmZlciwgcmV0KTsKICBvayhyZXQ9PWxzdHJsZW5BKEV4cGVjdGVkKSsxICYmIEdldExhc3RFcnJvcigpPT0wLAogICAgICAgICAgICJHZXRUaW1lRm9ybWF0KHJpZ2h0IHNpemUpOiByZXQ9JWQgZXJyb3I9JWxkXG4iLHJldCxHZXRMYXN0RXJyb3IoKSk7CiAgb2soYnVmZmVyWzBdICE9ICd4JywiR2V0VGltZUZvcm1hdChyaWdodCBzaXplKTogYnVmZmVyPVslc11cbiIsYnVmZmVyKTsKCiAgLyogdGVzdCBmYWlsdXJlIGR1ZSB0byBpbnN1ZmZpY2VudCBidWZmZXIgKi8KICByZXQgPSBHZXRUaW1lRm9ybWF0QShsY2lkLCBUSU1FX0ZPUkNFMjRIT1VSRk9STUFULCAmY3VydGltZSwgZm9ybWF0LCBidWZmZXIsIDIpOwogIG9rKHJldD09MCAmJiBHZXRMYXN0RXJyb3IoKT09RVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUiwKICAgICAgICAgICAiR2V0VGltZUZvcm1hdChsZW49Mik6IHJldD0lZCBlcnJvcj0lbGQiLCByZXQsIEdldExhc3RFcnJvcigpKTsKCiAgLyogdGVzdCB3aXRoIHRvbyBzbWFsbCBidWZmZXJzICovCiAgU2V0TGFzdEVycm9yKDApOwogIG1lbXNldChidWZmZXIsICcwJywgc2l6ZW9mKGJ1ZmZlcikpOwogIHJldCA9IEdldFRpbWVGb3JtYXRBKGxjaWQsIFRJTUVfRk9SQ0UyNEhPVVJGT1JNQVQsICZjdXJ0aW1lLCBmb3JtYXQsIE5VTEwsIDApOwogIG9rKHJldD09bHN0cmxlbkEoRXhwZWN0ZWQpKzEgJiYgR2V0TGFzdEVycm9yKCk9PTAsCiAgICAgICAgICAgIkdldFRpbWVGb3JtYXQobGVuPTApOiByZXQ9JWQgZXJyb3I9JWxkXG4iLHJldCxHZXRMYXN0RXJyb3IoKSk7CgogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyogdGVzdCBvdXQgVElNRV9OT01JTlVURVNPUlNFQ09ORFMgKi8KICBzdHJjcHkoRXhwZWN0ZWQsICI4IEFNIik7CiAgbWVtc2V0KGJ1ZmZlciwgJzAnLCBzaXplb2YoYnVmZmVyKSk7CiAgcmV0ID0gR2V0VGltZUZvcm1hdEEobGNpZCwgVElNRV9OT01JTlVURVNPUlNFQ09ORFMsICZjdXJ0aW1lLCBOVUxMLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKICBjbXAgPSBzdHJuY21wKGJ1ZmZlciwgRXhwZWN0ZWQsIEJVRkZFUl9TSVpFKTsKICBvayAoY21wID09IDAsICJHZXRUaW1lRm9ybWF0IGdvdCAnJXMnIGluc3RlYWQgb2YgJyVzJyIsIGJ1ZmZlciwgRXhwZWN0ZWQpOwogIGVxIChyZXQsIGxzdHJsZW5BKEV4cGVjdGVkKSsxLCAiR2V0VGltZUZvcm1hdCIsICIlZCIpOwoKICAvKiB0ZXN0IG91dCBUSU1FX05PTUlOVVRFU09SU0VDT05EUyB3aXRoIGNvbXBsZXggZm9ybWF0IHN0cmluZ3MgKi8KICBzdHJjcHkoRXhwZWN0ZWQsICI0Iik7CiAgbWVtc2V0KGJ1ZmZlciwgJzAnLCBzaXplb2YoYnVmZmVyKSk7CiAgcmV0ID0gR2V0VGltZUZvcm1hdEEobGNpZCwgVElNRV9OT01JTlVURVNPUlNFQ09ORFMsICZjdXJ0aW1lLCAibTFzMm0zczQiLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKICBjbXAgPSBzdHJuY21wKGJ1ZmZlciwgRXhwZWN0ZWQsIEJVRkZFUl9TSVpFKTsKICBvayAoY21wID09IDAsICJHZXRUaW1lRm9ybWF0IGdvdCAnJXMnIGluc3RlYWQgb2YgJyVzJyIsIGJ1ZmZlciwgRXhwZWN0ZWQpOwogIGVxIChyZXQsIGxzdHJsZW5BKEV4cGVjdGVkKSsxLCAiR2V0VGltZUZvcm1hdCIsICIlZCIpOwoKCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKiB0ZXN0IG91dCBUSU1FX05PU0VDT05EUyAqLwogIHN0cmNweShFeHBlY3RlZCwgIjg6NTYgQU0iKTsKICByZXQgPSBHZXRUaW1lRm9ybWF0QShsY2lkLCBUSU1FX05PU0VDT05EUywgJmN1cnRpbWUsIE5VTEwsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwogIGNtcCA9IHN0cm5jbXAoYnVmZmVyLCBFeHBlY3RlZCwgQlVGRkVSX1NJWkUpOwogIG9rIChjbXAgPT0gMCwgIkdldFRpbWVGb3JtYXQgZ290ICclcycgaW5zdGVhZCBvZiAnJXMnIiwgYnVmZmVyLCBFeHBlY3RlZCk7CiAgZXEgKHJldCwgbHN0cmxlbkEoRXhwZWN0ZWQpKzEsICJHZXRUaW1lRm9ybWF0IiwgIiVkIik7CgogIC8qIHRlc3Qgb3V0IFRJTUVfTk9TRUNPTkRTIHdpdGggYSBmb3JtYXQgc3RyaW5nIG9mICJoOm06cyB0dCIgKi8KICBzdHJjcHkoRXhwZWN0ZWQsICI4OjU2IEFNIik7CiAgbWVtc2V0KGJ1ZmZlciwgJzAnLCBzaXplb2YoYnVmZmVyKSk7CiAgcmV0ID0gR2V0VGltZUZvcm1hdEEobGNpZCwgVElNRV9OT1NFQ09ORFMsICZjdXJ0aW1lLCAiaDptOnMgdHQiLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKICBjbXAgPSBzdHJuY21wKGJ1ZmZlciwgRXhwZWN0ZWQsIEJVRkZFUl9TSVpFKTsKICBvayAoY21wID09IDAsICJHZXRUaW1lRm9ybWF0IGdvdCAnJXMnIGluc3RlYWQgb2YgJyVzJyIsIGJ1ZmZlciwgRXhwZWN0ZWQpOwogIGVxIChyZXQsIGxzdHJsZW5BKEV4cGVjdGVkKSsxLCAiR2V0VGltZUZvcm1hdCIsICIlZCIpOwoKICAvKiB0ZXN0IG91dCBUSU1FX05PU0VDT05EUyBhIHN0cmFuZ2UgZm9ybWF0IHN0cmluZyBvZiBtdWx0aXBsZSBkZWxpbWl0ZXJzICJoQDptQDpzIHR0IiAqLwogIC8qIGV4cGVjdGVkIGJlaGF2aW9yIGlzIHRvIHR1cm4gImhEMUQyLi4ubUQzRDQuLi5zRDVENi4uLnR0IiBhbmQgdHVybiB0aGlzIGludG8gKi8KICAvKiAiaEQxRDIuLi5tRDNENC4uLnR0IiAqLwogIHN0cmNweShFeHBlY3RlZCwgIjguQDo1Ni5AOkFNIik7CiAgbWVtc2V0KGJ1ZmZlciwgJzAnLCBzaXplb2YoYnVmZmVyKSk7CiAgcmV0ID0gR2V0VGltZUZvcm1hdEEobGNpZCwgVElNRV9OT1NFQ09ORFMsICZjdXJ0aW1lLCAiaC5AOm0uQDpzLkA6dHQiLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKICBjbXAgPSBzdHJuY21wKGJ1ZmZlciwgRXhwZWN0ZWQsIEJVRkZFUl9TSVpFKTsKICBvayAoY21wID09IDAsICJHZXRUaW1lRm9ybWF0IGdvdCAnJXMnIGluc3RlYWQgb2YgJyVzJyIsIGJ1ZmZlciwgRXhwZWN0ZWQpOwogIGVxIChyZXQsIGxzdHJsZW5BKEV4cGVjdGVkKSsxLCAiR2V0VGltZUZvcm1hdCIsICIlZCIpOwoKICAvKiB0ZXN0IG91dCBUSU1FX05PU0VDT05EUyB3aXRoIGFuIHN0cmluZyBvZiAiMXMyczNzNCIgKi8KICAvKiBleHBlY3QgdG8gc2VlIG9ubHkgIjMiICovCiAgc3RyY3B5KEV4cGVjdGVkLCAiMyIpOwogIG1lbXNldChidWZmZXIsICcwJywgc2l6ZW9mKGJ1ZmZlcikpOwogIHJldCA9IEdldFRpbWVGb3JtYXRBKGxjaWQsIFRJTUVfTk9TRUNPTkRTLCAmY3VydGltZSwgInMxczJzMyIsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwogIGNtcCA9IHN0cm5jbXAoYnVmZmVyLCBFeHBlY3RlZCwgQlVGRkVSX1NJWkUpOwogIG9rIChjbXAgPT0gMCwgIkdldFRpbWVGb3JtYXQgZ290ICclcycgaW5zdGVhZCBvZiAnJXMnIiwgYnVmZmVyLCBFeHBlY3RlZCk7CiAgZXEgKHJldCwgbHN0cmxlbkEoRXhwZWN0ZWQpKzEsICJHZXRUaW1lRm9ybWF0IiwgIiVkIik7CgogIC8qKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyogVGVzdCBvdXQgdGltZSBtYXJrZXIgKi8KICAvKiB0ZXN0IG91dCB0aW1lIG1hcmtlcihBTS9QTSkgYmVoYXZpb3IgKi8KICBzdHJjcHkoRXhwZWN0ZWQsICJBL0FNIik7CiAgbWVtc2V0KGJ1ZmZlciwgJzAnLCBzaXplb2YoYnVmZmVyKSk7CiAgcmV0ID0gR2V0VGltZUZvcm1hdEEobGNpZCwgMCwgJmN1cnRpbWUsICJ0L3R0IiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CiAgY21wID0gc3RybmNtcChidWZmZXIsIEV4cGVjdGVkLCBCVUZGRVJfU0laRSk7CiAgb2sgKGNtcCA9PSAwLCAiR2V0VGltZUZvcm1hdCBnb3QgJyVzJyBpbnN0ZWFkIG9mICVzIiwgYnVmZmVyLCBFeHBlY3RlZCk7CiAgZXEgKHJldCwgbHN0cmxlbkEoRXhwZWN0ZWQpKzEsICJHZXRUaW1lRm9ybWF0IiwgIiVkIik7CgogIC8qIHRpbWUgbWFya2VyIHRlc3RpbmcgcGFydCAyICovCiAgY3VydGltZS53SG91ciA9IDEzOwogIHN0cmNweShFeHBlY3RlZCwgIlAvUE0iKTsKICBtZW1zZXQoYnVmZmVyLCAnMCcsIHNpemVvZihidWZmZXIpKTsKICByZXQgPSBHZXRUaW1lRm9ybWF0QShsY2lkLCAwLCAmY3VydGltZSwgInQvdHQiLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKICBjbXAgPSBzdHJuY21wKGJ1ZmZlciwgRXhwZWN0ZWQsIEJVRkZFUl9TSVpFKTsKICBvayAoY21wID09IDAsICJHZXRUaW1lRm9ybWF0IGdvdCAnJXMnIGluc3RlYWQgb2YgJXMiLCBidWZmZXIsIEV4cGVjdGVkKTsKICBlcSAocmV0LCBsc3RybGVuQShFeHBlY3RlZCkrMSwgIkdldFRpbWVGb3JtYXQiLCAiJWQiKTsKCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKiB0ZXN0IG91dCBUSU1FX05PVElNRU1BUktFUiAqLwogIC8qIE5PVEU6IFRJTUVfTk9USU1FTUFSS0VSIGVsbWluYXRlcyBhbGwgdGV4dCBhcm91bmQgYW55IHRpbWUgbWFya2VyICovCiAgLyogICAgICBmb3JtYXR0aW5nIGNoYXJhY3RlciB1bnRpbCB0aGUgcHJldmlvdXMgb3IgbmV4dCBmb3JtYXR0aW5nIGNoYXJhY3RlciAqLwogIHN0cmNweShFeHBlY3RlZCwgIjE1NiIpOwogIG1lbXNldChidWZmZXIsICcwJywgc2l6ZW9mKGJ1ZmZlcikpOwogIHJldCA9IEdldFRpbWVGb3JtYXRBKGxjaWQsIFRJTUVfTk9USU1FTUFSS0VSLCAmY3VydGltZSwgImgxdDJ0dDNtIiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CiAgY21wID0gc3RybmNtcChidWZmZXIsIEV4cGVjdGVkLCBCVUZGRVJfU0laRSk7CiAgb2sgKGNtcCA9PSAwLCAiR2V0VGltZUZvcm1hdCBnb3QgJyVzJyBpbnN0ZWFkIG9mICVzIiwgYnVmZmVyLCBFeHBlY3RlZCk7CiAgZXEgKHJldCwgbHN0cmxlbkEoRXhwZWN0ZWQpKzEsICJHZXRUaW1lRm9ybWF0IiwgIiVkIik7CgogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKiB0ZXN0IG91dCBUSU1FX0ZPUkNFMjRIT1VSRk9STUFUICovCiAgc3RyY3B5KEV4cGVjdGVkLCAiMTM6NTY6MTMgUE0iKTsKICBtZW1zZXQoYnVmZmVyLCAnMCcsIHNpemVvZihidWZmZXIpKTsKICByZXQgPSBHZXRUaW1lRm9ybWF0QShsY2lkLCBUSU1FX0ZPUkNFMjRIT1VSRk9STUFULCAmY3VydGltZSwgImg6bTpzIHR0IiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CiAgY21wID0gc3RybmNtcChidWZmZXIsIEV4cGVjdGVkLCBCVUZGRVJfU0laRSk7CiAgb2sgKGNtcCA9PSAwLCAiR2V0VGltZUZvcm1hdCBnb3QgJyVzJyBpbnN0ZWFkIG9mICVzIiwgYnVmZmVyLCBFeHBlY3RlZCk7CiAgZXEgKHJldCwgbHN0cmxlbkEoRXhwZWN0ZWQpKzEsICJHZXRUaW1lRm9ybWF0IiwgIiVkIik7CgogIC8qIGNoZWNrIHRvIGNvbmZpcm0gdGhhdCB1bmxpa2Ugd2hhdCBtc2RuIGRvY3VtZW50YXRpb24gc3VnZ2VzdHMsIHRoZSB0aW1lIG1hcmtlciAqLwogIC8qIGlzIG5vdCBhZGRlZCB1bmRlciBUSU1FX0ZPUkNFMjRIT1VSRk9STUFUICovCiAgc3RyY3B5KEV4cGVjdGVkLCAiMTM6NTY6MTMiKTsKICBtZW1zZXQoYnVmZmVyLCAnMCcsIHNpemVvZihidWZmZXIpKTsKICByZXQgPSBHZXRUaW1lRm9ybWF0QShsY2lkLCBUSU1FX0ZPUkNFMjRIT1VSRk9STUFULCAmY3VydGltZSwgImg6bTpzIiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CiAgY21wID0gc3RybmNtcChidWZmZXIsIEV4cGVjdGVkLCBCVUZGRVJfU0laRSk7CiAgb2sgKGNtcCA9PSAwLCAiR2V0VGltZUZvcm1hdCBnb3QgJyVzJyBpbnN0ZWFkIG9mICVzIiwgYnVmZmVyLCBFeHBlY3RlZCk7CiAgZXEgKHJldCwgbHN0cmxlbkEoRXhwZWN0ZWQpKzEsICJHZXRUaW1lRm9ybWF0IiwgIiVkIik7CgoKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIC8qIHRlc3QgYWR2YW5jZWQgZm9ybWF0dGluZyBvZiBHZXRUaW1lRm9ybWF0ICovCgogIC8qIHRlc3QgZm9yIDI0IGhvdXIgY29udmVyc2lvbiBhbmQgZm9yIGxlYWRpbmcgemVybyAqLwogIC8qIE5PVEU6IHdlIGRvIG5vdCB0ZXN0IHRoZSAiaGggb3IgSEgiIGNhc2Ugc2luY2UgaG91cnMgaXMgdHdvIGRpZ2l0cyAqLwogIC8qICJoIGhoIEggSEggbSBtbSBzIHNzIHQgdHQiICovCiAgY3VydGltZS53SG91ciA9IDE0OyAvKiBjaGFuZ2UgdGhpcyB0byAxNCBvciAycG0gKi8KICBjdXJ0aW1lLndNaW51dGUgPSA1OwogIGN1cnRpbWUud1NlY29uZCA9IDM7CiAgc3RyY3B5KEV4cGVjdGVkLCAiMiAwMiAxNCAxNCA1IDA1IDMgMDMgUCBQTSIpOwogIG1lbXNldChidWZmZXIsICcwJywgc2l6ZW9mKGJ1ZmZlcikpOwogIHJldCA9IEdldFRpbWVGb3JtYXRBKGxjaWQsIDAsICZjdXJ0aW1lLCAiaCBoaCBIIEhIIG0gbW0gcyBzcyB0IHR0IiwgCmJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwogIGNtcCA9IHN0cm5jbXAoYnVmZmVyLCBFeHBlY3RlZCwgQlVGRkVSX1NJWkUpOwogIG9rIChjbXAgPT0gMCwgIkdldFRpbWVGb3JtYXQgZ290ICclcycgaW5zdGVhZCBvZiAnJXMnIiwgYnVmZmVyLCBFeHBlY3RlZCk7CiAgZXEgKHJldCwgbHN0cmxlbkEoRXhwZWN0ZWQpKzEsICJHZXRUaW1lRm9ybWF0IiwgIiVkIik7CgogIC8qIGNvbXBsZXRlIHRlc3Rpbmcgb24gdGhlIGFkdmFuY2VkIGZvcm1hdHRpbmcgYnkgdGVzdGluZyAiaGgiIGFuZCAiSEgiICovCiAgLyogMCBob3VyIGlzIDEyIG8nY2xvY2sgb3IgMDAgaHVuZHJlZCBob3VycyAqLwogIGN1cnRpbWUud0hvdXIgPSAwOwogIHN0cmNweShFeHBlY3RlZCwgIjEyLzAvMTIvMDAiKTsKICBtZW1zZXQoYnVmZmVyLCAnMCcsIHNpemVvZihidWZmZXIpKTsKICByZXQgPSBHZXRUaW1lRm9ybWF0QShsY2lkLCAwLCAmY3VydGltZSwgImgvSC9oaC9ISCIsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwogIGNtcCA9IHN0cm5jbXAoYnVmZmVyLCBFeHBlY3RlZCwgQlVGRkVSX1NJWkUpOwogIG9rIChjbXAgPT0gMCwgIkdldFRpbWVGb3JtYXQgZ290ICclcycgaW5zdGVhZCBvZiAnJXMnIiwgYnVmZmVyLCBFeHBlY3RlZCk7CiAgZXEgKHJldCwgbHN0cmxlbkEoRXhwZWN0ZWQpKzEsICJHZXRUaW1lRm9ybWF0IiwgIiVkIik7CgogIC8qIHRlc3QgZm9yIExPQ0FMRV9OT1VTRVJPVkVSUklERSBzZXQsIGxwRm9ybWF0IG11c3QgYmUgTlVMTCAqLwogIHN0cmNweShFeHBlY3RlZCwgIjA6NTozIEFNIik7CiAgbWVtc2V0KGJ1ZmZlciwgJzAnLCBzaXplb2YoYnVmZmVyKSk7CiAgcmV0ID0gR2V0VGltZUZvcm1hdEEobGNpZCwgTE9DQUxFX05PVVNFUk9WRVJSSURFLCAmY3VydGltZSwgImg6bTpzIHR0IiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CiAgLyogTk9URTogd2UgZXhwZWN0IHRoaXMgdG8gRkFJTCAqLwogIGNtcCA9IHN0cm5jbXAoYnVmZmVyLCBFeHBlY3RlZCwgQlVGRkVSX1NJWkUpOwogIG9rIChyZXQgPT0gMCwgIkdldFRpbWVGb3JtYXQgc3VjY2VlZGVkIGluc3RlYWQgb2YgZmFpbGluZyBmb3IgTE9DQUxFX05PVVNFUk9WRVJSSURFIGFuZCBhIG5vbi1udWxsIGxwRm9ybWF0XG4iKTsKCiAgLyogdHJ5IHRvIGNvbnZlcnQgZm9ybWF0dGluZyBzdHJpbmdzIHdpdGggbW9yZSB0aGFuIHR3byBsZXR0ZXJzICovCiAgLyogImg6aGg6aGhoOkg6SEg6SEhIOm06bW06bW1tOk06TU06TU1NOnM6c3M6c3NzOlM6U1M6U1NTIiAqLwogIC8qIE5PVEU6IHdlIGV4cGVjdCBhbnkgbGV0dGVyIGZvciB3aGljaCB0aGVyZSBpcyBhbiB1cHBlciBjYXNlIHZhbHVlICovCiAgLyogICAgd2Ugc2hvdWxkIGV4cGVjdCB0byBzZWUgYSByZXBsYWNlbWVudC4gIEZvciBsZXR0ZXJzIHRoYXQgRE8gTk9UICovCiAgLyogICAgaGF2ZSB1cHBlciBjYXNlIHZhbHVlcyB3ZSBleHBlY3QgdG8gc2VlIE5PIFJFUExBQ0VNRU5UICovCiAgY3VydGltZS53SG91ciA9IDg7ICBjdXJ0aW1lLndNaW51dGUgPSA1NjsKICBjdXJ0aW1lLndTZWNvbmQgPSAxMzsgY3VydGltZS53TWlsbGlzZWNvbmRzID0gMjI7CiAgc3RyY3B5KEV4cGVjdGVkLCAiODowODowOCA4OjA4OjA4IDU2OjU2OjU2IE06TU06TU1NIDEzOjEzOjEzIFM6U1M6U1NTIik7CiAgbWVtc2V0KGJ1ZmZlciwgJzAnLCBzaXplb2YoYnVmZmVyKSk7CiAgcmV0ID0gR2V0VGltZUZvcm1hdEEobGNpZCwgMCwgJmN1cnRpbWUsICJoOmhoOmhoaCBIOkhIOkhISCBtOm1tOm1tbSBNOk1NOk1NTSBzOnNzOnNzcyBTOlNTOlNTUyIsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwogIGNtcCA9IHN0cm5jbXAoYnVmZmVyLCBFeHBlY3RlZCwgQlVGRkVSX1NJWkUpOwogIG9rIChjbXAgPT0gMCwgIkdldFRpbWVGb3JtYXQgZ290ICclcycgaW5zdGVhZCBvZiAnJXMnIiwgYnVmZmVyLCBFeHBlY3RlZCk7CiAgZXEgKHJldCwgbHN0cmxlbkEoRXhwZWN0ZWQpKzEsICJHZXRUaW1lRm9ybWF0IiwgIiVkIik7CgogIC8qIHRlc3QgdGhhdCBpZiB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGlzIHplcm8gdGhhdCB0aGUgYnVmZmVyIGlzIG5vdCBtb2RpZmllZCAqLwogIC8qIGFuZCB0aGF0IHRoZSBudW1iZXIgb2YgbmVjZXNzYXJ5IGNoYXJhY3RlcnMgaXMgcmV0dXJuZWQgKi8KICAvKiBOT1RFOiBUaGUgY291bnQgaW5jbHVkZXMgdGhlIHRlcm1pbmF0aW5nIG51bGwuICovCiAgc3RyY3B5KGJ1ZmZlciwgIlRISVMgU0hPVUxEIE5PVCBCRSBNT0RJRklFRCIpOwogIHN0cmNweShFeHBlY3RlZCwgIlRISVMgU0hPVUxEIE5PVCBCRSBNT0RJRklFRCIpOwogIHJldCA9IEdldFRpbWVGb3JtYXRBKGxjaWQsIDAsICZjdXJ0aW1lLCAiaCIsIGJ1ZmZlciwgMCk7CiAgY21wID0gc3RybmNtcChidWZmZXIsIEV4cGVjdGVkLCBCVUZGRVJfU0laRSk7CiAgb2sgKGNtcCA9PSAwLCAiR2V0VGltZUZvcm1hdCBnb3QgJyVzJyBpbnN0ZWFkIG9mICclcyciLCBidWZmZXIsIEV4cGVjdGVkKTsKICBlcSAocmV0LCAyLCAiR2V0VGltZUZvcm1hdCIsICIlZCIpOyAvKiB3ZSBleHBlY3QgdG8gcmVxdWlyZSB0d28gY2hhcmFjdGVycyBvZiBzcGFjZSBmcm9tICJoIiAqLwoKICAvKiB0ZXN0IHRoYXQgY2hhcmFjdGVycyBpbiBzaW5nbGUgcXVvdGF0aW9uIG1hcmtzIGFyZSBpZ25vcmVkIGFuZCBsZWZ0IGluICovCiAgLyogdGhlIHNhbWUgbG9jYXRpb24gaW4gdGhlIG91dHB1dCBzdHJpbmcgKi8KICBzdHJjcHkoRXhwZWN0ZWQsICI4IGggOCBIIDA4IEhIIDU2IG0gMTMgcyBBIHQgQU0gdHQiKTsKICBtZW1zZXQoYnVmZmVyLCAnMCcsIHNpemVvZihidWZmZXIpKTsKICByZXQgPSBHZXRUaW1lRm9ybWF0QShsY2lkLCAwLCAmY3VydGltZSwgImggJ2gnIEggJ0gnIEhIICdISCcgbSAnbScgcyAncycgdCAndCcgdHQgJ3R0JyIsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwogIGNtcCA9IHN0cm5jbXAoYnVmZmVyLCBFeHBlY3RlZCwgQlVGRkVSX1NJWkUpOwogIG9rIChjbXAgPT0gMCwgIkdldFRpbWVGb3JtYXQgZ290ICclcycgaW5zdGVhZCBvZiAnJXMnIiwgYnVmZmVyLCBFeHBlY3RlZCk7CiAgZXEgKHJldCwgbHN0cmxlbkEoRXhwZWN0ZWQpKzEsICJHZXRUaW1lRm9ybWF0IiwgIiVkIik7CgogIC8qIHRlc3QgdGhlIHByaW50aW5nIG9mIHRoZSBzaW5nbGUgcXVvdGF0aW9uIG1hcmtzIHdoZW4gKi8KICAvKiB3ZSB1c2UgYW4gaW52YWxpZCBmb3JtYXR0aW5nIHN0cmluZyBvZiAiJycnIiBpbnN0ZWFkIG9mICInJycnIiAqLwogIHN0cmNweShFeHBlY3RlZCwgIiciKTsKICBtZW1zZXQoYnVmZmVyLCAnMCcsIHNpemVvZihidWZmZXIpKTsKICByZXQgPSBHZXRUaW1lRm9ybWF0QShsY2lkLCAwLCAmY3VydGltZSwgIicnJyIsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwogIGNtcCA9IHN0cm5jbXAoYnVmZmVyLCBFeHBlY3RlZCwgQlVGRkVSX1NJWkUpOwogIG9rIChjbXAgPT0gMCwgIkdldFRpbWVGb3JtYXQgZ290ICclcycgaW5zdGVhZCBvZiAnJXMnIiwgYnVmZmVyLCBFeHBlY3RlZCk7CiAgZXEgKHJldCwgbHN0cmxlbkEoRXhwZWN0ZWQpKzEsICJHZXRUaW1lRm9ybWF0IiwgIiVkIik7CgogIC8qIHRlc3QgdGhhdCBtc2RuIHN1Z2dlc3RlZCBzaW5nbGUgcXVvdGF0aW9uIHVzYWdlIHdvcmtzIGFzIGV4cGVjdGVkICovCiAgc3RyY3B5KEV4cGVjdGVkLCAiJyIpOwogIG1lbXNldChidWZmZXIsICcwJywgc2l6ZW9mKGJ1ZmZlcikpOwogIHJldCA9IEdldFRpbWVGb3JtYXRBKGxjaWQsIDAsICZjdXJ0aW1lLCAiJycnJyIsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwogIGNtcCA9IHN0cm5jbXAoYnVmZmVyLCBFeHBlY3RlZCwgQlVGRkVSX1NJWkUpOwogIG9rIChjbXAgPT0gMCwgIkdldFRpbWVGb3JtYXQgZ290ICclcycgaW5zdGVhZCBvZiAnJXMnIiwgYnVmZmVyLCBFeHBlY3RlZCk7CiAgZXEgKHJldCwgbHN0cmxlbkEoRXhwZWN0ZWQpKzEsICJHZXRUaW1lRm9ybWF0IiwgIiVkIik7CgogIC8qIHRlc3QgZm9yIG1vcmUgbm9ybWFsIHVzZSBvZiBzaW5nbGUgcXVvdGF0aW9uIG1hcmsgKi8KICBzdHJjcHkoRXhwZWN0ZWQsICIwOCIpOwogIG1lbXNldChidWZmZXIsICcwJywgc2l6ZW9mKGJ1ZmZlcikpOwogIHJldCA9IEdldFRpbWVGb3JtYXRBKGxjaWQsIDAsICZjdXJ0aW1lLCAiJydISEhISEgiLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKICBjbXAgPSBzdHJuY21wKGJ1ZmZlciwgRXhwZWN0ZWQsIEJVRkZFUl9TSVpFKTsKICBvayAoY21wID09IDAsICJHZXRUaW1lRm9ybWF0IGdvdCAnJXMnIGluc3RlYWQgb2YgJyVzJyIsIGJ1ZmZlciwgRXhwZWN0ZWQpOwogIGVxIChyZXQsIGxzdHJsZW5BKEV4cGVjdGVkKSsxLCAiR2V0VGltZUZvcm1hdCIsICIlZCIpOwoKICAvKiBhbmQgdGVzdCBmb3Igbm9ybWFsIHVzZSBvZiB0aGUgc2luZ2xlIHF1b3RhdGlvbiBtYXJrICovCiAgc3RyY3B5KEV4cGVjdGVkLCAiJ0hISEhISCIpOwogIG1lbXNldChidWZmZXIsICcwJywgc2l6ZW9mKGJ1ZmZlcikpOwogIHJldCA9IEdldFRpbWVGb3JtYXRBKGxjaWQsIDAsICZjdXJ0aW1lLCAiJycnSEhISEhIJyIsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwogIGNtcCA9IHN0cm5jbXAoYnVmZmVyLCBFeHBlY3RlZCwgQlVGRkVSX1NJWkUpOwogIG9rIChjbXAgPT0gMCwgIkdldFRpbWVGb3JtYXQgZ290ICclcycgaW5zdGVhZCBvZiAnJXMnIiwgYnVmZmVyLCBFeHBlY3RlZCk7CiAgZXEgKHJldCwgbHN0cmxlbkEoRXhwZWN0ZWQpKzEsICJHZXRUaW1lRm9ybWF0IiwgIiVkIik7CgogIC8qIHRlc3QgZm9yIG1vcmUgb2RkIHVzZSBvZiB0aGUgc2luZ2xlIHF1b3RhdGlvbiBtYXJrICovCiAgc3RyY3B5KEV4cGVjdGVkLCAiJ0hISEhISCIpOwogIG1lbXNldChidWZmZXIsICcwJywgc2l6ZW9mKGJ1ZmZlcikpOwogIHJldCA9IEdldFRpbWVGb3JtYXRBKGxjaWQsIDAsICZjdXJ0aW1lLCAiJycnSEhISEhIIiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CiAgY21wID0gc3RybmNtcChidWZmZXIsIEV4cGVjdGVkLCBCVUZGRVJfU0laRSk7CiAgb2sgKGNtcCA9PSAwLCAiR2V0VGltZUZvcm1hdCBnb3QgJyVzJyBpbnN0ZWFkIG9mICclcyciLCBidWZmZXIsIEV4cGVjdGVkKTsKICBlcSAocmV0LCBsc3RybGVuQShFeHBlY3RlZCkrMSwgIkdldFRpbWVGb3JtYXQiLCAiJWQiKTsKCiAgLyogdGVzdCB0aGF0IHdpdGggVElNRV9OT1RJTUVNQVJLRVIgdGhhdCBldmVuIGlmIHNvbWV0aGluZyBpcyBkZWZpbmVkICovCiAgLyogYXMgYSBsaXRlcmFsIHdlIGRyb3AgaXQgYmVmb3JlIGFuZCBhZnRlciB0aGUgbWFya2VycyB1bnRpbCB0aGUgbmV4dCAqLwogIC8qIGZvcm1hdHRpbmcgY2hhcmFjdGVyICovCiAgc3RyY3B5KEV4cGVjdGVkLCAiIik7CiAgbWVtc2V0KGJ1ZmZlciwgJzAnLCBzaXplb2YoYnVmZmVyKSk7CiAgcmV0ID0gR2V0VGltZUZvcm1hdEEobGNpZCwgVElNRV9OT1RJTUVNQVJLRVIsICZjdXJ0aW1lLCAiJzEyMyd0dCIsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwogIGNtcCA9IHN0cm5jbXAoYnVmZmVyLCBFeHBlY3RlZCwgQlVGRkVSX1NJWkUpOwogIG9rIChjbXAgPT0gMCwgIkdldFRpbWVGb3JtYXQgZ290ICclcycgaW5zdGVhZCBvZiAnJXMnIiwgYnVmZmVyLCBFeHBlY3RlZCk7CiAgZXEgKHJldCwgbHN0cmxlbkEoRXhwZWN0ZWQpKzEsICJHZXRUaW1lRm9ybWF0IiwgIiVkIik7CgogIC8qIHRlc3QgZm9yIGV4cGVjdGVkIHJldHVybiBhbmQgZXJyb3IgdmFsdWUgd2hlbiB3ZSBoYXZlIGEgKi8KICAvKiBub24tbnVsbCBmb3JtYXQgYW5kIExPQ0FMRV9OT1VTRVJPVkVSUklERSBmb3IgZmxhZ3MgKi8KICBTZXRMYXN0RXJyb3IoTk9fRVJST1IpOyAvKiByZXNldCBsYXN0IGVycm9yIHZhbHVlICovCiAgbWVtc2V0KGJ1ZmZlciwgJzAnLCBzaXplb2YoYnVmZmVyKSk7CiAgcmV0ID0gR2V0VGltZUZvcm1hdEEobGNpZCwgTE9DQUxFX05PVVNFUk9WRVJSSURFLCAmY3VydGltZSwgIicxMjMndHQiLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKICBlcnJvciA9IEdldExhc3RFcnJvcigpOwogIGNtcCA9IHN0cm5jbXAoYnVmZmVyLCBFeHBlY3RlZCwgQlVGRkVSX1NJWkUpOwogIG9rICgocmV0ID09IDApICYmIChlcnJvciA9PSBFUlJPUl9JTlZBTElEX0ZMQUdTKSwgIkdldFRpbWVGb3JtYXQgZ290IHJldCBvZiAnJWQnIGFuZCBlcnJvciBvZiAnJWQnIiwgcmV0LCBlcnJvcik7CgogIC8qIHRlc3QgdGhhdCBpbnZhbGlkIHRpbWUgdmFsdWVzIHJlc3VsdCBpbiBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiAqLwogIC8qIGFuZCBhIHJldHVybiB2YWx1ZSBvZiAwICovCiAgY3VydGltZS53SG91ciA9IDI1OwogIFNldExhc3RFcnJvcihOT19FUlJPUik7IC8qIHJlc2V0IGxhc3QgZXJyb3IgdmFsdWUgKi8KICBtZW1zZXQoYnVmZmVyLCAnMCcsIHNpemVvZihidWZmZXIpKTsKICByZXQgPSBHZXRUaW1lRm9ybWF0QShsY2lkLCAwLCAmY3VydGltZSwgIicxMjMndHQiLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKICBlcnJvciA9IEdldExhc3RFcnJvcigpOwogIGNtcCA9IHN0cm5jbXAoYnVmZmVyLCBFeHBlY3RlZCwgQlVGRkVSX1NJWkUpOwogIG9rICgocmV0ID09IDApICYmIChlcnJvciA9PSBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiksICJHZXRUaW1lRm9ybWF0IGdvdCByZXQgb2YgJyVkJyBhbmQgZXJyb3Igb2YgJyVkJyIsIHJldCwgZXJyb3IpOwoKICAvKiB0ZXN0IHRoYXQgaW52YWxpZCBpbmZvcm1hdGlvbiBpbiB0aGUgZGF0ZSBzZWN0aW9uIG9mIHRoZSBjdXJyZW50IHRpbWUgKi8KICAvKiBkb2Vzbid0IHJlc3VsdCBpbiBhbiBlcnJvciBzaW5jZSBHZXRUaW1lRm9ybWF0KCkgc2hvdWxkIGlnbm9yZSB0aGlzIGluZm9ybWF0aW9uICovCiAgY3VydGltZS53SG91ciA9IDEyOyAvKiB2YWxpZCB3SG91ciAqLwogIGN1cnRpbWUud01vbnRoID0gNjA7IC8qIHZlcnkgaW52YWxpZCB3TW9udGggKi8KICBzdHJjcHkoRXhwZWN0ZWQsICIxMjo1NjoxMyIpOwogIFNldExhc3RFcnJvcihOT19FUlJPUik7IC8qIHJlc2V0IGxhc3QgZXJyb3IgdmFsdWUgKi8KICByZXQgPSBHZXRUaW1lRm9ybWF0QShsY2lkLCAwLCAmY3VydGltZSwgImg6bTpzIiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CiAgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKICBjbXAgPSBzdHJuY21wKGJ1ZmZlciwgRXhwZWN0ZWQsIEJVRkZFUl9TSVpFKTsKICBvayAoKHJldCA9PSBsc3RybGVuQShFeHBlY3RlZCkrMSkgJiYgKGVycm9yID09IE5PX0VSUk9SKSwgIkdldFRpbWVGb3JtYXQgZ290IHJldCBvZiAnJWQnIGFuZCBlcnJvciBvZiAnJWQnIGFuZCBhIGJ1ZmZlciBvZiAnJXMnIiwgcmV0LCBlcnJvciwgYnVmZmVyKTsKfQoKdm9pZCBUZXN0R2V0RGF0ZUZvcm1hdEEoKQp7CiAgaW50IHJldCwgZXJyb3IsIGNtcDsKICBTWVNURU1USU1FICBjdXJ0aW1lOwogIGNoYXIgYnVmZmVyW0JVRkZFUl9TSVpFXSwgZm9ybWF0W0JVRkZFUl9TSVpFXSwgRXhwZWN0ZWRbQlVGRkVSX1NJWkVdOwogIExDSUQgbGNpZDsKCiAgbGNpZCA9IE1BS0VMQ0lEKE1BS0VMQU5HSUQoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfVVMpLCBTT1JUX0RFRkFVTFQgKTsKICBzdHJjcHkoZm9ybWF0LCAiZGRkJywnIE1NTSBkZCB5eSIpOwoKICAvKiB0ZXN0IGZvciBmYWlsdXJlIG9uIGR1bW15IGRhdGEgKi8KICBtZW1zZXQoJmN1cnRpbWUsIDIsIHNpemVvZihTWVNURU1USU1FKSk7CiAgbWVtc2V0KGJ1ZmZlciwgJzAnLCBzaXplb2YoYnVmZmVyKSk7CiAgU2V0TGFzdEVycm9yKE5PX0VSUk9SKTsKICByZXQgPSBHZXREYXRlRm9ybWF0QShsY2lkLCAwLCAmY3VydGltZSwgZm9ybWF0LCBidWZmZXIsIENPVU5UT0YoYnVmZmVyKSk7CiAgZXJyb3IgPSBHZXRMYXN0RXJyb3IgKCk7CiAgb2socmV0ID09IDAsICJHZXREYXRlRm9ybWF0IHNob3VsZCBmYWlsIG9uIGR1bW15IGRhdGEiKTsKICBlcShlcnJvciwgRVJST1JfSU5WQUxJRF9QQVJBTUVURVIsICJHZXREYXRlRm9ybWF0IiwgIiVkIik7CgogIC8qIHRlc3QgZm9yIGEgc2ltcGxlIGNhc2Ugb2YgZGF0ZSBjb252ZXJzaW9uICovCiAgc3RyY3B5KEV4cGVjdGVkLCAiU2F0LCBNYXkgMDQgMDIiKTsKICBjdXJ0aW1lLndZZWFyID0gMjAwMjsKICBjdXJ0aW1lLndNb250aCA9IDU7CiAgY3VydGltZS53RGF5ID0gNDsKICBjdXJ0aW1lLndEYXlPZldlZWsgPSAzOwogIG1lbXNldChidWZmZXIsIDAsIHNpemVvZihidWZmZXIpKTsKICByZXQgPSBHZXREYXRlRm9ybWF0QShsY2lkLCAwLCAmY3VydGltZSwgZm9ybWF0LCBidWZmZXIsIENPVU5UT0YoYnVmZmVyKSk7CiAgY21wID0gc3RybmNtcCAoRXhwZWN0ZWQsIGJ1ZmZlciwgc3RybGVuKEV4cGVjdGVkKSsxKTsKICBvayAoY21wID09IDAsICJHZXREYXRlRm9ybWF0IGdvdCAlcyBpbnN0ZWFkIG9mICVzIiwgYnVmZmVyLCBFeHBlY3RlZCk7CiAgZXEgKHJldCwgbHN0cmxlbkEoRXhwZWN0ZWQpKzEsICJHZXREYXRlRm9ybWF0IiwgIiVkIik7CgogIC8qIHRlc3QgZm9ybWF0IHdpdGggIiciICovCiAgc3RyY3B5KGZvcm1hdCwgImRkZCcsJyBNTU0gZGQgJycnJ3l5Iik7CiAgc3RyY3B5KEV4cGVjdGVkLCAiU2F0LCBNYXkgMDQgJzAyIik7CiAgbWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZW9mKGJ1ZmZlcikpOwogIHJldCA9IEdldERhdGVGb3JtYXRBKGxjaWQsIDAsICZjdXJ0aW1lLCBmb3JtYXQsIGJ1ZmZlciwgQ09VTlRPRihidWZmZXIpKTsKICBjbXAgPSBzdHJuY21wIChFeHBlY3RlZCwgYnVmZmVyLCBzdHJsZW4oRXhwZWN0ZWQpKzEpOwogIG9rIChjbXAgPT0gMCwgIkdldERhdGVGb3JtYXQgZ290ICVzIGluc3RlYWQgb2YgJXMiLCBidWZmZXIsIEV4cGVjdGVkKTsKICBlcSAocmV0LCBsc3RybGVuQShFeHBlY3RlZCkrMSwgIkdldERhdGVGb3JtYXQiLCAiJWQiKTsKCiAgLyogdGVzdCBmb3Igc3VjY2VzcyB3aXRoIGR1bW15IHRpbWUgZGF0YSAqLwogIGN1cnRpbWUud0hvdXIgPSAzNjsKICBtZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YoYnVmZmVyKSk7CiAgcmV0ID0gR2V0RGF0ZUZvcm1hdEEobGNpZCwgMCwgJmN1cnRpbWUsIGZvcm1hdCwgYnVmZmVyLCBDT1VOVE9GKGJ1ZmZlcikpOwogIGNtcCA9IHN0cm5jbXAgKEV4cGVjdGVkLCBidWZmZXIsIHN0cmxlbihFeHBlY3RlZCkrMSk7CiAgb2sgKGNtcCA9PSAwLCAiR2V0RGF0ZUZvcm1hdCBnb3QgJXMgaW5zdGVhZCBvZiAlcyIsIGJ1ZmZlciwgRXhwZWN0ZWQpOwogIGVxIChyZXQsIGxzdHJsZW5BKEV4cGVjdGVkKSsxLCAiR2V0RGF0ZUZvcm1hdCIsICIlZCIpOwoKICAvKiB0ZXN0IHRoYXQgd2UgcmV0cmlldmUgdGhlIGV4cGVjdGVkIHNpemUgZm9yIHRoZSBuZWNlc3Nhcnkgb3V0cHV0IG9mIHRoaXMgc3RyaW5nICovCiAgU2V0TGFzdEVycm9yKE5PX0VSUk9SKTsKICBtZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YoYnVmZmVyKSk7CiAgcmV0ID0gR2V0RGF0ZUZvcm1hdEEobGNpZCwgMCwgJmN1cnRpbWUsIGZvcm1hdCwgTlVMTCwgMCk7CiAgb2socmV0PT1sc3RybGVuQShFeHBlY3RlZCkrMSAmJiBHZXRMYXN0RXJyb3IoKSA9PSAwLAogICAgICAgICAgIkdldERhdGVGb3JtYXQobGVuPTApOiByZXQ9JWQgZXJyb3I9JWxkIGJ1ZmZlcj0nJXMnLCBleHBlY3RlZCBOT19FUlJPUigwKVxuIixyZXQsR2V0TGFzdEVycm9yKCksIGJ1ZmZlcik7CgogIC8qIHRlc3QgdGhhdCB0aGUgZXhwZWN0ZWQgc2l6ZSBtYXRjaGVzIHRoZSBhY3R1YWwgcmVxdWlyZWQgc2l6ZSBieSBwYXNzaW5nICovCiAgLyogaW4gdGhlIGV4cGVjdGVkIHNpemUgKi8KICBtZW1zZXQoYnVmZmVyLCAnMCcsIHNpemVvZihidWZmZXIpKTsKICByZXQgPSBHZXREYXRlRm9ybWF0QShsY2lkLCAwLCAmY3VydGltZSwgZm9ybWF0LCBidWZmZXIsIHJldCk7CiAgb2socmV0PT1sc3RybGVuQShFeHBlY3RlZCkrMSAmJiBHZXRMYXN0RXJyb3IoKT09MCwKICAgICAgICAgICAiR2V0RGF0ZUZvcm1hdChyaWdodCBzaXplKTogcmV0PSVkIGVycm9yPSVsZCwgYnVmZmVyID0gJyVzJ1xuIixyZXQsR2V0TGFzdEVycm9yKCksIGJ1ZmZlcik7CiAgb2soYnVmZmVyWzBdIT0neCcsIkdldERhdGVGb3JtYXQocmlnaHQgc2l6ZSk6IGJ1ZmZlcj1bJXNdXG4iLGJ1ZmZlcik7CgogIC8qIHRlc3QgdGhhdCBhIGJ1ZmZlciBzaG9ydGVyIHRoYW4gdGhlIG5lY2Vzc2FyeSBzaXplIHJlc3VsdHMgaW4gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUiAqLwogIHJldCA9IEdldERhdGVGb3JtYXRBKGxjaWQsIDAsICZjdXJ0aW1lLCBmb3JtYXQsIGJ1ZmZlciwgMik7CiAgb2socmV0PT0wICYmIEdldExhc3RFcnJvcigpPT1FUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSLAogICAgICAgICAgICJHZXREYXRlRm9ybWF0KGxlbj0yKTogcmV0PSVkIGVycm9yPSVsZCIsIHJldCwgR2V0TGFzdEVycm9yKCkpOwoKICAvKiB0ZXN0IGZvciBkZWZhdWx0IGJlaGF2aW9yIGJlaW5nIERBVEVfU0hPUlREQVRFICovCiAgdG9kb193aW5lIHsKICAgIHN0cmNweShFeHBlY3RlZCwgIjUvNC8wMiIpOwogICAgbWVtc2V0KGJ1ZmZlciwgJzAnLCBzaXplb2YoYnVmZmVyKSk7CiAgICByZXQgPSBHZXREYXRlRm9ybWF0KGxjaWQsIDAsICZjdXJ0aW1lLCBOVUxMLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKICAgIGNtcCA9IHN0cm5jbXAgKEV4cGVjdGVkLCBidWZmZXIsIHN0cmxlbihFeHBlY3RlZCkrMSk7CiAgICBvayAoY21wID09IDAsICJHZXREYXRlRm9ybWF0IGdvdCAnJXMnIGluc3RlYWQgb2YgJyVzJyIsIGJ1ZmZlciwgRXhwZWN0ZWQpOwogICAgZXEgKHJldCwgbHN0cmxlbkEoRXhwZWN0ZWQpKzEsICJHZXREYXRlRm9ybWF0IiwgIiVkIik7CiAgfQoKCiAgLyogdGVzdCBmb3IgZXhwZWN0ZWQgREFURV9MT05HREFURSBiZWhhdmlvciB3aXRoIG51bGwgZm9ybWF0ICovCiAgc3RyY3B5KEV4cGVjdGVkLCAiU2F0dXJkYXksIE1heSAwNCwgMjAwMiIpOwogIG1lbXNldChidWZmZXIsICcwJywgc2l6ZW9mKGJ1ZmZlcikpOwogIHJldCA9IEdldERhdGVGb3JtYXQobGNpZCwgREFURV9MT05HREFURSwgJmN1cnRpbWUsIE5VTEwsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwogIGNtcCA9IHN0cm5jbXAgKEV4cGVjdGVkLCBidWZmZXIsIHN0cmxlbihFeHBlY3RlZCkrMSk7CiAgb2sgKGNtcCA9PSAwLCAiR2V0RGF0ZUZvcm1hdCBnb3QgJyVzJyBpbnN0ZWFkIG9mICclcyciLCBidWZmZXIsIEV4cGVjdGVkKTsKICBlcSAocmV0LCBsc3RybGVuQShFeHBlY3RlZCkrMSwgIkdldERhdGVGb3JtYXQiLCAiJWQiKTsKCiAgLyogdGVzdCBmb3IgZXhwZWN0ZWQgREFURV9ZRUFSTU9OVEggYmVoYXZpb3Igd2l0aCBudWxsIGZvcm1hdCAqLwogIC8qIE5UNCByZXR1cm5zIEVSUk9SX0lOVkFMSURfRkxBR1MgZm9yIERBVEVfWUVBUk1PTlRIICovCiAgdG9kb193aW5lIHsKICAgIHN0cmNweShFeHBlY3RlZCwgIiIpOwogICAgYnVmZmVyWzBdID0gMDsKICAgIFNldExhc3RFcnJvcihOT19FUlJPUik7CiAgICBtZW1zZXQoYnVmZmVyLCAnMCcsIHNpemVvZihidWZmZXIpKTsKICAgIHJldCA9IEdldERhdGVGb3JtYXQobGNpZCwgREFURV9ZRUFSTU9OVEgsICZjdXJ0aW1lLCBOVUxMLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKICAgIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CiAgICBjbXAgPSBzdHJuY21wIChFeHBlY3RlZCwgYnVmZmVyLCBzdHJsZW4oRXhwZWN0ZWQpKzEpOwogICAgb2sgKHJldCA9PSAwICYmIChlcnJvciA9PSBFUlJPUl9JTlZBTElEX0ZMQUdTKSwgIkdldERhdGVGb3JtYXQgY2hlY2sgREFURV9ZRUFSTU9OVEggd2l0aCBudWxsIGZvcm1hdCBleHBlY3RlZCBFUlJPUl9JTlZBTElEX0ZMQUdTIGdvdCByZXR1cm4gb2YgJyVkJyBhbmQgZXJyb3Igb2YgJyVkJyIsIHJldCwgZXJyb3IpOwogIH0KCiAgLyogVGVzdCB0aGF0IHVzaW5nIGludmFsaWQgREFURV8qIGZsYWdzIHJlc3VsdHMgaW4gdGhlIGNvcnJlY3QgZXJyb3IgKi8KICAvKiBhbmQgcmV0dXJuIHZhbHVlcyAqLwogIHN0cmNweShmb3JtYXQsICJtL2QveSIpOwogIHN0cmNweShFeHBlY3RlZCwgIlNhdHVyZGF5IE1heSAyMDAyIik7CiAgU2V0TGFzdEVycm9yKE5PX0VSUk9SKTsKICBtZW1zZXQoYnVmZmVyLCAnMCcsIHNpemVvZihidWZmZXIpKTsKICByZXQgPSBHZXREYXRlRm9ybWF0KGxjaWQsIERBVEVfWUVBUk1PTlRIIHwgREFURV9TSE9SVERBVEUgfCBEQVRFX0xPTkdEQVRFLCAmY3VydGltZSwgZm9ybWF0LCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKICBlcnJvciA9IEdldExhc3RFcnJvcigpOwogIGNtcCA9IHN0cm5jbXAgKEV4cGVjdGVkLCBidWZmZXIsIHN0cmxlbihFeHBlY3RlZCkrMSk7CiAgb2sgKChyZXQgPT0gMCkgJiYgKGVycm9yID09IEVSUk9SX0lOVkFMSURfRkxBR1MpLCAiR2V0RGF0ZUZvcm1hdCBjaGVja2luZyBmb3IgbXV0dWFsbHkgZXhjbHVzaXZlIGZsYWdzIGdvdCAnJXMnIGluc3RlYWQgb2YgJyVzJywgZ290IGVycm9yIG9mICVkLCBleHBlY3RlZCBFUlJPUl9JTlZBTElEX0ZMQUdTIiwgYnVmZmVyLCBFeHBlY3RlZCwgZXJyb3IpOwp9Cgp2b2lkIFRlc3RHZXREYXRlRm9ybWF0VygpCnsKICAgIGludCByZXQsIGVycm9yLCBjbXA7CiAgICBTWVNURU1USU1FICBjdXJ0aW1lOwogICAgV0NIQVIgYnVmZmVyW0JVRkZFUl9TSVpFXSwgZm9ybWF0W0JVRkZFUl9TSVpFXSwgRXhwZWN0ZWRbQlVGRkVSX1NJWkVdOwogICAgTENJRCBsY2lkOwoKICAgIGxjaWQgPSBNQUtFTENJRChNQUtFTEFOR0lEKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1VTKSwgU09SVF9ERUZBVUxUICk7CgogICAgLyogMS4gRXJyb3IgY2FzZXMgKi8KCiAgICAvKiAxYSBJZiBmbGFncyBpcyBub3QgemVybyB0aGVuIGZvcm1hdCBtdXN0IGJlIG51bGwuICovCiAgICByZXQgPSBHZXREYXRlRm9ybWF0VyAoTE9DQUxFX1NZU1RFTV9ERUZBVUxULCBEQVRFX0xPTkdEQVRFLCBOVUxMLCBmb3JtYXQsIGJ1ZmZlciwgQ09VTlRPRihidWZmZXIpKTsKICAgIGlmIChyZXQ9PTAgJiYgR2V0TGFzdEVycm9yKCk9PUVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKQogICAgICAgIHJldHVybjsKICAgIGVycm9yID0gcmV0ID8gMCA6IEdldExhc3RFcnJvcigpOwogICAgb2sgKHJldCA9PSAwICYmIGVycm9yID09IEVSUk9SX0lOVkFMSURfRkxBR1MsICJHZXREYXRlRm9ybWF0VyBhbGxvd2VkIGZsYWdzIGFuZCBmb3JtYXQiKTsKCiAgICAvKiAxYiBUaGUgYnVmZmVyIGNhbiBvbmx5IGJlIG51bGwgaWYgdGhlIGNvdW50IGlzIHplcm8gKi8KICAgIC8qIEZvciB0aGUgcmVjb3JkIG90aGVyIGJhZCBwb2ludGVycyByZXN1bHQgaW4gYSBwYWdlIGZhdWx0IChXaW45OCkgKi8KICAgIHJldCA9IEdldERhdGVGb3JtYXRXIChsY2lkLCAwLCBOVUxMLCBmb3JtYXQsIE5VTEwsIENPVU5UT0YoYnVmZmVyKSk7CiAgICBlcnJvciA9IHJldCA/IDAgOiBHZXRMYXN0RXJyb3IoKTsKICAgIG9rIChyZXQgPT0gMCAmJiBlcnJvciA9PSBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiwgIkdldERhdGVGb3JtYXRXIGRpZCBub3QgZGV0ZWN0IG51bGwgYnVmZmVyIHBvaW50ZXIuIik7CiAgICByZXQgPSBHZXREYXRlRm9ybWF0VyAobGNpZCwgMCwgTlVMTCwgZm9ybWF0LCBOVUxMLCAwKTsKICAgIGVycm9yID0gcmV0ID8gMCA6IEdldExhc3RFcnJvcigpOwogICAgb2sgKHJldCAhPSAwICYmIGVycm9yID09IDAsICJHZXREYXRlRm9ybWF0VyBkaWQgbm90IHBlcm1pdCBudWxsIGJ1ZmZlciBwb2ludGVyIHdoZW4gY291bnRpbmcuIik7CgogICAgLyogMWMgQW4gaW5jb3JyZWN0IGRheSBvZiB3ZWVrIGlzIGNvcnJlY3RlZC4gKi8KICAgIC8qIDFkIFRoZSBpbmNvcnJlY3QgZGF5IG9mIHdlZWsgY2FuIGV2ZW4gYmUgb3V0IG9mIHJhbmdlLiAqLwogICAgLyogMWUgVGhlIHRpbWUgZG9lc24ndCBtYXR0ZXIgKi8KICAgIGN1cnRpbWUud1llYXIgPSAyMDAyOwogICAgY3VydGltZS53TW9udGggPSAxMDsKICAgIGN1cnRpbWUud0RheSA9IDIzOwogICAgY3VydGltZS53RGF5T2ZXZWVrID0gNDU2MTI7IC8qIHNob3VsZCBiZSAzIC0gV2VkbmVzZGF5ICovCiAgICBjdXJ0aW1lLndIb3VyID0gNjU0MzI7CiAgICBjdXJ0aW1lLndNaW51dGUgPSAzNDUxMjsKICAgIGN1cnRpbWUud1NlY29uZCA9IDY1NTM1OwogICAgY3VydGltZS53TWlsbGlzZWNvbmRzID0gMTIzNDU7CiAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyIChDUF9BQ1AsIDAsICJkZGRkIGQgTU1NTSB5eXl5IiwgLTEsIGZvcm1hdCwgQ09VTlRPRihmb3JtYXQpKTsKICAgIHJldCA9IEdldERhdGVGb3JtYXRXIChsY2lkLCAwLCAmY3VydGltZSwgZm9ybWF0LCBidWZmZXIsIENPVU5UT0YoYnVmZmVyKSk7CiAgICBlcnJvciA9IHJldCA/IDAgOiBHZXRMYXN0RXJyb3IoKTsKICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIgKENQX0FDUCwgMCwgIldlZG5lc2RheSAyMyBPY3RvYmVyIDIwMDIiLCAtMSwgRXhwZWN0ZWQsIENPVU5UT0YoRXhwZWN0ZWQpKTsKICAgIGNtcCA9IHJldCA/IGxzdHJjbXBXIChidWZmZXIsIEV4cGVjdGVkKSA6IDI7CiAgICBvayAocmV0ID09IGxzdHJsZW5XKEV4cGVjdGVkKSsxICYmIGVycm9yID09IDAgJiYgY21wID09IDAsICJEYXkgb2Ygd2VlayBjb3JyZWN0aW9uIGZhaWxlZFxuIik7Cn0KCgp2b2lkIFRlc3RHZXRDdXJyZW5jeUZvcm1hdCgpCnsKaW50IHJldCwgZXJyb3IsIGNtcDsKY2hhciBidWZmZXJbQlVGRkVSX1NJWkVdLCBFeHBlY3RlZFtCVUZGRVJfU0laRV0sIGZvcm1hdFtCVUZGRVJfU0laRV07CkxDSUQgbGNpZDsKCglsY2lkID0gTUFLRUxDSUQoTUFLRUxBTkdJRChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUyksIFNPUlRfREVGQVVMVCApOwojaWYgMAoJbGNpZCA9IE1BS0VMQ0lEKE1BS0VMQU5HSUQoTEFOR19GUkVOQ0gsIFNVQkxBTkdfREVGQVVMVCksIFNPUlRfREVGQVVMVCApOwojZW5kaWYKCgltZW1zZXQoIGJ1ZmZlciwgJ3gnLCBzaXplb2YoYnVmZmVyKSApOwoJcmV0ID0gR2V0Q3VycmVuY3lGb3JtYXRBKGxjaWQsIDAsICIyMyw2NSIsIE5VTEwsIGJ1ZmZlciwgQ09VTlRPRihidWZmZXIpKTsKCWVycm9yID0gR2V0TGFzdEVycm9yICgpOwoJY21wID0gc3RybmNtcCAoInh4eHgiLCBidWZmZXIsIDQpOwoKCW9rIChjbXAgPT0gMCwgIkdldEN1cnJlbmN5Rm9ybWF0IHNob3VsZCBmYWlsIHdpdGggJywnIik7CgllcSAocmV0LCAwLCAiR2V0Q3VycmVuY3lGb3JtYXQgd2l0aCAnLCciLCAiJWQiKTsKCWVxIChlcnJvciwgRVJST1JfSU5WQUxJRF9QQVJBTUVURVIsICJHZXRDdXJyZW5jeUZvcm1hdCIsICIlZCIpOwoKCS8qIFdlIGNoZWNrIHRoZSB3aG9sZSBidWZmZXIgd2l0aCBzdHJuY21wICovCglzdHJjcHkgKEV4cGVjdGVkLCAiJDIzLjUzIik7CglzdHJjcHkgKGZvcm1hdCwgIjIzLjUzIik7CgltZW1zZXQoIGJ1ZmZlciwgJ3gnLCBzaXplb2YoYnVmZmVyKSApOwoJcmV0ID0gR2V0Q3VycmVuY3lGb3JtYXRBKGxjaWQsIDAsIGZvcm1hdCwgTlVMTCwgYnVmZmVyLCBDT1VOVE9GKGJ1ZmZlcikpOwoJY21wID0gc3RybmNtcCAoRXhwZWN0ZWQsIGJ1ZmZlciwgQlVGRkVSX1NJWkUpOwoJb2sgKGNtcCA9PSAwLCAiR2V0Q3VycmVuY3lGb3JtYXRBIGdvdCAlcyBpbnN0ZWFkIG9mICVzIiwgYnVmZmVyLCBFeHBlY3RlZCk7CgllcSAocmV0LCBsc3RybGVuQShFeHBlY3RlZCkrMSwgIkdldEN1cnJlbmN5Rm9ybWF0QSIsIiVkIik7CgogICAgICAgIC8qIFRlc3QgdG9vIHNtYWxsIGJ1ZmZlcnMgKi8KICAgICAgICBTZXRMYXN0RXJyb3IoMCk7CglyZXQgPSBHZXRDdXJyZW5jeUZvcm1hdEEobGNpZCwgMCwgZm9ybWF0LCBOVUxMLCBOVUxMLCAwKTsKCW9rKHJldD09bHN0cmxlbkEoRXhwZWN0ZWQpKzEgJiYgR2V0TGFzdEVycm9yKCk9PTAsCiAgICAgICAiR2V0Q3VycmVuY3lGb3JtYXRBKHNpemU9MCk6IHJldD0lZCBlcnJvcj0lbGQiLCByZXQsIEdldExhc3RFcnJvcigpKTsKCgltZW1zZXQoIGJ1ZmZlciwgJ3gnLCBzaXplb2YoYnVmZmVyKSApOwoJcmV0ID0gR2V0Q3VycmVuY3lGb3JtYXRBKGxjaWQsIDAsIGZvcm1hdCwgTlVMTCwgYnVmZmVyLCByZXQpOwoJb2soc3RyY21wKGJ1ZmZlcixFeHBlY3RlZCk9PTAsCiAgICAgICAgICAgIkdldEN1cnJlbmN5Rm9ybWF0QShyaWdodCBzaXplKTogZ290IFslc10gaW5zdGVhZCBvZiBbJXNdIiwgYnVmZmVyLCBFeHBlY3RlZCk7CgllcSAocmV0LCBsc3RybGVuQShFeHBlY3RlZCkrMSwgIkdldEN1cnJlbmN5Rm9ybWF0QShyaWdodCBzaXplKSIsICIlZCIpOwoKCXJldCA9IEdldEN1cnJlbmN5Rm9ybWF0QShsY2lkLCAwLCBmb3JtYXQsIE5VTEwsIGJ1ZmZlciwgMik7CglvayhyZXQ9PTAgJiYgR2V0TGFzdEVycm9yKCk9PUVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIsCiAgICAgICAgICAgIkdldEN1cnJlbmN5Rm9ybWF0QShzaXplPTIpOiByZXQ9JWQgZXJyb3I9JWxkIiwgcmV0LCBHZXRMYXN0RXJyb3IoKSk7Cn0KCgp2b2lkIFRlc3RHZXROdW1iZXJGb3JtYXQoKQp7CmludCByZXQsIGVycm9yLCBjbXA7CmNoYXIgYnVmZmVyW0JVRkZFUl9TSVpFXSwgRXhwZWN0ZWRbQlVGRkVSX1NJWkVdLCBpbnB1dFtCVUZGRVJfU0laRV07CkxDSUQgbGNpZDsKTlVNQkVSRk1UQSBmb3JtYXQ7CgoJbGNpZCA9IE1BS0VMQ0lEKE1BS0VMQU5HSUQoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfVVMpLCBTT1JUX0RFRkFVTFQgKTsKCgltZW1zZXQoIGJ1ZmZlciwgJ3gnLCBzaXplb2YoYnVmZmVyKSApOwoJcmV0ID0gR2V0TnVtYmVyRm9ybWF0QShsY2lkLCAwLCAiMjMsNjUiLCBOVUxMLCBidWZmZXIsIENPVU5UT0YoYnVmZmVyKSk7CgllcnJvciA9IEdldExhc3RFcnJvciAoKTsKCWNtcCA9IHN0cm5jbXAgKCJ4eHgiLCBidWZmZXIsIDMpOwoJb2sgKGNtcCA9PSAwLCAiR2V0TnVtYmVyRm9ybWF0Iik7CglvayAocmV0ID09IDAsICJHZXROdW1iZXJGb3JtYXQgc2hvdWxkIHJldHVybiAwIik7CgllcSAoZXJyb3IsIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSLCAiR2V0TnVtYmVyRm9ybWF0IiwgIiVkIik7CgoJc3RyY3B5KGlucHV0LCAiMjM1MyIpOwoJc3RyY3B5KEV4cGVjdGVkLCAiMiwzNTMuMDAiKTsKICAgICAgICBTZXRMYXN0RXJyb3IoMCk7CglyZXQgPSBHZXROdW1iZXJGb3JtYXRBKGxjaWQsIDAsIGlucHV0LCBOVUxMLCBOVUxMLCAwKTsKCW9rKHJldD09bHN0cmxlbkEoRXhwZWN0ZWQpKzEgJiYgR2V0TGFzdEVycm9yKCk9PTAsCiAgICAgICAiR2V0TnVtYmVyRm9ybWF0QShzaXplPTApOiByZXQ9JWQgZXJyb3I9JWxkIiwgcmV0LCBHZXRMYXN0RXJyb3IoKSk7CgogICAgICAgIG1lbXNldCggYnVmZmVyLCAneCcsIHNpemVvZihidWZmZXIpICk7CglyZXQgPSBHZXROdW1iZXJGb3JtYXRBKGxjaWQsIDAsIGlucHV0LCBOVUxMLCBidWZmZXIsIHJldCk7CglvayhzdHJjbXAoYnVmZmVyLEV4cGVjdGVkKT09MCwKICAgICAgICAgICAiR2V0TnVtYmVyRm9ybWF0QShyaWdodCBzaXplKTogZ290IFslc10gaW5zdGVhZCBvZiBbJXNdIiwgYnVmZmVyLCBFeHBlY3RlZCk7CgllcShyZXQsIGxzdHJsZW5BKEV4cGVjdGVkKSsxLCAiR2V0TnVtYmVyRm9ybWF0IiwgIiVkIik7CgoJcmV0ID0gR2V0TnVtYmVyRm9ybWF0QShsY2lkLCAwLCBpbnB1dCwgTlVMTCwgYnVmZmVyLCAyKTsKCW9rKHJldD09MCAmJiBHZXRMYXN0RXJyb3IoKT09RVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUiwKICAgICAgICAgICAiR2V0TnVtYmVyRm9ybWF0QShzaXplPTIpOiByZXQ9JWQgZXJyb3I9JWxkIiwgcmV0LCBHZXRMYXN0RXJyb3IoKSk7CgoJLyogV2UgY2hlY2sgdGhlIHdob2xlIGJ1ZmZlciB3aXRoIHN0cm5jbXAgKi8KCW1lbXNldChFeHBlY3RlZCwgJ3gnLCBzaXplb2YoRXhwZWN0ZWQpICk7CglzdHJjcHkoRXhwZWN0ZWQsICIyLDM1My4wMCIpOwoJbWVtc2V0KCBidWZmZXIsICd4Jywgc2l6ZW9mKGJ1ZmZlcikgKTsKCXJldCA9IEdldE51bWJlckZvcm1hdEEobGNpZCwgMCwgaW5wdXQsIE5VTEwsIGJ1ZmZlciwgQ09VTlRPRihidWZmZXIpKTsKCWNtcCA9IHN0cm5jbXAgKEV4cGVjdGVkLCBidWZmZXIsIEJVRkZFUl9TSVpFKTsKCW9rIChjbXAgPT0gMCwgIkdldE51bWJlckZvcm1hdCBnb3QgJXMgaW5zdGVhZCBvZiAlcyIsIGJ1ZmZlciwgRXhwZWN0ZWQpOwoJZXEgKHJldCwgbHN0cmxlbkEoRXhwZWN0ZWQpKzEsICJHZXROdW1iZXJGb3JtYXQiLCAiJWQiKTsKCiAgICAgICAgLyogSWYgdGhlIG51bWJlciBvZiBkZWNpbWFscyBpcyB6ZXJvIHRoZXJlIHNob3VsZCBiZSBubyBkZWNpbWFsCiAgICAgICAgICogc2VwYXJhdG9yLgogICAgICAgICAqIElmIHRoZSBncm91cGluZyBzaXplIGlzIHplcm8gdGhlcmUgc2hvdWxkIGJlIG5vIGdyb3VwaW5nIHN5bWJvbAogICAgICAgICAqLwogICAgICAgIGZvcm1hdC5OdW1EaWdpdHMgPSAwOwogICAgICAgIGZvcm1hdC5MZWFkaW5nWmVybyA9IDA7CiAgICAgICAgZm9ybWF0Lkdyb3VwaW5nID0gMDsKICAgICAgICBmb3JtYXQuTmVnYXRpdmVPcmRlciA9IDA7CiAgICAgICAgZm9ybWF0LmxwRGVjaW1hbFNlcCA9ICIuIjsKICAgICAgICBmb3JtYXQubHBUaG91c2FuZFNlcCA9ICIsIjsKICAgICAgICBzdHJjcHkgKEV4cGVjdGVkLCAiMTIzNDU2Nzg5Iik7CgltZW1zZXQoIGJ1ZmZlciwgJ3gnLCBzaXplb2YoYnVmZmVyKSApOwogICAgICAgIHJldCA9IEdldE51bWJlckZvcm1hdEEgKDAsIDAsICIxMjM0NTY3ODkuMCIsICZmb3JtYXQsIGJ1ZmZlciwgQ09VTlRPRihidWZmZXIpKTsKICAgICAgICBjbXAgPSBzdHJuY21wIChFeHBlY3RlZCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CglvayAoY21wID09IDAsICJHZXROdW1iZXJGb3JtYXQgZ290ICVzIGluc3RlYWQgb2YgJXMiLCBidWZmZXIsIEV4cGVjdGVkKTsKCn0KCgovKiBDYWxsYmFjayBmdW5jdGlvbiB1c2VkIGJ5IFRlc3RFbnVtVGltZUZvcm1hdHMgKi8KQk9PTCBDQUxMQkFDSyBFbnVtVGltZUZvcm1hdHNQcm9jKGNoYXIgKiBscFRpbWVGb3JtYXRTdHJpbmcpCnsKCXRyYWNlKCIlc1xuIiwgbHBUaW1lRm9ybWF0U3RyaW5nKTsKCXN0cmNweShHbG9iYWxCdWZmZXIsIGxwVGltZUZvcm1hdFN0cmluZyk7CiNpZiAwCglyZXR1cm4gVFJVRTsKI2VuZGlmCglyZXR1cm4gRkFMU0U7Cn0KCnZvaWQgVGVzdEVudW1UaW1lRm9ybWF0cygpCnsKaW50IHJldDsKTENJRCBsY2lkOwpjaGFyIEV4cGVjdGVkW0JVRkZFUl9TSVpFXTsKCglsY2lkID0gTUFLRUxDSUQoTUFLRUxBTkdJRChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUyksIFNPUlRfREVGQVVMVCApOwoJbWVtc2V0KCBHbG9iYWxCdWZmZXIsICd4Jywgc2l6ZW9mKEdsb2JhbEJ1ZmZlcikgKTsKCXN0cmNweShFeHBlY3RlZCwgImg6bW06c3MgdHQiKTsKCXJldCA9IEVudW1UaW1lRm9ybWF0c0EoRW51bVRpbWVGb3JtYXRzUHJvYywgbGNpZCwgMCk7CgoJZXEgKHJldCwgMSwgIkVudW1UaW1lRm9ybWF0cyBzaG91bGQgcmV0dXJuIDEiLCAiJWQiKTsKCW9rIChzdHJuY21wIChHbG9iYWxCdWZmZXIsIEV4cGVjdGVkLCBzdHJsZW4oRXhwZWN0ZWQpKSA9PSAwLAoJCQkJIkVudW1UaW1lRm9ybWF0cyBmYWlsZWQiKTsKCW9rIChyZXQgPT0gMSwgIkVudW1UaW1lRm9ybWF0cyBzaG91bGQgcmV0dXJuIDEiKTsKfQoKCnZvaWQgVGVzdENvbXBhcmVTdHJpbmdBKCkKewppbnQgcmV0OwpMQ0lEIGxjaWQ7CmNoYXIgYnVmZmVyMVtCVUZGRVJfU0laRV0sIGJ1ZmZlcjJbQlVGRkVSX1NJWkVdOwoKCWxjaWQgPSBNQUtFTENJRChNQUtFTEFOR0lEKExBTkdfRlJFTkNILCBTVUJMQU5HX0RFRkFVTFQpLCBTT1JUX0RFRkFVTFQgKTsKCglzdHJjcHkoYnVmZmVyMSwgIlNhbHV0Iik7IHN0cmNweShidWZmZXIyLCAiU2FsdXRlIik7CglyZXQgPSBDb21wYXJlU3RyaW5nQShsY2lkLCBOT1JNX0lHTk9SRUNBU0UsIGJ1ZmZlcjEsIC0xLCBidWZmZXIyLCAtMSk7CglvayAocmV0PT0gMSwgIkNvbXBhcmVTdHJpbmdBIChzdDE9JXMgc3RyMj0lcykgZXhwZWN0ZWQgcmVzdWx0PTEiLCBidWZmZXIxLCBidWZmZXIyKTsKCglzdHJjcHkoYnVmZmVyMSwgIlNhbHV0Iik7IHN0cmNweShidWZmZXIyLCAic2FMdVQiKTsKCXJldCA9IENvbXBhcmVTdHJpbmdBKGxjaWQsIE5PUk1fSUdOT1JFQ0FTRSwgYnVmZmVyMSwgLTEsIGJ1ZmZlcjIsIC0xKTsKCW9rIChyZXQ9PSAyLCAiQ29tcGFyZVN0cmluZ0EgKHN0MT0lcyBzdHIyPSVzKSBleHBlY3RlZCByZXN1bHQ9MiIsIGJ1ZmZlcjEsIGJ1ZmZlcjIpOwoKCXN0cmNweShidWZmZXIxLCAiU2FsdXQiKTsgc3RyY3B5KGJ1ZmZlcjIsICJob2xhIik7CglyZXQgPSBDb21wYXJlU3RyaW5nQShsY2lkLCBOT1JNX0lHTk9SRUNBU0UsIGJ1ZmZlcjEsIC0xLCBidWZmZXIyLCAtMSk7CglvayAocmV0PT0gMywgIkNvbXBhcmVTdHJpbmdBIChzdDE9JXMgc3RyMj0lcykgZXhwZWN0ZWQgcmVzdWx0PTMiLCBidWZmZXIxLCBidWZmZXIyKTsKCglzdHJjcHkoYnVmZmVyMSwgImjpaOkiKTsgc3RyY3B5KGJ1ZmZlcjIsICJo6GjoIik7CglyZXQgPSBDb21wYXJlU3RyaW5nQShsY2lkLCBOT1JNX0lHTk9SRUNBU0UsIGJ1ZmZlcjEsIC0xLCBidWZmZXIyLCAtMSk7CglvayAocmV0PT0gMSwgIkNvbXBhcmVTdHJpbmdBIChzdDE9JXMgc3RyMj0lcykgZXhwZWN0ZWQgcmVzdWx0PTEiLCBidWZmZXIxLCBidWZmZXIyKTsKCglsY2lkID0gTUFLRUxDSUQoTUFLRUxBTkdJRChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUyksIFNPUlRfREVGQVVMVCApOwoKCXN0cmNweShidWZmZXIxLCAiaOlo6SIpOyBzdHJjcHkoYnVmZmVyMiwgImjoaOgiKTsKCXJldCA9IENvbXBhcmVTdHJpbmdBKGxjaWQsIE5PUk1fSUdOT1JFQ0FTRSwgYnVmZmVyMSwgLTEsIGJ1ZmZlcjIsIC0xKTsKCW9rIChyZXQ9PSAxLCAiQ29tcGFyZVN0cmluZ0EgKHN0MT0lcyBzdHIyPSVzKSBleHBlY3RlZCByZXN1bHQ9MSIsIGJ1ZmZlcjEsIGJ1ZmZlcjIpOwoKCXJldCA9IENvbXBhcmVTdHJpbmdBKGxjaWQsIE5PUk1fSUdOT1JFQ0FTRSwgYnVmZmVyMSwgLTEsIGJ1ZmZlcjIsIDApOwoJb2sgKHJldD09IDMsICJDb21wYXJlU3RyaW5nQSAoc3QxPSVzIHN0cjI9JXMpIGV4cGVjdGVkIHJlc3VsdD0zIiwgYnVmZmVyMSwgYnVmZmVyMik7Cn0KCgpTVEFSVF9URVNUKGxvY2FsZSkKewojaWYgMAoJVGVzdEVudW1UaW1lRm9ybWF0cygpOwojZW5kaWYKCVRlc3RHZXRMb2NhbGVJbmZvQSgpOwoJVGVzdEdldFRpbWVGb3JtYXRBKCk7CglUZXN0R2V0RGF0ZUZvcm1hdEEoKTsKCVRlc3RHZXREYXRlRm9ybWF0VygpOwoJVGVzdEdldE51bWJlckZvcm1hdCgpOwoJVGVzdEdldEN1cnJlbmN5Rm9ybWF0KCk7CglUZXN0Q29tcGFyZVN0cmluZ0EoKTsKfQo=