I3ByYWdtYSBzYXZlX3R5cGVzLHN0cm9uZ190eXBlcyxydHRfY2hlY2tzLHBlZGFudGljCgppbmhlcml0ICIvc3RkL2xpdmluZy9tb3ZpbmciOwoKI2luY2x1ZGUgPG1vdmluZy5oPgojaW5jbHVkZSA8ZGVmaW5lcy5oPgojaW5jbHVkZSA8cHJvcGVydGllcy5oPgojaW5jbHVkZSAiL3Avc2VydmljZS9wYWRyZWljL21ucGMvbW5wYy5oIgojZGVmaW5lIE5FRURfUFJPVE9UWVBFUwojaW5jbHVkZSA8bGl2aW5nL2NvbWJhdC5oPgojdW5kZWYgTkVFRF9QUk9UT1RZUEVTCiNpbmNsdWRlIDxjb21iYXQuaD4KCiNkZWZpbmUgRU5WICAgIGVudmlyb25tZW50CiNkZWZpbmUgUE8gICAgIHByZXZpb3VzX29iamVjdCgpCgovLyBMZXR6dGVyIFNwaWVsZXJrb250YWt0LiAtMSwgd2VubiBkZXIgTU5QQyBpbmFrdGl2IHp1aGF1c2UgcnVtc3RlaHQKc3RhdGljIGludCBtZWV0X2xhc3RfcGxheWVyOwoKc3RhdGljIHZvaWQgbW5wY19jcmVhdGUoKQp7CiAgaWYgKFBPICYmIG1lbWJlcihpbmhlcml0X2xpc3QoUE8pLCAiL3N0ZC9yb29tLmMiKSE9LTEpCiAgICBTZXRQcm9wKE1OUENfSE9NRSwgb2JqZWN0X25hbWUoUE8pKTsKICBlbHNlIGlmIChQTCAmJiBFTlYoUEwpKQogICAgU2V0UHJvcChNTlBDX0hPTUUsIG9iamVjdF9uYW1lKEVOVihQTCkpKTsKICBlbHNlCiAgICBTZXRQcm9wKE1OUENfSE9NRSwgTU5QQ19ERkxUX0hPTUUpOwogIFNldFByb3AoUF9NTlBDLCAxKTsKICBTZXRQcm9wKE1OUENfQVJFQSwgKHt9KSk7CiAgU2V0UHJvcChNTlBDX0RFTEFZLCBNTlBDX0RGTFRfREVMQVkpOwogIFNldFByb3AoTU5QQ19GVU5DLCAwKTsKICBTZXRQcm9wKE1OUENfUkFORE9NLCAwKTsKICBTZXRQcm9wKE1OUENfV0FMS19USU1FLCBNTlBDX0RGTFRfV0FMSyk7CiAgU2V0UHJvcChNTlBDX0ZMQUdTLCAwKTsKICBTZXRQcm9wKFBfRU5BQkxFX0lOX0FUVEFDS19PVVQsIDEpOwogIG1lZXRfbGFzdF9wbGF5ZXI9dGltZSgpOwp9Cgpwcm90ZWN0ZWQgdm9pZCBSZWdpc3RlcldhbGsoKQp7CiAgaWYgKChRdWVyeVByb3AoTU5QQ19ERUxBWSkrUXVlcnlQcm9wKE1OUENfUkFORE9NKSk8PU1BWF9NQVNURVJfVElNRSkKICAgIFdBTEtfTUFTVEVSLT5SZWdpc3RlcldhbGtlcihRdWVyeVByb3AoTU5QQ19ERUxBWSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVlcnlQcm9wKE1OUENfUkFORE9NKSk7CiAgZWxzZQogICAgY2FsbF9vdXQoIldhbGsiLCBRdWVyeVByb3AoTU5QQ19ERUxBWSkrcmFuZG9tKFF1ZXJ5UHJvcChNTlBDX1JBTkRPTSkpKTsKfQoKLy8gQ2FuIGJlIHVzZWQgdG8gbWFudWFsbHkgcmVzdGFydCB0aGUgTU5QQyBmcm9tIGEgZGlmZmVyZW50IG9iamVjdCBldmVuIGlmCi8vIHRoZSBNTlBDIGhhZCBub3QgcGxheWVyIGNvbnRhY3QuCnB1YmxpYyBpbnQgUmVzdGFydFdhbGsoKQp7CiAgaW50IGZsYWdzID0gUXVlcnlQcm9wKE1OUENfRkxBR1MpOwogIC8vIEZhbGxzIG5pY2h0IGxhdWZlbmQsIHdpcmQgZ2FyIG5pY2h0cyBnZW1hY2h0LgogIGlmIChmbGFncyAmIE1OUENfV0FMSykKICB7CiAgICAvL1NwaWVsZXJrb250YWt0IHNpbXVsaWVyZW4KICAgIG1lZXRfbGFzdF9wbGF5ZXI9dGltZSgpOwogICAgLy8gRmFsbHMgTU5QQyBub2NoIHJlZ2lzdHJpZXJ0IGlzdCBvZGVyIG5vY2ggZWluZW4gQ2FsbG91dCBhdWYgV2FsayBoYXQsCiAgICAvLyBtdXNzIG5pY2h0cyB3ZWl0ZXIgZ2VtYWNodCB3ZXJkZW4uCiAgICBpZiAoV0FMS19NQVNURVItPlJlZ2lzdHJhdGlvbigpCiAgICAgICAgfHwgZmluZF9jYWxsX291dCgiV2FsayIpID4gLTEpCiAgICAgIHJldHVybiAtMTsKICAgIC8vIGFuc29uc3RlbiBNTlBDIHJlZ2lzdHJpZXJlbiwgZmFsbHMgZ2VlaWduZXQuCiAgICBpZiAoKFF1ZXJ5UHJvcChNTlBDX0RFTEFZKStRdWVyeVByb3AoTU5QQ19SQU5ET00pKTw9TUFYX01BU1RFUl9USU1FKQogICAgICBXQUxLX01BU1RFUi0+UmVnaXN0ZXJXYWxrZXIoUXVlcnlQcm9wKE1OUENfREVMQVkpLCBRdWVyeVByb3AoTU5QQ19SQU5ET00pKTsKICAgIC8vIHVuZCBtaXQga3VyemVyIFZlcnpvZWdlcnVuZyBlaW5tYWwgbGF1ZmVuLiAoamEsIGFic2ljaHQsIGhpZXIKICAgIC8vIE1OUENfREVMQVkgenUgbnV0emVuIC0gZGVubiBzb2xhbmdlIGRhdWVydCBkYXMgV2FsayB2b20gTWFzdGVyCiAgICAvLyBtaW5kZXN0ZW5zLikKICAgIGNhbGxfb3V0KCJXYWxrIiwxK3JhbmRvbSggbWluKFF1ZXJ5UHJvcChNTlBDX0RFTEFZKS0xLDgpICkpOwogICAgcmV0dXJuIDE7CiAgfQogIHJldHVybiAwOwp9Cgpwcm90ZWN0ZWQgdm9pZCBTdG9wKGludCBtb3ZlaG9tZSkKewogIGlmIChXQUxLX01BU1RFUi0+UmVnaXN0cmF0aW9uKCkpCiAgICBXQUxLX01BU1RFUi0+UmVtb3ZlV2Fsa2VyKCk7CiAgZWxzZSBpZiAoZmluZF9jYWxsX291dCgiV2FsayIpIT0tMSkKICAgIHJlbW92ZV9jYWxsX291dCgiV2FsayIpOwogIGlmIChtb3ZlaG9tZSkKICB7CiAgICBtb3ZlKFF1ZXJ5UHJvcChNTlBDX0hPTUUpLCBNX1RQT1JUfE1fTk9DSEVDSyk7CiAgICBtZWV0X2xhc3RfcGxheWVyPS0xOwogIH0KfQoKc3RhdGljIGludCBfc2V0X21ucGNfZmxhZ3MoaW50IGZsYWdzKQp7CiAgaWYgKGZsYWdzICYgTU5QQ19XQUxLKQogIHsKICAgIGlmICghUXVlcnlQcm9wKE1OUENfSE9NRSkpCiAgICAgIHJhaXNlX2Vycm9yKCJ1bmtub3duIE1OUENfSE9NRVxuIik7CiAgICAvL3dlbm4gZGllIEZsYWdzIG5ldSBnZXNldHp0IHdlcmRlbiwgd2lyZCBkZXIgTU5QQyBkYXMgendlaXRlIE1hbCBpbQogICAgLy9NYXN0ZXIgYW5nZW1lbGRldCAtPiB2b3JoZXIgYWJtZWxkZW4gKFplc3N0cmEpCiAgICBpZiAoUXVlcnlQcm9wKE1OUENfRkxBR1MpICYgTU5QQ19XQUxLKQogICAgewogICAgICBTdG9wKDApOwogICAgfQogICAgUmVnaXN0ZXJXYWxrKCk7CiAgfQogIC8vIGVsc2UgbmljaHQgdm9uIEJlZGV1dHVuZywgZGEgaW4gV2FsaygpIGRhcyBmbGFnIGdldGVzdGV0IHdpcmQKICBpZiAoZmxhZ3MgJiBNTlBDX0ZPTExPV19QTEFZRVIpCiAgewogICAgaWYgKCFRdWVyeVByb3AoTU5QQ19QVVJTVUVSKSkKICAgIHsgLy8gd3VyZGUgZGllc2VzIEZsYWcgbmV1IGVpbmdlc2NoYWx0ZXQ/CiAgICAgIGlmIChlbnZpcm9ubWVudCgpKQogICAgICB7IC8vIFZlcmZvbGd1bmcgYXVmbmVobWVuLi4uCiAgICAgICAgb2JqZWN0ICpwdXJzdWVyID0gZmlsdGVyKGFsbF9pbnZlbnRvcnkoRU5WKCkpLCAjJ2ludGVyYWN0aXZlKTsKICAgICAgICBmaWx0ZXJfb2JqZWN0cyhwdXJzdWVyLCAiQWRkUHVyc3VlciIsIE1FKTsKICAgICAgICBTZXRQcm9wKE1OUENfUFVSU1VFUiwgcHVyc3Vlcik7CiAgICAgIH0KICAgICAgZWxzZQogICAgICAgIFNldFByb3AoTU5QQ19QVVJTVUVSLCAoe30pKTsKICAgIH0KICB9CiAgZWxzZSBpZiAocG9pbnRlcnAoUXVlcnlQcm9wKE1OUENfUFVSU1VFUikpKQogIHsgLy8gd2lyZCBkZXJ6ZWl0IGlyZ2VuZHdlciB2ZXJmb2xndD8KICAgIC8vIGFsbGUgVmVyZm9sZ3VuZ2VuIGFiYnJlY2hlbi4uLgogICAgZmlsdGVyX29iamVjdHMoUXVlcnlQcm9wKE1OUENfUFVSU1VFUiktKHsgMCB9KSwgIlJlbW92ZVB1cnN1ZXIiLCBNRSk7CiAgICBTZXRQcm9wKE1OUENfUFVSU1VFUiwgMCk7IC8vIFNwZWljaGVyIGZyZWlnZWJlbi4uLgogIH0KICBlbHNlCiAgICBTZXRQcm9wKE1OUENfUFVSU1VFUiwgMCk7CgogIC8vIG51ciBsaXZpbmdzIGtvZW5uZW4gY29tbWFuZF9tZSBudXR6ZW4uLi4KICBpZiAoIWxpdmluZyhNRSkpCiAgICBmbGFncyB8PSBNTlBDX0RJUkVDVF9NT1ZFOwoKICByZXR1cm4gU2V0KE1OUENfRkxBR1MsIGZsYWdzLCBGX1ZBTFVFKTsKfQoKc3RhdGljIHZvaWQgbW5wY19JbnNlcnRFbmVteShvYmplY3QgZW5lbXkpCnsKICBpZiAoIChRdWVyeVByb3AoTU5QQ19GTEFHUykgJiBNTlBDX0ZPTExPV19FTkVNWSkgJiYKICAgICAgICAgKG1lbWJlcihRdWVyeVByb3AoTU5QQ19QVVJTVUVSKSwgUEwpPT0tMSkpCiAgewogICAgIFBMLT5BZGRQdXJzdWVyKE1FKTsKICAgICBTZXRQcm9wKE1OUENfUFVSU1VFUiwgUXVlcnlQcm9wKE1OUENfUFVSU1VFUikrKHsgUEwgfSkpOwogIH0KfQoKc3RhdGljIHZvaWQgbW5wY19yZXNldCgpCnsKICBpbnQgZmxhZ3MgPSBRdWVyeVByb3AoTU5QQ19GTEFHUyk7CiAgLy8gbWVldF9sYXN0X3BsYXllciA8IDAgemVpZ3QgYW4sIGRhc3MgZGVyIE1OUEMgc2Nob24genVoYXVzZSBpc3QuCiAgaWYgKG1lZXRfbGFzdF9wbGF5ZXIgPCAwCiAgICAgIHx8ICEoZmxhZ3MgJiBNTlBDX1dBTEspCiAgICAgIHx8IChmbGFncyAmIE1OUENfTk9fTU9WRV9IT01FKSkKICAgIHJldHVybjsKCiAgLy8gTGFuZ2Uga2VpbmVuIFNwaWVsZXJrb250YWt0IHVuZCBrZWluIFNwaWVsZXIgaW0gUmF1bTogbmFjaCBIYXVzZSBnZWhlbi4KICBpZiAoUXVlcnlQcm9wKE1OUENfV0FMS19USU1FKSttZWV0X2xhc3RfcGxheWVyIDwgdGltZSgpCiAgICAgICYmIGVudmlyb25tZW50KCkgJiYgIXNpemVvZihmaWx0ZXIoCiAgICAgIGFsbF9pbnZlbnRvcnkoZW52aXJvbm1lbnQoKSksICMncXVlcnlfb25jZV9pbnRlcmFjdGl2ZSkpKQogIHsKICAgIC8vIEFic2NoYWx0ZW4gdW5kIEhlaW1nZWhlbiB1bmQgZG9ydCB3YXJ0ZW4uCiAgICBTdG9wKDEpOwogIH0KfQoKc3RhdGljIGludCBfcXVlcnlfbW5wY19sYXN0X21lZXQoKQp7ICAgcmV0dXJuIG1lZXRfbGFzdF9wbGF5ZXI7ICAgfQoKc3RhdGljIHZvaWQgbW5wY19pbml0KCkKewogIGlmIChpbnRlcmFjdGl2ZShQTCkpCiAgewogICAgaWYgKG1lZXRfbGFzdF9wbGF5ZXI8PTApCiAgICB7CiAgICAgIFJlZ2lzdGVyV2FsaygpOwogICAgfQogICAgaWYgKCAoUXVlcnlQcm9wKE1OUENfRkxBR1MpICYgTU5QQ19GT0xMT1dfUExBWUVSKSAmJgogICAgICAgICAobWVtYmVyKFF1ZXJ5UHJvcChNTlBDX1BVUlNVRVIpLCBQTCk9PS0xKSAmJgogICAgICAgICghKFF1ZXJ5UHJvcChNTlBDX0ZMQUdTKSAmIE1OUENfRk9MTE9XX0VORU1ZKSB8fCBJc0VuZW15KFBMKSkpCiAgICB7CiAgICAgIFBMLT5BZGRQdXJzdWVyKE1FKTsKICAgICAgU2V0UHJvcChNTlBDX1BVUlNVRVIsIFF1ZXJ5UHJvcChNTlBDX1BVUlNVRVIpKyh7IFBMIH0pKTsKICAgIH0KICAgIG1lZXRfbGFzdF9wbGF5ZXI9dGltZSgpOwogIH0KICBlbHNlCiAgewogICAgLy8gV2VubiBkZXIgcmVpbmtvbW1lbmRlIGF1Y2ggZWluIE1OUENfTEFTVF9NRUVUIGdyb2Vzc2VyIDAgaGF0LCBpc3QgZXMKICAgIC8vIGVpbiBNTlBDLCBkZXIgbm9jaCBsYWV1ZnQuIFdlbm4gd2lyIG5pY2h0IGxhdWZlbiwgbGF1ZmVuIHdpciBsb3MuCiAgICAvLyBJbiBkaWVzZW0gdW5kIGF1Y2ggaW0gYW5kZXJlbiBGYWxsIHVlYmVybmVobWVuIHdpciBhYmVyIG1hbCBzZWluZW4KICAgIC8vIGxldHp0ZW4gU3BpZWxlcmtvbnRha3QsIGRlbm4gZGVyIGlzdCBqdWVuZ2VyIGFscyB1bnNlcmVyLgogICAgaW50IGxtID0gUEwtPlF1ZXJ5UHJvcChNTlBDX0xBU1RfTUVFVCk7CiAgICBpZiAobWVldF9sYXN0X3BsYXllcjw9MCAmJiBsbT4wKQogICAgewogICAgICBSZWdpc3RlcldhbGsoKTsKICAgICAgbWVldF9sYXN0X3BsYXllcj1sbTsKICAgIH0KICAgIGVsc2UgaWYgKG1lZXRfbGFzdF9wbGF5ZXI8bG0pCiAgICAgICBtZWV0X2xhc3RfcGxheWVyPWxtOwogIH0KfQoKc3RhdGljIHZvaWQgbW5wY19tb3ZlKCkKewogIGlmIChlbnZpcm9ubWVudCgpICYmIChRdWVyeVByb3AoTU5QQ19GTEFHUykgJiBNTlBDX0ZPTExPV19QTEFZRVIpKQogIHsKICAgIG9iamVjdCAqbGl2ID0gUXVlcnlQcm9wKE1OUENfUFVSU1VFUikgJiBhbGxfaW52ZW50b3J5KGVudmlyb25tZW50KCkpOwogICAgZmlsdGVyX29iamVjdHMoUXVlcnlQcm9wKE1OUENfUFVSU1VFUiktbGl2LSh7IDAgfSksICJSZW1vdmVQdXJzdWVyIiwgTUUpOwogICAgU2V0UHJvcChNTlBDX1BVUlNVRVIsIGxpdik7CiAgfQogIGlmIChRdWVyeVByb3AoTU5QQ19GVU5DKSkKICAgIGNhbGxfb3RoZXIoTUUsIFF1ZXJ5UHJvcChNTlBDX0ZVTkMpKTsKfQoKc3RhdGljIGludCBQcmV2ZW50RW50ZXIoc3RyaW5nIGZpbGUpCi8vIGRhcmYgZGVyIFJhdW0gYmV0cmV0ZW4gd2VyZGVuPwp7CiAgc3RyaW5nICphcmVhOwoKICBpZiAoIXNpemVvZihhcmVhPVF1ZXJ5UHJvcChNTlBDX0FSRUEpKSkKICAgIHJldHVybiAwOyAvLyBSYXVtIGRhcmYgYmV0cmV0ZW4gd2VyZGVuCiAgZWxzZQogIHsKICAgIGludCBpOwogICAgc3RhdHVzIGV4YWN0bWF0Y2g7CiAgICBleGFjdG1hdGNoPVF1ZXJ5UHJvcChNTlBDX0ZMQUdTKSAmIE1OUENfRVhBQ1RfQVJFQV9NQVRDSDsKICAgIGlmICgoaT1zdHJzdHIoZmlsZSwgIiMiKSkhPS0xKSBmaWxlPWZpbGVbMC4uaS0xXTsKICAgIGZvciAoaT1zaXplb2YoYXJlYSktMTsgaT49MDsgaS0tKQogICAgewogICAgICBpZiAoZXhhY3RtYXRjaCkKICAgICAgewogICAgICAgIC8vZXhha3RlciBWZXJnbGVpY2gsIGtlaW4gU3Vic3RyaW5ndmVyZ2xlaWNoIGdld3VlbnNjaHQKICAgICAgICBpZiAoZmlsZT09YXJlYVtpXSkKICAgICAgICAgIHJldHVybiAwOyAgLy9iZXRyZXRlbgogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIGlmIChzdHJzdHIoZmlsZSwgYXJlYVtpXSk9PTApCiAgICAgICAgICByZXR1cm4gMDsgLy8gUmF1bSBiZXRyZXRlbgogICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsgLy8gIFJhdW0gZGFyZiBuaWNodCBiZXRyZXRlbiB3ZXJkZW4KICB9Cn0KCnN0YXRpYyBpbnQgbW5wY19QcmV2ZW50Rm9sbG93KG9iamVjdCBkZXN0KQp7CiAgaWYgKGRlc3QgJiYgUHJldmVudEVudGVyKG9iamVjdF9uYW1lKGRlc3QpKSkKICAgIHJldHVybiAyOwogIHJldHVybiAwOwp9CgovLyBCZXdlZ3VuZ3NzaW11bGF0aW9uIChCZXdlZ3VuZ3NtZWxkdW5nKSBmdWVyIGJld2VnZW5kZSBub24tbGl2aW5ncwpzdGF0aWMgaW50IGRpcmVjdF9tb3ZlKG1peGVkIGRlc3QsIGludCBtZXRob2QsIHN0cmluZyBkaXJlY3Rpb24pCnsKICAgaW50IHJlcywgcGFyYSwgdG1wOwogICBzdHJpbmcgdGV4dG91dCwgdGV4dGluLCAqbW91dCwgdmMsIGZuOwogICBvYmplY3Qgb2xkZW52LCAqaW52OwoKICAgaWYgKGxpdmluZyhNRSkpCiAgICAgIHJldHVybiBjYWxsX290aGVyKE1FLCAibW92ZSIsIGRlc3QsIG1ldGhvZCk7CiAgIGVsc2UKICAgewogICAgICBvbGRlbnYgPSBlbnZpcm9ubWVudCgpOwogICAgICBwYXJhPVF1ZXJ5UHJvcChQX1BBUkEpOwogICAgICBpZiAoKHBhcmE+MCkgJiYgc3RyaW5ncChkZXN0KSkKICAgICAgewogICAgICAgICBmbj1kZXN0KyJeIitwYXJhOwogICAgICAgICBpZiAoZmluZF9vYmplY3QoZm4pIHx8IChmaWxlX3NpemUoZm4rIi5jIik+MCkpCiAgICAgICAgICAgIGRlc3Q9Zm47CiAgICAgICAgIGVsc2UgaWYgKGZpbGVfc2l6ZSh2Yz1pbXBsb2RlKGV4cGxvZGUoZm4sIi8iKVswLi48Ml0sIi8iKQogICAgICAgICAgICAgICAgICArIi92aXJ0dWFsX2NvbXBpbGVyLmMiKT4wKQogICAgICAgICB7CiAgICAgICAgICAgIC8vIHdlbm4gZWluIFZDIGV4aXN0aWVydCwgcHL8ZmVuIG9iIGRpZXNlciBQYXJhT2JqZWN0ZSB1bnRlcnN0dWV0enQKICAgICAgICAgICAgLy8gd2VubiBqYSwgZGFubiB0ZXN0ZW4gb2Igc2ljaCBSYXVtIGxhZGVuIGxhZXNzdC4uLgogICAgICAgICAgICBpZiAoKCFjYXRjaCh0bXA9KGludCljYWxsX290aGVyKHZjLCJOb1BhcmFPYmplY3RzIikpICYmICghdG1wKSkgJiYKICAgICAgICAgICAgICAgICghY2F0Y2goY2FsbF9vdGhlciggZm4sICI/Pz8iICkpKSkKICAgICAgICAgICAgICAgIGRlc3Q9Zm47CiAgICAgICAgIH0KICAgICAgfQoKICAgICAgcmVzID0gKGludCljYWxsX290aGVyKE1FLCAibW92ZSIsIGRlc3QsIE1fTk9DSEVDSyk7CgogICAgICBpZiAob2xkZW52PT1lbnZpcm9ubWVudCgpKQogICAgICAgIHJldHVybiByZXM7CgogICAgICAvLyBhbHMgZXJzdGVzIGRpZSBNZWxkdW5nIGZ1ZXIgZGFzIFZlcmxhc3NlbiBkZXMgUmF1bWVzLi4uCiAgICAgIGlmICggbWV0aG9kICYgTV9UUE9SVCApCiAgICAgICAgdGV4dG91dCA9IChzdHJpbmcpIFF1ZXJ5UHJvcChQX01NU0dPVVQpIHx8IChzdHJpbmcpIFF1ZXJ5UHJvcChQX01TR09VVCk7CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIG1vdXQgPSBleHBsb2RlKCAoc3RyaW5nKSBRdWVyeVByb3AoUF9NU0dPVVQpIHx8ICIiLCAiIyIgKTsKICAgICAgICB0ZXh0b3V0ID0gbW91dFswXSB8fCAoc3RyaW5nKSBRdWVyeVByb3AoUF9NTVNHT1VUKTsKICAgICAgfQoKICAgICAgaWYgKHN0cmluZ3AodGV4dG91dCkpCiAgICAgIHsKICAgICAgICAgaWYgKCAhc2l6ZW9mKGRpcmVjdGlvbikgKQogICAgICAgICAgIGRpcmVjdGlvbiA9IDA7CgogICAgICAgICBpbnYgPSBhbGxfaW52ZW50b3J5KG9sZGVudikgLSAoeyB0aGlzX29iamVjdCgpIH0pOwogICAgICAgICBpbnYgPSBmaWx0ZXIoIGludiwgIydsaXZpbmcpOwogICAgICAgICBpbnYgLT0gZmlsdGVyX29iamVjdHMoIGludiwgIkNhbm5vdFNlZSIsIDEgKTsKICAgICAgICAgZmlsdGVyKCBpbnYsICMndGVsbF9vYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgTmFtZSggV0VSLCAyICkgKyAiICIgKyB0ZXh0b3V0ICsKICAgICAgICAgICAgICAgICAgICAgICAoZGlyZWN0aW9uID8gIiAiICsgZGlyZWN0aW9uIDogIiIpICsKICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKG1vdXQpID4gMSA/IG1vdXRbMV0gOiAiIikgKyAiLlxuIiApOwogICAgICB9CgogICAgICAvLyBudW4gZGllIE1lbGR1bmcgZvxyIGRhcyAiQmV0cmV0ZW4iIGRlcyBSYXVtZXMuLi4KCiAgICAgIGlmICggbWV0aG9kICYgTV9UUE9SVCApCiAgICAgICAgdGV4dGluID0gKHN0cmluZykgUXVlcnlQcm9wKFBfTU1TR0lOKTsKICAgICAgZWxzZQogICAgICAgIHRleHRpbiA9IChzdHJpbmcpIFF1ZXJ5UHJvcChQX01TR0lOKTsKCiAgICAgIGlmIChzdHJpbmdwKHRleHRpbikpCiAgICAgIHsKICAgICAgICAgaW52ID0gYWxsX2ludmVudG9yeShlbnZpcm9ubWVudCgpKSAtICh7IHRoaXNfb2JqZWN0KCkgfSk7CiAgICAgICAgIGludiA9IGZpbHRlciggaW52LCAjJ2xpdmluZyk7CiAgICAgICAgIGludiAtPSBmaWx0ZXJfb2JqZWN0cyggaW52LCAiQ2Fubm90U2VlIiwgMSApOwogICAgICAgICBmaWx0ZXIoIGludiwgIyd0ZWxsX29iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKG5hbWUoIFdFUiwgMCApKSArICIgIiArIHRleHRpbiArICIuXG4iICk7CiAgICAgIH0KICB9CiAgcmV0dXJuIHJlczsKfQoKaW50IFdhbGsoKQp7CiAgaW50ICAgICBpOwogIG1hcHBpbmcgZXhpdHM7CiAgc3RyaW5nICAqcm9vbXMsICpkaXJzLCAqZXgsIHRtcDsKCiAgaWYgKCFlbnZpcm9ubWVudCgpKQogIHsKICAgIC8vIGRhcmYgZWlnZW50bGljaCBuaWNodCB2b3Jrb21tZW4uCiAgICByYWlzZV9lcnJvcigiTU5QQyBvaG5lIEVudmlyb25tZW50LlxuIik7CiAgfQoKICBpbnQgZmxhZ3M9UXVlcnlQcm9wKE1OUENfRkxBR1MpOwogIGlmICghKGZsYWdzICYgTU5QQ19XQUxLKSkKICAgIHJldHVybiAwOwoKICAvL2dnZi4gbmV1ZW4gQ2FsbG91dCBlaW50cmFnZW4sIGJldm9yIGlyZ2VuZHdhcyBhbmRlcmVzIGdlbWFjaHQgd2lyZC4KICBpZiAoKFF1ZXJ5UHJvcChNTlBDX0RFTEFZKStRdWVyeVByb3AoTU5QQ19SQU5ET00pKT5NQVhfTUFTVEVSX1RJTUUpCiAgICBjYWxsX291dCgiV2FsayIsIFF1ZXJ5UHJvcChNTlBDX0RFTEFZKStyYW5kb20oUXVlcnlQcm9wKE1OUENfUkFORE9NKSkpOwoKICAvLyBJbSBLYW1wZiBnZ2YuIG5pY2h0IHdlaXRlcmdlaGVuLgogIGlmICgoZmxhZ3MgJiBNTlBDX05PX1dBTEtfSU5fRklHSFQpICYmIEluRmlnaHQoKSkKICB7CiAgICBtZWV0X2xhc3RfcGxheWVyPXRpbWUoKTsKICAgIHJldHVybiAxOwogIH0KCiAgLy8gTU5QQyBhbmhhbHRlbiwgd2VubiBsYW5nZSBrZWluIFNwaWVsZXJrb250YWt0CiAgaWYgKFF1ZXJ5UHJvcChNTlBDX1dBTEtfVElNRSkrbWVldF9sYXN0X3BsYXllciA8IHRpbWUoKQogICAgICAmJiAhc2l6ZW9mKGZpbHRlcihhbGxfaW52ZW50b3J5KGVudmlyb25tZW50KCkpLAogICAgICAgICAgICAgICAgICMncXVlcnlfb25jZV9pbnRlcmFjdGl2ZSkpCiAgICAgICkKICB7CiAgICAvLyBhbmhhbHRlbiB1bmQgZ2dmLiBhdWNoIGRpcmVrdCBuYWNoIEhhdXNlIGdlaGVuLgogICAgU3RvcChmbGFncyAmIE1OUENfR09fSE9NRV9XSEVOX1NUT1BQRUQpOwogICAgcmV0dXJuIDA7CiAgfQoKICAvLyBBdXNnYWVuZ2UgZXJtaXR0ZWxuLgogIGV4aXRzID0gKGVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX0VYSVRTKSk7CiAgcm9vbXMgPSBtX3ZhbHVlcyhleGl0cyk7CiAgZGlycyAgPSBtX2luZGljZXMoZXhpdHMpOwogIGV4ID0gKHt9KTsKCiAgZm9yIChpPXNpemVvZihyb29tcyktMTsgaT49MDsgaS0tKQogIHsKICAgIGlmICghUHJldmVudEVudGVyKHJvb21zW2ldKSkKICAgICAgZXggKz0gKHsgZGlyc1tpXSB9KTsKICB9CiAgLyogSGllciBtdWVzc2VuIHdpciBhdWYgZGllIFp1dmVybGFlc3NpZ2tlaXQgdW5zZXJlciBNYWdpZXIgYmF1ZW4gLi4uICovCiAgaWYgKGZsYWdzICYgTU5QQ19ESVJFQ1RfTU9WRSkKICB7CiAgICAvLyBpbSBkaXJlY3QgbW9kZSBrZWluZSBTRXMgYmVudXR6YmFyLi4uCiAgICBpZiAoc2l6ZW9mKGV4KSkKICAgIHsKICAgICAgIHRtcD1leFtyYW5kb20oc2l6ZW9mKGV4KSldOwogICAgICAgZGlyZWN0X21vdmUoZXhwbG9kZShleGl0c1t0bXBdLCAiIyIpWzwxXSwgTV9HTywgIm5hY2ggIitjYXBpdGFsaXplKHRtcCkpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgLy8gSG5nbC4gTmFjaCBIYXVzZS4uLgogICAgICAgZGlyZWN0X21vdmUoUXVlcnlQcm9wKE1OUENfSE9NRSksIE1fVFBPUlR8TV9OT0NIRUNLLCAwKTsKICAgICAgIG1lZXRfbGFzdF9wbGF5ZXI9LTE7CiAgICAgfQogIH0KICBlbHNlIGlmIChmbGFncyAmIE1OUENfT05MWV9FWElUUykKICB7CiAgICAvLyBsb2dpc2NoZXJ3ZWlzZSBhdWNoIGtlaW5lIFNFcyBiZW51dHplbi4uLgogICAgaWYgKHNpemVvZihleCkpCiAgICB7CiAgICAgIGNvbW1hbmQoZXhbcmFuZG9tKHNpemVvZihleCkpXSk7IC8qIElyZ2VuZHdvaGluIGdlaGVuICovCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIC8vIEhuZ2wuIE5hY2ggSGF1c2UuLi4KICAgICAgbW92ZShRdWVyeVByb3AoTU5QQ19IT01FKSwgTV9UUE9SVHxNX05PQ0hFQ0spOwogICAgICBtZWV0X2xhc3RfcGxheWVyPS0xOwogICB9CiAgfQogIGVsc2UKICB7CiAgICAvLyBTcGVjaWFsIEV4aXRzIG1pdGJlbnV0emVuLgogICAgZXggKz0gbV9pbmRpY2VzKEVOVigpLT5RdWVyeVByb3AoUF9TUEVDSUFMX0VYSVRTKSk7CiAgICBpZiAoc2l6ZW9mKGV4KSkKICAgIHsKICAgICAgY29tbWFuZChleFtyYW5kb20oc2l6ZW9mKGV4KSldKTsgLyogSXJnZW5kd29oaW4gZ2VoZW4gKi8KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgLy8gSG5nbC4gR2FyIGtlaW5lIEF1c2dhZW5nZS4gTmFjaCBIYXVzZS4uLgogICAgICBtb3ZlKFF1ZXJ5UHJvcChNTlBDX0hPTUUpLCBNX1RQT1JUfE1fTk9DSEVDSyk7CiAgICAgIG1lZXRfbGFzdF9wbGF5ZXI9LTE7CiAgICB9CiAgfQoKICByZXR1cm4gMTsKfQo=