IyEvdXNyL2Jpbi9wZXJsCj1oZWFkMSBOQU1FCgpNYWtlbWFwCgo9aGVhZDEgU1lOT1BTSVMKCiB6dXIgRXJ6ZXVndW5nIHZvbiBTaXRlbWFwIHVuZCBOYXZpZ2F0aW9uc2xlaXN0ZW4KCiBTeW50YXg6ICAgbWFrZW1hcC5wbCBBdWZnYWJlIFtPcHRpb25lbl0KIEJlaXNwaWVsOiBtYWtlbWFwLnBsIG1uIC12CiAgIAogbWl0IC0taGlsZmUgQWJzY2huaXR0IGVyaGFlbHQgbWFuIHdlaXRlcmUgSGlsZmUuIEFic2Nobml0dGUgc2luZDoKIE9QVElPTkVOLCBBVUZHQUJFTiwgQkVTQ0hSRUlCVU5HLCBTSVRFTUFQLCBOQVZCQVIsIERBVEVOQkFOSywKIFZFUlNJT04sIEhJU1RPUlksIEJVR1MsIFRPRE8uCgo9aGVhZDEgQVVGR0FCRU4KCj1vdmVyIDQKCj1pdGVtIEI8YT4KCkFrdHVhbGlzaWVyZW4gZGVyIEluZm9ybWF0aW9uZW4gaW4gZGVyIERhdGVuYmFuayBzaXRlLmRhdGEKCj1pdGVtIEI8bT4KCk1hcHMgZXJzdGVsbGVuCgo9aXRlbSBCPG4+CgpOYXZiYXJzIGVyc3RlbGxlbiwgaW4gZWlnZW5lIERhdGVpZW4gc2NocmVpYmVuCmFiZXIgbmljaHQgaW4gZGllIGh0bWwtRGF0ZWllbiBlaW5wZmxlZ2VuCgo9aXRlbSBCPHc+CgplcnN0ZWxsdGUgTmF2YmFycyBpbiBhbGxlIGh0bWwgRGF0ZWllbiBzY2hyZWliZW4KCj1iYWNrCgoKPWhlYWQxIE9QVElPTkVOCiAKPW92ZXIgMTIKCj1pdGVtIEI8LS12ZXJib3NlPgoKQXVzZ2FiZW4genVyIEJlYXJiZWl0dW5nIGRlciBFaW56ZWxzY2hyaXR0ZQoKPWl0ZW0gQjwtLXZlcmJvc2VmaWxlPXM+CgpBdXNnYWJlIGluIERhdGVpIHVtbGVua2VuCgo9aXRlbSBCPC0tZGVidWc+Cgp6dXIgQXVzZ2FiZSB2b24gRGVidWcgaW5mb3MuIERpZSBBbmdhYmUga2FubiBtZWhyZmFjaCBlcmZvbGdlbiwgCmRhbm4gd2VyZGVuIGV2dGwuIGVudHNwcmVjaGVuZCBtZWhyIEluZm9ybWF0aW9uZW4gZ2VnZWJlbi4KCj1pdGVtIEI8LS1kZWJ1Z2ZpbGU9cz4KCkF1c2dhYmUgaW4gRGF0ZWkgdW1sZW5rZW4KCgo9aXRlbSBCPC0taGlsZmU+CgpIaWxmZSBmaW5kZW4KCm1pdCAtLWhpbGZlIEFic2Nobml0dCBlcmhhZWx0IG1hbiB3ZWl0ZXJlIEhpbGZlLiAKQWJzY2huaXR0ZSBzaW5kOiBPUFRJT05FTiwgQVVGR0FCRU4sIEJFU0NIUkVJQlVORywgU0lURU1BUCwgTkFWQkFSLCBEQVRFTkJBTkssClZFUlNJT04sIEhJU1RPUlksIEJVR1MsIFRPRE8uCgo9YmFjawoKCj1oZWFkMSBCRVNDSFJFSUJVTkcKCkRpZSBJZGVlIGRlcyBQcm9ncmFtbXMgYmVzdGVodCBkYXJpbiwgZGllIEVyc3RlbGx1bmcgZGVyIFNpdGVtYXAKdW5kIGRlciBOYXZpZ2F0aW9uc2xlaXN0ZW4gdm9uIFdlYnNlaXRlbiBkZXMgZGV1dHNwcmFjaGlnZW4gCk9wZW5PZmZpY2Uub3JnIFByb2pla3RlcyB6dSBlcmxlaWNodGVybi4gSW0gWnVzYW1tZW5zcGllbCBtaXQgCmRlciBEYXRlbmJhbmtkYXRlaSBzaXRlLmRhdGEgZXJsZWRpZ3QgZGFzIFNrcmlwdCBkYWJlaSB2aWVyCnplbnRyYWxlIEF1ZmdhYmVuIGF1ZiBkZW0gRGF0ZW5iZXN0YW5kIGltIGxva2FsZW4gQ1ZTLgpEaWUgaW4gZGVyIERhdGVuYmFuayBnZXNwZWljaGVydGVuIExpbmtzIHdlcmRlbiBtaXQgZGVuIHZvcmhhbmRlbmVuCmh0bWwgKGh0bS9wZGYvb2R0Ly4uLikgRGF0ZWllbiB2ZXJnbGljaGVuIHVuZCBldnRsLiBhYmdlZ2xpY2hlbi4KQXVzIGRlciBEYXRlbmJhbmsgd2lyZCBkaWUgU2l0ZW1hcCBlcnN0ZWxsdC4KRWJlbnNvIHdlcmRlbiBhdXMgZGVyIERhdGVuYmFuayBkaWUgTmF2aWdhdGlvbnNsZWlzdGVuIGVyc3RlbGx0LgpVbmQgc2NobGllc3NsaWNoIGtvZW5uZW4gZGllIE5hdmlnYXRpb25zbGVpc3RlbiBpbiBkaWUgZWluemVsbmVuCmh0bWwgRGF0ZWllbiBnZXNjaHJpZWJlbiB3ZXJkZW4sIHdlbm4gc2llIHNpY2ggZ2VhZW5kZXJ0IGhhYmVuLgpOYWNoZGVtIGRhcyBTa3JpcHQgZGllIGxva2FsZW4gRGF0ZWllbiBha3R1YWxpc2llcnQgaGF0LCBtdWVzc2VuCmRpZSBuZXVlbiBEYXRlaWVuIHBlciBDVlMgbmV1IGNvbW1pdGVkIHdlcmRlbi4KCj1oZWFkMSBTSVRFTUFQCgp0byB3cml0ZQoKPWhlYWQxIE5BVkJBUgoKdG8gd3JpdGUKCj1oZWFkMSBEQVRFTkJBTksKCnRvIHdyaXRlCgo9aGVhZDEgVkVSU0lPTgoKIFZlcnNpb24gMC41LjYgMjkuMDEuMjAwNiBNaWNoYWVsIEtpcmNobmVyCiBDb3B5cmlnaHQgKGMpIDIwMDUgTWljaGFlbCBLaXJjaG5lciwgTWFya28gTW9lbGxlcgogQmVpIEZyYWdlbiwgV/xuc2NoZW4sIEFucmVndW5nZW4gbWFpbCB0bzogbWljaGFlbEBoaXJucmVjay5kZQogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLgogICAgSSBBTSBOT1QgUkVTUE9TSUJMRSBGT1IgQU5ZIFBST0JMRU1TIFRIQVQKICAgICAgICAgVEhJUyBNQVkgQ0FVU0UgV0hBVFNPRVZFUi4KCgo9aGVhZDEgSElTVE9SWQoKPW92ZXIKCj1pdGVtIDA1MDgyODAwMDAKCk0uIE1vZWxsZXI6IEF1ZiBuZXVlIE5hdnRhYnMgYW5nZXBhc3N0LCBOYXZpZ2F0aW9uc2hpbGZlIHVuZCB3M2MgZWluZ2VwZmxlZ3QKCj1pdGVtIDA1MTExNjAwMDAKCk0uIEtpcmNobmVyOiB2aWVsIEFlbmRlcnVuZ2VuLCBVVEYtOCwgRG9rdW1lbnRhdGlvbiwgQXVmZ2FiZW4gc3RhdHQgRHVyY2hsYXVmCgo9aXRlbSAwNTExMTgwMDAwCgpHcnVwcGVuIGtvZW5uZW4gR3J1cHBlbiBlbnRoYWx0ZW4KCj1pdGVtIDA2MDEyOTAwMDAKCktsZWluZXJlIEFlbmRlcnVuZ2VuLCBOYXZiYXJ0aXRlbAoKPWJhY2sKCj1oZWFkMSBUT0RPCgo9b3ZlcgoKPWl0ZW0gClNjaHJlaWJlbiBkZXIgRG9rdW1lbnRpb24genUgU2l0ZW1hcCwgTmF2YmFyIHVuZCBEYXRlbmJhbmsKCj1pdGVtIApWZXJiZXNzZXJuIGRlciBBa3R1YWxpc2llcnVuZywgQW56ZWlnZSB2b24gZmVobGVuZGVuIERhdGVpZW4KQXVzZ2FiZSB2b24gbmV1ZW4gRGF0ZWllbgoKPWl0ZW0gCkVpbmJpbmRlbiB2b24gcGRmIHVuZCBzb25zdGlnZW4gRG9rdW1lbnRmb3JtYXRlbiBpbiBkaWUgU2l0ZW1hcC4KQW0gYmVzdGVuIHNvLCBkYXNzIGpld2VpbHMgbnVyIGRpZSBEYXRlaWVuZHVuZyB1bmQgR3JvZXNzZSBhbmdlemVpZ3Qgd2lyZC4KCj1pdGVtIApFaW5iaW5kZW4gdm9uIEpvYWNoaW1zIE5hdmJhci1lcnNldHp1bmdzLXNrcmlwdCB1bmQgCnZlcndlbmR1bmcgZGVzc2VsYmVuIG1pdCB6dXNhZXR6bGljaGVuIFNwYWx0ZSBpbgpzaXRlLmRhdGEgdW0gc3BlemlmaXNjaCBqZWRlIGh0bWwtRGF0ZWkgbWl0IGVpbmVyCmVpZ2VuZW4gTmF2YmFyIGF1c3p1c3RhdHRlbi4gSGllcnp1IG11c3MgYmVzb25kZXJzCmVpbiBNZWNoYW5pc211cyBlcmRhY2h0IHdlcmRlbiwgZGVyIGVzIGVybGF1YnQgbnVyIGRpZQpnZWFlbmRlcnRlbiBOYXZiYXJzIGF1c3p1dGF1c2NoZW4uCgo9aXRlbQpQZmxlZ2UgZGVyIHNpdGUuZGF0YSBlcmxlaWNodGVybiwgaW5kZW0gZnVlciBuZXVlIFNlaXRlbiBnbGVpY2gKZWluZSBFaW5nYWJlbWFza2UgYmVyZWl0Z2VzdGVsbHQgd2lyZCwgaW4gZGVyIG5ldWUgU2VpdGVuCnBsYXppZXJ0IHdlcmRlbiBrb2VubmVuLgoKCj1iYWNrCgo9aGVhZDEgQlVHUwoKQnVncz8gV2VsY2hlIEJ1Z3M/IEJlaSBtaXIgZ2lidCBlcyBrZWluZSBGZWxoZXIhCkFuc29uc3RlbjogbWljaGFlbEBoaXJucmVjay5kZQoJCSAKPWN1dAoKCgp1c2UgRmlsZTo6RmluZDsKcmVxdWlyZSBIVE1MOjpIZWFkUGFyc2VyOwp1c2UgUE9TSVggcXcoc3RyZnRpbWUpOwpQT1NJWDo6c2V0bG9jYWxlKExDX1RJTUUsICJEZSIpOwp1c2UgR2V0b3B0OjpMb25nOwp1c2UgUG9kOjpVc2FnZTsKdXNlIHdhcm5pbmdzOwoKbXkgJHZlcmJvc2UgPSAwOyAgICAgICAgICAgICAgICAgICAgIyBmcmVxdWVudGx5IHJlZmVycmVkCm15ICRkZWJ1ZyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICMgZnJlcXVlbnRseSByZWZlcnJlZApteSAlb3B0aW9ucyA9ICgndmVyYm9zZScgPT4gXCR2ZXJib3NlLCAnZGVidWcnID0+IFwkZGVidWcgKTsKR2V0b3B0OjpMb25nOjpDb25maWd1cmUgKCJidW5kbGluZyIpOwpHZXRPcHRpb25zICgKCQlcJW9wdGlvbnMsIAoJCSd2ZXJib3NlfHYnLCAKCQkndmVyYm9zZWZpbGU9cycsCgkJJ2RlYnVnfGQrJywKCQknZGVidWdmaWxlPXMnLAoJCSdoaWxmZXxoZWxwfGh8PzpzJwoJCSkgb3IgUG9kOjpVc2FnZS0+cG9kMnVzYWdlKDEpCgkJOwoKCiAKJGRhdGFmaWxlID0gJ3NpdGUuZGF0YSc7ICAgICAgICAjIERhdGVpbmFtZSBkZXIgRmxhdHRleHQgRGF0ZW5iYW5rCiR1bnNvcnRlZCA9ICdOaWNodCB6dWdlb3JkbmV0JzsgIyBHcnVwcGUsIG1pdCBub2NoIG5pY2h0IHp1Z2VvcmRuZXRlbiBFbGVtZW50ZW4KJG5vc2hvdyA9ICdOaWNodCBhbnplaWdlbic7ICAgICAjIEdydXBwZSwgbWl0IG5pY2h0IGFuenV6ZWlnZW5kZW4gRWxlbWVudGVuCiR1cmxtYXRjaCA9IHFyL15cLi87ICAgICAgICAgICAgIyBXaXJkIGluIGRlciBBdXNnYWJlCiR1cmxyZXBsYWNlID0gJy4nOyAgICAgICAgICAgICAgIyBpbiBqZWRlbSByZWxhdGl2ZW4gTGluayBlcnNldHp0CiRuZXdkaXIgPSAnLi4nOyAgICAgICAgICAgICAgICAgIyBaaWVsdmVyemVpY2huaXMgZnVlciBTdGFydAokbmF2YmFya29wZiA9ICcnOyAgICAgICAgICAgICAgICMgSW5pdGFsaXNpZXJ1bmcgTmF2YmFya29wZgokVmVyc2lvbiA9ICcwLjUuNic7CgoKCm15IEBmaWxlczsgICAgIyBFbnRoYWVsdCBkaWUgZ2VmdW5kZW5lbiAqLmh0bWwvKi5odG0gRGF0ZWluYW1lbiBtaXQgUGZhZCB2b24gLi8KbXkgQHBkZmZpbGVzOyAjIEVudGhhZWx0IGRpZSBnZWZ1bmRlbmVuICoucGRmIERhdGVpbmFtZW4gbWl0IFBmYWQgdm9uIC4vCm15ICVuYXZiYXI7ICAgIyBFbnRoYWVsdCBkaWUgZXJ6ZXVnZXRlbiBOYXZiYXJzIGFscyBIYXNoIG9mIExpc3RzCm15ICVkYXRhZmlsZXM7IyBFbnRoYWVsdCBkaWUgRGF0ZWluYW1lbiBpbSBkYXRhZmlsZSAuLwpteSAlZGF0YTsgICAgICMgRW50aGFlbHQgZGllIEVpbnRyYWVnZSB2b24gJGRhdGFmaWxlIGFscyBIYXNoIG9mIExpc3RzCgoKaWYgKGV4aXN0cyAkb3B0aW9uc3snaGlsZmUnfSkgewoJaWYgKCRvcHRpb25zeydoaWxmZSd9IGVxICcnICkgewoJCXBvZDJ1c2FnZSgxKTsKCX0KCWVsc2UgewoJCXBvZDJ1c2FnZSggeyAtdmVyYm9zZSA9PiA5OSwKCQkJCS1leGl0dmFsID0+IDEsCgkJCQktc2VjdGlvbnMgPT4gIiRvcHRpb25zeydoaWxmZSd9IiwgfSk7Cgl9Cn0KCgppZiAoQEFSR1YgPCAxICkgewoJUG9kOjpVc2FnZS0+cG9kMnVzYWdlKDApOwp9CgoKCmlmICgkdmVyYm9zZSkgewoJaWYgKGV4aXN0cygkb3B0aW9uc3sndmVyYm9zZWZpbGUnfSkpIHsKCQlvcGVuIFZFUkJPU0VPVVQsICI+JG9wdGlvbnN7J3ZlcmJvc2VmaWxlJ30iIAoJCQkJb3IgZGllICJDYW5ub3Qgb3BlbiB2ZXJib3NlIG91dHB1dCAlcyIsICRvcHRpb25zeyd2ZXJib3NlZmlsZSd9OwoJfQoJZWxzZSB7IG9wZW4gVkVSQk9TRU9VVCwgIj4tIiBvciBkaWUgIkNhbm5vdCBvcGVuIHZlcmJvc2Ugb3V0cHV0IHRvIGNvbnNvbGUuIjt9Cn0KaWYgKCRkZWJ1ZykgewoJaWYgKGV4aXN0cygkb3B0aW9uc3snZGVidWdmaWxlJ30pKSB7CgkJb3BlbiBERUJVR09VVCwgIj4kb3B0aW9uc3snZGVidWdmaWxlJ30iIAoJCQkJb3IgZGllICJDYW5ub3Qgb3BlbiBkZWJ1ZyBvdXRwdXQgJXMiLCAkb3B0aW9uc3snZGVidWdmaWxlJ307Cgl9CgllbHNlIHsgb3BlbiBERUJVR09VVCwgIj4tIiBvciBkaWUgIkNhbm5vdCBvcGVuIGRlYnVnIG91dHB1dCB0byBjb25zb2xlLiI7fQp9CgoKbXkgJEF1ZmdhYmUgPSBzaGlmdCBAQVJHVjsKdW5sZXNzIChkZWZpbmVkICgkQXVmZ2FiZSkpIHsKCQlkaWUgKCdLZWluZSBBdWZnYWJlIGFuZ2VnZWJlbicpOwp9OwoKIyBNYWluCgojWmllbHZlcnplaWNobmlzIHp1bSBha3R1ZWxsZW4gVmVyemVpY2huaXMgbWFjaGVuCmNoZGlyICgkbmV3ZGlyKTsKCiMgYW1uID0gYWt0dWFsaXNpZXJlbiwgbWFwIGVyc3RlbGxlbiwgbmF2YmFyIGVyc3RlbGxlbgojID0+IGVzIG11c3MgZGllIHNpdGUuZGF0YSBlaW5nZWxlc2VuIHdlcmRlbgppZiAoJEF1ZmdhYmUgPX4gL1thbW53XS9pKSB7CgkmcmVhZHNpdGU7CgkmY3Jhd2w7CgkmY2hlY2tuZXc7Cn0KCiMgYSA9IGFrdHVhbGlzaWVyZW4KIyA9PiBlcyB3ZXJkZW4gZGllIHZvcmhhbmRlbmVuIERhdGVuIGFiZ2VzdWNodCB1bmQgbmV1IGluIHNpdGUuZGF0YSBnZXNjaHJpZWJlbgppZiAoJEF1ZmdhYmUgPX4gL2EvaSkgewoJJnZhbGlkYXRlc2l0ZTsKCSZ3cml0ZXNpdGU7Cn0KCiMgYW1uID0gYWt0dWFsaXNpZXJlbiwgbWFwIGVyc3RlbGxlbiwgbmF2YmFyIGVyc3RlbGxlbgojID0+IGxpbmtzIHJlbGF0aXYgenVyIHNpdGVtYXAgc2V0emVuCiMgYXVzIGRlbSBIZWFkZXIgZGVyIEhUTUwgZXZ0bC4gVGl0ZWwgbmFjaGxlc2VuCmlmICgkQXVmZ2FiZSA9fiAvW21uXS9pKSB7CgkmYmFzZWxpbmtzOwoJJnJlYWRoZWFkZXI7Cn0KCiMgbSA9IG1hcCBlcnN0ZWxsZW4KaWYgKCRBdWZnYWJlID1+IC9tL2kpIHsKCSZtYWtlc2l0ZW1hcDsKfQoKIyBuID0gbmF2YmFyIGVyc3RlbGxlbgppZiAoJEF1ZmdhYmUgPX4gL24vaSkgewoJJm1ha2VuYXZiYXI7Cn0KCiMgdyA9IG5hdmJhciBlaW5sZXNlbiB1bmQgZWlucGZsZWdlbgppZiAoJEF1ZmdhYmUgPX4gL3cvaSkgewoJJnJlYWRuYXZiYXI7Cgkmd3JpdGVuYXZiYXI7Cn0KCmNsb3NlIFZFUkJPU0VPVVQgaWYgJHZlcmJvc2U7CmNsb3NlIERFQlVHT1VUIGlmICRkZWJ1ZzsKCiMgRW5kZSB2b24gTWFpbgoKCnN1YiB3YW50ZWQgewojIFdpcmQgZnVlciBkaWUgU3VjaGUgbWl0IGZpbGU6OmZpbmQgYmVub2V0aWd0IHVuZCBnaWJ0IGRpZSBnZXd1ZW5zY2h0ZW4gRGF0ZWllbiBhbi4KaWYgKC9cLmh0bWw/JC8pIHtwdXNoIEBmaWxlcywgJEZpbGU6OkZpbmQ6Om5hbWV9OwppZiAoL1wucGRmJC8pIHtwdXNoIEBwZGZmaWxlcywgJEZpbGU6OkZpbmQ6Om5hbWV9Owp9CgpzdWIgY3Jhd2wgewojIHN1Y2h0IGltIGFrdHVlbGxlbiBWZXJ6ZWljaG5pcyB1bmQgZGFydW50ZXIgbmFjaCBEYXRlaWVuLCBmdWVyIGplZGUgd2lyZCBXYW50ZWQKIyBhdWZnZXJ1ZmVuCnByaW50IFZFUkJPU0VPVVQgIlN1Y2hlIG5hY2ggRGF0ZWllbiBtaXQgcGFzc2VuZGVuIEVuZHVuZ2VuIiBpZiAkdmVyYm9zZTsKZmluZChcJndhbnRlZCwgJy4nKTsKcHJpbnQgVkVSQk9TRU9VVCAiLlxuIiBpZiAkdmVyYm9zZTsKfQoKc3ViIHJlYWRzaXRlIHsKIyBFaW5sZXNlbiBkZXMgRGF0YWZpbGVzCgkJCnByaW50IFZFUkJPU0VPVVQgIkxlc2UgRmxhdHRleHQgRGF0ZW5iYW5rIGRlciBTaXRlIiBpZiAkdmVyYm9zZTsKCm9wZW4gKERBVEFGSUxFLCAiPDp1dGY4IiwkZGF0YWZpbGUpIG9yIGRpZSAiS2FubiAkZGF0YWZpbGUgbmljaHQgb2VmZm5lbiI7CkJBU0U6IHdoaWxlICg8REFUQUZJTEU+KSB7CiMgV2VubiBlcyBlaW5lIEtvbW1lbnRhcnplaWxlIGlzdAppZiAoL15ccyojLykgewoJcHVzaCBATGluZXMsICRfOwoJbmV4dCBCQVNFOwp9CgojIFdlbm4gZXMgZWluIEVpbnRyYWcgaXN0LCB3byBEYXRlaWVuIHp1IEdydXBwZW4gZ2VvcmRuZXQgd2VyZGVuCiMgQnp3IGRpZSBLYXRlZ29yaWVuIHVuZCBBdXNnYWJlbiBkZWZpbmllcnQgd2VyZGVuCmlmICgvXihbXiNdLiopXHQoLiopXHQoLiopXHQoLiopXHQoLiopXHQoLiopJC8pIHsKCSRhZGF0YSA9IHt9OwoJJGFkYXRhLT57J0dydXBwZSd9PSQxOwoJaWYgKCQyIGVxICcnIG9yICQyID09IDAgKSB7ICRhZGF0YS0+eydMZXZlbCd9PSc5OScgfQoJZWxzZSB7ICRhZGF0YS0+eydMZXZlbCd9PSQyIDsgfQoJJGFkYXRhLT57J1N0aWwnfT0kMzsKCSRhZGF0YS0+eydUZXh0J309JDQ7CgkkYWRhdGEtPnsnTGluayd9PSQ1OwoJJGFkYXRhLT57J0Jlc2NocmVpYnVuZyd9PSQ2OwoJJGFkYXRhLT57J1Bvc2l0aW9uJ309JC47CgkjIEtvbW1lbnRhcnplaWxlbiB3ZXJkZW4genVtIGZvbGdlbmRlbiBFaW50cmFnIGRhenVnZXJlY2huZXQKCUB7JGFkYXRhLT57J0tvbW1lbnRhcid9fT1ATGluZXM7CglATGluZXMgPSAoKTsKCXB1c2ggQHskZGF0YXskMX19LCAkYWRhdGE7CgkjIEluIERhdGFmaWxlcyB3ZXJkZW4gYWxsZSBEYXRlaW5hbWVuIGF1cyBkZW0gRGF0YWZpbGUgZ2VzY2hyaWViZW4KCSMgRGllcyBpc3Qgbm90d2VuZGlnLCB1bSBuYWNoaGVyIG1pdCBkZW4gZ2VzY2FubnRlbiBEYXRlaWVuIHp1IHZlcmdsZWljaGVuCglpZiAoIG5vdCAkYWRhdGEtPnsnTGluayd9ID1+IC9eaHR0cC9pICApIHsKCQlwdXNoIEB7JGRhdGFmaWxlc3skYWRhdGEtPnsnTGluayd9fXsnUmVmJ319ICwgJGFkYXRhIH07Cgl9Cn0KY2xvc2UgREFUQUZJTEU7CgpwcmludCBWRVJCT1NFT1VUICIuXG4iIGlmICR2ZXJib3NlOwp9ICMgcmVhZHNpdGUKCgpzdWIgY2hlY2tuZXcgewojIERpZSBMaXN0ZSBkZXIgZ2VzY2FubnRlbiBEYXRlaWVuIHdpcmQgZHVyY2hnZXNlaGVuIHVuZCBtaXQKIyBkZW4gRGF0ZWllbiBpbSBEYXRhZmlsZSB2ZXJnbGljaGVuIHVtIGdlbG9lc2NodGUgdW5kIG5ldWUgenUgaWRlbnRpZml6aWVyZW4KcHJpbnQgVkVSQk9TRU9VVCAiVmVyZ2xlaWNoZSBEYXRlbmJhbmsgbWl0IGFrdHVlbGxlbiBodG1sLURhdGVpZW4iIGlmICR2ZXJib3NlOwoKZm9yZWFjaCAkZmlsZSAoQGZpbGVzKSB7CiMgV2VubiBkaWUgRGF0ZWluIGltIERhdGFmaWxlIHNjaG9uIGJla2FubnQgd2FyLAojIHdpcmQgc2llIGlociBlaW50cmFnIGluIGRlbiBkYXRhZmlsZXMgbWFya2llcnQKaWYgKGV4aXN0cyAkZGF0YWZpbGVzeyRmaWxlfSApIHsKCSRkYXRhZmlsZXN7JGZpbGV9eydOb2NoZGEnfSA9IDE7CgkjIGhpZXIga2FubiBhdWYgRG9wcGVsdGUgRWludHJhZWdlIGdlcGZydWVmdCB3ZXJkZW4KfQojIG5ldWUgRGF0ZWllbiB3ZXJkZW4gaW4gZGllIEdydXBwZSAkdW5zb3J0ZWQgZ2Vub21tZW4KIyB1bmQgZWluIERhdGFmaWxlZWludHJhZyBhbmdlbGVndAojIFNwYWV0ZXIgc29sbHRlIGRpZXMgaW50ZXJha3RpdiBlcmZvbGdlbgplbHNlIHsKCSRhZGF0YSA9IHt9OwoJJGFkYXRhLT57J0dydXBwZSd9PSR1bnNvcnRlZDsKCSRhZGF0YS0+eydMZXZlbCd9PSc5OSc7CgkkYWRhdGEtPnsnU3RpbCd9PScnOwoJJGFkYXRhLT57J1RleHQnfT0nJzsKCSRhZGF0YS0+eydMaW5rJ309JGZpbGU7CgkkYWRhdGEtPnsnQmVzY2hyZWlidW5nJ309Jyc7CglwdXNoIEB7JGRhdGF7JHVuc29ydGVkfX0sICRhZGF0YTsKCSRkYXRhZmlsZXN7JGZpbGV9eydOb2NoZGEnfSA9IDE7CglwdXNoIEB7JGRhdGFmaWxlc3skZmlsZX17J1JlZid9fSAsICRhZGF0YSA7Cn0gI2Vsc2UgZXhpc3RzCn0gIyBmb3JlYWNoIGZpbGUKcHJpbnQgVkVSQk9TRU9VVCAiLlxuIiBpZiAkdmVyYm9zZTsKCnByaW50IFZFUkJPU0VPVVQgIlZlcmdsZWljaGUgRGF0ZW5iYW5rIG1pdCBha3R1ZWxsZW4gcGRmLURhdGVpZW4iIGlmICR2ZXJib3NlOwpmb3JlYWNoICRwZGZmaWxlIChAcGRmZmlsZXMpIHsKIyBXZW5uIGRpZSBQZGYtRGF0ZWkgaW0gRGF0YWZpbGUgc2Nob24gYmVrYW5udCB3YXIsCiMgd2lyZCBzaWUgaWhyIGVpbnRyYWcgaW4gZGVuIGRhdGFmaWxlcyBtYXJraWVydAppZiAoZXhpc3RzICRkYXRhZmlsZXN7JHBkZmZpbGV9ICkgewoJJGRhdGFmaWxlc3skcGRmZmlsZX17J05vY2hkYSd9ID0gMTsKfQojIG5ldWUgRGF0ZWllbiB3ZXJkZW4gaW4gZGllIEdydXBwZSAkdW5zb3J0ZWQgZ2Vub21tZW4KIyB1bmQgZWluIERhdGFmaWxlZWludHJhZyBhbmdlbGVndAojIFNwYWV0ZXIgc29sbHRlIGRpZXMgaW50ZXJha3RpdiBlcmZvbGdlbgplbHNlIHsKCSRhZGF0YSA9IHt9OwoJJGFkYXRhLT57J0dydXBwZSd9PSR1bnNvcnRlZDsKCSRhZGF0YS0+eydMZXZlbCd9PSc5OSc7CgkkYWRhdGEtPnsnU3RpbCd9PScnOwoJJGFkYXRhLT57J1RleHQnfT0nJzsKCSRhZGF0YS0+eydMaW5rJ309JHBkZmZpbGU7CgkkYWRhdGEtPnsnQmVzY2hyZWlidW5nJ309Jyc7CglwdXNoIEB7JGRhdGF7JHVuc29ydGVkfX0sICRhZGF0YTsKCSRkYXRhZmlsZXN7JHBkZmZpbGV9eydOb2NoZGEnfSA9IDE7CglwdXNoIEB7JGRhdGFmaWxlc3skcGRmZmlsZX17J1JlZid9fSAsICRhZGF0YSA7Cn0gI2Vsc2UgZXhpc3RzCn0gIyBmb3JlYWNoIHBkZmZpbGUKcHJpbnQgVkVSQk9TRU9VVCAiLlxuIiBpZiAkdmVyYm9zZTsKCn0gIyBzdWIgY2hlY2tuZXcKCnN1YiB2YWxpZGF0ZXNpdGUgewpwcmludCBWRVJCT1NFT1VUICJTdWNoZSBuYWNoIGZlaGxlbmRlbiBMaW5rcyBpbiBkZXIgRGF0ZW5iYW5rIiBpZiAkdmVyYm9zZTsKIyBKZXR6dCBzb2xsIGdlcHJ1ZWZ0IHdlcmRlbiwgb2IgaW4gJGRhdGFmaWxlcyBub2NoIGxpbmtzCiMgenUgRGF0ZWllbiwgZGllIG5pY2h0IG1laHIgZXhpc3RpZXJlbiwgdWViZXJpZ2dlYmxpZWJlbiBzaW5kLgpteSAkYWxsZWRhPTE7CmZvcmVhY2ggJGZpbGUgKGtleXMgJWRhdGFmaWxlcykgewoJaWYgKG5vdCAoZXhpc3RzICRkYXRhZmlsZXN7JGZpbGV9eydOb2NoZGEnfSkgCgkJCQkJYW5kICgkZmlsZSA9fiAvXlwuXC8vaSkpIHsKCQlpZiAoJGFsbGVkYSA9PSAxKSB7CgkJCXByaW50ICJcblxuRm9sZ2VuZGUgTGlua3MgYXVzICRkYXRhZmlsZSBzaW5kIG5pY2h0IG1laHIgYXVmenVmaW5kZW4uXG4iOwoJCQlwcmludCAiRGllIGVudHNwcmVjaGVuZGVuIERhdGVpZW4gc2luZCB2ZXJtdXRsaWNoIGdlbG9lc2NodCB1bmQgc29sbHRlblxuIjsKCQkJcHJpbnQgImF1Y2ggcGVyIEhhbmQgYXVzICRkYXRhZmlsZSBlbmZlcm50IHdlcmRlbi5cbiI7CgkJCXByaW50ICJJbSBNb21lbWVudCB3ZXJkZW4gc2llIHdlaXRlciBpbiBkZXIgU2l0ZW1hcCBlcnNjaGVpbmVuLFxuIjsKCQkJcHJpbnQgIndlbm4gc2llIGRvcnQgdm9yaGVyIGF1ZmdldGF1Y2h0IHdhcmVuLlxuIjsKCQkJJGFsbGVkYSA9IDA7CgkJCSMgSGllciBrb2VubnRlIHNwYWV0ZXIgZXZ0bC4gZWluZSBSb3V0aW5lIGFuc2V0enRlbiwgZGllCgkJCSMgZ2xlaWNoIGRpZSBiZWFyYmVpdHVuZyBkZXIgRWludHJhZWdlIGVybGF1YnQKCQl9CgkJcHJpbnQgKCRmaWxlLCJcbiIpOwoJCSMgRGVyIEVpbnRyYWcgd2lyZCBhdWNoIGluIGRhdGFmaWxlcyBnZWxvZXNjaHQKCQkjIHVtIHNwYWV0ZXIgbmljaHQgbm9jaCBhbHMgRGF0ZWkgYW5nZXNwcm9jaGVuIHp1IHdlcmRlbgoJCSMgYWxsZXJkaW5ncyBibGVpYnQgZGVyIEVpbnRyYWcgaW4gJWRhdGEgZXJoYWx0ZW4uCgkJZGVsZXRlICRkYXRhZmlsZXskZmlsZX07Cgl9CQp9CmlmICgkdmVyYm9zZSBhbmQgJGFsbGVkYSkgewoJcHJpbnQgIi5cbktlaW5lIGZlaGxlbmRlbiBMaW5rcyBpbiAkZGF0YWZpbGUgZ2VmdW5kZW4uXG4iOwp9CgojIEF1c2dhYmUgZGVyIERhdGVpZW4sIGRpZSBpbSBzaXRlLmRhdGEgdm9yaGFuZGVuIAojIHNpbmQsIGFiZXIgbm9jaCBuaWNodCB6dWdlb3JkbmV0IHd1cmRlbgppZiAoZXhpc3RzICRkYXRheyR1bnNvcnRlZH0gYW5kIEB7JGRhdGF7JHVuc29ydGVkfX0pIHsKCXByaW50ICIuXG5Gb2xnZW5kZSBEYXRlaWVuIHNpbmQgaW0gJGRhdGFmaWxlIGFscyBuaWNodCB6dWdlb3JkbmV0IGdla2VubnplaWNobmV0LlxuIjsKCXByaW50ICJEaWUgZW50c3ByZWNoZW5kZW4gRGF0ZWllbiB3dXJkZW4gdmVybXV0bGljaCBuYWNoIGRlciBsZXR6dGVuIEJlYXJiZWl0dW5nXG4iOwoJcHJpbnQgInZvbiAkZGF0YWZpbGUgaW5zIENWUyB6dWdlZnVlZ3QgdW5kIG11ZXNzZW4gdm9uIEhhbmQgYW4gZGllIHJpY2h0aWdlbiBcbiI7CglwcmludCAiU3RlbGxlbiAkZGF0YWZpbGUgZWluZ2VwZmxlZ3Qgd2VyZGVuLiBadXIgRXJsZWljaHRlcnVuZyB3dXJkZW4gc2llIGpldHp0XG4iOwoJcHJpbnQgImJlcmVpdHMgYW5zIEVuZGUgdm9uICRkYXRhZmlsZSBlaW5nZXRyYWdlbi5cbiI7CglwcmludCAiSW0gTW9tZW50IHd1ZXJkZW4gc2llIG5pY2h0IGluIGRlciBTaXRlbWFwIGVyc2NoZWluZW4uXG4iOwoJIyBIaWVyIGtvZW5udGUgc3BhZXRlciBldnRsLiBlaW5lIFJvdXRpbmUgYW5zZXR6dGVuLCBkaWUKCSMgZ2xlaWNoIGRpZSBiZWFyYmVpdHVuZyBkZXIgRWludHJhZWdlIGVybGF1YnQKCWZvcmVhY2ggJGFkYXRhIChAeyRkYXRheyR1bnNvcnRlZH19KXsKCQlwcmludCAoJGFkYXRhLT57J0xpbmsnfSwiXG4iKTsKCX0KfQoKCn0gIyB2YWxpZGF0ZXNpdGUKCgpzdWIgd3JpdGVzaXRlIHsKCnByaW50IFZFUkJPU0VPVVQgIkRpZSBEYXRlbmJhbmsgd2lyZCBuZXUgZ2VzY2hyaWViZW4iIGlmICR2ZXJib3NlOwojIERhcyBEYXRhZmlsZSB3aXJkIG5ldSBnZXNjaHJpZWJlbiwgamV0enQgbWl0IGRlbiBuZXVlbiwgbmljaHQgenVnZW9yZG5ldGVuIERhdGVpZW4Kb3BlbiAoREFUQUZJTEUsICc+OnV0ZjgnLCRkYXRhZmlsZSkgb3IgZGllICJLYW5uICRkYXRhZmlsZSBuaWNodCBvZWZmbmVuIjsKCmZvcmVhY2ggJGFncm91cCAoc29ydCB7CgkjIERpZSBTb3J0aWVycmVpaGVuZm9sZ2UgZW50c3ByaWNodCBkZXIgUmVpaGVuZm9sZ2UgaW0gRGF0YWZpbGUKCSMgJ1Bvc2l0aW9uJyBlbnRoYWVsdCBqZXdlaWxzIGRpZSBaZWlsZW5udW1tZXIKCShleGlzdHMoJGRhdGF7JGF9WzBdLT57J1Bvc2l0aW9uJ30pID8gJGRhdGF7JGF9WzBdLT57J1Bvc2l0aW9uJ30gOiA5OTk5OTkpCgkJCTw9PgoJKGV4aXN0cygkZGF0YXskYn1bMF0tPnsnUG9zaXRpb24nfSkgPyAkZGF0YXskYn1bMF0tPnsnUG9zaXRpb24nfSA6IDk5OTk5OSkKCQkJfHwKCQkkYSAgY21wICAkYgogICAgCX0KCWtleXMgJWRhdGEpIHsKCWZvcmVhY2ggJGFkYXRhIChAeyRkYXRheyRhZ3JvdXB9fSl7CgoJCWZvcmVhY2ggKEB7JGFkYXRhLT57J0tvbW1lbnRhcid9fSkge3ByaW50IERBVEFGSUxFfTsKCgkJcHJpbnRmIERBVEFGSUxFICIlc1x0JXNcdCVzXHQlc1x0JXNcdCVzXG4iLAoJCQkkYWRhdGEtPnsnR3J1cHBlJ30sCgkJCSRhZGF0YS0+eydMZXZlbCd9LAoJCQkkYWRhdGEtPnsnU3RpbCd9LAoJCQkkYWRhdGEtPnsnVGV4dCd9LAoJCQkkYWRhdGEtPnsnTGluayd9LAoJCQkkYWRhdGEtPnsnQmVzY2hyZWlidW5nJ30KCQkJOwoJfSAjIGZvcmVhY2ggYWRhdGEKfSAjIGZvcmVhY2ggZ3JvdXAKCmNsb3NlIERBVEFGSUxFOwpwcmludCBWRVJCT1NFT1VUICIuXG4iIGlmICR2ZXJib3NlOwp9ICN3cml0ZXNpdGUKCnN1YiBiYXNlbGlua3MgewpwcmludCBWRVJCT1NFT1VUICJBbnBhc3N1bmcgZGVyIExpbmtzLCB3ZW5uIGRpZSBTaXRlbWFwIG5pY2h0IGluIFNpdGVyb290IGlzdCIgaWYgJHZlcmJvc2U7CiMgTmFjaGRlbSBkYXMgRGF0YWZpbGUgZ2VzY2hyaWViZW4gaXN0LCB3ZXJkZW4gZGllIExpbmtzCiMgdmVyYWVuZGVydCwgZGFtaXQgZGllIFNpdGVtYXAgYXVjaCBhbiBlaW5lciBhbmRlcmVuIFN0ZWxsZSAKIyBhbHMgZGVyIHNpdGVyb290IHN0ZWhlbiBrYW5uLgpmb3JlYWNoICRhZ3JvdXAgKGtleXMgJWRhdGEpIHsKCWZvcmVhY2ggJGFkYXRhIChAeyRkYXRheyRhZ3JvdXB9fSl7CgkJaWYgKCBub3QgJGFkYXRhLT57J0xpbmsnfSA9fiAvXmh0dHAvaSAgKSB7CgkJCSRhZGF0YS0+eydMaW5rJ30gPX4gcy8kdXJsbWF0Y2gvJHVybHJlcGxhY2UvICA7CgkJfQoJfSAjIGZvcmVhY2ggYWRhdGEKfSAjIGZvcmVhY2ggZ3JvdXAKcHJpbnQgVkVSQk9TRU9VVCAiLlxuIiBpZiAkdmVyYm9zZTsKfQoKc3ViIHJlYWRoZWFkZXIgewpwcmludCBWRVJCT1NFT1VUICJGZWhsZW5kZSBUZXh0ZSBhdXMgZGVuIGh0bWwtSGVhZGVybiBhdXNsZXNlbiIgaWYgJHZlcmJvc2U7CiMgSmVkZSBEYXRlaSB3aXJkIGdlcHJ1ZWZ0LCB3ZW5uIHNjaG9uIGVpbiBUZXh0IHZvcmxpZWd0CiMgd2lyZCBlciB2ZXJ3ZW5kZXQsIHNvbnN0IHNjaGF1dCBtYW4gbmFjaCBkZW0gVGl0ZWwgZGVyIGh0bWwtZGF0ZWkuCiMgdW5kIGluIGRlbiA8TWV0YSBuYW1lPSJ0aXRsZSIgY29udGVudD0iWFhYWCI+IGVpbnRyYWcgaW0gSGVhZGVyCiMgQWxsIGRhcyBmdW5rdGlvbmllcnQgbmljaHQgZ3V0LCB3ZWlsIGdlbWlzY2h0IHZvcmhhbmRlbmUgRWxlbWVudGUKIyBuaWNodCBnZXBydWVmdCB3ZXJkZW4gdW5kIGZ1ZXIgZGllIG5ldWVuIERhdGVpZW4ga2VpbmUgSW5mb3MKIyBhdWZnZW5vbW1lbiB3ZXJkZW4KZm9yZWFjaCAkZmlsZSAoQGZpbGVzKSB7CgoJZm9yZWFjaCAkYWRhdGEgKEB7JGRhdGFmaWxlc3skZmlsZX17J1JlZid9fSl7CgkJaWYgKCBub3QgZXhpc3RzKCRhZGF0YS0+eydUZXh0J30pCgkJCQlvciAoJGFkYXRhLT57J1RleHQnfSBlcSAiIiApKSB7CgkJCgkJCSMgRWluZW4gUGFyc2VyIG9lZmZuZW4gdW5kIGRlbiBIZWFkZXIgZGVyIERhdGVpIGxlc2VuCgkJCSMgdmllbGxlaWNodCBmaW5kZW4gd2lyIGphIGRhIGVpbmVuIFRleHQgenVtIEVpbnRyYWcKCQkJCgkJCSRwID0gSFRNTDo6SGVhZFBhcnNlci0+bmV3OwoJCQlvcGVuIChteSAkZmgsICI8OnV0ZjgiLCRmaWxlKSBvciBkaWUgIkthbm4gJGZpbGUgbmljaHQgb2VmZm5lbiI7CgkJCSRwLT5wYXJzZV9maWxlKCRmaCk7CgoJCQkkdGl0bGUgPSAkcC0+aGVhZGVyKCdUaXRsZScpOwoJCQlpZiAobm90IGRlZmluZWQgJHRpdGxlKSB7JHRpdGxlID0gJHAtPmhlYWRlcignWC1NZXRhLXRpdGxlJykgfQoJCQlpZiAobm90IGRlZmluZWQgJHRpdGxlKSB7JHRpdGxlID0gIiIgfQoJCQljbG9zZSAoJGZoKTsKCgkJCSMgRWluZSBrdXJ6ZSBCZW1lcmt1bmcgenVtIFRoZW1hIFVuaWNvZGU6CgkJCSMgRGEgc2l0ZS5kYXRhIHVuZCBkaWUgbWFwXyouaHRtbCBpbiBVVEY4IHNpbmQKCQkJIyB1bmQgYWxsZSBhbmRlcmVuIGVpbmdlbGVzZW5lbiBTZWl0ZW4gaW4gdXRmOCBvZGVyIDg4NTktMQoJCQkjIG1hY2h0IHBlcmwgYWxsZSBLb252ZXJzaW9uZW4gYXV0b21hdGlzY2guIERpZXMgd2lyZAoJCQkjIHNjaGllZmdlaGVuLCBzb2JhbGQgamVtYW5kIHNpY2ggbmljaHQgYW4gZGllIGVuY29kaW5ncyBoYWVsdAoJCQkjIG9kZXIgZWluZSBFdXJvIGluIGRlbiBVZWJlcnNjaHJpZnRlbiBoYWJlbiB3aWxsLgoJCQkjb3BlbiAobXkgJGZoLCAiPCIsJGZpbGUpIG9yIGRpZSAoIktvbm50ZSAkZmlsZSBuaWNodCBvZWZmbmVuLlxuIik7CgkJCSNlaW4gdmVyc3VjaCBtaXQgVW5pY29kZQoJCQkjJHR5cGUgPSAkcC0+aGVhZGVyKCdDb250ZW50LVR5cGUnKTsKCQkJI2lmIChub3QgZGVmaW5lZCAkdHlwZSkgeyR0eXBlID0gIk5vdCBkZWZpbmVkIiB9CgkJICAgICN1bmxlc3MgKCR0eXBlID1+IC9jaGFyc2V0PVVURi04L2kpIHsKCQkJIwlpZiAoJGRlYnVnKSB7cHJpbnQgREVCVUdPVVQgJGZpbGUuIlx0Ii4kdHlwZS4iXHQifTsKCQkJIwlpZiAoJGRlYnVnKSB7cHJpbnQgREVCVUdPVVQgJHRpdGxlLiJcdCJ9OwoKCQkJIwkjJHRpdGxlID1+IHMv/C8mdXVtbDsvOwoJCQkjCSMkdGl0bGUgPX4gcy/cLyZVdW1sOy87CgkJCSMJIyR0aXRsZSA9fiBzL/YvJm91bWw7LzsKCQkJIwkjJHRpdGxlID1+IHMv1i8mT3VtbDsvOwoJCQkjCSMkdGl0bGUgPX4gcy/kLyZhdW1sOy87CgkJCSMJIyR0aXRsZSA9fiBzL8QvJkF1bWw7LzsKCQkJIwkjJHRpdGxlID1+IHMv3y8mc3psaWc7LzsKCQkJIwlpZiAoJGRlYnVnKSB7cHJpbnQgREVCVUdPVVQgJHRpdGxlfTsKCQkJIwlpZiAoJGRlYnVnKSB7cHJpbnQgREVCVUdPVVQgIlxuIn07CgkJCSN9CgkJCSNjbG9zZSAkZmg7CgoJCQkkYWRhdGEtPnsnVGV4dCd9ID0gJHRpdGxlOwoJCX0KCX0gIyBmb3JlYWNoIGFkYXRhCn0gIyBmb3JlYWNoIGZpbGUKCnByaW50IFZFUkJPU0VPVVQgIi5cbiIgaWYgJHZlcmJvc2U7Cn0gI3JlYWRoZWFkZXIKCgpzdWIgbWFrZXNpdGVtYXAgeyAKCnN1YiB3cml0ZW1hcGdyb3VwIHsKCm15ICgkYWdyb3VwLCRsZXZlbCkgPSBAXzsKCm15ICRpbnRybyA9ICIiOwoJCQoKIyBzb2xsIGRpZSBHcnVwcGUgdWViZXJoYXVwdCBhdXNnZWdlYmVuIHdlcmRlbj8KaWYgKCgkYWdyb3VwLT57J0xldmVsJ308PSRzaXRlbWFwbGV2ZWwpYW5kICgkYWdyb3VwLT57J0Jlc2NocmVpYnVuZyd9IG5lICRub3Nob3cpKSB7Cglmb3IgKCRpPTI7JGk8JGxldmVsOyRpKyspIHsgJGludHJvIC49ICJcdCIgfTsKCgkjIEZ1ZXIgamVkZSBHcnVwcGUgZWluZW4gTGluaywgd2VubiBlcyBkYXMgb2JlcnN0ZSBMZXZlbCBpc3QKCWlmICgkbGV2ZWwgPT0gMikgewoJCXByaW50ZiBPVVRGSUxFICJcbiRpbnRybzxhIG5hbWU9XCIlc1wiPjwvYT5cbiIsJGFncm91cC0+eydMaW5rJ307Cgl9CgkJCQoJIyBGdWVyIGplZGUgR3J1cHBlIGVpbmUgVWViZXJzY2hyaWZ0LCB3ZW5uIG5pY2h0IGxlZXIKCWlmICgkYWdyb3VwLT57J1RleHQnfSBuZSAnJykgewoJCXByaW50ZiBPVVRGSUxFICJcbiRpbnRybzxoJGxldmVsPiVzICIsCgkJCQkkYWdyb3VwLT57J1RleHQnfTsKCQlpZiAoJGxldmVsID09IDIpIHsgcHJpbnRmIE9VVEZJTEUgIjxhIGhyZWY9JyNUb3AnPl48L2E+IjsgfQoJCXByaW50ZiBPVVRGSUxFICI8L2gkbGV2ZWw+XG4iOwoJfQoJCQkKCSMgRnVlciBqZWRlIEdydXBwZSBlaW5lbiBCZXNjaHJlaWJ1bmdzdGV4dAoJaWYgKCRhZ3JvdXAtPnsnQmVzY2hyZWlidW5nJ30gbmUgJycpIHsKCQlwcmludGYgT1VURklMRSAiJGludHJvJXNcbiIsICRhZ3JvdXAtPnsnQmVzY2hyZWlidW5nJ307Cgl9CgoJCgkjIHVuZCBqZXR6dCBlaW5lIExpc3RlCglpZiAoJGFncm91cC0+eydMaW5rJ30gbmUgJycpIHsKCQlwcmludCBPVVRGSUxFICIkaW50cm88dWw+XG4iOwoJCSMgdW5kIGpldHp0IGRpZSBFbGVtZW50ZSBkZXIgR3J1cHBlCgkJZm9yZWFjaCAkYWRhdGEgKEB7JGRhdGF7JGFncm91cC0+eydMaW5rJ319fSl7CgkJCWlmICgoJGFkYXRhLT57J0xldmVsJ308PSRzaXRlbWFwbGV2ZWwpIAoJCQkJCWFuZCAoJGFkYXRhLT57J0Jlc2NocmVpYnVuZyd9IG5lICRub3Nob3cpKSB7CgkJCQkJCgkJCQkjIEVpbmUgR3J1cHBlIGFscyBMaW5rIC0+IFVudGVyZ3J1cHBlCgkJCQlpZiAoJGFkYXRhLT57J0xpbmsnfSAhfiAvXmh0dHB8XC4vKSB7CgkJCQkJcHJpbnRmIE9VVEZJTEUgIiRpbnRybzxsaT4gIjsKCQkJCQkmd3JpdGVtYXBncm91cCAoJGFkYXRhLCRsZXZlbCsxKTsKCQkJCQlwcmludGYgT1VURklMRSAiJGludHJvPC9saT5cbiIsCgkJCQl9CgkJCQkjIEtlaW5lIFVudGVyZ3J1cHBlIAoJCQkJZWxzZSB7CgkJCQkJIyB3ZW5uIGtlaW4gVGV4dCBkZWZpbmllcnQgaXN0LCB3aXJkIFBmYWQrRGF0ZWkgdmVyd2VuZGV0CgkJCQkJcHJpbnRmIE9VVEZJTEUgIiRpbnRybzxsaT4gPGEgaHJlZj1cIiVzXCI+ICVzIDwvYT5cbiRpbnRyb1x0JXMgPC9saT5cbiIsCgkJCQkgICAgICAgCSRhZGF0YS0+eydMaW5rJ30sCgkJCQkgICAgICAgCSgkYWRhdGEtPnsnVGV4dCd9IG5lICIiKT8gJGFkYXRhLT57J1RleHQnfTokYWRhdGEtPnsnTGluayd9LAoJCQkJICAgICAgIAkoJGFkYXRhLT57J0Jlc2NocmVpYnVuZyd9IG5lICIiKT8KCQkJCQkJCQkkYWRhdGEtPnsnQmVzY2hyZWlidW5nJ306IiAiOwoJCQkJfQoJCQl9CgkJfSAjIGZvcmVhY2ggYWRhdGEKCQlwcmludGYgT1VURklMRSAiJGludHJvPC91bD4iOwoJfQoKCQoKfSAjIHNpdGVtYXBsZXZlbAoKfSAjIHN1YiB3cml0ZW1hcGdyb3VwCgoJCQpwcmludCBWRVJCT1NFT1VUICJEaWUgU2l0ZW1hcChzKSB3ZXJkZW4gZ2VzY2hyaWViZW46ICIgaWYgJHZlcmJvc2U7CiMgTnVuIHdlcmRlbiBkaWUgQXVzZ2FiZS1odG1sIERhdGVpZW4gZ2VzY2hyaWViZW4uCmZvcmVhY2ggJGF0eXBlIChAeyRkYXRheydwZXJsLXNpdGVtYXAnfX0pIHsKCSRvdXRmaWxlID0gJGF0eXBlLT57J1RleHQnfTsKCSMkc2l0ZW1hcHN0aWwgPSAkYXR5cGUtPnsnU3RpbCd9OwoJJHNpdGVtYXBsZXZlbCA9ICRhdHlwZS0+eydMZXZlbCd9OwoJJHNpdGVtYXB0aXRsZSA9ICRhdHlwZS0+eydCZXNjaHJlaWJ1bmcnfTsKCSRrYXRvID0gJGF0eXBlLT57J0xpbmsnfTsKICAgIHByaW50IFZFUkJPU0VPVVQgJG91dGZpbGUgaWYgJHZlcmJvc2U7CglvcGVuIChPVVRGSUxFLCAnPjp1dGY4Jywkb3V0ZmlsZSkgb3IgZGllICJLYW5uICRvdXRmaWxlIG5pY2h0IG9lZmZuZW4iOwoJJERhdHVtID0gc3RyZnRpbWUgIiVBLCAlZC4gJUIgJVkgJUg6JU06JVMiLCBsb2NhbHRpbWUoIHRpbWUpOwoKCSRzaXRlbWFwa29wZiA9IDw8RU9UOwo8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+CjxodG1sIGxhbmc9ImRlIj4KPGhlYWQ+Cgk8dGl0bGU+JHNpdGVtYXB0aXRsZTwvdGl0bGU+Cgk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgLz4KCTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ic3R5bGVzL2RlLmNzcyIgbWVkaWE9InNjcmVlbiIgdHlwZT0idGV4dC9jc3MiIC8+Cgk8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InN0eWxlcy9kZV9wcmludC5jc3MiIG1lZGlhPSJwcmludCIgdHlwZT0idGV4dC9jc3MiIC8+Cgk8bGluayByZWw9InN0eWxlc2hlZXQiIHRpdGxlPSJtaXQgTmF2YmFyIiBocmVmPSJzdHlsZXMvZGVfbmF2YmFyLmNzcyIgbWVkaWE9InNjcmVlbiIgdHlwZT0idGV4dC9jc3MiIC8+Cgk8bGluayByZWw9ImFsdGVybmF0ZSBzdHlsZXNoZWV0IiB0aXRsZT0ib2huZSBOYXZiYXIiIG1lZGlhPSJzY3JlZW4iIGhyZWY9InN0eWxlcy9kZV9ub25hdmJhci5jc3MiIHR5cGU9InRleHQvY3NzIiAvPgoJPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KCTxtZXRhIG5hbWU9InZlcnNpb24iIGNvbnRlbnQ9IiRvdXRmaWxlLFYkVmVyc2lvbiAkRGF0dW0gJEVOVnsnVVNFUk5BTUUnfSIgLz4KCTxtZXRhIG5hbWU9ImF1dGhvciIgY29udGVudD0iJEVOVnsnVVNFUk5BTUUnfSIgLz4KCTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgICAgCS8qPCFbQ0RBVEFbKi8KICAgICAgICAJPCEtLQogICAgICAgIAlcQGltcG9ydCB1cmwoInN0eWxlcy9pbnN0X2RlLmNzcyIpOwogICAgICAgIAktLT4KICAgICAgICAJLypdXT4qLwogICAgICAgIDwvc3R5bGU+CiAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaHR0cDovL3d3dy5vcGVub2ZmaWNlLm9yZy9icmFuZGluZy9jc3MvcHJpbnQuY3NzIiBtZWRpYT0icHJpbnQiIC8+CiAgICAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiBocmVmPSJodHRwOi8vd3d3Lm9wZW5vZmZpY2Uub3JnL2Zhdmljb24uaWNvIiAvPgoKCTxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSJPcGVuT2ZmaWNlLm9yZywgT3BlbiBPZmZpY2UsIE9wZW5PZmZpY2UsIG9wZW5vZmZpY2UsIFN0YXJPZmZpY2UsIFN0YXIgT2ZmaWNlLCBPT28sIG9vbywgeG1sLCBvcGVuIHNvdXJjZSwgZGV2ZWxvcGVyLCBVTk8iIC8+Cgk8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iZGUuT3Blbk9mZmljZS5vcmc6IFNpdGVtYXAiIC8+Cgo8IS0tID4KCUtvbW1lbnRhcmUgenVyIFNlaXRlCglBY2h0dW5nOiBEaWVzZSBTZWl0ZSB3aXJkIGF1dG9tYXRpc2NoIG1pdCBkZW0gU2tyaXB0IG1ha2VtYXAucGwgZXJ6ZXVndC4KCVNpZSBrYW5uIHp3YXIgZGlyZWt0IHZlcuRuZGVydCB1bmQga29ycmlnaWVydCB3ZXJkZW4sIGFsbGVyZGluZ3MgZ2VoZW4KCcRuZGVydW5nZW4sIGRpZQluaWNodCBhdWNoIGluIGRlciBGbGF0dGV4dCBEYXRlbmJhbmsgc2l0ZS5kYXRhIGVpbmdlcGZsZWd0Cgl3ZXJkZW4sIGJlaW0gbuRjaHN0ZW4g/GJlcnNjaHJlaWJlbiB2ZXJsb3Jlbi4gSW0gWndlaWZlbHNmYWxsIGJpdHRlIGF1ZgoJZGV2ZGUgdW0gZGllIMRuZGVydW5nIGJpdHRlbi4KCVwkSWQ6IG1ha2VtYXAucGwsdiAxLjggMjAwNi8wOC8xNSAwNjo1MjoyNyBtYXJrb21sbSBFeHAgJAo8IC0tPgoKCgo8L2hlYWQ+Cjxib2R5PgoKCjxhIG5hbWU9IlRvcCI+PC9hPgo8ZGl2IGlkPSJib2R5MiI+Cjx0YWJsZSBpZD0ibWFpbjIiIHN1bW1hcnk9ImJvZHkyIj4KPHRyPgo8dGQgaWQ9ImJvZHkydGQiPgo8ZGl2IGlkPSJib2R5MmNvbCI+Cgo8ZGl2IGlkPSJ0b3B0YWJzMiI+CgpFT1QKCiRzaXRlbWFwZnVzcyA9IDw8RU9UMjsKCgo8cD4KICAgIDxhIGhyZWY9Imh0dHA6Ly92YWxpZGF0b3IudzMub3JnL2NoZWNrP3VyaT1yZWZlcmVyIj48aW1nCiAgICAgICAgc3JjPSJodHRwOi8vd3d3LnczLm9yZy9JY29ucy92YWxpZC14aHRtbDEwIgogICAgICAgIGFsdD0iVmFsaWQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbCIgaGVpZ2h0PSIzMSIgd2lkdGg9Ijg4IiAvPjwvYT4KPC9wPgo8L2Rpdj4KPC9ib2R5Pgo8L2h0bWw+CkVPVDIKCglwcmludCBPVVRGSUxFICRzaXRlbWFwa29wZjsKCSMgdWViZXIgYWxsZSBHcnVwcGVuIGluIGRlciBLYXRlZ29yaWUKCSMgRWluZSBMaW5rbGlzdGUgenUgZGVuIEdydXBwZW4gc3RlaHQgYW0gQW5mYW5nLgoJcHJpbnQgT1VURklMRSAiXG48dWw+IjsKCWZvcmVhY2ggJGFncm91cCAoQHskZGF0YXska2F0b319KSB7CgkJaWYgKCgkYWdyb3VwLT57J0xldmVsJ308PSRzaXRlbWFwbGV2ZWwpIAoJCQkJCWFuZCAoJGFncm91cC0+eydCZXNjaHJlaWJ1bmcnfSBuZSAkbm9zaG93KSl7CgkJCXByaW50ZiBPVVRGSUxFICJcbjxsaT48YSBocmVmPVwiIyVzXCI+JXM8L2E+PC9saT4iLAoJCQkJCSRhZ3JvdXAtPnsnTGluayd9LAoJCQkJCSRhZ3JvdXAtPnsnVGV4dCd9OwoJCX0KCX0KCXByaW50IE9VVEZJTEUgIlxuPC91bD5cbjwvZGl2PlxuPGJyIC8+PGJyIC8+IjsKCXByaW50IE9VVEZJTEUgJzxociBub3NoYWRlPSJub3NoYWRlIiBzaXplPSIxIiAvPic7CglwcmludCBPVVRGSUxFICJcbjwvZGl2PlxuPC90ZD5cbjwvdHI+XG48L3RhYmxlPiI7CgoKCgkjIERhbm4gZm9sZ3QgZGllIFNlaXRlbnVlYmVyc2NocmlmdAoJcHJpbnQgT1VURklMRSAiXG48aDE+JHNpdGVtYXB0aXRsZTwvaDE+XG4iOwoKCgkKCSMgSmV0enQgd2lyZCBHcnVwcGVud2Vpc2UgZ2VzY2hyaWViZW4KCSMgd29iZWkgamVkZXIgR3J1cHBlIHZvbiBlaW5lciBaZWlsZSBtaXQgZGVyCgkjIFJpY2h0aWdlbiBLYXRlZ29yaWUgcmVmZXJlbnppZXJ0IHdpcmQKCWZvcmVhY2ggJGFncm91cCAoQHskZGF0YXska2F0b319KSB7CiAgICAJJndyaXRlbWFwZ3JvdXAgKCRhZ3JvdXAsMik7Cgl9IAoKCXByaW50IE9VVEZJTEUgJHNpdGVtYXBmdXNzOwoJY2xvc2UgT1VURklMRTsKICAgIHByaW50IFZFUkJPU0VPVVQgIiwgIiBpZiAkdmVyYm9zZTsKfSAjIGZvcmVhY2ggcGVybC1zaXRlbWFwCgpwcmludCBWRVJCT1NFT1VUICIuXG4iIGlmICR2ZXJib3NlOwp9ICNtYWtlc2l0ZW1hcAoKCgpzdWIgbWFrZW5hdmJhciB7IAoKc3ViIHdyaXRlbmF2Z3JvdXAgewoKbXkgKCRhZ3JvdXAsJGxldmVsLCRhdXN3YWhsKSA9IEBfOwoKbXkgJGludHJvID0gIiI7CgkJCgojIHNvbGwgZGllIEdydXBwZSB1ZWJlcmhhdXB0IGF1c2dlZ2ViZW4gd2VyZGVuPwppZiAoJGFncm91cC0+eydMZXZlbCd9PD0kbmF2YmFybGV2ZWwpIHsKCWZvciAoJGk9MTskaTwkbGV2ZWw7JGkrKykgeyAkaW50cm8gLj0gIiAgIiB9OwoKCSMgZGllIGxpc3RlIG9lZmZuZW4KCWlmICgkbGV2ZWwgPT0gMSkgewoJCXByaW50IE9VVEZJTEUgIiRpbnRybzx1bCBpZD1cIiRuYXZiYXJzdGlsXCI+XG4iOwoJCSNVZWJlcnNjaHJpZnQgZGVyIGdlc2FtdGVuIE5hdmJhcgoJCXByaW50IE9VVEZJTEUgIiRpbnRybyAgICA8bGk+PGRpdiA+ZGUtbGlua3M8L2Rpdj48L2xpPlxuIjsKCX0KCWVsc2lmICgkbGV2ZWwgPiAyICkgewoJCSMgRnVlciBqZWRlIEdydXBwZSBlaW5lIFVlYmVyc2NocmlmdCwKCQkjIEluIExldmVsPTIgaXN0IGVzIGVpbmUgUHNldWRva2F0ZWdvcmllLAoJCSMgZGllIG51ciBlaW5lIEF1c3dhaGwgYXVzIGVpbmVyIEthdGVnb3JpZSBkYXJzdGVsbGVuCgkJaWYgKCRhZ3JvdXAtPnsnVGV4dCd9IG5lICcnKSB7CgkJCXByaW50ZiBPVVRGSUxFICIkaW50cm88bGk+JXNcbiIsICRhZ3JvdXAtPnsnVGV4dCd9OwoJCX0KCQlwcmludCBPVVRGSUxFICIkaW50cm8gIDx1bD5cbiI7Cgl9CgoJIyB1bmQgamV0enQgZWluZSBMaXN0ZQoJaWYgKCRhZ3JvdXAtPnsnTGluayd9IG5lICcnKSB7CgkJZm9yZWFjaCAkYWRhdGEgKEB7JGRhdGF7JGFncm91cC0+eydMaW5rJ319fSl7CgkJCWlmICgkYWRhdGEtPnsnTGV2ZWwnfTw9JG5hdmJhcmxldmVsKXsKCQkJCQkKCQkJCSMgRWluZSBHcnVwcGUgYWxzIExpbmsgLT4gVW50ZXJncnVwcGUKCQkJCWlmICgkYWRhdGEtPnsnTGluayd9ICF+IC9eaHR0cHxcLi8pIHsKCQkJCQkJCgkJCQkJIyBFcyBnaWJ0IHp3ZWkgTW9lZ2xpY2hrZWl0ZW4KCQkJCQkjIGVudHdlZGVyIHNvbGwgd2lya2xpY2ggZGllIGdlc2FtdGUgR3J1cHBlIGF1c2dlZ2ViZW4KCQkJCQkjIHdlcmRlbiBvZGVyIGVzIHNvbGwgbnVyIGVpbiBlbGVtZW50IGRlciBHcnVwcGUKCQkJCQkjIGF1c2dlZ2ViZW4gd2VyZGVuLCBkZXIgUmVzdCBudXIgbWl0IGVpbmVtIExpbmsgYXVmCgkJCQkJIyBlaW5lIFVFYmVyc2ljaHRzc2VpdGUKCQkJCQlpZiAoJGF1c3dhaGwgZXEgJycpIHsKCQkJCQkJIyAxYSkgZ2VzYW10ZSBHcnVwcGUsIGtlaW5lIDIuRWJlbmUgYXVzZ2V3YWVobHQsIGRlc2hhbGIgYWxsZQoJCQkJCQkmd3JpdGVuYXZncm91cCAoJGFkYXRhLCRsZXZlbCsxLCRhZGF0YS0+eydTdGlsJ30pOwoJCQkJCX0KCQkJCQllbHNpZiAoJGF1c3dhaGwgZXEgJGFkYXRhLT57J0xpbmsnfSApIHsKCQkJCQkJIyAxYikgZ2VzYW10ZSBHcnVwcGUgZGllIGRlciBnZXdhZWhsZW4gMi4gRWJlbmUgZW50c3ByaWNodAoJCQkJCQkmd3JpdGVuYXZncm91cCAoJGFkYXRhLCRsZXZlbCsxLCRhZGF0YS0+eydTdGlsJ30pOwoJCQkJCX0gZWxzZSB7CgkJCQkJCSMgMikJCgkJCQkJCSMgQXVzZ2FiZSBhbHMgVWViZXJzY2hyaWZ0IG1pdAoJCQkJCQkjIGRlbSBlcnN0ZW4gTGluayBtaXQgcGFzc2VuZGVtIExldmVsIGluIGRlciBHcnVwcGUKCQkJCQkJZm9yZWFjaCAkYmRhdGEgKEB7JGRhdGF7JGFkYXRhLT57J0xpbmsnfX19KXsKCQkJCQkJCWlmICgoJGJkYXRhLT57J0xpbmsnfSA9fiAvXmh0dHB8XC4vKSBhbmQgCgkJCQkJCQkJCSgkYmRhdGEtPnsnTGV2ZWwnfTw9JG5hdmJhcmxldmVsKSkgewoJCQkJCQkJCXByaW50ZiBPVVRGSUxFCgkJCQkJCQkJIiRpbnRybyAgPGxpPiA8YSBocmVmPVwiJXNcIiB0aXRsZT1cIiVzXCI+ICVzIDwvYT48L2xpPlxuIiwKCQkJCSAgICAJCQkgICAJJGJkYXRhLT57J0xpbmsnfSwKCQkJCQkJCQkJKCgkYWRhdGEtPnsnQmVzY2hyZWlidW5nJ30gZXEgIiIpIG9yCgkJCQkJCQkJCSgkYWRhdGEtPnsnQmVzY2hyZWlidW5nJ30gZXEgJG5vc2hvdykpCgkJCQkJCQkJCT8gIiAiOiAkYWRhdGEtPnsnQmVzY2hyZWlidW5nJ30sCgkJCQkJCQkJIyB3ZW5uIGtlaW4gVGV4dCBkZWZpbmllcnQgaXN0LCB3aXJkIEVpbiBEdW1teSB2ZXJ3ZW5kZXQKCQkgICAgCQkJCQkgICAJKCRhZGF0YS0+eydUZXh0J30gbmUgIiIpPyAkYWRhdGEtPnsnVGV4dCd9Oic/Pz8/Pyc7CgkJCQkJCQkJbGFzdDsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCSMgS2VpbmUgVW50ZXJncnVwcGUgYWxzIExpbmssIGVzIGlzdCBlaW5lIERhdGVpIG9kZXIgVVJMIGFuZ2VnZWJlbgoJCQkJZWxzZSB7CgkJCQkJcHJpbnRmIE9VVEZJTEUKCQkJCQkiJGludHJvICA8bGk+IDxhIGhyZWY9XCIlc1wiIHRpdGxlPVwiJXNcIj4gJXMgPC9hPjwvbGk+XG4iLAoJCQkJICAgICAgIAkkYWRhdGEtPnsnTGluayd9LAoJCQkJCQkoKCRhZGF0YS0+eydCZXNjaHJlaWJ1bmcnfSBlcSAiIikgb3IKCQkJCQkJKCRhZGF0YS0+eydCZXNjaHJlaWJ1bmcnfSBlcSAkbm9zaG93KSkKCQkJCQkJPyAiICI6ICRhZGF0YS0+eydCZXNjaHJlaWJ1bmcnfSwKCQkJCQkjIHdlbm4ga2VpbiBUZXh0IGRlZmluaWVydCBpc3QsIHdpcmQgRWluIER1bW15IHZlcndlbmRldAoJCSAgICAJCSAgIAkoJGFkYXRhLT57J1RleHQnfSBuZSAiIik/ICRhZGF0YS0+eydUZXh0J306Jz8/Pz8/JzsKCQkJCQkJCgkJCQl9CgkJCX0KCQl9ICMgZm9yZWFjaCBhZGF0YQoJfQoKCQoJIyBkaWUgbGlzdGUgc2NobGllc3NlbgoJaWYgKCRsZXZlbCA9PSAxKSB7CgkJcHJpbnRmIE9VVEZJTEUgIiRpbnRybzwvdWw+XG4iOwoJfQoJZWxzaWYgKCRsZXZlbCA+IDIgKSB7CgkJIyBGdWVyIGplZGUgR3J1cHBlIGVpbmUgVWViZXJzY2hyaWZ0CgkJcHJpbnQgT1VURklMRSAiJGludHJvICA8L3VsPlxuIjsKCQlpZiAoJGFncm91cC0+eydUZXh0J30gbmUgJycpIHsKCQkJcHJpbnRmIE9VVEZJTEUgIiRpbnRybzwvbGk+XG4iOwoJCX0KCX0KCgoJCn0gIyBuYXZiYXJsZXZlbAp9ICMgc3ViIHdyaXRlbmF2Z3JvdXAKCgoJCQoJCnByaW50IFZFUkJPU0VPVVQgIkRpZSBOYXZiYXJzIHdlcmRlbiBlcnpldWd0IHVuZCBnZXNwZWljaGVydDpcbiIgaWYgJHZlcmJvc2U7CmZvcmVhY2ggJGF0eXBlIChAeyRkYXRheydwZXJsLW5hdmJhcid9fSkgewoKCSRvdXRmaWxlID0gJGF0eXBlLT57J1RleHQnfTsKICAgIHByaW50IFZFUkJPU0VPVVQgJG91dGZpbGUgaWYgJHZlcmJvc2U7CgkkbmF2YmFyc3RpbCA9ICRhdHlwZS0+eydTdGlsJ307CgkjIGhhY2s6IHVyc3By/G5nbGljaCBzb2xsdGVuIGRpZSBOYXZiYXJzIG1hbCB1bnRlcnNjaGllZGVuIHdlcmRlbgoJIyBkaWVzIHNvbGx0ZSBzaWNoIGltIFN0aWwgYXVzZHJ1ZWNrZW4KCSRuYXZiYXJzdGlsID0gJ25hdmJhcl9kZSc7CgkjIGhhY2s6ZW5kZQoJJG5hdmJhcmxldmVsID0gJGF0eXBlLT57J0xldmVsJ307CgkkbmF2YmFydGl0bGUgPSAkYXR5cGUtPnsnQmVzY2hyZWlidW5nJ307Cgkka2F0byA9ICRhdHlwZS0+eydMaW5rJ307CglvcGVuIChPVVRGSUxFLCAnPjp1dGY4JywgJG91dGZpbGUpIG9yIGRpZSAiS2FubiAkb3V0ZmlsZSBuaWNodCBvZWZmbmVuIjsKCSREYXR1bSA9IHN0cmZ0aW1lICIlQSwgJWQuICVCICVZICVIOiVNOiVTIiwgbG9jYWx0aW1lKCB0aW1lKTsKCiRuYXZiYXJrb3BmID0gPDxFT1Q7Cgk8IS0tID4KCUtvbW1lbnRhcmUgenVyIE5hdmJhciAkbmF2YmFydGl0bGUKCU1ha2VtYXB2ZXJzaW9uOgoJXCRJZDogbWFrZW1hcC5wbCx2IDEuOCAyMDA2LzA4LzE1IDA2OjUyOjI3IG1hcmtvbWxtIEV4cCAkCglOYXZiYXI6Cgkkb3V0ZmlsZSAsViAkVmVyc2lvbiAkRGF0dW0gJEVOVnsnVVNFUk5BTUUnfQoJPCAtLT4KRU9UCgokbmF2YmFyZnVzcyA9IDw8RU9UOwpFT1QKCglwcmludCBPVVRGSUxFICRuYXZiYXJrb3BmOwoKICAgICZ3cml0ZW5hdmdyb3VwICgkYXR5cGUsMSwnJyk7CgoJcHJpbnQgT1VURklMRSAkbmF2YmFyZnVzczsKCWNsb3NlIE9VVEZJTEU7CiAgICBwcmludCBWRVJCT1NFT1VUICIsICIgaWYgJHZlcmJvc2U7Cn0gIyBmb3JlYWNoIHBlcmwtbmF2YmFyCgpwcmludCBWRVJCT1NFT1VUICIuXG4iIGlmICR2ZXJib3NlOwp9ICNtYWtlbmF2YmFyCgoKc3ViIHJlYWRuYXZiYXIgewojIEVpbmxlc2VuIGRlciBOYXZiYXJzCgkJCnByaW50IFZFUkJPU0VPVVQgIkxlc2UgTmF2YmFyOlxuIiBpZiAkdmVyYm9zZTsKCmZvcmVhY2ggJGF0eXBlIChAeyRkYXRheydwZXJsLW5hdmJhcid9fSkgewoJCQoJbXkgJG5hdmZpbGUgPSAkYXR5cGUtPnsnVGV4dCd9OwoJbXkgJG5hdnN0aWwgPSAkYXR5cGUtPnsnU3RpbCd9OwogICAgcHJpbnQgVkVSQk9TRU9VVCAkbmF2ZmlsZSBpZiAkdmVyYm9zZTsKCW9wZW4gKE5BVkZJTEUsICI8OnV0ZjgiLCRuYXZmaWxlKSBvciBkaWUgIkthbm4gJG5hdmZpbGUgbmljaHQgb2VmZm5lbiI7CglOQVZSRUFEOiB3aGlsZSAoPE5BVkZJTEU+KSB7CgkJcHVzaCBAeyRuYXZiYXJ7JG5hdnN0aWx9fSwgJF87Cgl9CgljbG9zZSBOQVZGSUxFOwogICAgcHJpbnQgVkVSQk9TRU9VVCAiICIgaWYgJHZlcmJvc2U7Cn0KCnByaW50IFZFUkJPU0VPVVQgIi5cbiIgaWYgJHZlcmJvc2U7Cn0gIyByZWFkbmF2YmFyCgoKc3ViIHdyaXRlbmF2YmFyIHsKCm15IEBzb3VyY2VmaWxlOyAKbXkgQG5hdmJhciA7Cm15ICRzdGFydHBvczsgCm15ICRlbmRwb3M7Cm15ICRzdGFydG5hdmZsYWc9IHFyLzwhLS0gU3RhcnQgTmF2YmFyIC0tPi87Cm15ICRlbmRuYXZmbGFnPSBxci88IS0tIEVuZCBOYXZiYXIgLS0+LzsKCQkKIyBTY2hyZWliZW4gZGVyIE5hdmJhcnMKcHJpbnQgVkVSQk9TRU9VVCAiU2NocmVpYmUgTmF2YmFyKHMpIGluIGh0bWwtRGF0ZWllbjogXG4iIGlmICR2ZXJib3NlOwoKCkFMTEZJTEU6IGZvcmVhY2ggJGZpbGUgKEBmaWxlcykgIHsKCiAgIAlwcmludCBWRVJCT1NFT1VUICJcbiRmaWxlIiBpZiAkdmVyYm9zZTsKCSMgc29sbCB1ZWJlcmhhdXB0IGVpbmUgTmF2YmFyIGFuZ2VsZWd0IHdlcmRlbj8KCgkjIGVyc21hbCBhbGxlIEZpbGUtc3R5bGVzIHBydWVmZW4KCSRuYXZiYXJzdGlsID0gJyc7Cglmb3JlYWNoICRhZGF0YSAoIEB7JGRhdGFmaWxlc3skZmlsZX17J1JlZid9fSkgewoJCWlmICgkYWRhdGEtPnsnU3RpbCd9IG5lICcnKSB7CgkJCSRuYXZiYXJzdGlsID0gJGFkYXRhLT57J1N0aWwnfTsKCQkJbGFzdDsgCgkJfQoJfQoJCgkjIHdlbm4gZXIgaW1tZXIgbm9jaCBmZWhsdCwgZGFubiBkZW4gZXJzdGVuIGdydXBwZW5zdGlsIG5laG1lbiwgd2VubiBleGlzdGVudAoJaWYgKCRuYXZiYXJzdGlsIGVxICcnICkgewoJCSRhZGF0YSA9ICRkYXRhZmlsZXN7JGZpbGV9eydSZWYnfVswXTsKCQkkZ3J1cHBlID0gJGFkYXRhLT57J0dydXBwZSd9OwoJCWlmICgkZ3J1cHBlIG5lICR1bnNvcnRlZCkgewoJCQkkYWRhdGEgPSAkZGF0YXskZ3J1cHBlfVswXTsKCQkJJG5hdmJhcnN0aWwgPSAkYWRhdGEtPnsnU3RpbCd9OwoJCX0KCX0KCgkKCWlmICgkbmF2YmFyc3RpbCBuZSAnJyApIHsKCgkJIyBFaW5sZXNlbiBkZXIgaHRtbC1EYXRlaSBpbiBlaW4gQXJyYXkKCQlvcGVuIChIVE1MRklMRSwgIjw6dXRmOCIsJGZpbGUpIG9yIGRpZSAiS2FubiAkZmlsZSBuaWNodCBvZWZmbmVuIjsKCQlAc291cmNlZmlsZSA9ICgpOwoJCWxvY2FsICgkLykgPSAiXDAxMiI7CgkJd2hpbGUgKDxIVE1MRklMRT4pIHsKCQkJcy9cMDE1P1wwMTIvXG4vZzsKCQkJcHVzaCBAc291cmNlZmlsZSwgJF87CgkJCXByaW50IERFQlVHT1VUIGlmICgkZGVidWcpOwoJCX0KICAgIAlwcmludCBWRVJCT1NFT1VUICI8IiBpZiAkdmVyYm9zZTsKCQljbG9zZSBIVE1MRklMRTsKCgkJCgoJCSMgRmluZGVuIGRlciBTdGFydCB1bmQgRW5kcHVua3RlIGRlciBOYXZiYXIJCQoJCSRzdGFydHBvcyA9IC0xOwoJCSRlbmRwb3MgPSAtMTsKCQlmb3IgKCRpID0gMDsgJGkgPD0gJCNzb3VyY2VmaWxlOyAkaSsrKSB7CgkJCWlmICgkc291cmNlZmlsZVskaV0gPX4gLyRzdGFydG5hdmZsYWcvaWcpIHsgJHN0YXJ0cG9zID0gJGkgfQoJCQlpZiAoJHNvdXJjZWZpbGVbJGldID1+IC8kZW5kbmF2ZmxhZy9pZykgeyAkZW5kcG9zID0gJGkgfQoJCX0gCgoJCSMgRmVobGVuZGUgb2RlciBmYWxzY2hlIEVuZHB1bmt0ZT8JCQoJCXByaW50IERFQlVHT1VUICgkc3RhcnRwb3MsJyAnLCRlbmRwb3MpIGlmICRkZWJ1Zz4xOwkKCQlpZiAoKCRzdGFydHBvcyA9PSAtMSkgb3IgKCAkc3RhcnRwb3MgPj0gJGVuZHBvcykpIHtuZXh0IEFMTEZJTEU7fQoKCQkjIEFsbGUgTGlua3MgaW4gZGVyIHZvcmJlcmVpdGV0ZW4gTmF2YmFyIHNpbmQgUmVsYXRpdiB2b24gc2l0ZXJvb3QKCQkjIGRhcyBtdXNzIGdlYWVuZGVydCB3ZXJkZW4KCQlAbmF2YmFyID0gKCk7CgkJZm9yZWFjaCBteSAkTGluZSAoQHskbmF2YmFyeyRuYXZiYXJzdGlsfX0pIHsKCQkJJG5ld0xpbmUgPSAkTGluZTsKCQkJd2hpbGUgKCRuZXdMaW5lID1+IG0vaHJlZj1cIihcLlwvW14iXSopXCIvICkgewoJCQkJIyB1ZWJlciBhbGxlIF9yZWxhdGl2ZW5fIExpbmtzIGluIGRlciBOYXZiYXIKCQkJCSMgYWNodHVuZywgZGFiZWkgd2lyZCBkZXIgZnVlaHJlbmRlIFB1bmt0IAoJCQkJIyBhbHMgSW5kaWthdG9yIGZ1ZXIgZGllIGFlbmRlcnVuZyBlbnRmZXJudAoJCQkJIyBkYXMgc29sbHRlIG1pdCBcRyBub2NoIGJlc3NlciBnZWhlbiwgYWJlciB3aWU/CgkJCQkkbGluayA9ICQxOwoJCQkJcHJpbnQgREVCVUdPVVQgKCRsaW5rLCIgLT4gIikgaWYgJGRlYnVnPjE7CQoJCQkJIyBBdWZzcGFsdGVuIGluIFZlcnplaWNobmlzZWJlbmVuCiAgICAJCQlAZmlsZXRyZWUgPSBzcGxpdCAvXC8vLCRmaWxlOwoJCQkJIyBBdWZzcGFsdGVuIGluIFZlcnplaWNobmlzZWJlbmVuLCBmdWVyIGplZGVuIExpbmsKICAgIAkJCUBsaW5rdHJlZSA9IHNwbGl0IC9cLy8sJGxpbms7CgoJCQkJIyBHbGVpY2hlIEViZW5lbiBsb2VzY2hlbiwgbWluZGVzdGVucyBkZW4gUHVua3QgYmVoYWx0ZW4KCQkJCXdoaWxlICggICAgICgkI2ZpbGV0cmVlID4gMCkgCgkJCQkJCWFuZCAoJCNsaW5rdHJlZSA+IDApIAoJCQkJCQlhbmQgKCRmaWxldHJlZVsxXSBlcSAkbGlua3RyZWVbMV0pICkgewoJCQkJCXByaW50IERFQlVHT1VUICgiIC0+ICIpIGlmICRkZWJ1Zz4xOwkKCQkJCQlzcGxpY2UgQGZpbGV0cmVlLDEsMTsKCQkJCQlzcGxpY2UgQGxpbmt0cmVlLDEsMTsKCQkJCX0gCgoJCQkJI0Z1ZXIgamVkZSB2ZXJibGllYmVuZSBFYmVuZSBpbSBmaWxlIGVpbiAuLiB6dWZ1ZWdlbgoJCQkJZm9yICgxIC4uICQjZmlsZXRyZWUtMSkgewoJCQkJCXByaW50IERFQlVHT1VUICgiIC4uIC0+ICIpIGlmICRkZWJ1Zz4xOwkKCQkJCQlzcGxpY2UgQGxpbmt0cmVlLDEsMCwoJy4uJyk7CgkJCQl9CgoJCQkJIyBkZW4gUHVua3Qgd2VnCgkJCQlzaGlmdCBAbGlua3RyZWU7CgkJCQkKCQkJCSMgdW5kIHdpZWRlciB6dXNhbW1lbgoJCQkJJGxpbmtuZXcgPSBqb2luICgnLycsQGxpbmt0cmVlKTsKCQkJCXByaW50IERFQlVHT1VUICgiXG4iLCRsaW5rLCI9PiIsJGxpbmtuZXcsIlxuIikgaWYgJGRlYnVnOwkKCQkJCWlmIChsZW5ndGgoJGxpbmtuZXcpKSB7CgkJCQkJJG5ld0xpbmUgPX4gcy8kbGluay8kbGlua25ldy87CgkJCQkJcHJpbnQgREVCVUdPVVQgKCRuZXdMaW5lLCJcbiIpIGlmICRkZWJ1ZzsJCgkJCQl9CgkJCQkjIHdlbm4gZGVyIG5ldWUgTGluayBsZWVyIGlzdCwgc2luZCB3aXIgYXVmIGRlciBTZWl0ZQoJCQkJIyBEaWVzZSBzb2xsIGJlc29uZGVycyBiZWhhbmRlbHQgd2VyZGVuLCBkZXIgTGluawoJCQkJIyB2ZXJzY2h3aW5kZXQsIHN0YXR0ZGVzc2VuIG51ciBUZXh0CgkJCQllbHNlIHsKCQkJCQkkbmV3TGluZSA9fiBzL1w8YSBocmVmPVwiJGxpbmtcIiAuKj8+ICguKikgXDxcL2FcPi8kMSAvOwoJCQkJCXByaW50IERFQlVHT1VUICgkbmV3TGluZSwiXG4iKSBpZiAkZGVidWc7CQoJCQkJfQoJCQl9CgkJCXB1c2ggQG5hdmJhciwgJG5ld0xpbmU7CgkJfQoJCQoJCSMgRWluZnVlZ2VuIGRlciBOYXZiYXIgaW4gZGFzIERhdGVpYXJyYXkKICAgIAlAcmVtb3ZlZCA9IHNwbGljZSBAc291cmNlZmlsZSwkc3RhcnRwb3MrMSwkZW5kcG9zLSRzdGFydHBvcy0xLEBuYXZiYXI7CgoJCSMgd2VubiBkaWUgZW50ZmVybnRlbiBnbGVpY2ggZGVuIG5ldWVuIHNpbmQsIGJyYXVjaGVuIHdpciBkaWUgRGF0ZWkgbmljaHQKCQkjIHNjaHJlaWJlbi4KICAgIAlpZiAoJmNvbXBhcmVfbmF2YmFyKFxAcmVtb3ZlZCxcQG5hdmJhcikpIHsKICAgIAkJcHJpbnQgVkVSQk9TRU9VVCAiLT4gIiBpZiAkdmVyYm9zZTsKCQkJbmV4dCBBTExGSUxFOwoJCX0gCgkJCgoJCSMgU2NocmVpYmVuIGRlciBEYXRlaQoJCW9wZW4gKEhUTUxGSUxFLCAiPjp1dGY4IiwkZmlsZSkgb3IgZGllICJLYW5uICRmaWxlIG5pY2h0IG9lZmZuZW4iOwoJCWZvcmVhY2ggKEBzb3VyY2VmaWxlKSB7CgkJCXByaW50IEhUTUxGSUxFOwoJCX0KICAgIAlwcmludCBWRVJCT1NFT1VUICJ3PiAiIGlmICR2ZXJib3NlOwoJCWNsb3NlIEhUTUxGSUxFOwoJfSAjIGlmIGRlZmluZWQgc3RpbAp9CgpwcmludCBWRVJCT1NFT1VUICIuXG4iIGlmICR2ZXJib3NlOwoKCn0gIyB3cml0ZW5hdmJhcgoKICAgIHN1YiBjb21wYXJlX25hdmJhciB7CiAgICAgICAgbXkgKCRmaXJzdCwgJHNlY29uZCkgPSBAXzsKICAgICAgICBubyB3YXJuaW5nczsgICMgc2lsZW5jZSBzcHVyaW91cyAtdyB1bmRlZiBjb21wbGFpbnRzCiAgICAgICAgcmV0dXJuIDAgdW5sZXNzIEAkZmlyc3QgPT0gQCRzZWNvbmQ7CiAgICAgICAgZm9yIChteSAkaSA9IDQ7ICRpIDwgQCRmaXJzdDsgJGkrKykgewogICAgICAgICAgICByZXR1cm4gMCBpZiAkZmlyc3QtPlskaV0gbmUgJHNlY29uZC0+WyRpXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDE7CiAgICB9Cgo=