I3ByYWdtYSBzdHJpY3RfdHlwZXMKCiNpbmNsdWRlIDxtb3ZpbmcuaD4KI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KI2luY2x1ZGUgPGxhbmd1YWdlLmg+CiNpbmNsdWRlIDxuZXdfc2tpbGxzLmg+Cgppbmhlcml0ICJzdGQvdGhpbmciOwoKdm9pZCBjcmVhdGUoKQp7CiAgOjpjcmVhdGUoKTsKICBTZXRQcm9wKCBQX05BTUUsICJTdGVtcGVsIGRlcyBUb2RlcyIgKTsKICBTZXRQcm9wKCBQX0dFTkRFUiwgTUFMRSApOwogIFNldFByb3AoIFBfU0hPUlQsIDAgKTsKICBTZXRQcm9wKCBQX0lOVklTLCAxICk7CiAgU2V0UHJvcCggUF9ORVZFUkRST1AsIDEgKTsKICBBZGRJZCgoeyJkZWF0aF9tYXJrIiwiXG5kZWF0aF9tYXJrIn0pKTsKfQoKdm9pZCByZXNldCgpCnsKICA6OnJlc2V0KCk7CiAgaWYgKGVudmlyb25tZW50KCkgJiYgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoZW52aXJvbm1lbnQoKSkpCiAgICByZW1vdmUoKTsKfQoKCi8qCiAqIEZ1bmN0aW9uIG5hbWU6IHN0YXJ0X2RlYXRoCiAqIERlc2NyaXB0aW9uOiAgIFN0YXJ0IHRoZSBkZWF0aCBzZXF1ZW5jZS4KICovCnZvaWQgc3RhcnRfZGVhdGgoKQp7CiAgaWYgKCAhZW52aXJvbm1lbnQoKSB8fCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShlbnZpcm9ubWVudCgpKQogICAgICAgfHwgIWVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX0dIT1NUKSApCiAgewogICAgICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKICAgICAgcmV0dXJuOwogIH0KCiAgc2F5KCJEdSBzaWVoc3QgZWluZSBkdW5rbGUgR2VzdGFsdCwgZGllIGV0d2FzIER1bnN0IGVpbnNhbW1lbHQgLi4uIG9kZXIgdmllbGxlaWNodFxuIisKICAgICAgImJpbGRlc3QgZHUgRGlyIGRhcyBhdWNoIG51ciBlaW4gLi4uXG4iKTsKICBlbnZpcm9ubWVudCgpLT5tb3ZlKCIvcm9vbS9kZWF0aC92aXJ0dWFsL2RlYXRoX3Jvb21fIitnZXR1aWQoZW52aXJvbm1lbnQoKSksCgkJICAgICBNX0dPfE1fU0lMRU5UfE1fTk9fU0hPV3xNX05PQ0hFQ0spOwogIC8vIERlciBmb2xnZW5kZSBDb2RlIHZlcmhpbmRlcnQsIGRhc3MgZWluIHVuYmVkYWNodGVyIE1hZ2llciBpbSBpbml0CiAgLy8gb2RlciBleGl0IGVpbmVuIFNwaWVsZXIgdPZ0ZXQsIHVuZCBpaG4gZGlya2V0IGRhbmFjaCBtb3ZldC4KICBlbnZpcm9ubWVudCgpLT5TZXRQcm9wKFBfVE1QX01PVkVfSE9PSywoe3RpbWUoKSsxMCx0aGlzX29iamVjdCgpLCJjYXRjaF9kaWVfbW92ZSJ9KSk7ICAKfQoKdmFyYXJncyBpbnQgbW92ZShtaXhlZCBkZXN0LG1peGVkIG1ldGhvZCkKewkKICBpZiAoIW1ldGhvZCAmIE1fTk9DSEVDSykgcmV0dXJuIE1FX0NBTlRfQkVfRFJPUFBFRDsKICByZXR1cm4gOjptb3ZlKGRlc3QsbWV0aG9kKTsKfQoKaW50IF9xdWVyeV9hdXRvbG9hZG9iaigpIHsgcmV0dXJuIDE7IH0KCmludCBjYXRjaF9kaWVfbW92ZSgpIHsgcmV0dXJuIC0xOyB9Cgp2b2lkIGluaXQoKQp7CiAgOjppbml0KCk7CiAgaWYgKHRoaXNfcGxheWVyKCkgPT0gZW52aXJvbm1lbnQoKSkKICAgIHN0YXJ0X2RlYXRoKCk7Cn0K