IyEvdXNyL2Jpbi9lbnYgcGVybAojCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCiMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojCiMgSnVseSAyMDA0CiMKIyAyLjIyeCBSQzQgdHVuZS11cDotKSBJdCBzaG91bGQgYmUgbm90ZWQgdGhvdWdoIHRoYXQgbXkgaGFuZCBbYXMgaW4KIyAiaGFuZC1jb2RlZCBhc3NlbWJsZXIiXSBkb2Vzbid0IHN0YW5kIGZvciB0aGUgd2hvbGUgaW1wcm92ZW1lbnQKIyBjb2VmZmljaWVudC4gSXQgdHVybmVkIG91dCB0aGF0IGVsaW1pbmF0aW5nIFJDNF9DSEFSIGZyb20gY29uZmlnCiMgbGluZSByZXN1bHRzIGluIH40MCUgaW1wcm92ZW1lbnQgKHllcywgZXZlbiBmb3IgQyBpbXBsZW1lbnRhdGlvbikuCiMgUHJlc3VtYWJseSBpdCBoYXMgZXZlcnl0aGluZyB0byBkbyB3aXRoIEFNRCBjYWNoZSBhcmNoaXRlY3R1cmUgYW5kCiMgUkFXIG9yIHdoYXRldmVyIHBlbmFsdGllcy4gT25jZSBhZ2FpbiEgVGhlIG1vZHVsZSAqcmVxdWlyZXMqIGNvbmZpZwojIGxpbmUgKndpdGhvdXQqIFJDNF9DSEFSISBBcyBmb3IgY29kaW5nICJzZWNyZXQsIiBJIGJldCBvbiBwYXJ0aWFsCiMgcmVnaXN0ZXIgYXJpdGhtZXRpY3MuIEZvciBleGFtcGxlIGluc3RlYWQgb2YgJ2luYyAlcjg7IGFuZCAkMjU1LCVyOCcKIyBJIHNpbXBseSAnaW5jICVyOGInLiBFdmVuIHRob3VnaCBvcHRpbWl6YXRpb24gbWFudWFsIGRpc2NvdXJhZ2VzCiMgdG8gb3BlcmF0ZSBvbiBwYXJ0aWFsIHJlZ2lzdGVycywgaXQgdHVybmVkIG91dCB0byBiZSB0aGUgYmVzdCBiZXQuCiMgQXQgbGVhc3QgZm9yIEFNRC4uLiBIb3cgSUEzMkUgd291bGQgcGVyZm9ybSByZW1haW5zIHRvIGJlIHNlZW4uLi4KCiMgTm92ZW1iZXIgMjAwNAojCiMgQXMgd2FzIHNob3duIGJ5IE1hcmMgQmV2YW5kIHJlb3JkZXJpbmcgb2YgY291cGxlIG9mIGxvYWQgb3BlcmF0aW9ucwojIHJlc3VsdHMgaW4gZXZlbiBoaWdoZXIgcGVyZm9ybWFuY2UgZ2FpbiBvZiAzLjN4Oi0pIEF0IGxlYXN0IG9uCiMgT3B0ZXJvbi4uLiBGb3IgcmVmZXJlbmNlLCAxeCBpbiB0aGlzIGNhc2UgaXMgUkM0X0NIQVIgQy1jb2RlCiMgY29tcGlsZWQgd2l0aCBnY2MgMy4zLjIsIHdoaWNoIHBlcmZvcm1zIGF0IH41NE1CcHMgcGVyIDFHSHogY2xvY2suCiMgTGF0dGVyIG1lYW5zIHRoYXQgaWYgeW91IHdhbnQgdG8gKmVzdGltYXRlKiB3aGF0IHRvIGV4cGVjdCBmcm9tCiMgKnlvdXIqIE9wdGVyb24sIHRoZW4gbXVsdGlwbHkgNTQgYnkgMy4zIGFuZCBjbG9jayBmcmVxdWVuY3kgaW4gR0h6LgoKIyBOb3ZlbWJlciAyMDA0CiMKIyBJbnRlbCBQNCBFTTY0VCBjb3JlIHdhcyBmb3VuZCB0byBydW4gdGhlIEFNRDY0IGNvZGUgcmVhbGx5IHNsb3cuLi4KIyBUaGUgb25seSB3YXkgdG8gYWNoaWV2ZSBjb21wYXJhYmxlIHBlcmZvcm1hbmNlIG9uIFA0IHdhcyB0byBrZWVwCiMgUkM0X0NIQVIuIEtpbmQgb2YgaXJvbmljLCBodWg/IEFzIGl0J3MgYXBwYXJlbnRseSBpbXBvc3NpYmxlIHRvCiMgY29tcG9zZSBibGVuZGVkIGNvZGUsIHdoaWNoIHdvdWxkIHBlcmZvcm0gZXZlbiB3aXRoaW4gMzAlIG1hcmdpbmFsCiMgb24gZWl0aGVyIEFNRCBhbmQgSW50ZWwgcGxhdGZvcm1zLCBJIGltcGxlbWVudCBib3RoIGNhc2VzLiBTZWUKIyByYzRfc2tleS5jIGZvciBmdXJ0aGVyIGRldGFpbHMuLi4KCiMgQXByaWwgMjAwNQojCiMgUDQgRU02NFQgY29yZSBhcHBlYXJzIHRvIGJlICJhbGxlcmdpYyIgdG8gNjQtYml0IGluYy9kZWMuIFJlcGxhY2luZyAKIyB0aG9zZSB3aXRoIGFkZC9zdWIgcmVzdWx0cyBpbiA1MCUgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgb2YgZm9sZGVkCiMgbG9vcC4uLgoKIyBNYXkgMjAwNQojCiMgQXMgd2FzIHNob3duIGJ5IFpvdSBOYW5oYWkgbG9vcCB1bnJvbGxpbmcgY2FuIGltcHJvdmUgSW50ZWwgRU02NFQKIyBwZXJmb3JtYW5jZSBieSA+MzAlIFt1bmxpa2UgUDQgMzItYml0IGNhc2UgdGhhdCBpc10uIEJ1dCB0aGlzIGlzCiMgcHJvdmlkZWQgdGhhdCBsb2FkcyBhcmUgcmVvcmRlcmVkIGV2ZW4gbW9yZSBhZ2dyZXNzaXZlbHkhIEJvdGggY29kZQojIHBhdGhlcywgQU1ENjQgYW5kIEVNNjRULCByZW9yZGVyIGxvYWRzIGluIGVzc2VudGlhbGx5IHNhbWUgbWFubmVyCiMgYXMgbXkgSUEtNjQgaW1wbGVtZW50YXRpb24uIE9uIE9wdGVyb24gdGhpcyByZXN1bHRlZCBpbiBtb2Rlc3QgNSUKIyBpbXByb3ZlbWVudCBbSSBoYWQgdG8gdGVzdCBpdF0sIHdoaWxlIGZpbmFsIEludGVsIFA0IHBlcmZvcm1hbmNlCiMgYWNoaWV2ZXMgcmVzcGVjdGZ1bCA0MzJNQnBzIG9uIDIuOEdIeiBwcm9jZXNzb3Igbm93LiBGb3IgcmVmZXJlbmNlLgojIElmIGV4ZWN1dGVkIG9uIFhlb24sIGN1cnJlbnQgUkM0X0NIQVIgY29kZS1wYXRoIGlzIDIuN3ggZmFzdGVyIHRoYW4KIyBSQzRfSU5UIGNvZGUtcGF0aC4gV2hpbGUgaWYgZXhlY3V0ZWQgb24gT3B0ZXJvbiwgaXQncyBvbmx5IDI1JQojIHNsb3dlciB0aGFuIHRoZSBSQzRfSU5UIG9uZSBbbWVhbmluZyB0aGF0IGlmIENQVSC1LWFyY2ggZGV0ZWN0aW9uCiMgaXMgbm90IGltcGxlbWVudGVkLCB0aGVuIHRoaXMgZmluYWwgUkM0X0NIQVIgY29kZS1wYXRoIHNob3VsZCBiZQojIHByZWZlcnJlZCwgYXMgaXQgcHJvdmlkZXMgYmV0dGVyICphbGwtcm91bmQqIHBlcmZvcm1hbmNlXS4KCiMgTWFyY2ggMjAwNwojCiMgSW50ZWwgQ29yZTIgd2FzIG9ic2VydmVkIHRvIHBlcmZvcm0gcG9vcmx5IG9uIGJvdGggY29kZSBwYXRoczotKCBJdAojIGFwcGFyZW50bHkgc3VmZmVycyBmcm9tIHNvbWUga2luZCBvZiBwYXJ0aWFsIHJlZ2lzdGVyIHN0YWxsLCB3aGljaAojIG9jY3VycyBpbiA2NC1iaXQgbW9kZSBvbmx5IFthcyB2aXJ0dWFsbHkgaWRlbnRpY2FsIDMyLWJpdCBsb29wIHdhcwojIG9ic2VydmVkIHRvIG91dHBlcmZvcm0gNjQtYml0IG9uZSBieSBhbG1vc3QgNTAlXS4gQWRkaW5nIHR3byBtb3Z6YiB0bwojIGNsb29wMSBib29zdHMgaXRzIHBlcmZvcm1hbmNlIGJ5IDgwJSEgVGhpcyBsb29wIGFwcGVhcnMgdG8gYmUgb3B0aW1hbAojIGZpdCBmb3IgQ29yZTIgYW5kIHRoZXJlZm9yZSB0aGUgY29kZSB3YXMgbW9kaWZpZWQgdG8gc2tpcCBjbG9vcDggb24KIyB0aGlzIENQVS4KCiMgTWF5IDIwMTAKIwojIEludGVsIFdlc3RtZXJlIHdhcyBvYnNlcnZlZCB0byBwZXJmb3JtIHN1Ym9wdGltYWxseS4gQWRkaW5nIHlldAojIGFub3RoZXIgbW92emIgdG8gY2xvb3AxIGltcHJvdmVkIHBlcmZvcm1hbmNlIGJ5IGFsbW9zdCA1MCUhIENvcmUyCiMgcGVyZm9ybWFuY2UgaXMgaW1wcm92ZWQgdG9vLCBidXQgbm9taW5hbGx5Li4uCgojIE1heSAyMDExCiMKIyBUaGUgb25seSBjb2RlIHBhdGggdGhhdCB3YXMgbm90IG1vZGlmaWVkIGlzIFA0LXNwZWNpZmljIG9uZS4gTm9uLVA0CiMgSW50ZWwgY29kZSBwYXRoIG9wdGltaXphdGlvbiBpcyBoZWF2aWx5IGJhc2VkIG9uIHN1Ym1pc3Npb24gYnkgTWF4aW0KIyBQZXJtaW5vdiwgTWF4aW0gTG9ja3R5dWtoaW4gYW5kIEppbSBHdWlsZm9yZCBvZiBJbnRlbC4gSSd2ZSB1c2VkCiMgc29tZSBvZiB0aGUgaWRlYXMgZXZlbiBpbiBhdHRlbXB0IHRvIG9wdG1pemUgdGhlIG9yaWdpbmFsIFJDNF9JTlQKIyBjb2RlIHBhdGguLi4gQ3VycmVudCBwZXJmb3JtYW5jZSBpbiBjeWNsZXMgcGVyIHByb2Nlc3NlZCBieXRlIChsZXNzCiMgaXMgYmV0dGVyKSBhbmQgaW1wcm92ZW1lbnQgY29lZmZpY2llbnRzIHJlbGF0aXZlIHRvIHByZXZpb3VzCiMgdmVyc2lvbiBvZiB0aGlzIG1vZHVsZSBhcmU6CiMKIyBPcHRlcm9uCTUuMy8rMCUoKikKIyBQNAkJNi41CiMgQ29yZTIJCTYuMi8rMTUlKCoqKQojIFdlc3RtZXJlCTQuMi8rNjAlCiMgU2FuZHkgQnJpZGdlCTQuMi8rMTIwJQojIEF0b20JCTkuMy8rODAlCiMKIyAoKikJQnV0IGNvcnJlc3BvbmRpbmcgbG9vcCBoYXMgbGVzcyBpbnN0cnVjdGlvbnMsIHdoaWNoIHNob3VsZCBoYXZlCiMJcG9zaXRpdmUgZWZmZWN0IG9uIHVwY29taW5nIEJ1bGxkb3plciwgd2hpY2ggaGFzIG9uZSBsZXNzIEFMVS4KIwlGb3IgcmVmZXJlbmNlLCBJbnRlbCBjb2RlIHJ1bnMgYXQgNi44IGNwYiByYXRlIG9uIE9wdGVyb24uCiMgKCoqKQlOb3RlIHRoYXQgQ29yZTIgcmVzdWx0IGlzIH4xNSUgbG93ZXIgdGhhbiBjb3JyZXNwb25kaW5nIHJlc3VsdAojCWZvciAzMi1iaXQgY29kZSwgbWVhbmluZyB0aGF0IGl0J3MgcG9zc2libGUgdG8gaW1wcm92ZSBpdCwKIwlidXQgbW9yZSB0aGFuIGxpa2VseSBhdCB0aGUgY29zdCBvZiB0aGUgb3RoZXJzIChzZWUgcmM0LTU4Ni5wbAojCXRvIGdldCB0aGUgaWRlYSkuLi4KCiRmbGF2b3VyID0gc2hpZnQ7CiRvdXRwdXQgID0gc2hpZnQ7CmlmICgkZmxhdm91ciA9fiAvXC4vKSB7ICRvdXRwdXQgPSAkZmxhdm91cjsgdW5kZWYgJGZsYXZvdXI7IH0KCiR3aW42ND0wOyAkd2luNjQ9MSBpZiAoJGZsYXZvdXIgPX4gL1tubV1hc218bWluZ3c2NC8gfHwgJG91dHB1dCA9fiAvXC5hc20kLyk7CgokMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOwooICR4bGF0ZT0iJHtkaXJ9eDg2XzY0LXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlICkgb3IKKCAkeGxhdGU9IiR7ZGlyfS4uLy4uL3Blcmxhc20veDg2XzY0LXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlKSBvcgpkaWUgImNhbid0IGxvY2F0ZSB4ODZfNjQteGxhdGUucGwiOwoKb3BlbiBPVVQsInwgXCIkXlhcIiAkeGxhdGUgJGZsYXZvdXIgJG91dHB1dCI7CipTVERPVVQ9Kk9VVDsKCiRkYXQ9IiVyZGkiOwkgICAgIyBhcmcxCiRsZW49IiVyc2kiOwkgICAgIyBhcmcyCiRpbnA9IiVyZHgiOwkgICAgIyBhcmczCiRvdXQ9IiVyY3giOwkgICAgIyBhcmc0Cgp7CiRjb2RlPTw8X19fOwoudGV4dAouZXh0ZXJuCU9QRU5TU0xfaWEzMmNhcF9QCgouZ2xvYmwJYXNtX1JDNAoudHlwZQlhc21fUkM0LFxAZnVuY3Rpb24sNAouaGlkZGVuCWFzbV9SQzQKLmFsaWduCTE2CmFzbV9SQzQ6CglvcgkkbGVuLCRsZW4KCWpuZQkuTGVudHJ5CglyZXQKLkxlbnRyeToKCXB1c2gJJXJieAoJcHVzaAklcjEyCglwdXNoCSVyMTMKLkxwcm9sb2d1ZToKCW1vdgkkbGVuLCVyMTEKCW1vdgkkaW5wLCVyMTIKCW1vdgkkb3V0LCVyMTMKX19fCm15ICRsZW49IiVyMTEiOwkJIyByZWFzc2lnbiBpbnB1dCBhcmd1bWVudHMKbXkgJGlucD0iJXIxMiI7Cm15ICRvdXQ9IiVyMTMiOwoKbXkgQFhYPSgiJXIxMCIsIiVyc2kiKTsKbXkgQFRYPSgiJXJheCIsIiVyYngiKTsKbXkgJFlZPSIlcmN4IjsKbXkgJFRZPSIlcmR4IjsKCiRjb2RlLj08PF9fXzsKCXhvcgkkWFhbMF0sJFhYWzBdCgl4b3IJJFlZLCRZWQoKCWxlYQk4KCRkYXQpLCRkYXQKCW1vdgktOCgkZGF0KSwkWFhbMF0jYgoJbW92CS00KCRkYXQpLCRZWSNiCgljbXBsCVwkLTEsMjU2KCRkYXQpCglqZQkuTFJDNF9DSEFSCgltb3YJT1BFTlNTTF9pYTMyY2FwX1AoJXJpcCksJXI4ZAoJeG9yCSRUWFsxXSwkVFhbMV0KCWluYwkkWFhbMF0jYgoJc3ViCSRYWFswXSwkVFhbMV0KCXN1YgkkaW5wLCRvdXQKCW1vdmwJKCRkYXQsJFhYWzBdLDQpLCRUWFswXSNkCgl0ZXN0CVwkLTE2LCRsZW4KCWp6CS5MbG9vcDEKCWJ0CVwkMzAsJXI4ZAkjIEludGVsIENQVT8KCWpjCS5MaW50ZWwKCWFuZAlcJDcsJFRYWzFdCglsZWEJMSgkWFhbMF0pLCRYWFsxXQoJanoJLkxvb3A4CglzdWIJJFRYWzFdLCRsZW4KLkxvb3A4X3dhcm11cDoKCWFkZAkkVFhbMF0jYiwkWVkjYgoJbW92bAkoJGRhdCwkWVksNCksJFRZI2QKCW1vdmwJJFRYWzBdI2QsKCRkYXQsJFlZLDQpCgltb3ZsCSRUWSNkLCgkZGF0LCRYWFswXSw0KQoJYWRkCSRUWSNiLCRUWFswXSNiCglpbmMJJFhYWzBdI2IKCW1vdmwJKCRkYXQsJFRYWzBdLDQpLCRUWSNkCgltb3ZsCSgkZGF0LCRYWFswXSw0KSwkVFhbMF0jZAoJeG9yYgkoJGlucCksJFRZI2IKCW1vdmIJJFRZI2IsKCRvdXQsJGlucCkKCWxlYQkxKCRpbnApLCRpbnAKCWRlYwkkVFhbMV0KCWpuegkuTG9vcDhfd2FybXVwCgoJbGVhCTEoJFhYWzBdKSwkWFhbMV0KCWptcAkuTG9vcDgKLmFsaWduCTE2Ci5Mb29wODoKX19fCmZvciAoJGk9MDskaTw4OyRpKyspIHsKJGNvZGUuPTw8X19fIGlmICgkaT09Nyk7CglhZGQJXCQ4LCRYWFsxXSNiCl9fXwokY29kZS49PDxfX187CglhZGQJJFRYWzBdI2IsJFlZI2IKCW1vdmwJKCRkYXQsJFlZLDQpLCRUWSNkCgltb3ZsCSRUWFswXSNkLCgkZGF0LCRZWSw0KQoJbW92bAlgNCooJGk9PTc/LTE6JGkpYCgkZGF0LCRYWFsxXSw0KSwkVFhbMV0jZAoJcm9yCVwkOCwlcjgJCQkJIyByb3IgaXMgcmVkdW5kYW50IHdoZW4gJGk9MAoJbW92bAkkVFkjZCw0KiRpKCRkYXQsJFhYWzBdLDQpCglhZGQJJFRYWzBdI2IsJFRZI2IKCW1vdmIJKCRkYXQsJFRZLDQpLCVyOGIKX19fCnB1c2goQFRYLHNoaWZ0KEBUWCkpOyAjcHVzaChAWFgsc2hpZnQoQFhYKSk7CSMgInJvdGF0ZSIgcmVnaXN0ZXJzCn0KJGNvZGUuPTw8X19fOwoJYWRkCVwkOCwkWFhbMF0jYgoJcm9yCVwkOCwlcjgKCXN1YglcJDgsJGxlbgoKCXhvcgkoJGlucCksJXI4Cgltb3YJJXI4LCgkb3V0LCRpbnApCglsZWEJOCgkaW5wKSwkaW5wCgoJdGVzdAlcJC04LCRsZW4KCWpuegkuTG9vcDgKCWNtcAlcJDAsJGxlbgoJam5lCS5MbG9vcDEKCWptcAkuTGV4aXQKCi5hbGlnbgkxNgouTGludGVsOgoJdGVzdAlcJC0zMiwkbGVuCglqegkuTGxvb3AxCglhbmQJXCQxNSwkVFhbMV0KCWp6CS5Mb29wMTZfaXNfaG90CglzdWIJJFRYWzFdLCRsZW4KLkxvb3AxNl93YXJtdXA6CglhZGQJJFRYWzBdI2IsJFlZI2IKCW1vdmwJKCRkYXQsJFlZLDQpLCRUWSNkCgltb3ZsCSRUWFswXSNkLCgkZGF0LCRZWSw0KQoJbW92bAkkVFkjZCwoJGRhdCwkWFhbMF0sNCkKCWFkZAkkVFkjYiwkVFhbMF0jYgoJaW5jCSRYWFswXSNiCgltb3ZsCSgkZGF0LCRUWFswXSw0KSwkVFkjZAoJbW92bAkoJGRhdCwkWFhbMF0sNCksJFRYWzBdI2QKCXhvcmIJKCRpbnApLCRUWSNiCgltb3ZiCSRUWSNiLCgkb3V0LCRpbnApCglsZWEJMSgkaW5wKSwkaW5wCglkZWMJJFRYWzFdCglqbnoJLkxvb3AxNl93YXJtdXAKCgltb3YJJFlZLCRUWFsxXQoJeG9yCSRZWSwkWVkKCW1vdgkkVFhbMV0jYiwkWVkjYgoKLkxvb3AxNl9pc19ob3Q6CglsZWEJKCRkYXQsJFhYWzBdLDQpLCRYWFsxXQpfX18Kc3ViIFJDNF9sb29wIHsKICBteSAkaT1zaGlmdDsKICBteSAkaj0kaTwwPzA6JGk7CiAgbXkgJHhtbT0iJXhtbSIuKCRqJjEpOwoKICAgICRjb2RlLj0iCWFkZAlcJDE2LCRYWFswXSNiXG4iCQlpZiAoJGk9PTE1KTsKICAgICRjb2RlLj0iCW1vdmRxdQkoJGlucCksJXhtbTJcbiIJCQlpZiAoJGk9PTE1KTsKICAgICRjb2RlLj0iCWFkZAkkVFhbMF0jYiwkWVkjYlxuIgkJaWYgKCRpPD0wKTsKICAgICRjb2RlLj0iCW1vdmwJKCRkYXQsJFlZLDQpLCRUWSNkXG4iOwogICAgJGNvZGUuPSIJcHhvcgkleG1tMCwleG1tMlxuIgkJCWlmICgkaT09MCk7CiAgICAkY29kZS49Iglwc2xscQlcJDgsJXhtbTFcbiIJCQlpZiAoJGk9PTApOwogICAgJGNvZGUuPSIJcHhvcgkkeG1tLCR4bW1cbiIJCQlpZiAoJGk8PTEpOwogICAgJGNvZGUuPSIJbW92bAkkVFhbMF0jZCwoJGRhdCwkWVksNClcbiI7CiAgICAkY29kZS49IglhZGQJJFRZI2IsJFRYWzBdI2JcbiI7CiAgICAkY29kZS49Igltb3ZsCWA0KigkaisxKWAoJFhYWzFdKSwkVFhbMV0jZFxuIglpZiAoJGk8MTUpOwogICAgJGNvZGUuPSIJbW92egkkVFhbMF0jYiwkVFhbMF0jZFxuIjsKICAgICRjb2RlLj0iCW1vdmwJJFRZI2QsNCokaigkWFhbMV0pXG4iOwogICAgJGNvZGUuPSIJcHhvcgkleG1tMSwleG1tMlxuIgkJCWlmICgkaT09MCk7CiAgICAkY29kZS49IglsZWEJKCRkYXQsJFhYWzBdLDQpLCRYWFsxXVxuIglpZiAoJGk9PTE1KTsKICAgICRjb2RlLj0iCWFkZAkkVFhbMV0jYiwkWVkjYlxuIgkJaWYgKCRpPDE1KTsKICAgICRjb2RlLj0iCXBpbnNydwlcJGAoJGo+PjEpJjdgLCgkZGF0LCRUWFswXSw0KSwkeG1tXG4iOwogICAgJGNvZGUuPSIJbW92ZHF1CSV4bW0yLCgkb3V0LCRpbnApXG4iCQlpZiAoJGk9PTApOwogICAgJGNvZGUuPSIJbGVhCTE2KCRpbnApLCRpbnBcbiIJCWlmICgkaT09MCk7CiAgICAkY29kZS49Igltb3ZsCSgkWFhbMV0pLCRUWFsxXSNkXG4iCQlpZiAoJGk9PTE1KTsKfQoJUkM0X2xvb3AoLTEpOwokY29kZS49PDxfX187CglqbXAJLkxvb3AxNl9lbnRlcgouYWxpZ24JMTYKLkxvb3AxNjoKX19fCgpmb3IgKCRpPTA7JGk8MTY7JGkrKykgewogICAgJGNvZGUuPSIuTG9vcDE2X2VudGVyOlxuIgkJaWYgKCRpPT0xKTsKCVJDNF9sb29wKCRpKTsKCXB1c2goQFRYLHNoaWZ0KEBUWCkpOyAJCSMgInJvdGF0ZSIgcmVnaXN0ZXJzCn0KJGNvZGUuPTw8X19fOwoJbW92CSRZWSwkVFhbMV0KCXhvcgkkWVksJFlZCQkJIyBrZXl3b3JkIHRvIHBhcnRpYWwgcmVnaXN0ZXIKCXN1YglcJDE2LCRsZW4KCW1vdgkkVFhbMV0jYiwkWVkjYgoJdGVzdAlcJC0xNiwkbGVuCglqbnoJLkxvb3AxNgoKCXBzbGxxCVwkOCwleG1tMQoJcHhvcgkleG1tMCwleG1tMgoJcHhvcgkleG1tMSwleG1tMgoJbW92ZHF1CSV4bW0yLCgkb3V0LCRpbnApCglsZWEJMTYoJGlucCksJGlucAoKCWNtcAlcJDAsJGxlbgoJam5lCS5MbG9vcDEKCWptcAkuTGV4aXQKCi5hbGlnbgkxNgouTGxvb3AxOgoJYWRkCSRUWFswXSNiLCRZWSNiCgltb3ZsCSgkZGF0LCRZWSw0KSwkVFkjZAoJbW92bAkkVFhbMF0jZCwoJGRhdCwkWVksNCkKCW1vdmwJJFRZI2QsKCRkYXQsJFhYWzBdLDQpCglhZGQJJFRZI2IsJFRYWzBdI2IKCWluYwkkWFhbMF0jYgoJbW92bAkoJGRhdCwkVFhbMF0sNCksJFRZI2QKCW1vdmwJKCRkYXQsJFhYWzBdLDQpLCRUWFswXSNkCgl4b3JiCSgkaW5wKSwkVFkjYgoJbW92YgkkVFkjYiwoJG91dCwkaW5wKQoJbGVhCTEoJGlucCksJGlucAoJZGVjCSRsZW4KCWpuegkuTGxvb3AxCglqbXAJLkxleGl0CgouYWxpZ24JMTYKLkxSQzRfQ0hBUjoKCWFkZAlcJDEsJFhYWzBdI2IKCW1vdnpiCSgkZGF0LCRYWFswXSksJFRYWzBdI2QKCXRlc3QJXCQtOCwkbGVuCglqegkuTGNsb29wMQoJam1wCS5MY2xvb3A4Ci5hbGlnbgkxNgouTGNsb29wODoKCW1vdgkoJGlucCksJXI4ZAoJbW92CTQoJGlucCksJXI5ZApfX18KIyB1bnJvbGwgMng0LXdpc2UsIGJlY2F1c2UgNjQtYml0IHJvdGF0ZXMga2lsbCBJbnRlbCBQNC4uLgpmb3IgKCRpPTA7JGk8NDskaSsrKSB7CiRjb2RlLj08PF9fXzsKCWFkZAkkVFhbMF0jYiwkWVkjYgoJbGVhCTEoJFhYWzBdKSwkWFhbMV0KCW1vdnpiCSgkZGF0LCRZWSksJFRZI2QKCW1vdnpiCSRYWFsxXSNiLCRYWFsxXSNkCgltb3Z6YgkoJGRhdCwkWFhbMV0pLCRUWFsxXSNkCgltb3ZiCSRUWFswXSNiLCgkZGF0LCRZWSkKCWNtcAkkWFhbMV0sJFlZCgltb3ZiCSRUWSNiLCgkZGF0LCRYWFswXSkKCWpuZQkuTGNtb3YkaQkJCSMgSW50ZWwgY21vdiBpcyBzbG9vb293Li4uCgltb3YJJFRYWzBdLCRUWFsxXQouTGNtb3YkaToKCWFkZAkkVFhbMF0jYiwkVFkjYgoJeG9yCSgkZGF0LCRUWSksJXI4YgoJcm9yCVwkOCwlcjhkCl9fXwpwdXNoKEBUWCxzaGlmdChAVFgpKTsgcHVzaChAWFgsc2hpZnQoQFhYKSk7CSMgInJvdGF0ZSIgcmVnaXN0ZXJzCn0KZm9yICgkaT00OyRpPDg7JGkrKykgewokY29kZS49PDxfX187CglhZGQJJFRYWzBdI2IsJFlZI2IKCWxlYQkxKCRYWFswXSksJFhYWzFdCgltb3Z6YgkoJGRhdCwkWVkpLCRUWSNkCgltb3Z6YgkkWFhbMV0jYiwkWFhbMV0jZAoJbW92emIJKCRkYXQsJFhYWzFdKSwkVFhbMV0jZAoJbW92YgkkVFhbMF0jYiwoJGRhdCwkWVkpCgljbXAJJFhYWzFdLCRZWQoJbW92YgkkVFkjYiwoJGRhdCwkWFhbMF0pCglqbmUJLkxjbW92JGkJCQkjIEludGVsIGNtb3YgaXMgc2xvb29vdy4uLgoJbW92CSRUWFswXSwkVFhbMV0KLkxjbW92JGk6CglhZGQJJFRYWzBdI2IsJFRZI2IKCXhvcgkoJGRhdCwkVFkpLCVyOWIKCXJvcglcJDgsJXI5ZApfX18KcHVzaChAVFgsc2hpZnQoQFRYKSk7IHB1c2goQFhYLHNoaWZ0KEBYWCkpOwkjICJyb3RhdGUiIHJlZ2lzdGVycwp9CiRjb2RlLj08PF9fXzsKCWxlYQktOCgkbGVuKSwkbGVuCgltb3YJJXI4ZCwoJG91dCkKCWxlYQk4KCRpbnApLCRpbnAKCW1vdgklcjlkLDQoJG91dCkKCWxlYQk4KCRvdXQpLCRvdXQKCgl0ZXN0CVwkLTgsJGxlbgoJam56CS5MY2xvb3A4CgljbXAJXCQwLCRsZW4KCWpuZQkuTGNsb29wMQoJam1wCS5MZXhpdApfX18KJGNvZGUuPTw8X19fOwouYWxpZ24JMTYKLkxjbG9vcDE6CglhZGQJJFRYWzBdI2IsJFlZI2IKCW1vdnpiCSRZWSNiLCRZWSNkCgltb3Z6YgkoJGRhdCwkWVkpLCRUWSNkCgltb3ZiCSRUWFswXSNiLCgkZGF0LCRZWSkKCW1vdmIJJFRZI2IsKCRkYXQsJFhYWzBdKQoJYWRkCSRUWFswXSNiLCRUWSNiCglhZGQJXCQxLCRYWFswXSNiCgltb3Z6YgkkVFkjYiwkVFkjZAoJbW92emIJJFhYWzBdI2IsJFhYWzBdI2QKCW1vdnpiCSgkZGF0LCRUWSksJFRZI2QKCW1vdnpiCSgkZGF0LCRYWFswXSksJFRYWzBdI2QKCXhvcmIJKCRpbnApLCRUWSNiCglsZWEJMSgkaW5wKSwkaW5wCgltb3ZiCSRUWSNiLCgkb3V0KQoJbGVhCTEoJG91dCksJG91dAoJc3ViCVwkMSwkbGVuCglqbnoJLkxjbG9vcDEKCWptcAkuTGV4aXQKCi5hbGlnbgkxNgouTGV4aXQ6CglzdWIJXCQxLCRYWFswXSNiCgltb3ZsCSRYWFswXSNkLC04KCRkYXQpCgltb3ZsCSRZWSNkLC00KCRkYXQpCgoJbW92CSglcnNwKSwlcjEzCgltb3YJOCglcnNwKSwlcjEyCgltb3YJMTYoJXJzcCksJXJieAoJYWRkCVwkMjQsJXJzcAouTGVwaWxvZ3VlOgoJcmV0Ci5zaXplCWFzbV9SQzQsLi1hc21fUkM0Cl9fXwp9CgokaWR4PSIlcjgiOwokaWRvPSIlcjkiOwoKJGNvZGUuPTw8X19fOwouZ2xvYmwJYXNtX1JDNF9zZXRfa2V5Ci50eXBlCWFzbV9SQzRfc2V0X2tleSxcQGZ1bmN0aW9uLDMKLmhpZGRlbglhc21fUkM0X3NldF9rZXkKLmFsaWduCTE2CmFzbV9SQzRfc2V0X2tleToKCWxlYQk4KCRkYXQpLCRkYXQKCWxlYQkoJGlucCwkbGVuKSwkaW5wCgluZWcJJGxlbgoJbW92CSRsZW4sJXJjeAoJeG9yCSVlYXgsJWVheAoJeG9yCSRpZG8sJGlkbwoJeG9yCSVyMTAsJXIxMAoJeG9yCSVyMTEsJXIxMQoKCW1vdglPUEVOU1NMX2lhMzJjYXBfUCglcmlwKSwkaWR4I2QKCWJ0CVwkMjAsJGlkeCNkCSMgUkM0X0NIQVI/CglqYwkuTGMxc3Rsb29wCglqbXAJLkx3MXN0bG9vcAoKLmFsaWduCTE2Ci5MdzFzdGxvb3A6Cgltb3YJJWVheCwoJGRhdCwlcmF4LDQpCglhZGQJXCQxLCVhbAoJam5jCS5MdzFzdGxvb3AKCgl4b3IJJGlkbywkaWRvCgl4b3IJJGlkeCwkaWR4Ci5hbGlnbgkxNgouTHcybmRsb29wOgoJbW92CSgkZGF0LCRpZG8sNCksJXIxMGQKCWFkZAkoJGlucCwkbGVuLDEpLCRpZHgjYgoJYWRkCSVyMTBiLCRpZHgjYgoJYWRkCVwkMSwkbGVuCgltb3YJKCRkYXQsJGlkeCw0KSwlcjExZAoJY21vdnoJJXJjeCwkbGVuCgltb3YJJXIxMGQsKCRkYXQsJGlkeCw0KQoJbW92CSVyMTFkLCgkZGF0LCRpZG8sNCkKCWFkZAlcJDEsJGlkbyNiCglqbmMJLkx3Mm5kbG9vcAoJam1wCS5MZXhpdF9rZXkKCi5hbGlnbgkxNgouTGMxc3Rsb29wOgoJbW92CSVhbCwoJGRhdCwlcmF4KQoJYWRkCVwkMSwlYWwKCWpuYwkuTGMxc3Rsb29wCgoJeG9yCSRpZG8sJGlkbwoJeG9yCSRpZHgsJGlkeAouYWxpZ24JMTYKLkxjMm5kbG9vcDoKCW1vdgkoJGRhdCwkaWRvKSwlcjEwYgoJYWRkCSgkaW5wLCRsZW4pLCRpZHgjYgoJYWRkCSVyMTBiLCRpZHgjYgoJYWRkCVwkMSwkbGVuCgltb3YJKCRkYXQsJGlkeCksJXIxMWIKCWpuegkuTGNub3dyYXAKCW1vdgklcmN4LCRsZW4KLkxjbm93cmFwOgoJbW92CSVyMTBiLCgkZGF0LCRpZHgpCgltb3YJJXIxMWIsKCRkYXQsJGlkbykKCWFkZAlcJDEsJGlkbyNiCglqbmMJLkxjMm5kbG9vcAoJbW92bAlcJC0xLDI1NigkZGF0KQoKLmFsaWduCTE2Ci5MZXhpdF9rZXk6Cgl4b3IJJWVheCwlZWF4Cgltb3YJJWVheCwtOCgkZGF0KQoJbW92CSVlYXgsLTQoJGRhdCkKCXJldAouc2l6ZQlhc21fUkM0X3NldF9rZXksLi1hc21fUkM0X3NldF9rZXkKX19fCgojIEVYQ0VQVElPTl9ESVNQT1NJVElPTiBoYW5kbGVyIChFWENFUFRJT05fUkVDT1JEICpyZWMsVUxPTkc2NCBmcmFtZSwKIwkJQ09OVEVYVCAqY29udGV4dCxESVNQQVRDSEVSX0NPTlRFWFQgKmRpc3ApCmlmICgkd2luNjQpIHsKJHJlYz0iJXJjeCI7CiRmcmFtZT0iJXJkeCI7CiRjb250ZXh0PSIlcjgiOwokZGlzcD0iJXI5IjsKCiRjb2RlLj08PF9fXzsKLmV4dGVybglfX2ltcF9SdGxWaXJ0dWFsVW53aW5kCi50eXBlCXN0cmVhbV9zZV9oYW5kbGVyLFxAYWJpLW9tbmlwb3RlbnQKLmFsaWduCTE2CnN0cmVhbV9zZV9oYW5kbGVyOgoJcHVzaAklcnNpCglwdXNoCSVyZGkKCXB1c2gJJXJieAoJcHVzaAklcmJwCglwdXNoCSVyMTIKCXB1c2gJJXIxMwoJcHVzaAklcjE0CglwdXNoCSVyMTUKCXB1c2hmcQoJc3ViCVwkNjQsJXJzcAoKCW1vdgkxMjAoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJheAoJbW92CTI0OCgkY29udGV4dCksJXJieAkjIHB1bGwgY29udGV4dC0+UmlwCgoJbGVhCS5McHJvbG9ndWUoJXJpcCksJXIxMAoJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA8cHJvbG9ndWUgbGFiZWwKCWpiCS5MaW5fcHJvbG9ndWUKCgltb3YJMTUyKCRjb250ZXh0KSwlcmF4CSMgcHVsbCBjb250ZXh0LT5Sc3AKCglsZWEJLkxlcGlsb2d1ZSglcmlwKSwlcjEwCgljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcD49ZXBpbG9ndWUgbGFiZWwKCWphZQkuTGluX3Byb2xvZ3VlCgoJbGVhCTI0KCVyYXgpLCVyYXgKCgltb3YJLTgoJXJheCksJXJieAoJbW92CS0xNiglcmF4KSwlcjEyCgltb3YJLTI0KCVyYXgpLCVyMTMKCW1vdgklcmJ4LDE0NCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJieAoJbW92CSVyMTIsMjE2KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjEyCgltb3YJJXIxMywyMjQoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SMTMKCi5MaW5fcHJvbG9ndWU6Cgltb3YJOCglcmF4KSwlcmRpCgltb3YJMTYoJXJheCksJXJzaQoJbW92CSVyYXgsMTUyKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UnNwCgltb3YJJXJzaSwxNjgoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5Sc2kKCW1vdgklcmRpLDE3NigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJkaQoKCWptcAkuTGNvbW1vbl9zZWhfZXhpdAouc2l6ZQlzdHJlYW1fc2VfaGFuZGxlciwuLXN0cmVhbV9zZV9oYW5kbGVyCgoudHlwZQlrZXlfc2VfaGFuZGxlcixcQGFiaS1vbW5pcG90ZW50Ci5hbGlnbgkxNgprZXlfc2VfaGFuZGxlcjoKCXB1c2gJJXJzaQoJcHVzaAklcmRpCglwdXNoCSVyYngKCXB1c2gJJXJicAoJcHVzaAklcjEyCglwdXNoCSVyMTMKCXB1c2gJJXIxNAoJcHVzaAklcjE1CglwdXNoZnEKCXN1YglcJDY0LCVyc3AKCgltb3YJMTUyKCRjb250ZXh0KSwlcmF4CSMgcHVsbCBjb250ZXh0LT5Sc3AKCW1vdgk4KCVyYXgpLCVyZGkKCW1vdgkxNiglcmF4KSwlcnNpCgltb3YJJXJzaSwxNjgoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5Sc2kKCW1vdgklcmRpLDE3NigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJkaQoKLkxjb21tb25fc2VoX2V4aXQ6CgoJbW92CTQwKCRkaXNwKSwlcmRpCQkjIGRpc3AtPkNvbnRleHRSZWNvcmQKCW1vdgkkY29udGV4dCwlcnNpCQkjIGNvbnRleHQKCW1vdglcJDE1NCwlZWN4CQkjIHNpemVvZihDT05URVhUKQoJLmxvbmcJMHhhNTQ4ZjNmYwkJIyBjbGQ7IHJlcCBtb3ZzcQoKCW1vdgkkZGlzcCwlcnNpCgl4b3IJJXJjeCwlcmN4CQkjIGFyZzEsIFVOV19GTEFHX05IQU5ETEVSCgltb3YJOCglcnNpKSwlcmR4CQkjIGFyZzIsIGRpc3AtPkltYWdlQmFzZQoJbW92CTAoJXJzaSksJXI4CQkjIGFyZzMsIGRpc3AtPkNvbnRyb2xQYwoJbW92CTE2KCVyc2kpLCVyOQkJIyBhcmc0LCBkaXNwLT5GdW5jdGlvbkVudHJ5Cgltb3YJNDAoJXJzaSksJXIxMAkJIyBkaXNwLT5Db250ZXh0UmVjb3JkCglsZWEJNTYoJXJzaSksJXIxMQkJIyAmZGlzcC0+SGFuZGxlckRhdGEKCWxlYQkyNCglcnNpKSwlcjEyCQkjICZkaXNwLT5Fc3RhYmxpc2hlckZyYW1lCgltb3YJJXIxMCwzMiglcnNwKQkJIyBhcmc1Cgltb3YJJXIxMSw0MCglcnNwKQkJIyBhcmc2Cgltb3YJJXIxMiw0OCglcnNwKQkJIyBhcmc3Cgltb3YJJXJjeCw1NiglcnNwKQkJIyBhcmc4LCAoTlVMTCkKCWNhbGwJKl9faW1wX1J0bFZpcnR1YWxVbndpbmQoJXJpcCkKCgltb3YJXCQxLCVlYXgJCSMgRXhjZXB0aW9uQ29udGludWVTZWFyY2gKCWFkZAlcJDY0LCVyc3AKCXBvcGZxCglwb3AJJXIxNQoJcG9wCSVyMTQKCXBvcAklcjEzCglwb3AJJXIxMgoJcG9wCSVyYnAKCXBvcAklcmJ4Cglwb3AJJXJkaQoJcG9wCSVyc2kKCXJldAouc2l6ZQlrZXlfc2VfaGFuZGxlciwuLWtleV9zZV9oYW5kbGVyCgouc2VjdGlvbgkucGRhdGEKLmFsaWduCTQKCS5ydmEJLkxTRUhfYmVnaW5fYXNtX1JDNAoJLnJ2YQkuTFNFSF9lbmRfYXNtX1JDNAoJLnJ2YQkuTFNFSF9pbmZvX2FzbV9SQzQKCgkucnZhCS5MU0VIX2JlZ2luX2FzbV9SQzRfc2V0X2tleQoJLnJ2YQkuTFNFSF9lbmRfYXNtX1JDNF9zZXRfa2V5CgkucnZhCS5MU0VIX2luZm9fYXNtX1JDNF9zZXRfa2V5Cgouc2VjdGlvbgkueGRhdGEKLmFsaWduCTgKLkxTRUhfaW5mb19hc21fUkM0OgoJLmJ5dGUJOSwwLDAsMAoJLnJ2YQlzdHJlYW1fc2VfaGFuZGxlcgouTFNFSF9pbmZvX2FzbV9SQzRfc2V0X2tleToKCS5ieXRlCTksMCwwLDAKCS5ydmEJa2V5X3NlX2hhbmRsZXIKX19fCn0KCnN1YiByZWdfcGFydCB7Cm15ICgkcmVnLCRjb252KT1AXzsKICAgIGlmICgkcmVnID1+IC8lclswLTldKy8pCXsgJHJlZyAuPSAkY29udjsgfQogICAgZWxzaWYgKCRjb252IGVxICJiIikJeyAkcmVnID1+IHMvJVtlcl0oW154XSspeD8vJSQxbC87CX0KICAgIGVsc2lmICgkY29udiBlcSAidyIpCXsgJHJlZyA9fiBzLyVbZXJdKC4rKS8lJDEvOwkJfQogICAgZWxzaWYgKCRjb252IGVxICJkIikJeyAkcmVnID1+IHMvJVtlcl0oLispLyVlJDEvOwkJfQogICAgcmV0dXJuICRyZWc7Cn0KCiRjb2RlID1+IHMvKCVbYS16MC05XSspIyhbYndkXSkvcmVnX3BhcnQoJDEsJDIpL2dlbTsKJGNvZGUgPX4gcy9cYChbXlxgXSopXGAvZXZhbCAkMS9nZW07CgpwcmludCAkY29kZTsKCmNsb3NlIFNURE9VVDsK