IyEgL3Vzci9iaW4vcGVybCAtdwoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgdnJ0MnRlaS5wbAojIGV1cmVjbwojIGxlaWJuaXotaW5zdGl0dXQgZnVlciBkZXV0c2NoZSBzcHJhY2hlIC8gY3NjIGZpbmxhbmQgZXNibwojIGF1Z3VzdCAyMDI0CiMgCiMgCiMgdXNpbmcgWE1MOjpUd2lnICwgc2VlIGh0dHA6Ly93d3cueG1sdHdpZy5vcmcvLCBodHRwczovL21ldGFjcGFuLm9yZy9wb2QvWE1MOjpUd2lnYQojIAojIHVzYWdlOiBzZWUgYmVsb3cgdGhlIHVzYWdlIGZ1Z25jdGlvbgojIFVzYWdlOiAgLi92cnQydGVpLnBsIDx2cnR4bWxmaWxlLnhtbD4gPG91dGZpbGU+CiMgICAgICAgICA8dnJ0eG1sZmlsZT46IHhtbC1pc2VkIHZydCBmaWxlCiMKIwojIFRPRE86IAojIDEgIGluc2VydCBkdGQgc3BlYywgb3IgcmVmIHRvIFRFSQoKIyAzYSByZW1vdmUgdGhlIHZydCBwb3NpdGlvbmFsIGF0dHJpYnV0ZSBjb21tZW50IGxpbmUgLyBhbGwgY29tbWVudCBsaW5lcwojIDNiIGFkZCBAaGVhZCBhbmQgQGRlcHJlbCB0byBJNSBzb3dpZSBhdWNoIEBtc2QKIyAzYyBiZWFyYmVpdHVuZyB2b24gQGhlYWQgdW5kIEBkZXByZWwgaW4gdGVpMmtvcmFweG1sIGR1cmNoIE5pbHM/CiMgM2QgYnVpbGQgMzAgYmlsbGlvbiBjb3JwdXMKCiMgNGEgdGFrZSBjYXJlIG9mIElEcwojIDRiIHNlZSB0byB0aGUgdmFsdWVzIG9mIEB4bWw6bGFuZwojIDUgYWJmYW5nZW4gdm9uIHVuZXJ3YXJ0ZXRlbiBlbGVtZW50ZW4gZGggYW5kZXJlIGFscyA8c2VudGVuY2U+IHVuZCA8cGFyYWdyYXBoPgojIDVhIHdvcnQgcmVpaGVuZm9sZ2Ugbm9jaG1hbCBjaGVja2VuCiMgNiBjaGVja3MgYW5kIGJhbGFuY2VzCiMgNyAgSG93IHRvIGVuY29kZSBLaWVsaXBhbmtraSBhbmQgTmF0aW9uYWwgTGlicmFyeSBvZiBGaW5sYW5kPyBpbiB0ZWlDb3JwdXMgSGVhZGVyCiMgOCAgY29uc3RydWN0IDxpZHNEb2M+cyBmb3IgdGhlIG1vbnRocyAob3IgZ28gZm9yIFRFSSkKIyA5ICBwYXJhbGxlbGlzYXRpb24gaW4gYmFzaCBhbmQgYXBwbGljYXRpb24gb24gc3ViIGNvcnBvcmEgb2YgS0xLCiMgMTAgIHJlLWltcGxlbWVudGF0aW9uIG9mIHRoZSBnYXdrIGNvZGUgaW4gdGhlIHBlcmwgc2NyaXB0CiMgMTIgIHJlLWltcGxlbWVudCBjcmVhdGlvbiBvZiB0ZXh0IGhlYWRlciBmcm9tIHhtbCBmaWxlIGluIGFub3RoZXIgdHdpZyAvIHBhcmFtZXRyaXplIFRFSSB2cyBJNQoKCgojcmVtZW1iZXIKI2Zvcm1hdHRlZC54bWw6MTA1NjEzOiBlbGVtZW50IHc6IHZhbGlkaXR5IGVycm9yIDogTm8gZGVjbGFyYXRpb24gZm9yIGF0dHJpYnV0ZSBkZXByZWwgb2YgZWxlbWVudCB3CiNmb3JtYXR0ZWQueG1sOjEwNTYxMzogZWxlbWVudCB3OiB2YWxpZGl0eSBlcnJvciA6IE5vIGRlY2xhcmF0aW9uIGZvciBhdHRyaWJ1dGUgaGVhZCBvZiBlbGVtZW50IHcKCgojCiMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIFhNTDo6VHdpZzsgCnVzZSBYTUw6OkdlbmVyYXRvciAnOnByZXR0eSc7ICAjIGFwcGFyZW50bHkgbm8gZWZmZWN0IHdoZW4gdXNpbmcgZmx1c2goKTsKCiAKdXNlIGxvY2FsZTsgICAgICAgICAgICAgICAgICMgZGllc2UgZHJlaSBaZWlsZW4sIGRhbWl0IFxiIGltIHJlZ2V4IG5pY2h0IFVtbGF1dGUgdW5kIN8gbWF0Y2h0Lgp1c2UgUE9TSVggcXcobG9jYWxlX2gpOyAgICAgIyB0byBiZSBhYmxlIHRvIHVzZSBzZXRsb2NhbGUoKQojc2V0bG9jYWxlKExDX0FMTCwnZGVfREUnKTsgIApzZXRsb2NhbGUoTENfQUxMLCAiZmlfRkkiKTsgIAp1c2UgdXRmODsKdXNlIG9wZW4gcXcoIDpzdGQgOmVuY29kaW5nKFVURi04KSApOwoKdXNlIFRpbWU6OlBpZWNlOwp1c2UgVGllOjpJeEhhc2g7CgoKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgY2hlY2sgZmlsZSBhcmd1bWVudHM6CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIGFyZzAgaW5maWxlOiAgIHZydC14bWwKCnVubGVzcygkQVJHVlswXSkgeyZ1c2FnZV9tZXNzYWdlKCl9IDsgIyBtaW4gYXJnMCwgdGhlIGlucHV0IGZpbGUKaWYgICAgKCRBUkdWWzFdKSB7JnVzYWdlX21lc3NhZ2UoKX07ICAjIG1heCBhcmcwLCB0aGUgaW5wdXQgZmlsZQoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgR0xPQkFMIFZBUklBQkxFUyAKIyMjIyMjIyMjIyMjIyMjIyMjIyMKCm15ICRlbmNvZGluZyA9ICJVVEYtOCI7ICAgICAgICAgICAgICAgCiNteSAkZW5jb2RpbmcgPSAiaXNvLTg4NTktMSI7ICAgICAgICAgICAgICMgZGllc2VzICRlbmNvZGluZyBpc3QgTlVSIGZ1ZXIgZGFzIG91dHB1dCBzLnUuIHR3aWcgZnVua3Rpb24KbXkgJHRleHRjb3VudGVyID0gMDsKCgoKbXkgJHR3aWc9IiI7ICAgCm15ICR0ZWlDb3JwdXNIZWFkZXJEb2M9IiI7CgojIGdsb2JhbCB2YXJpYWJsZXMgcGVydGFpbmluZyB0byB0aGUgb3JpZ2luYWwgY29ycHVzIDoKbXkgJGtpZWxpcGFua2tpQ29ycHVzID0gImtsay1maS12Mi12cnQiOwoKCgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIHJlYWQgY29ycHVzSGVhZGVyU2tlbGV0b24gZG9jdW1lbnQgYW5kIGdldCBoZWFkZXIgb3V0IG9mIGl0CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCm15ICR0ZWlDb3JwdXNIZWFkZXJEb2NUd2lnID0gbmV3IFhNTDo6VHdpZygKICAgIGtlZXBfc3BhY2VzID0+IDEsCiAgICBrZWVwX2F0dHNfb3JkZXIgPT4gMSwKICAgIGNvbW1lbnRzID0+ICdkcm9wJywKICAgICk7CgoKJHRlaUNvcnB1c0hlYWRlckRvY1R3aWctPnBhcnNlZmlsZSgidGVpQ29ycHVzSGVhZGVyU2tlbGV0b24udGVpLnhtbCIpOwpteSAkY29ycHVzSGVhZGVyID0gJHRlaUNvcnB1c0hlYWRlckRvY1R3aWctPnJvb3Q7ICAgICAgICAgICAgICAgICAgIyBnZXR0aW5nIHRoZSB0ZWlIZWFkZXIgZm9yIGNvcnB1cyBvdXQgb2YgdGhlIHRlaUNvcnB1c0hlYWRlclNrZWxldG9uIGRvY3VtZW50CgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIHJlYWQgdGV4dEhlYWRlclNrZWxldG9uIGRvY3VtZW50IGFkbiBnZXQgaGVhZGVyIG91dCBvZiBpdAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpteSAkdGVpVGV4dEhlYWRlckRvY1R3aWcgPSBuZXcgWE1MOjpUd2lnKAogICAga2VlcF9zcGFjZXMgPT4gMSwKICAgIGtlZXBfYXR0c19vcmRlciA9PiAxLAogICAgY29tbWVudHMgPT4gJ2Ryb3AnLAogICAgKTsKCiR0ZWlUZXh0SGVhZGVyRG9jVHdpZy0+cGFyc2VmaWxlKCJ0ZWlUZXh0SGVhZGVyU2tlbGV0b24udGVpLnhtbCIpOwpteSAkdGV4dEhlYWRlciA9ICR0ZWlUZXh0SGVhZGVyRG9jVHdpZy0+cm9vdDsgICAgICAgICAgICAgICAgICAgICAgIyBnZXR0aW5nIHRoZSB0ZWlIZWFkZXIgZm9yIGNvcnB1cyBvdXQgb2YgdGhlIHRlaVRleHRIZWFkZXJTa2VsZXRvbiBkb2N1bWVudAoKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgcmVhZCBpbnB1dCBWUlQtWE1MIGRvY3VtZW50CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpvcGVuKG15ICRJTiwgICI8ICRBUkdWWzBdIikgfHwgZGllKCIkMDogY2Fubm90IG9wZW4gZmlsZSBmb3IgcmVhZGluZzogJEFSR1ZbMF0iKTsgICAgICMgb3BlbiBpbnB1dCAgZmlsZSBhbmQgaW5pdGlhbGlzZSBmaWxlaGFuZGVsLCBhY3R1YWxseSBkb2VzIG5vdCBzZWVtIHRvIGJlIG5lZWRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXMgcGFyc2VmaWxlKCkgKHMuYi4pIGlzIGFwcGxpZWQgdG8gdGhlIGZpbGVuYW1lCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgICAgIE0gQSBJIE4gIAojIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgc3RhcnQgdHdpZyBmb3IgaW5wdXQgYW5kIGNhbGwgc3RhcnQgdGFnIGhhbmRsZXIgZm9yIHJvb3QgYW5kIHR3aWcgaGFuZGxlciBmb3IgZWFjaCA8dGV4dD4gaW4gdGhlIFZSVAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCiR0d2lnID0gbmV3IFhNTDo6VHdpZygKICAgIGtlZXBfc3BhY2VzID0+IDEsICAgICAgICAgICAjIGRhZHVyY2ggYXVjaCB3aGl0ZXNwYWNlcyBhbiBlaGVtZWxpZ2VuIGVsZW1lbnRncmVuemVuIGltIG91dHB1dAogICAga2VlcF9hdHRzX29yZGVyID0+IDEsICAgICAgICMgcmVxdWlyZXMgVGllOjpJeEhhc2gKICAgIGNvbW1lbnRzID0+ICdkcm9wJywKICAgIHN0YXJ0X3RhZ19oYW5kbGVycyA9PiB7Cgl0ZXh0cyA9PiBzdWJ7cm9vdChAXywgJGNvcnB1c0hlYWRlcil9CiAgICB9LAogICAgdHdpZ19oYW5kbGVycyA9PiAgewojCXRleHQgPT4gXCZ0ZXh0Cgl0ZXh0ID0+ICBzdWJ7dGV4dChAXywgJHRleHRIZWFkZXItPmNvcHkpfSAgICAjICAgY29weSBtdXN0IGJlIGJlY2F1c2UgdGV4dEhlYWRlciB3aWxsIGJlIGZsdXNoZWQgd2l0aCAkdHdpZyBpbiB0aGUgPHRleHQ+IGhhbmRsZXI7CiAgICB9LAogICAgIyBkdGRfaGFuZGxlcnMgPT4gICB7ICAgICAgICMgVG9EbyBmb3IgSTUKICAgICMJXCZzZXRfZHRkOwogICAgIyB9CiAgICAKICAgIG91dHB1dF9lbmNvZGluZyA9PiAkZW5jb2RpbmcsCiAgICApOwoKJHR3aWctPnBhcnNlZmlsZSgkQVJHVlswXSk7CgoKCgoKIyMjIyMjIyMjIyMKIyBFTkQgTUFJTgojIyMjIyMjIyMjIwoKCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgICBTIFUgQiBSIE8gVSBUIEkgTiBFIFMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIHN1YiBzZXRfZHRkIFsKIyAgICBteSAkdHdpZywgJGR0ZCA9IEBfOwojICAgIG15ICRpbnRlcm5hbCA9IHFxfFxuUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiJcbiJEVEQveGh0bWwxLXN0cmljdC5kdGQifDsKIwojICAgICR0d2lnLT50d2lnX2RvY3R5cGUoJ2h0bWwnLCB1bmRlZiwgdW5kZWYsICRpbnRlcm5hbCk7CiMgICAgfQoKCgpzdWIgcm9vdCB7CiAgICBteSAoJHR3aWcsICRyb290LCAkY29ycHVzSGVhZGVyKSA9QF87CgogICAgJHJvb3QtPnNldF9naSgndGVpQ29ycHVzJyk7CiAgICAkcm9vdC0+c2V0X2F0dCgieG1sbnMiLCAnaHR0cDovL3d3dy50ZWktYy5vcmcvbnMvMS4wJyk7CgogICAgJmluc2VydENvcnB1c0hlYWRlcigkcm9vdCwgJGNvcnB1c0hlYWRlcik7Cn0KCgoKc3ViIGluc2VydENvcnB1c0hlYWRlcnsKICAgIG15ICgkcm9vdCwgJGNvcnB1c0hlYWRlcikgPUBfOwoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgZ2V0IHNvbWUgbWV0YWRhdGEgZm9yIHRoZSBjdXJyZW50IG91dHB1dCBjb3JwdXMgYmFzZWQgb24gc291cmNlIGFuZCB5ZWFyCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAKICAgIG15IEBhcnJheSA9IHNwbGl0KC9cLy8sICRBUkdWWzBdKTsKICAgIG15ICRsID0gc2NhbGFyKEBhcnJheSk7CiAgICBteSAkc291cmNlID0gJGFycmF5WyRsLTFdOwogICAgJHNvdXJjZSA9fiBzLyhbMC05XVswLTldWzAtOV1bMC05XSlcLnhtbCQvLzsKCiAgICBteSAkbGFuZ3VhZ2U9IkZpbm5pc2giOwogICAgbXkgJGxhbmdfdGxhPSJmaSI7CiAgICAKICAgIG15ICR5eSA9ICQxOyAgICMgJDEgbm93IGNvbnRhaW50cyBzdWJzdHJpbmcgaW4gZmlyc3QgYnJhY2tldCBpbiByZWdleCBhYm92ZQoKICAgIG15ICRjdGl0bGUgPSAkc291cmNlIC4gIiAiIC4gJHl5IC4gIiwgZnJvbSAiLiAka2llbGlwYW5ra2lDb3JwdXMgLiAiIGZvciBFdVJlQ28iOyAgICAjIHRvIGRvOiBhbHNvIGdldCBuYW1lIG9mIGNvcnB1cyAoa2xrLWZpLXYyLXZydCkKCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIHNldCBjb3JwdXMgaGVhZGVyCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgJnNldF90aXRsZSggICAgICRjb3JwdXNIZWFkZXIsICRzb3VyY2UsICR5eSwgJGtpZWxpcGFua2tpQ29ycHVzKTsKICAgICZzZXRfc291cmNlRGVzYygkY29ycHVzSGVhZGVyLCAkc291cmNlLCAkeXksICRraWVsaXBhbmtraUNvcnB1cyk7CgogICAgbXkgJHRlaUNvcnB1c0hlYWRlciAgICAgICAgPSAkY29ycHVzSGVhZGVyLT5wYXN0ZSgiZmlyc3RfY2hpbGQiLCAkcm9vdCk7Cgp9CiAgICAKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgaGFuZGxlciAmdGV4dCBmb3IgPHRleHQ+CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpzdWIgdGV4dCB7CiAgICBteSAoJHR3aWcsICR0ZXh0LCAkdGV4dEhlYWRlcikgPSBAXzsKCiAgICAkdGV4dGNvdW50ZXIrKzsgICAgICAgICAgICAgICAKCiAgICAKICAgICMgVG9EbzogY2F0Y2ggYWxsIG90aGVyLCB1bmV4cGVjdGVkIGNoaWxkcmVuIG9mIHJvb3QKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgR2V0IHRleHQgbWV0YWRhdGEgKGF0dHJpYnV0ZXMgb2YgPHRleHQ+KSBhbmQgY3JlYXRlIHRlaUhlYWRlciBmb3IgPHRleHQ+CiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgbXkgJHRleHRhdHRzcmVmID0gJHRleHQtPmF0dHMoKTsgICAgICAgICAgICAgICAjICR0ZXh0YXR0c3JlZiBpcyBub3cgYSByZWZlcmVuY2UgdG8gYSBoYXNoIGFuZCBzaG91bGQgYmUgdXNlZCB3aXRoICctPicKCgogICAgJmNyZWF0ZVRleHRIZWFkZXIoJHRleHQsICR0ZXh0YXR0c3JlZiwgJHRleHRIZWFkZXIpOwoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBjcmVhdGUgPFRFST4gZnJvbSA8dGV4dD4KICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICAjIHNldCB2cnQgPHRleHQ+IHRvIDxURUk+IGFuZCBkZWxldGUgYWxsIGF0dHJpYnV0ZXMgYWZ0ZXIgdGhleSB3ZXJlIHdlcmUgc2F2ZWQgYWJvdmUKICAgICR0ZXh0LT5kZWxfYXR0czsKICAgICR0ZXh0LT5zZXRfZ2koIlRFSSIpOwoKICAgICMgISEhISEhISEhISEhISEhISEhCiAgICAjIFRvRG86IEdlbmVyYXRlIGEgcHJvcGVyIHRleHRzaWdsZSBpbiBURUkvQHhtbDppZCB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgaW50byBhIHRleHRzaWdsZQoKICAgIAoKICAgIAogICAgCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGNyZWF0ZSB0aGUgPHRlaTp0ZXh0PiwgPGJvZHk+LCA8ZGl2PiBlbGVtZW50cyBpbnNpZGUgPFRFST4KICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAogICAgbXkgJHR0ZXh0X2VsZW1lbnQgPSBYTUw6OlR3aWc6OkVsdC0+bmV3KCd0ZXh0Jyk7CiAgICBteSAkYm9keV9lbGVtZW50ICA9IFhNTDo6VHdpZzo6RWx0LT5uZXcoJ2JvZHknKTsKICAgIG15ICRkaXZfZWxlbWVudCAgID0gWE1MOjpUd2lnOjpFbHQtPm5ldygnZGl2Jyk7CgogICAgIyBzZXQgYXR0cwogICAgJGRpdl9lbGVtZW50ICAtPnNldF9hdHQoInR5cGUiLCAicGFnZSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUb0RvOiB0aGlzIGlzIHNwZWNpZmljIHRvIEtMSwogICAgJHR0ZXh0X2VsZW1lbnQtPnNldF9hdHQoInhtbDpsYW5nIiwgJ2ZpJyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXMgaW4gSUNDLU5PUgoKICAgICMgcGFzdGUKICAgICR0dGV4dF9lbGVtZW50LT5wYXN0ZSgnbGFzdF9jaGlsZCcsICAkdGV4dCk7CiAgICAkYm9keV9lbGVtZW50IC0+cGFzdGUoJ2xhc3RfY2hpbGQnLCAgJHR0ZXh0X2VsZW1lbnQpOwogICAgJGRpdl9lbGVtZW50ICAtPnBhc3RlKCdsYXN0X2NoaWxkJywgICRib2R5X2VsZW1lbnQpOwoKICAgIAogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgY3JlYXRlIDxwPiBmcm9tIDxwYXJhZ3JhcGg+CiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICBteSBAcGFyYWdyYXBocyA9ICR0ZXh0LT5jaGlsZHJlbiggJ3BhcmFncmFwaCcpOwoKICAgIGZvcmVhY2ggbXkgJHBhcmFncmFwaCAoQHBhcmFncmFwaHMpIHsKCQoJJnNldFAoJHBhcmFncmFwaCk7CgoJJHBhcmFncmFwaC0+bW92ZSgnbGFzdF9jaGlsZCcsICRkaXZfZWxlbWVudCk7CgkKCSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCSMgY3JlYXRlIDxzPiBmcm9tIDxzZW50ZW5jZT4KCSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCQoJbXkgQHNlbnRlbmNlcyA9ICRwYXJhZ3JhcGgtPmNoaWxkcmVuKCdzZW50ZW5jZScpOwoJZm9yZWFjaCBteSAkc2VudGVuY2UgKEBzZW50ZW5jZXMpIHsKCgkgICAgJnNldFMoJHNlbnRlbmNlKTsKCgoJICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJICAgICMgY3JlYXRlIDx3PiAod29yZCkgZnJvbSBlYWNoICRsaW5lCgkgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkgICAgCgkgICAgbXkgQGxpbmVzID0gc3BsaXQoL1xuKy8sICRzZW50ZW5jZS0+eG1sX3RleHQpOwoJICAgICRzZW50ZW5jZS0+c2V0X3RleHQoIlxuIik7CgoJICAgIGZvciBteSAkbGluZSAoQGxpbmVzKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRvZG86IFJlaWhlbmZvbGdlIGNoZWNrZW4KCQlpZigkbGluZSBuZSAiIiApewoJCSAgICBteSAkd19lbGVtZW50ID0gWE1MOjpUd2lnOjpFbHQtPm5ldygndycpOwoJCSAgICAmY3JlYXRlVygkd19lbGVtZW50LCAkbGluZSk7CgkJICAgICR3X2VsZW1lbnQtPnBhc3RlKCdsYXN0X2NoaWxkJywgJHNlbnRlbmNlKTsKCQl9CgkgICAgfSAjIGVuZCB3b3JkcwoJfSAjIGVuZCBzZW50ZW5jZXMKICAgIH0gIyBlbmQgcGFyYWdyYXBocwoKICAgICMgJHR3aWctPnNldF9wcmV0dHlfcHJpbnQoICdyZWNvcmQnKTsKICAgICMgJHR3aWctPmZsdXNoKCRPVVQpOwogICAgJHR3aWctPmZsdXNoKCIvZGV2L3N0ZG91dCIpOwp9CgpzdWIgY3JlYXRlVGV4dEhlYWRlcnsKICAgIG15ICgkdGV4dCwgJHRleHRhdHRzcmVmLCAkdGV4dEhlYWRlcikgPSBAXzsKICAgIAogICAgIyBVU0UgMDEgYmluZGluZ19pZD0iMjI0NjAyNSIKICAgICMgVVNFIDAyIGRhdGU9IjIwMjEtMDEtMTUiCiAgICAjICAgICAwMyBkYXRlZnJvbT0iMjAyMTAxMTUiCiAgICAjICAgICAwNCBkYXRldG89IjIwMjEwMTE1IgogICAgIyAgICAgMDUgZWxlY19kYXRlPSJfIgogICAgIyAgICAgMDYgZmlsZT0iIgogICAgIyBVU0UgMDcgZmlsZW5hbWVfbWV0YWRhdGE9ImZpbmNsYXJpbl9zaWlydG9fazIwMjEvMDAzOS01NTUyLzIwMjEvYWx0by8yMjQ2MDI1XzAwMzktNTU1Ml8yMDIxLTAxLTE1X1NLMDIyMV9tZXRzLnhtbCIKICAgICMgVVNFIDA4IGZpbGVuYW1lX29yaWcgICAgPSJmaW5jbGFyaW5fc2lpcnRvX2syMDIxLzAwMzktNTU1Mi8yMDIxL2FsdG8vMjI0NjAyNV8wMDM5LTU1NTJfMjAyMS0wMS0xNV9TSzAyMjFfcGFnZS0yMDIxMDExNTAyMjEwMDMwMzAxLnhtbAogICAgIyBVU0UgMDkgaWQ9InQtYmNkMGYzZmEtYmJkM2RhYzQiCiAgICAjICAgICAxMCBpbWdfdXJsPSIiCiAgICAjIFVTRSAxMSBpc3N1ZV9kYXRlPSIxNS4wMS4yMDIxIgogICAgIyBVU0UgMTIgaXNzdWVfbm89IlNLMDIyMSIKICAgICMgVVNFIDEzIGlzc3VlX3RpdGxlPSJTdW9tZW4gS3V2YWxlaHRpIgogICAgIyBVU0UgMTQgbGFiZWw9IlN1b21lbiBLdXZhbGVodGkgbm8uIFNLMDIyMSAxNS4wMS4yMDIxIgogICAgIyBVU0UgMTYgbGFuZ3VhZ2U9ImZpIgogICAgIyBVU0UgMTcgcGFnZV9pZD0icDEiCiAgICAjIFVTRSAxOCBwYWdlX25vPSJOb25lIgogICAgIyAgICAgMTkgcGFydF9uYW1lPSJfIgogICAgIyAgICAgMjAgcHVibF9pZD0iMDAzOS01NTUyIgogICAgIyAgICAgMjEgcHVibF9wYXJ0PSIiCiAgICAjIFVTRSAyMiBwdWJsX3RpdGxlPSJTdW9tZW4gS3V2YWxlaHRpIiAKICAgICMgVVNFIDIzIHB1YmxfdHlwZT0iYWlrYWthdXNpIgogICAgIyBVU0UgMjQgc2VudGNvdW50PSI3MCIKICAgICMgVVNFIDI1IHN1bV9sYW5nPSJ8eHh4OjQ0fGZpbjoyM3xlbmc6M3wiCiAgICAjICAgICAyNiB0aW1lZnJvbT0iMDAwMDAwIgogICAgIyAgICAgMjcgdGltZXRvPSIyMzU5NTkiCiAgICAjIFVTRSAyOCB0b2tlbmNvdW50PSIzMDQiCiAgICAjICAgICAyOSB2ZXJzaW9uX2FkZGVkPSJLTEstZmktMjAyMSI+CgoKICAgIG15ICRCSUQgICAgICAgICAgPSAkdGV4dGF0dHNyZWYtPnsnYmluZGluZ19pZCd9OwogICAgbXkgJERBVEUgICAgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydkYXRlJ307CiAgICBteSAkTUVUQUZJTEVOQU1FID0gJHRleHRhdHRzcmVmLT57J2ZpbGVuYW1lX21ldGFkYXRhJ307ICAgIAogICAgbXkgJE9SSUdGSUxFTkFNRSA9ICR0ZXh0YXR0c3JlZi0+eydmaWxlbmFtZV9vcmlnJ307CiAgICBteSAkSUQgICAgICAgICAgID0gJHRleHRhdHRzcmVmLT57J2lkJ307CiAgICBteSAkSVNTVUVEQVRFICAgID0gJHRleHRhdHRzcmVmLT57J2lzc3VlX2RhdGUnfTsKICAgIG15ICRJU1NVRU5PICAgICAgPSAkdGV4dGF0dHNyZWYtPnsnaXNzdWVfbm8nfTsKICAgIG15ICRJU1NVRVRJVExFICAgPSAkdGV4dGF0dHNyZWYtPnsnaXNzdWVfdGl0bGUnfTsKICAgIG15ICRMQUJFTCAgICAgICAgPSAkdGV4dGF0dHNyZWYtPnsnbGFiZWwnfTsKICAgIG15ICRMQU5HVUFHRSAgICAgPSAkdGV4dGF0dHNyZWYtPnsnbGFuZ3VhZ2UnfTsKICAgIG15ICRQQUdFSUQgICAgICAgPSAkdGV4dGF0dHNyZWYtPnsncGFnZV9pZCd9OwogICAgbXkgJFBBR0VOTyAgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydwYWdlX25vJ307CiAgICBteSAkUFVCTFRJVExFICAgID0gJHRleHRhdHRzcmVmLT57J3B1YmxfdGl0bGUnfTsKICAgIG15ICRQVUJMVFlQRSAgICAgPSAkdGV4dGF0dHNyZWYtPnsncHVibF90eXBlJ307CiAgICBteSAkU0VOVENPVU5UICAgID0gJHRleHRhdHRzcmVmLT57J3NlbnRjb3VudCd9OwogICAgbXkgJFNVTUxBTkcgICAgICA9ICR0ZXh0YXR0c3JlZi0+eydzdW1fbGFuZyd9OwogICAgbXkgJFRPS0VOQ09VTlQgICA9ICR0ZXh0YXR0c3JlZi0+eyd0b2tlbmNvdW50J307CgogICAgCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgRGVyaXZlZCBNZXRhZGF0YSB2YXJpYWJsZXMKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIG15IEBkYXRlYXJyYXkgPSBzcGxpdCgiLSIsICREQVRFKTsKICAgIG15IEBsYW5nYXJyYXkgPSBzcGxpdCgifCIsICRTVU1MQU5HKTsKICAgIG15IEBuYW1lYXJyYXkgPSBzcGxpdCgvW1wuXC9dLywgJE9SSUdGSUxFTkFNRSk7ICAjIHVzZSAkbmFtZWFycmF5WzRdIGFzIElEIGZvciB0aGUgcGFnZQogICAgCgoKICAgIAogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIENSRUFURSB0ZXh0LXRlaUhlYWRlciBBQ0NPUkRJTkcgVE8gVEhFIFNLRUxFVE9OIGluICR0ZXh0SGVhZGVyCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgogICAgJHRleHRIZWFkZXItPnBhc3RlKCdmaXJzdF9jaGlsZCcsICR0ZXh0KTsKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgPHRlaUhlYWRlcj4KICAgICMgICA8ZmlsZURlc2Mgbj0iRXVSZUNvLUtMSy1GSU5fWyRJRF0iPgogICAgIyAgICAgPHRpdGxlU3RtdD4KICAgICMgICAgICAgPHRpdGxlPlskTEFCRUwsIHBhZ2UgJFBBR0VOT108L3RpdGxlPgkKCiAgICAkdGV4dEhlYWRlci0+Zmlyc3RfY2hpbGQoImZpbGVEZXNjIikgICAtPiAgc2V0X2F0dCgnbicsICJFdVJlQ28tIi4gJGtpZWxpcGFua2tpQ29ycHVzIC4gJElEKTsKICAgIAogICAgJHRleHRIZWFkZXItPmZpcnN0X2NoaWxkKCJmaWxlRGVzYyIpICAgIC0+IGZpcnN0X2NoaWxkKCJ0aXRsZVN0bXQiKS0+Zmlyc3RfY2hpbGQoInRpdGxlIikKCS0+c2V0X3RleHQoJExBQkVMIC4gIiwgVGV4dCAjIiAuICR0ZXh0Y291bnRlcik7ICAgICMgQ2FzZSBLTEs7ICBQQUdFTk8gc2NoZWludCBtZWlzdCAiTm9uZSIgenUgc2VpbgoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyA8ZmlsZURlc2M+CiAgICAjICA8c291cmNlRGVzYz4KICAgICMgICA8YmlibFN0cnVjdD4KICAgICMgICAgICA8YW5hbHl0aWM+CiAgICAjICAgICAgICAgPHRpdGxlIHR5cGU9Im1haW4iPlskTEFCRUwsIHBhZ2UgJFBBR0VOT108L3RpdGxlPgogICAgIyAgICAgICAgIDxkYXRlPlskREFURV08L2RhdGU+CiAgICAjICAgICAgICAgPGRhdGUgdHlwZT0ieWVhciI+VE9ETzwvZGF0ZT4KICAgICMgICAgICAgICA8ZGF0ZSB0eXBlPSJtb250aCI+VE9ETzwvZGF0ZT4KICAgICMgICAgICAgICA8ZGF0ZSB0eXBlPSJkYXkiPlRPRE88L2RhdGU+CiAgICAjICAgICAgICAgPGlkbm8gdHlwZT0iUEFHRUlEIj4kUEFHRUlEPC9pZG5vPgogICAgIyAgICAgICAgIDxpZG5vIHR5cGU9IkJJTkRJTkdJRCI+JEJJRDwvaWRubz4KICAgICMgICAgICAgICA8aWRubyB0eXBlPSJJRCI+JElEPC9pZG5vPgogICAgIyAgICAgICAgIDxpZG5vIHR5cGU9IktJRUxJUEFOS0tJX01FVEFGSUxFTkFNRSI+JE1FVEFGSUxFTkFNRTwvaWRubz4KICAgICMgICAgICAgICA8aWRubyB0eXBlPSJLSUVMSVBBTktLSV9PUklHRklMRU5BTUUiPiRPUklHRklMRU5BTUU8L2lkbm8+CiAgICAjICAgICAgICAgPHRleHRMYW5nPiRMQU5HVUFHRTwvdGV4dExhbmc+CgogICAgbXkgJGFuYWx5dGljICA9ICR0ZXh0SGVhZGVyLT5nZXRfeHBhdGgoIi4vZmlsZURlc2Mvc291cmNlRGVzYy9iaWJsU3RydWN0L2FuYWx5dGljIiwgMCk7CgogICAgJGFuYWx5dGljLT5maXJzdF9jaGlsZCgidGl0bGUiKSAgICAgICAgICAgICAgICAgICAgLT5zZXRfdGV4dCgkTEFCRUwgLiAiLCBUZXh0ICMiIC4gJHRleHRjb3VudGVyKTsgICAjIENhc2UgS0xLOyBQQUdFTk8gc2NoZWludCBtZWlzdCAiTm9uZSIgenUgc2VpbgogICAgJGFuYWx5dGljLT5nZXRfeHBhdGgoJy4vZGF0ZVtAdHlwZT0iZGF0ZSJdJywgICAwKSAgLT5zZXRfdGV4dCgkREFURSk7CiAgICAkYW5hbHl0aWMtPmdldF94cGF0aCgnLi9kYXRlW0B0eXBlPSJ5ZWFyIl0nLCAgIDApICAtPnNldF90ZXh0KCRkYXRlYXJyYXlbMF0pOwogICAgJGFuYWx5dGljLT5nZXRfeHBhdGgoJy4vZGF0ZVtAdHlwZT0ibW9udGgiXScsICAwKSAgLT5zZXRfdGV4dCgkZGF0ZWFycmF5WzFdKTsKICAgICRhbmFseXRpYy0+Z2V0X3hwYXRoKCcuL2RhdGVbQHR5cGU9ImRheSJdJywgICAgMCkgIC0+c2V0X3RleHQoJGRhdGVhcnJheVsyXSk7ICAgIAogICAgJGFuYWx5dGljLT5nZXRfeHBhdGgoJy4vaWRub1tAdHlwZT0iUEFHRUlEIl0nLCAgICAgICAwKSAgICAgLT5zZXRfdGV4dCgkUEFHRUlEKTsKICAgICRhbmFseXRpYy0+Z2V0X3hwYXRoKCcuL2lkbm9bQHR5cGU9IkJJTkRJTkdJRCJdJywgICAgMCkgICAgIC0+c2V0X3RleHQoJEJJRCk7CiAgICAkYW5hbHl0aWMtPmdldF94cGF0aCgnLi9pZG5vW0B0eXBlPSJJRCJdJywgICAgICAgICAgIDApICAgICAtPnNldF90ZXh0KCRJRCk7CiAgICAkYW5hbHl0aWMtPmdldF94cGF0aCgnLi9pZG5vW0B0eXBlPSJLSUVMSVBBTktLSV9NRVRBRklMRU5BTUUiXScsIDApICAgICAtPnNldF90ZXh0KCRNRVRBRklMRU5BTUUpOwogICAgJGFuYWx5dGljLT5nZXRfeHBhdGgoJy4vaWRub1tAdHlwZT0iS0lFTElQQU5LS0lfT1JJR0ZJTEVOQU1FIl0nLCAwKSAgICAgLT5zZXRfdGV4dCgkT1JJR0ZJTEVOQU1FKTsKICAgICRhbmFseXRpYy0+Zmlyc3RfY2hpbGQoJ3RleHRMYW5nJykgICAgICAgICAgICAgICAgICAgICAgICAtPnNldF90ZXh0KCRMQU5HVUFHRSk7CiAgICAKICAgICMgIDxtb25vZ3I+CiAgICAjICAgIDx0aXRsZT4kUFVCTFRJVExFPC90aXRsZT4KICAgICMgICAgPGltcHJpbnQ+CiAgICAjICAgICAgPHB1YlBsYWNlPlRPRE88L3B1YlBsYWNlPgogICAgIyAgICAgIDxwdWJsaXNoZXI+VE9ETzwvcHVibGlzaGVyPgogICAgIyAgICA8L2ltcHJpbnQ+CiAgICAjICAgIDxiaWJsU2NvcGUgdW5pdD0iSVNTVUVUSVRMRSIvPgogICAgIyAgICA8YmlibFNjb3BlIHVuaXQ9IklTU1VFTk8iLz4KICAgICMgICAgPGJpYmxTY29wZSB1bml0PSJJU1NVRURBVEUiLz4KICAgICMgICAgPGJpYmxTY29wZSB1bml0PSJwcCI+JFBBR0VOTzwvYmlibFNjb3BlPgoKICAgIG15ICRtb25vZ3IgID0gJHRleHRIZWFkZXItPmdldF94cGF0aCgiLi9maWxlRGVzYy9zb3VyY2VEZXNjL2JpYmxTdHJ1Y3QvbW9ub2dyIiwgMCk7CgogICAgJG1vbm9nci0+Zmlyc3RfY2hpbGQoInRpdGxlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+c2V0X3RleHQoJFBVQkxUSVRMRSk7CiAgICAkbW9ub2dyLT5maXJzdF9jaGlsZCgiaW1wcmludCIpLT5maXJzdF9jaGlsZCgicHViUGxhY2UiKSAgICAgICAgLT5zZXRfdGV4dCgiVG9EbyIpOyAgICAgICAgICMgaW1wcmludCBpcyBuZWVkZWQgZm9yIHRlaSB2YWxpZGl0eQogICAgJG1vbm9nci0+Zmlyc3RfY2hpbGQoImltcHJpbnQiKS0+Zmlyc3RfY2hpbGQoInB1Ymxpc2hlciIpICAgICAgIC0+c2V0X3RleHQoIlRvRG8iKTsgICAgICAgICAjIGltcHJpbnQgaXMgbmVlZGVkIGZvciB0ZWkgdmFsaWRpdHkKICAgICRtb25vZ3ItPmdldF94cGF0aCgnLi9iaWJsU2NvcGVbQHVuaXQ9IklTU1VFVElUTEUiXScsIDApICAgICAgICAtPnNldF90ZXh0KCRJU1NVRVRJVExFKTsKICAgICRtb25vZ3ItPmdldF94cGF0aCgnLi9iaWJsU2NvcGVbQHVuaXQ9IklTU1VFTk8iXScsIDApICAgICAgICAgICAtPnNldF90ZXh0KCRJU1NVRU5PKTsKICAgICRtb25vZ3ItPmdldF94cGF0aCgnLi9iaWJsU2NvcGVbQHVuaXQ9IklTU1VFREFURSJdJywgMCkgICAgICAgICAtPnNldF90ZXh0KCRJU1NVRURBVEUpOwogICAgJG1vbm9nci0+Z2V0X3hwYXRoKCcuL2JpYmxTY29wZVtAdW5pdD0icHAiXScsIDApICAgICAgICAgICAgICAgIC0+c2V0X3RleHQoJFBBR0VOTyk7ICAgICAgICAjIEFjaHR1bmcgLSBQQUdFTk8gc2NoZWludCBtZWlzdCAiTm9uZSIgenUgc2VpbgoKICAgICMgIDxlbmNvZGluZ0Rlc2M+CiAgICAjICAgIDx0YWdzRGVjbD4KICAgICMgICAgICA8bmFtZXNwYWNlIG5hbWU9Imh0dHA6Ly93d3cudGVpLWMub3JnL25zLzEuMCI+CiAgICAjICAgICAgICA8dGFnVXNhZ2UgZ2k9InMiIG9jY3Vycz0iU0VOVENPVU5UIi8+CiAgICAjICAgICAgICA8dGFnVXNhZ2UgZ2k9InciIG9jY3Vycz0iVE9LRU5DT1VOVCIvPgoKICAgICR0ZXh0SGVhZGVyLT5nZXRfeHBhdGgoJy4vZW5jb2RpbmdEZXNjL3RhZ3NEZWNsL25hbWVzcGFjZS90YWdVc2FnZVtAZ2k9InMiXScsIDApICAgICAgLT4gc2V0X2F0dCgnb2NjdXJzJywgJFNFTlRDT1VOVCk7CiAgICAkdGV4dEhlYWRlci0+Z2V0X3hwYXRoKCcuL2VuY29kaW5nRGVzYy90YWdzRGVjbC9uYW1lc3BhY2UvdGFnVXNhZ2VbQGdpPSJ3Il0nLCAwKSAgICAgIC0+IHNldF9hdHQoJ29jY3VycycsICRUT0tFTkNPVU5UKTsKCQogICAgIyAgPHByb2ZpbGVEZXNjPgogICAgIyAgICA8bGFuZ1VzYWdlPgogICAgIyAgICAgPGxhbmd1YWdlIGlkZW50PSJmaSIgdXNhZ2U9Inx4eHg6NDR8ZmluOjIzfGVuZzozfCIvPgogICAgIyAgIDwvbGFuZ1VzYWdlPgogICAgIyAgICA8dGV4dENsYXNzPgogICAgIyAgICAgIDxjbGFzc0NvZGUgc2NoZW1lPSJraWVsaXBhbmtraV9rbGsiPiRQVUJMVFlQRTwvY2xhc3NDb2RlPgogICAgIyAgICAgIDxjbGFzc0NvZGUgc2NoZW1lPSJraWVsaXBhbmtraV9rbGtfbWFwcGVkIj5UT0RPPC9jbGFzc0NvZGU+CgogICAgJHRleHRIZWFkZXItPmdldF94cGF0aCgnLi9wcm9maWxlRGVzYy9sYW5nVXNhZ2UvbGFuZ3VhZ2UnLCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXRfYXR0KCdpZGVudCcsICRMQU5HVUFHRSk7CiAgICAkdGV4dEhlYWRlci0+Z2V0X3hwYXRoKCcuL3Byb2ZpbGVEZXNjL2xhbmdVc2FnZS9sYW5ndWFnZScsIDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnNldF9hdHQoJ3VzYWdlJywgJFNVTUxBTkcpOwogICAgIyBpbiBAdXNhZ2UgbXVzcyBlaWd0LiBlaW4gaW50ZWdlcjsgYW0gYmVzdGVuIGluaGFsdCB2b24gU1VNTEFORyBhdWZkcm9lc2VsbiB1bmQgbWVocmVyZSA8bGFuZ3VhZ2U+IG1hY2hlbgoKICAgICR0ZXh0SGVhZGVyLT5nZXRfeHBhdGgoJy4vcHJvZmlsZURlc2MvdGV4dENsYXNzL2NsYXNzQ29kZVtAc2NoZW1lPSJraWVsaXBhbmtraV9rbGsiXScsIDApICAgICAgIC0+c2V0X3RleHQoJFBVQkxUWVBFKTsKICAgICR0ZXh0SGVhZGVyLT5nZXRfeHBhdGgoJy4vcHJvZmlsZURlc2MvdGV4dENsYXNzL2NsYXNzQ29kZVtAc2NoZW1lPSJraWVsaXBhbmtraV9rbGtfbWFwcGVkIl0nLCAwKS0+c2V0X3RleHQoIlRvRG8iKTsKCiAgICAjICA8cmV2aXNpb25EZXNjPgogICAgIyAgICA8Y2hhbmdlIHdoZW49IlRPRE8iIHdobz0iSEwiPlRFSSB2ZXJzaW9uIGZvciBFdVJlQ288L2NoYW5nZT4KCiAgICAkdGV4dEhlYWRlci0+Z2V0X3hwYXRoKCcuL3JldmlzaW9uRGVzYy9jaGFuZ2UnLCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+c2V0X2F0dCgnd2hlbicsIGxvY2FsdGltZS0+eW1kKCctJykpOwogICAgCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIEVORCBPRiBDUkVBVElORyBURUlIRUFERVIKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCn0KCnN1YiBzZXRQIHsKICAgIG15ICgkcGFyYWdyYXBoKSA9IEBfOwogICAgCiAgICAkcGFyYWdyYXBoLT5zZXRfZ2koJ3AnKTsKICAgIAogICAgIyA8cGFyYWdyYXBoIGlkPSJwLWJjZDBmM2ZhLWJiZDNkYWM0LTgxNWVhZDdhIiBzdW1fbGFuZz0ifGZpbjoxfCI+CiAgICAjIGF0dHMgb2YgPHBhcmFncmFwaD46CiAgICAjICAgIEBpZCAgICAgICAgVVNFCiAgICAjICAgIEBzdW1fbGFuZyAgVVNFOiBwdXQgaW4geG1sOmxhbmcgYW5kIHByZWZpeCB0aGUgdmFsdWUgd2l0aCAieC0iIGZvciBwcml2YXRlIHZhbHVlCiAgICAKICAgICRwYXJhZ3JhcGgtPnNldF9hdHQoInhtbDpsYW5nIiwgIngtIiAuICRwYXJhZ3JhcGgtPmF0dCgic3VtX2xhbmciKSk7CiAgICAkcGFyYWdyYXBoLT5kZWxfYXR0KCJzdW1fbGFuZyIpOwogICAgIyAkcGFyYWdyYXBoLT5jaGFuZ2VfYXR0X25hbWUoJ2lkJywgJ3htbDppZCcpOwogICAgJHBhcmFncmFwaC0+ZGVsX2F0dCgiaWQiKTsgICAgICAgICAgICAgICMgZGllc2UgaWQgaXN0IGF1Y2ggbmljaHQgZWluZGV1dGlnISEKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApzdWIgc2V0UyB7CiAgICBteSAoJHNlbnRlbmNlKSA9IEBfOwogICAgCiAgICAkc2VudGVuY2UtPnNldF9naSgncycpOwoJICAgIAogICAgIyB0aGUgYXR0cyBvZiA8c2VudGVuY2U+OgogICAgIyAgICBVU0UgICAxIEBpZD0icy1iY2QwZjNmYS1iYmQzZGFjNC1mNzQyOTA5MCIKICAgICMgICAgVVNFICAgMiBAbGFuZz0iZmluIiAtPiB4bWw6bGFuZyAKICAgICMgICAgPyAgICAgMyBAbGFuZ19jb25mPSIwLjY3MzQ4NTMiPiAtPiBUb0RvIEBjZXJ0ID8JICAgIAogICAgCiAgICAjIHNldCBhdHRycyBvZiA8cz4KICAgICRzZW50ZW5jZS0+c2V0X2F0dCgieG1sOmxhbmciLCAkc2VudGVuY2UtPmF0dCgibGFuZyIpKTsgICMgVG9EbzogY29udmVydCB0aGUgdmFsdWUgLyBpbnRyb2R1Y2UgYSBoYXNoIGZvciBsb29rdXAgKGlucHV0IHZhbHVlczogImZpbiIsICJ4eHgiLCAuLi4uKQogICAgIyAkc2VudGVuY2UtPmNoYW5nZV9hdHRfbmFtZSgnaWQnLCAneG1sOmlkJyk7ICAgICAgICAgICAgIyBuaWNodCBlaW5kZXV0aWcKICAgICRzZW50ZW5jZS0+ZGVsX2F0dCgnaWQnKTsKICAgICRzZW50ZW5jZS0+ZGVsX2F0dCgibGFuZyIpOyAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcGxhY2VkIGJ5IHhtbDpsYW5nCiAgICAkc2VudGVuY2UtPmRlbF9hdHQoImxhbmdfY29uZiIpOyAgICAgICAgICAgICAgICAgICAgIyBmb3IgdGhlIHRpbWUgYmVpbmcKICAgIAp9CgpzdWIgY3JlYXRlVyB7CiAgICBteSAoJHdfZWxlbWVudCwgJGxpbmUpID0gQF87CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBHZXQgdGhlIHRhZ3MgKD1jb2x1bW5zKQogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgCiAgICBteSBAdGFncyA9IHNwbGl0KC9cdC8sICRsaW5lKTsKICAgIAogICAgIyBzZXQgY29udGVudCBvZiA8dz4gaS5lLiB0aGUgdG9rZW4KICAgICR3X2VsZW1lbnQtPnNldF90ZXh0KCR0YWdzWzBdKTsKICAgIAogICAgIyB2cnQgcG9zaXRpb25hbC1hdHRyaWJ1dGVzIGluIGNvcnB1cyBLTEs6CiAgICAjICBVU0UgWzBdIHdvcmQKICAgICMgIFVTRSBbMV0gcmVmICAoaWQgZm9yIHJlZmVyZW5jZSBvZiBkZXBoZWFkKQogICAgIyAgVVNFIFsyXSBsZW1tYQogICAgIyAgPyAgIFszXSBsZW1tYWNvbXAgICAobGVtbWEgd2l0aCBjb21wb3VuZCBpbmZvIC0gY291bGQgZ28gaW4gQG5vcm0sIGFzIHRhZyBhYnVzZT8pCiAgICAjICBVU0UgWzRdIHBvcyAKICAgICMgIFVTRSBbNV0gbXNkIAogICAgIyAgVVNFIFs2XSBkZXBoZWFkCiAgICAjICBVU0UgWzddIGRlcHJlbCAKICAgICMgICAgICBbOF0gY29udGVudCAgIChvY3ItcHJvY2VzcykKICAgICMgICAgICBbOV0gdnBvcyAgICAgIChvY3ItcHJvY2VzcykKICAgICMgICAgIFsxMF0gb2NyICAgICAgIChvY3ItcHJvY2VzcykKICAgICMgICAgIFsxMV0gY2MgICAgICAgIChvY3ItcHJvY2VzcykKICAgICMgICAgIFsxMl0gaHlwaCAgICAgIChvY3ItcHJvY2VzcykKICAgICMgICAgIFsxM10gc3R5bGUgICAgIChvY3ItcHJvY2VzcykKICAgICMgICAgIFsxNF0gbGV4ICAgICAgIChrb3JwIHNlbWFudGljIGRpc2FtYmlndWF0aW9uIGZyb20gRyJvdGVib3JnKQogICAgCiAgICAjIHNldCB0aGUgYXR0cmlidXRlcyBvZiA8dz46CiAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJuIiwgICAgICAkdGFnc1sxXSk7CiAgICAjICR3X2VsZW1lbnQtPnNldF9hdHQoImlkIiwgICAgICJ3XyIgLiAkbmFtZWFycmF5WzRdIC4gJHNlbnRlbmNlLT5hdHQoInhtbDppZCIpIC4gIl8iIC4gJHRhZ3NbMV0pOwogICAgIyBzbyB6dXNhbW1lbmdlYmF1dGUgSUQgaXN0IGF1Y2ggbmljaHQgZWluZGV1dGlnLi4uCiAgICAkd19lbGVtZW50LT5kZWxfYXR0KCJpZCIpOwogICAgJHdfZWxlbWVudC0+c2V0X2F0dCgibGVtbWEiLCAgJHRhZ3NbMl0pOwogICAgIyAkd19lbGVtZW50LT5zZXRfYXR0KCJub3JtIiwgICAkdGFnc1szXSk7ICAjIHRhZyBhYnVzZSBvZiBAbm9ybQogICAgJHdfZWxlbWVudC0+c2V0X2F0dCgicG9zIiwgICAgJHRhZ3NbNF0pOwogICAgJHdfZWxlbWVudC0+c2V0X2F0dCgibXNkIiwgICAgJHRhZ3NbNV0pOwojVE1QICAgICR3X2VsZW1lbnQtPnNldF9hdHQoImhlYWQiLCAgICR0YWdzWzZdKTsKI1RNUCAgICAkd19lbGVtZW50LT5zZXRfYXR0KCJkZXByZWwiLCAkdGFnc1s3XSk7CiAgICAKfQogICAgCgpzdWIgc2V0X3RpdGxlewogICAgbXkgKCRjb3JwdXNIZWFkZXIsICRzb3VyY2UsICR5eSwgJGtpZWxpcGFua2tpQ29ycHVzKSA9IEBfOwoKICAgIG15ICRjVGl0bGVTdHJpbmcgPSAkc291cmNlIC4gIiAiIC4gJHl5IC4gIiwgZnJvbSAiLiAka2llbGlwYW5ra2lDb3JwdXMgLiAiIGZvciBFdVJlQ28iOyAgICAKCiAgICAjPHRlaUhlYWRlcj4KICAgICMgIDxmaWxlRGVzYz4KICAgICMgICAgPHRpdGxlU3RtdD4KICAgICMgICAgICA8dGl0bGU+W0FhbXVsZWh0aTIwMjFdIGZyb20gW2tsay1maS12Mi12cnQgZm9yXSBFdVJlQ288L3RpdGxlPgogICAgIyAgICA8L3RpdGxlU3RtdD4KICAgICMgICAgPCEtLSAuLi4gLS0+CiAgICAjICA8L2ZpbGVEZXNjPgogICAgIzwvdGVpSGVhZGVyPgoKICAgIG15ICRjVGl0bGVOb2RlID0gJGNvcnB1c0hlYWRlci0+Zmlyc3RfY2hpbGQoImZpbGVEZXNjIiktPmZpcnN0X2NoaWxkKCJ0aXRsZVN0bXQiKS0+Zmlyc3RfY2hpbGQoInRpdGxlIik7CgogICAgJGNUaXRsZU5vZGUtPnNldF90ZXh0KCRjVGl0bGVTdHJpbmcpOwogICAgCn0KCnN1YiBzZXRfc291cmNlRGVzY3sKICAgIG15ICgkY29ycHVzSGVhZGVyLCAkc291cmNlLCAkeXksICRraWVsaXBhbmtraUNvcnB1cykgPSBAXzsKCiAgICBteSAkY0JpYmxTdHJpbmcgPSAkc291cmNlIC4gIiAiIC4gJHl5IC4gIiwgZnJvbSAiLiAka2llbGlwYW5ra2lDb3JwdXMgLiAiIGZvciBFdVJlQ28iOyAgICAKCiAgICAjPHRlaUhlYWRlcj4KICAgICMgIDxmaWxlRGVzYz4KICAgICMgICAgPCEtLSAuLi4gLS0+CiAgICAjICAgIDxzb3VyY2VEZXNjPgogICAgIyAgICAgIDxiaWJsPltBYW11bGVodGkyMDIxXSBmcm9tIFtrbGstZmktdjItdnJ0XTwvYmlibD4KICAgICMgICAgPC9zb3VyY2VEZXNjPgogICAgIyAgICA8IS0tIC4uLiAtLT4KICAgICMgIDwvZmlsZURlc2M+CiAgICAjPC90ZWlIZWFkZXI+CgogICAgbXkgJGNCaWJsTm9kZSA9ICRjb3JwdXNIZWFkZXItPmZpcnN0X2NoaWxkKCJmaWxlRGVzYyIpLT5maXJzdF9jaGlsZCgic291cmNlRGVzYyIpLT5maXJzdF9jaGlsZCgiYmlibCIpOwoKICAgICRjQmlibE5vZGUtPnNldF90ZXh0KCRjQmlibFN0cmluZyk7ICAgIAp9CgoKCgoKCgojIyMjIyMjIyMjIyMjIyMjIwojIyB1c2FnZV9tZXNzYWdlCiMjIyMjIyMjIyMjIyMjIyMjCgoKc3ViIHVzYWdlX21lc3NhZ2UgewogICAgcHJpbnQgIiAgIFVzYWdlOiAgLi92cnQydGVpLnBsIDxmaWxlLnZydC54bWw+IDxvdXRmaWxlPlxuIjsKICAgIHByaW50ICIgICA8ZmlsZS52cnQueG1sPiBpcyBhIFZSVCBmaWxlIGNvbnZlcnRlZCB0byBwcm9wZXIgWE1MXG4iOwogICAgZXhpdDsKfQoKCg==