IyAyMDEwIE5vdmVtZWJlciAxOAojCiMgVGhlIGF1dGhvciBkaXNjbGFpbXMgY29weXJpZ2h0IHRvIHRoaXMgc291cmNlIGNvZGUuICBJbiBwbGFjZSBvZgojIGEgbGVnYWwgbm90aWNlLCBoZXJlIGlzIGEgYmxlc3Npbmc6CiMKIyAgICBNYXkgeW91IGRvIGdvb2QgYW5kIG5vdCBldmlsLgojICAgIE1heSB5b3UgZmluZCBmb3JnaXZlbmVzcyBmb3IgeW91cnNlbGYgYW5kIGZvcmdpdmUgb3RoZXJzLgojICAgIE1heSB5b3Ugc2hhcmUgZnJlZWx5LCBuZXZlciB0YWtpbmcgbW9yZSB0aGFuIHlvdSBnaXZlLgojCiMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgojIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHJlZ3Jlc3Npb24gdGVzdHMgZm9yIFNRTGl0ZSBsaWJyYXJ5LiAgVGhlCiMgZm9jdXMgb2YgdGhpcyBzY3JpcHQgdGVzdGluZyB0aGUgY2FsbGJhY2stZnJlZSBDL0MrKyBBUEkuCiMKIyAkSWQ6IGNhcGkzZS50ZXN0LHYgMS43MCAyMDA5LzAxLzA5IDAyOjQ5OjMyIGRyaCBFeHAgJAojCgpzZXQgdGVzdGRpciBbZmlsZSBkaXJuYW1lICRhcmd2MF0Kc291cmNlICR0ZXN0ZGlyL3Rlc3Rlci50Y2wKCiMgTWFrZSBzdXJlIHRoZSBzeXN0ZW0gZW5jb2RpbmcgaXMgdXRmLTguIE90aGVyd2lzZSwgaWYgdGhlIHN5c3RlbSBlbmNvZGluZwojIGlzIG90aGVyIHRoYW4gdXRmLTgsIFtmaWxlIGlzZmlsZSAkeF0gbWF5IG5vdCByZWZlciB0byB0aGUgc2FtZSBmaWxlCiMgYXMgW3NxbGl0ZTMgZGIgJHhdLgplbmNvZGluZyBzeXN0ZW0gdXRmLTgKCiMgRG8gbm90IHVzZSBhIGNvZGVjIGZvciB0ZXN0cyBpbiB0aGlzIGZpbGUsIGFzIHRoZSBkYXRhYmFzZSBmaWxlIGlzCiMgbWFuaXB1bGF0ZWQgZGlyZWN0bHkgdXNpbmcgdGNsIHNjcmlwdHMgKHVzaW5nIHRoZSBbaGV4aW9fd3JpdGVdIGNvbW1hbmQpLgojCmRvX25vdF91c2VfY29kZWMKCiMgUmV0dXJuIHRoZSBVVEYtMTYgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN1cHBsaWVkIFVURi04IHN0cmluZyAkc3RyLgojIElmICRudCBpcyB0cnVlLCBhcHBlbmQgdHdvIDB4MDAgYnl0ZXMgYXMgYSBudWwgdGVybWluYXRvci4KcHJvYyB1dGYxNiB7c3RyIHtudCAxfX0gewogIHNldCByIFtlbmNvZGluZyBjb252ZXJ0dG8gdW5pY29kZSAkc3RyXQogIGlmIHskbnR9IHsKICAgIGFwcGVuZCByICJceDAwXHgwMCIKICB9CiAgcmV0dXJuICRyCn0KCiMgUmV0dXJuIHRoZSBVVEYtOCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3VwcGxpZWQgVVRGLTE2IHN0cmluZyAkc3RyLiAKcHJvYyB1dGY4IHtzdHJ9IHsKICAjIElmICRzdHIgZW5kcyBpbiB0d28gMHgwMCAweDAwIGJ5dGVzLCBrbm9jayB0aGVzZSBvZmYgYmVmb3JlCiAgIyBjb252ZXJ0aW5nIHRvIFVURi04IHVzaW5nIFRDTC4KICBiaW5hcnkgc2NhbiAkc3RyIFxjKiB2YWxzCiAgaWYge1tsaW5kZXggJHZhbHMgZW5kXT09MCAmJiBbbGluZGV4ICR2YWxzIGVuZC0xXT09MH0gewogICAgc2V0IHN0ciBbYmluYXJ5IGZvcm1hdCBcYyogW2xyYW5nZSAkdmFscyAwIGVuZC0yXV0KICB9CgogIHNldCByIFtlbmNvZGluZyBjb252ZXJ0ZnJvbSB1bmljb2RlICRzdHJdCiAgcmV0dXJuICRyCn0KCiMgVGhlc2UgdGVzdHMgY29tcGxlbWVudCB0aG9zZSBpbiBjYXBpMi50ZXN0LiBUaGV5IGFyZSBvcmdhbml6ZWQKIyBhcyBmb2xsb3dzOgojCiMgY2FwaTNlLTEuKjogVGVzdCBzcWxpdGUzX29wZW4gd2l0aCB2YXJpb3VzIFVURjggZmlsZW5hbWVzCiMgY2FwaTNlLTIuKjogVGVzdCBzcWxpdGUzX29wZW4xNiB3aXRoIHZhcmlvdXMgVVRGOCBmaWxlbmFtZXMKIyBjYXBpM2UtMy4qOiBUZXN0IEFUVEFDSCB3aXRoIHZhcmlvdXMgVVRGOCBmaWxlbmFtZXMKCmRiIGNsb3NlCgojIGhlcmUncyB0aGUgbGlzdCBvZiBmaWxlIG5hbWVzIHdlJ3JlIHRlc3RpbmcKc2V0IG5hbWVzIHt0IDEgdC4gMS4gdC5kIDEuZCB0LTEgMS0xIHQuZGIg5C5kYiDrLmRiIPYuZGIg/C5kYiD/LmRifQoKc2V0IGkgMApmb3JlYWNoIG5hbWUgJG5hbWVzIHsKICBpbmNyIGkKICBkb190ZXN0IGNhcGkzZS0xLjEuJGkgewogICAgc2V0IGRiMiBbc3FsaXRlM19vcGVuICRuYW1lIHt9XQogICAgc3FsaXRlM19lcnJjb2RlICRkYjIKICB9IHtTUUxJVEVfT0t9CiAgZG9fdGVzdCBjYXBpM2UtMS4yLiRpIHsKICAgIHNxbGl0ZTNfY2xvc2UgJGRiMgogIH0ge1NRTElURV9PS30KICBkb190ZXN0IGNhcGkzZS0xLjMuJGkgewogICAgZmlsZSBpc2ZpbGUgJG5hbWUKICB9IHsxfQp9CgppZmNhcGFibGUge3V0ZjE2fSB7CiAgc2V0IGkgMAogIGZvcmVhY2ggbmFtZSAkbmFtZXMgewogICAgaW5jciBpCiAgICBkb190ZXN0IGNhcGkzZS0yLjEuJGkgewogICAgICBzZXQgZGIyIFtzcWxpdGUzX29wZW4xNiBbdXRmMTYgJG5hbWVdIHt9XQogICAgICBzcWxpdGUzX2VycmNvZGUgJGRiMgogICAgfSB7U1FMSVRFX09LfQogICAgZG9fdGVzdCBjYXBpM2UtMi4yLiRpIHsKICAgICAgc3FsaXRlM19jbG9zZSAkZGIyCiAgICB9IHtTUUxJVEVfT0t9CiAgICBkb190ZXN0IGNhcGkzZS0yLjMuJGkgewogICAgICBmaWxlIGlzZmlsZSAkbmFtZQogICAgfSB7MX0KICB9Cn0KCmlmY2FwYWJsZSBhdHRhY2ggewogIGRvX3Rlc3QgY2FwaTNlLTMuMSB7CiAgICBzcWxpdGUzIGRiMiBiYXNlLmRiCiAgfSB7fQogIHNldCBpIDAKICBmb3JlYWNoIG5hbWUgJG5hbWVzIHsKICAgIGluY3IgaQogICAgZG9fdGVzdCBjYXBpM2UtMy4yLiRpIHsKICAgICAgZGIyIGV2YWwgIkFUVEFDSCBEQVRBQkFTRSAnJG5hbWUnIEFTIGRiJGk7IgogICAgfSB7fQogICAgZG9fdGVzdCBjYXBpM2UtMy4zLiRpIHsKICAgICAgZGIyIGV2YWwgIkRFVEFDSCBEQVRBQkFTRSBkYiRpOyIKICAgIH0ge30KICB9CiAgZG9fdGVzdCBjYXBpM2UtMy40IHsKICAgIGRiMiBjbG9zZQogIH0ge30KfQoKIyBjbGVhbiB1cApmb3JjZWRlbGV0ZSBiYXNlLmRiCmZvcmVhY2ggbmFtZSAkbmFtZXMgewogIGZvcmNlZGVsZXRlICRuYW1lCn0KCmZpbmlzaF90ZXN0Cg==