IyEvdXNyL2Jpbi9lbnYgcGVybAojCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCiMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojCiMgSnVseSAyMDA0CiMKIyAyLjIyeCBSQzQgdHVuZS11cDotKSBJdCBzaG91bGQgYmUgbm90ZWQgdGhvdWdoIHRoYXQgbXkgaGFuZCBbYXMgaW4KIyAiaGFuZC1jb2RlZCBhc3NlbWJsZXIiXSBkb2Vzbid0IHN0YW5kIGZvciB0aGUgd2hvbGUgaW1wcm92ZW1lbnQKIyBjb2VmZmljaWVudC4gSXQgdHVybmVkIG91dCB0aGF0IGVsaW1pbmF0aW5nIFJDNF9DSEFSIGZyb20gY29uZmlnCiMgbGluZSByZXN1bHRzIGluIH40MCUgaW1wcm92ZW1lbnQgKHllcywgZXZlbiBmb3IgQyBpbXBsZW1lbnRhdGlvbikuCiMgUHJlc3VtYWJseSBpdCBoYXMgZXZlcnl0aGluZyB0byBkbyB3aXRoIEFNRCBjYWNoZSBhcmNoaXRlY3R1cmUgYW5kCiMgUkFXIG9yIHdoYXRldmVyIHBlbmFsdGllcy4gT25jZSBhZ2FpbiEgVGhlIG1vZHVsZSAqcmVxdWlyZXMqIGNvbmZpZwojIGxpbmUgKndpdGhvdXQqIFJDNF9DSEFSISBBcyBmb3IgY29kaW5nICJzZWNyZXQsIiBJIGJldCBvbiBwYXJ0aWFsCiMgcmVnaXN0ZXIgYXJpdGhtZXRpY3MuIEZvciBleGFtcGxlIGluc3RlYWQgb2YgJ2luYyAlcjg7IGFuZCAkMjU1LCVyOCcKIyBJIHNpbXBseSAnaW5jICVyOGInLiBFdmVuIHRob3VnaCBvcHRpbWl6YXRpb24gbWFudWFsIGRpc2NvdXJhZ2VzCiMgdG8gb3BlcmF0ZSBvbiBwYXJ0aWFsIHJlZ2lzdGVycywgaXQgdHVybmVkIG91dCB0byBiZSB0aGUgYmVzdCBiZXQuCiMgQXQgbGVhc3QgZm9yIEFNRC4uLiBIb3cgSUEzMkUgd291bGQgcGVyZm9ybSByZW1haW5zIHRvIGJlIHNlZW4uLi4KCiMgTm92ZW1iZXIgMjAwNAojCiMgQXMgd2FzIHNob3duIGJ5IE1hcmMgQmV2YW5kIHJlb3JkZXJpbmcgb2YgY291cGxlIG9mIGxvYWQgb3BlcmF0aW9ucwojIHJlc3VsdHMgaW4gZXZlbiBoaWdoZXIgcGVyZm9ybWFuY2UgZ2FpbiBvZiAzLjN4Oi0pIEF0IGxlYXN0IG9uCiMgT3B0ZXJvbi4uLiBGb3IgcmVmZXJlbmNlLCAxeCBpbiB0aGlzIGNhc2UgaXMgUkM0X0NIQVIgQy1jb2RlCiMgY29tcGlsZWQgd2l0aCBnY2MgMy4zLjIsIHdoaWNoIHBlcmZvcm1zIGF0IH41NE1CcHMgcGVyIDFHSHogY2xvY2suCiMgTGF0dGVyIG1lYW5zIHRoYXQgaWYgeW91IHdhbnQgdG8gKmVzdGltYXRlKiB3aGF0IHRvIGV4cGVjdCBmcm9tCiMgKnlvdXIqIE9wdGVyb24sIHRoZW4gbXVsdGlwbHkgNTQgYnkgMy4zIGFuZCBjbG9jayBmcmVxdWVuY3kgaW4gR0h6LgoKIyBOb3ZlbWJlciAyMDA0CiMKIyBJbnRlbCBQNCBFTTY0VCBjb3JlIHdhcyBmb3VuZCB0byBydW4gdGhlIEFNRDY0IGNvZGUgcmVhbGx5IHNsb3cuLi4KIyBUaGUgb25seSB3YXkgdG8gYWNoaWV2ZSBjb21wYXJhYmxlIHBlcmZvcm1hbmNlIG9uIFA0IHdhcyB0byBrZWVwCiMgUkM0X0NIQVIuIEtpbmQgb2YgaXJvbmljLCBodWg/IEFzIGl0J3MgYXBwYXJlbnRseSBpbXBvc3NpYmxlIHRvCiMgY29tcG9zZSBibGVuZGVkIGNvZGUsIHdoaWNoIHdvdWxkIHBlcmZvcm0gZXZlbiB3aXRoaW4gMzAlIG1hcmdpbmFsCiMgb24gZWl0aGVyIEFNRCBhbmQgSW50ZWwgcGxhdGZvcm1zLCBJIGltcGxlbWVudCBib3RoIGNhc2VzLiBTZWUKIyByYzRfc2tleS5jIGZvciBmdXJ0aGVyIGRldGFpbHMuLi4KCiMgQXByaWwgMjAwNQojCiMgUDQgRU02NFQgY29yZSBhcHBlYXJzIHRvIGJlICJhbGxlcmdpYyIgdG8gNjQtYml0IGluYy9kZWMuIFJlcGxhY2luZyAKIyB0aG9zZSB3aXRoIGFkZC9zdWIgcmVzdWx0cyBpbiA1MCUgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgb2YgZm9sZGVkCiMgbG9vcC4uLgoKIyBNYXkgMjAwNQojCiMgQXMgd2FzIHNob3duIGJ5IFpvdSBOYW5oYWkgbG9vcCB1bnJvbGxpbmcgY2FuIGltcHJvdmUgSW50ZWwgRU02NFQKIyBwZXJmb3JtYW5jZSBieSA+MzAlIFt1bmxpa2UgUDQgMzItYml0IGNhc2UgdGhhdCBpc10uIEJ1dCB0aGlzIGlzCiMgcHJvdmlkZWQgdGhhdCBsb2FkcyBhcmUgcmVvcmRlcmVkIGV2ZW4gbW9yZSBhZ2dyZXNzaXZlbHkhIEJvdGggY29kZQojIHBhdGhlcywgQU1ENjQgYW5kIEVNNjRULCByZW9yZGVyIGxvYWRzIGluIGVzc2VudGlhbGx5IHNhbWUgbWFubmVyCiMgYXMgbXkgSUEtNjQgaW1wbGVtZW50YXRpb24uIE9uIE9wdGVyb24gdGhpcyByZXN1bHRlZCBpbiBtb2Rlc3QgNSUKIyBpbXByb3ZlbWVudCBbSSBoYWQgdG8gdGVzdCBpdF0sIHdoaWxlIGZpbmFsIEludGVsIFA0IHBlcmZvcm1hbmNlCiMgYWNoaWV2ZXMgcmVzcGVjdGZ1bCA0MzJNQnBzIG9uIDIuOEdIeiBwcm9jZXNzb3Igbm93LiBGb3IgcmVmZXJlbmNlLgojIElmIGV4ZWN1dGVkIG9uIFhlb24sIGN1cnJlbnQgUkM0X0NIQVIgY29kZS1wYXRoIGlzIDIuN3ggZmFzdGVyIHRoYW4KIyBSQzRfSU5UIGNvZGUtcGF0aC4gV2hpbGUgaWYgZXhlY3V0ZWQgb24gT3B0ZXJvbiwgaXQncyBvbmx5IDI1JQojIHNsb3dlciB0aGFuIHRoZSBSQzRfSU5UIG9uZSBbbWVhbmluZyB0aGF0IGlmIENQVSC1LWFyY2ggZGV0ZWN0aW9uCiMgaXMgbm90IGltcGxlbWVudGVkLCB0aGVuIHRoaXMgZmluYWwgUkM0X0NIQVIgY29kZS1wYXRoIHNob3VsZCBiZQojIHByZWZlcnJlZCwgYXMgaXQgcHJvdmlkZXMgYmV0dGVyICphbGwtcm91bmQqIHBlcmZvcm1hbmNlXS4KCiMgTWFyY2ggMjAwNwojCiMgSW50ZWwgQ29yZTIgd2FzIG9ic2VydmVkIHRvIHBlcmZvcm0gcG9vcmx5IG9uIGJvdGggY29kZSBwYXRoczotKCBJdAojIGFwcGFyZW50bHkgc3VmZmVycyBmcm9tIHNvbWUga2luZCBvZiBwYXJ0aWFsIHJlZ2lzdGVyIHN0YWxsLCB3aGljaAojIG9jY3VycyBpbiA2NC1iaXQgbW9kZSBvbmx5IFthcyB2aXJ0dWFsbHkgaWRlbnRpY2FsIDMyLWJpdCBsb29wIHdhcwojIG9ic2VydmVkIHRvIG91dHBlcmZvcm0gNjQtYml0IG9uZSBieSBhbG1vc3QgNTAlXS4gQWRkaW5nIHR3byBtb3Z6YiB0bwojIGNsb29wMSBib29zdHMgaXRzIHBlcmZvcm1hbmNlIGJ5IDgwJSEgVGhpcyBsb29wIGFwcGVhcnMgdG8gYmUgb3B0aW1hbAojIGZpdCBmb3IgQ29yZTIgYW5kIHRoZXJlZm9yZSB0aGUgY29kZSB3YXMgbW9kaWZpZWQgdG8gc2tpcCBjbG9vcDggb24KIyB0aGlzIENQVS4KCiMgTWF5IDIwMTAKIwojIEludGVsIFdlc3RtZXJlIHdhcyBvYnNlcnZlZCB0byBwZXJmb3JtIHN1Ym9wdGltYWxseS4gQWRkaW5nIHlldAojIGFub3RoZXIgbW92emIgdG8gY2xvb3AxIGltcHJvdmVkIHBlcmZvcm1hbmNlIGJ5IGFsbW9zdCA1MCUhIENvcmUyCiMgcGVyZm9ybWFuY2UgaXMgaW1wcm92ZWQgdG9vLCBidXQgbm9taW5hbGx5Li4uCgojIE1heSAyMDExCiMKIyBUaGUgb25seSBjb2RlIHBhdGggdGhhdCB3YXMgbm90IG1vZGlmaWVkIGlzIFA0LXNwZWNpZmljIG9uZS4gTm9uLVA0CiMgSW50ZWwgY29kZSBwYXRoIG9wdGltaXphdGlvbiBpcyBoZWF2aWx5IGJhc2VkIG9uIHN1Ym1pc3Npb24gYnkgTWF4aW0KIyBQZXJtaW5vdiwgTWF4aW0gTG9ja3R5dWtoaW4gYW5kIEppbSBHdWlsZm9yZCBvZiBJbnRlbC4gSSd2ZSB1c2VkCiMgc29tZSBvZiB0aGUgaWRlYXMgZXZlbiBpbiBhdHRlbXB0IHRvIG9wdG1pemUgdGhlIG9yaWdpbmFsIFJDNF9JTlQKIyBjb2RlIHBhdGguLi4gQ3VycmVudCBwZXJmb3JtYW5jZSBpbiBjeWNsZXMgcGVyIHByb2Nlc3NlZCBieXRlIChsZXNzCiMgaXMgYmV0dGVyKSBhbmQgaW1wcm92ZW1lbnQgY29lZmZpY2llbnRzIHJlbGF0aXZlIHRvIHByZXZpb3VzCiMgdmVyc2lvbiBvZiB0aGlzIG1vZHVsZSBhcmU6CiMKIyBPcHRlcm9uCTUuMy8rMCUoKikKIyBQNAkJNi41CiMgQ29yZTIJCTYuMi8rMTUlKCoqKQojIFdlc3RtZXJlCTQuMi8rNjAlCiMgU2FuZHkgQnJpZGdlCTQuMi8rMTIwJQojIEF0b20JCTkuMy8rODAlCiMKIyAoKikJQnV0IGNvcnJlc3BvbmRpbmcgbG9vcCBoYXMgbGVzcyBpbnN0cnVjdGlvbnMsIHdoaWNoIHNob3VsZCBoYXZlCiMJcG9zaXRpdmUgZWZmZWN0IG9uIHVwY29taW5nIEJ1bGxkb3plciwgd2hpY2ggaGFzIG9uZSBsZXNzIEFMVS4KIwlGb3IgcmVmZXJlbmNlLCBJbnRlbCBjb2RlIHJ1bnMgYXQgNi44IGNwYiByYXRlIG9uIE9wdGVyb24uCiMgKCoqKQlOb3RlIHRoYXQgQ29yZTIgcmVzdWx0IGlzIH4xNSUgbG93ZXIgdGhhbiBjb3JyZXNwb25kaW5nIHJlc3VsdAojCWZvciAzMi1iaXQgY29kZSwgbWVhbmluZyB0aGF0IGl0J3MgcG9zc2libGUgdG8gaW1wcm92ZSBpdCwKIwlidXQgbW9yZSB0aGFuIGxpa2VseSBhdCB0aGUgY29zdCBvZiB0aGUgb3RoZXJzIChzZWUgcmM0LTU4Ni5wbAojCXRvIGdldCB0aGUgaWRlYSkuLi4KCiRmbGF2b3VyID0gc2hpZnQ7CiRvdXRwdXQgID0gc2hpZnQ7CmlmICgkZmxhdm91ciA9fiAvXC4vKSB7ICRvdXRwdXQgPSAkZmxhdm91cjsgdW5kZWYgJGZsYXZvdXI7IH0KCiR3aW42ND0wOyAkd2luNjQ9MSBpZiAoJGZsYXZvdXIgPX4gL1tubV1hc218bWluZ3c2NC8gfHwgJG91dHB1dCA9fiAvXC5hc20kLyk7CgokMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOwooICR4bGF0ZT0iJHtkaXJ9eDg2XzY0LXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlICkgb3IKKCAkeGxhdGU9IiR7ZGlyfS4uLy4uL3Blcmxhc20veDg2XzY0LXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlKSBvcgpkaWUgImNhbid0IGxvY2F0ZSB4ODZfNjQteGxhdGUucGwiOwoKb3BlbiBTVERPVVQsInwgJF5YICR4bGF0ZSAkZmxhdm91ciAkb3V0cHV0IjsKCiRkYXQ9IiVyZGkiOwkgICAgIyBhcmcxCiRsZW49IiVyc2kiOwkgICAgIyBhcmcyCiRpbnA9IiVyZHgiOwkgICAgIyBhcmczCiRvdXQ9IiVyY3giOwkgICAgIyBhcmc0Cgp7CiRjb2RlPTw8X19fOwoudGV4dAouZXh0ZXJuCU9QRU5TU0xfaWEzMmNhcF9QCgouZ2xvYmwJUkM0Ci50eXBlCVJDNCxcQGZ1bmN0aW9uLDQKLmFsaWduCTE2ClJDNDoJb3IJJGxlbiwkbGVuCglqbmUJLkxlbnRyeQoJcmV0Ci5MZW50cnk6CglwdXNoCSVyYngKCXB1c2gJJXIxMgoJcHVzaAklcjEzCi5McHJvbG9ndWU6Cgltb3YJJGxlbiwlcjExCgltb3YJJGlucCwlcjEyCgltb3YJJG91dCwlcjEzCl9fXwpteSAkbGVuPSIlcjExIjsJCSMgcmVhc3NpZ24gaW5wdXQgYXJndW1lbnRzCm15ICRpbnA9IiVyMTIiOwpteSAkb3V0PSIlcjEzIjsKCm15IEBYWD0oIiVyMTAiLCIlcnNpIik7Cm15IEBUWD0oIiVyYXgiLCIlcmJ4Iik7Cm15ICRZWT0iJXJjeCI7Cm15ICRUWT0iJXJkeCI7CgokY29kZS49PDxfX187Cgl4b3IJJFhYWzBdLCRYWFswXQoJeG9yCSRZWSwkWVkKCglsZWEJOCgkZGF0KSwkZGF0Cgltb3YJLTgoJGRhdCksJFhYWzBdI2IKCW1vdgktNCgkZGF0KSwkWVkjYgoJY21wbAlcJC0xLDI1NigkZGF0KQoJamUJLkxSQzRfQ0hBUgoJbW92CU9QRU5TU0xfaWEzMmNhcF9QKCVyaXApLCVyOGQKCXhvcgkkVFhbMV0sJFRYWzFdCglpbmMJJFhYWzBdI2IKCXN1YgkkWFhbMF0sJFRYWzFdCglzdWIJJGlucCwkb3V0Cgltb3ZsCSgkZGF0LCRYWFswXSw0KSwkVFhbMF0jZAoJdGVzdAlcJC0xNiwkbGVuCglqegkuTGxvb3AxCglidAlcJDMwLCVyOGQJIyBJbnRlbCBDUFU/CglqYwkuTGludGVsCglhbmQJXCQ3LCRUWFsxXQoJbGVhCTEoJFhYWzBdKSwkWFhbMV0KCWp6CS5Mb29wOAoJc3ViCSRUWFsxXSwkbGVuCi5Mb29wOF93YXJtdXA6CglhZGQJJFRYWzBdI2IsJFlZI2IKCW1vdmwJKCRkYXQsJFlZLDQpLCRUWSNkCgltb3ZsCSRUWFswXSNkLCgkZGF0LCRZWSw0KQoJbW92bAkkVFkjZCwoJGRhdCwkWFhbMF0sNCkKCWFkZAkkVFkjYiwkVFhbMF0jYgoJaW5jCSRYWFswXSNiCgltb3ZsCSgkZGF0LCRUWFswXSw0KSwkVFkjZAoJbW92bAkoJGRhdCwkWFhbMF0sNCksJFRYWzBdI2QKCXhvcmIJKCRpbnApLCRUWSNiCgltb3ZiCSRUWSNiLCgkb3V0LCRpbnApCglsZWEJMSgkaW5wKSwkaW5wCglkZWMJJFRYWzFdCglqbnoJLkxvb3A4X3dhcm11cAoKCWxlYQkxKCRYWFswXSksJFhYWzFdCglqbXAJLkxvb3A4Ci5hbGlnbgkxNgouTG9vcDg6Cl9fXwpmb3IgKCRpPTA7JGk8ODskaSsrKSB7CiRjb2RlLj08PF9fXyBpZiAoJGk9PTcpOwoJYWRkCVwkOCwkWFhbMV0jYgpfX18KJGNvZGUuPTw8X19fOwoJYWRkCSRUWFswXSNiLCRZWSNiCgltb3ZsCSgkZGF0LCRZWSw0KSwkVFkjZAoJbW92bAkkVFhbMF0jZCwoJGRhdCwkWVksNCkKCW1vdmwJYDQqKCRpPT03Py0xOiRpKWAoJGRhdCwkWFhbMV0sNCksJFRYWzFdI2QKCXJvcglcJDgsJXI4CQkJCSMgcm9yIGlzIHJlZHVuZGFudCB3aGVuICRpPTAKCW1vdmwJJFRZI2QsNCokaSgkZGF0LCRYWFswXSw0KQoJYWRkCSRUWFswXSNiLCRUWSNiCgltb3ZiCSgkZGF0LCRUWSw0KSwlcjhiCl9fXwpwdXNoKEBUWCxzaGlmdChAVFgpKTsgI3B1c2goQFhYLHNoaWZ0KEBYWCkpOwkjICJyb3RhdGUiIHJlZ2lzdGVycwp9CiRjb2RlLj08PF9fXzsKCWFkZAlcJDgsJFhYWzBdI2IKCXJvcglcJDgsJXI4CglzdWIJXCQ4LCRsZW4KCgl4b3IJKCRpbnApLCVyOAoJbW92CSVyOCwoJG91dCwkaW5wKQoJbGVhCTgoJGlucCksJGlucAoKCXRlc3QJXCQtOCwkbGVuCglqbnoJLkxvb3A4CgljbXAJXCQwLCRsZW4KCWpuZQkuTGxvb3AxCglqbXAJLkxleGl0CgouYWxpZ24JMTYKLkxpbnRlbDoKCXRlc3QJXCQtMzIsJGxlbgoJanoJLkxsb29wMQoJYW5kCVwkMTUsJFRYWzFdCglqegkuTG9vcDE2X2lzX2hvdAoJc3ViCSRUWFsxXSwkbGVuCi5Mb29wMTZfd2FybXVwOgoJYWRkCSRUWFswXSNiLCRZWSNiCgltb3ZsCSgkZGF0LCRZWSw0KSwkVFkjZAoJbW92bAkkVFhbMF0jZCwoJGRhdCwkWVksNCkKCW1vdmwJJFRZI2QsKCRkYXQsJFhYWzBdLDQpCglhZGQJJFRZI2IsJFRYWzBdI2IKCWluYwkkWFhbMF0jYgoJbW92bAkoJGRhdCwkVFhbMF0sNCksJFRZI2QKCW1vdmwJKCRkYXQsJFhYWzBdLDQpLCRUWFswXSNkCgl4b3JiCSgkaW5wKSwkVFkjYgoJbW92YgkkVFkjYiwoJG91dCwkaW5wKQoJbGVhCTEoJGlucCksJGlucAoJZGVjCSRUWFsxXQoJam56CS5Mb29wMTZfd2FybXVwCgoJbW92CSRZWSwkVFhbMV0KCXhvcgkkWVksJFlZCgltb3YJJFRYWzFdI2IsJFlZI2IKCi5Mb29wMTZfaXNfaG90OgoJbGVhCSgkZGF0LCRYWFswXSw0KSwkWFhbMV0KX19fCnN1YiBSQzRfbG9vcCB7CiAgbXkgJGk9c2hpZnQ7CiAgbXkgJGo9JGk8MD8wOiRpOwogIG15ICR4bW09IiV4bW0iLigkaiYxKTsKCiAgICAkY29kZS49IglhZGQJXCQxNiwkWFhbMF0jYlxuIgkJaWYgKCRpPT0xNSk7CiAgICAkY29kZS49Igltb3ZkcXUJKCRpbnApLCV4bW0yXG4iCQkJaWYgKCRpPT0xNSk7CiAgICAkY29kZS49IglhZGQJJFRYWzBdI2IsJFlZI2JcbiIJCWlmICgkaTw9MCk7CiAgICAkY29kZS49Igltb3ZsCSgkZGF0LCRZWSw0KSwkVFkjZFxuIjsKICAgICRjb2RlLj0iCXB4b3IJJXhtbTAsJXhtbTJcbiIJCQlpZiAoJGk9PTApOwogICAgJGNvZGUuPSIJcHNsbHEJXCQ4LCV4bW0xXG4iCQkJaWYgKCRpPT0wKTsKICAgICRjb2RlLj0iCXB4b3IJJHhtbSwkeG1tXG4iCQkJaWYgKCRpPD0xKTsKICAgICRjb2RlLj0iCW1vdmwJJFRYWzBdI2QsKCRkYXQsJFlZLDQpXG4iOwogICAgJGNvZGUuPSIJYWRkCSRUWSNiLCRUWFswXSNiXG4iOwogICAgJGNvZGUuPSIJbW92bAlgNCooJGorMSlgKCRYWFsxXSksJFRYWzFdI2RcbiIJaWYgKCRpPDE1KTsKICAgICRjb2RlLj0iCW1vdnoJJFRYWzBdI2IsJFRYWzBdI2RcbiI7CiAgICAkY29kZS49Igltb3ZsCSRUWSNkLDQqJGooJFhYWzFdKVxuIjsKICAgICRjb2RlLj0iCXB4b3IJJXhtbTEsJXhtbTJcbiIJCQlpZiAoJGk9PTApOwogICAgJGNvZGUuPSIJbGVhCSgkZGF0LCRYWFswXSw0KSwkWFhbMV1cbiIJaWYgKCRpPT0xNSk7CiAgICAkY29kZS49IglhZGQJJFRYWzFdI2IsJFlZI2JcbiIJCWlmICgkaTwxNSk7CiAgICAkY29kZS49IglwaW5zcncJXCRgKCRqPj4xKSY3YCwoJGRhdCwkVFhbMF0sNCksJHhtbVxuIjsKICAgICRjb2RlLj0iCW1vdmRxdQkleG1tMiwoJG91dCwkaW5wKVxuIgkJaWYgKCRpPT0wKTsKICAgICRjb2RlLj0iCWxlYQkxNigkaW5wKSwkaW5wXG4iCQlpZiAoJGk9PTApOwogICAgJGNvZGUuPSIJbW92bAkoJFhYWzFdKSwkVFhbMV0jZFxuIgkJaWYgKCRpPT0xNSk7Cn0KCVJDNF9sb29wKC0xKTsKJGNvZGUuPTw8X19fOwoJam1wCS5Mb29wMTZfZW50ZXIKLmFsaWduCTE2Ci5Mb29wMTY6Cl9fXwoKZm9yICgkaT0wOyRpPDE2OyRpKyspIHsKICAgICRjb2RlLj0iLkxvb3AxNl9lbnRlcjpcbiIJCWlmICgkaT09MSk7CglSQzRfbG9vcCgkaSk7CglwdXNoKEBUWCxzaGlmdChAVFgpKTsgCQkjICJyb3RhdGUiIHJlZ2lzdGVycwp9CiRjb2RlLj08PF9fXzsKCW1vdgkkWVksJFRYWzFdCgl4b3IJJFlZLCRZWQkJCSMga2V5d29yZCB0byBwYXJ0aWFsIHJlZ2lzdGVyCglzdWIJXCQxNiwkbGVuCgltb3YJJFRYWzFdI2IsJFlZI2IKCXRlc3QJXCQtMTYsJGxlbgoJam56CS5Mb29wMTYKCglwc2xscQlcJDgsJXhtbTEKCXB4b3IJJXhtbTAsJXhtbTIKCXB4b3IJJXhtbTEsJXhtbTIKCW1vdmRxdQkleG1tMiwoJG91dCwkaW5wKQoJbGVhCTE2KCRpbnApLCRpbnAKCgljbXAJXCQwLCRsZW4KCWpuZQkuTGxvb3AxCglqbXAJLkxleGl0CgouYWxpZ24JMTYKLkxsb29wMToKCWFkZAkkVFhbMF0jYiwkWVkjYgoJbW92bAkoJGRhdCwkWVksNCksJFRZI2QKCW1vdmwJJFRYWzBdI2QsKCRkYXQsJFlZLDQpCgltb3ZsCSRUWSNkLCgkZGF0LCRYWFswXSw0KQoJYWRkCSRUWSNiLCRUWFswXSNiCglpbmMJJFhYWzBdI2IKCW1vdmwJKCRkYXQsJFRYWzBdLDQpLCRUWSNkCgltb3ZsCSgkZGF0LCRYWFswXSw0KSwkVFhbMF0jZAoJeG9yYgkoJGlucCksJFRZI2IKCW1vdmIJJFRZI2IsKCRvdXQsJGlucCkKCWxlYQkxKCRpbnApLCRpbnAKCWRlYwkkbGVuCglqbnoJLkxsb29wMQoJam1wCS5MZXhpdAoKLmFsaWduCTE2Ci5MUkM0X0NIQVI6CglhZGQJXCQxLCRYWFswXSNiCgltb3Z6YgkoJGRhdCwkWFhbMF0pLCRUWFswXSNkCgl0ZXN0CVwkLTgsJGxlbgoJanoJLkxjbG9vcDEKCWptcAkuTGNsb29wOAouYWxpZ24JMTYKLkxjbG9vcDg6Cgltb3YJKCRpbnApLCVyOGQKCW1vdgk0KCRpbnApLCVyOWQKX19fCiMgdW5yb2xsIDJ4NC13aXNlLCBiZWNhdXNlIDY0LWJpdCByb3RhdGVzIGtpbGwgSW50ZWwgUDQuLi4KZm9yICgkaT0wOyRpPDQ7JGkrKykgewokY29kZS49PDxfX187CglhZGQJJFRYWzBdI2IsJFlZI2IKCWxlYQkxKCRYWFswXSksJFhYWzFdCgltb3Z6YgkoJGRhdCwkWVkpLCRUWSNkCgltb3Z6YgkkWFhbMV0jYiwkWFhbMV0jZAoJbW92emIJKCRkYXQsJFhYWzFdKSwkVFhbMV0jZAoJbW92YgkkVFhbMF0jYiwoJGRhdCwkWVkpCgljbXAJJFhYWzFdLCRZWQoJbW92YgkkVFkjYiwoJGRhdCwkWFhbMF0pCglqbmUJLkxjbW92JGkJCQkjIEludGVsIGNtb3YgaXMgc2xvb29vdy4uLgoJbW92CSRUWFswXSwkVFhbMV0KLkxjbW92JGk6CglhZGQJJFRYWzBdI2IsJFRZI2IKCXhvcgkoJGRhdCwkVFkpLCVyOGIKCXJvcglcJDgsJXI4ZApfX18KcHVzaChAVFgsc2hpZnQoQFRYKSk7IHB1c2goQFhYLHNoaWZ0KEBYWCkpOwkjICJyb3RhdGUiIHJlZ2lzdGVycwp9CmZvciAoJGk9NDskaTw4OyRpKyspIHsKJGNvZGUuPTw8X19fOwoJYWRkCSRUWFswXSNiLCRZWSNiCglsZWEJMSgkWFhbMF0pLCRYWFsxXQoJbW92emIJKCRkYXQsJFlZKSwkVFkjZAoJbW92emIJJFhYWzFdI2IsJFhYWzFdI2QKCW1vdnpiCSgkZGF0LCRYWFsxXSksJFRYWzFdI2QKCW1vdmIJJFRYWzBdI2IsKCRkYXQsJFlZKQoJY21wCSRYWFsxXSwkWVkKCW1vdmIJJFRZI2IsKCRkYXQsJFhYWzBdKQoJam5lCS5MY21vdiRpCQkJIyBJbnRlbCBjbW92IGlzIHNsb29vb3cuLi4KCW1vdgkkVFhbMF0sJFRYWzFdCi5MY21vdiRpOgoJYWRkCSRUWFswXSNiLCRUWSNiCgl4b3IJKCRkYXQsJFRZKSwlcjliCglyb3IJXCQ4LCVyOWQKX19fCnB1c2goQFRYLHNoaWZ0KEBUWCkpOyBwdXNoKEBYWCxzaGlmdChAWFgpKTsJIyAicm90YXRlIiByZWdpc3RlcnMKfQokY29kZS49PDxfX187CglsZWEJLTgoJGxlbiksJGxlbgoJbW92CSVyOGQsKCRvdXQpCglsZWEJOCgkaW5wKSwkaW5wCgltb3YJJXI5ZCw0KCRvdXQpCglsZWEJOCgkb3V0KSwkb3V0CgoJdGVzdAlcJC04LCRsZW4KCWpuegkuTGNsb29wOAoJY21wCVwkMCwkbGVuCglqbmUJLkxjbG9vcDEKCWptcAkuTGV4aXQKX19fCiRjb2RlLj08PF9fXzsKLmFsaWduCTE2Ci5MY2xvb3AxOgoJYWRkCSRUWFswXSNiLCRZWSNiCgltb3Z6YgkkWVkjYiwkWVkjZAoJbW92emIJKCRkYXQsJFlZKSwkVFkjZAoJbW92YgkkVFhbMF0jYiwoJGRhdCwkWVkpCgltb3ZiCSRUWSNiLCgkZGF0LCRYWFswXSkKCWFkZAkkVFhbMF0jYiwkVFkjYgoJYWRkCVwkMSwkWFhbMF0jYgoJbW92emIJJFRZI2IsJFRZI2QKCW1vdnpiCSRYWFswXSNiLCRYWFswXSNkCgltb3Z6YgkoJGRhdCwkVFkpLCRUWSNkCgltb3Z6YgkoJGRhdCwkWFhbMF0pLCRUWFswXSNkCgl4b3JiCSgkaW5wKSwkVFkjYgoJbGVhCTEoJGlucCksJGlucAoJbW92YgkkVFkjYiwoJG91dCkKCWxlYQkxKCRvdXQpLCRvdXQKCXN1YglcJDEsJGxlbgoJam56CS5MY2xvb3AxCglqbXAJLkxleGl0CgouYWxpZ24JMTYKLkxleGl0OgoJc3ViCVwkMSwkWFhbMF0jYgoJbW92bAkkWFhbMF0jZCwtOCgkZGF0KQoJbW92bAkkWVkjZCwtNCgkZGF0KQoKCW1vdgkoJXJzcCksJXIxMwoJbW92CTgoJXJzcCksJXIxMgoJbW92CTE2KCVyc3ApLCVyYngKCWFkZAlcJDI0LCVyc3AKLkxlcGlsb2d1ZToKCXJldAouc2l6ZQlSQzQsLi1SQzQKX19fCn0KCiRpZHg9IiVyOCI7CiRpZG89IiVyOSI7CgokY29kZS49PDxfX187Ci5nbG9ibAlwcml2YXRlX1JDNF9zZXRfa2V5Ci50eXBlCXByaXZhdGVfUkM0X3NldF9rZXksXEBmdW5jdGlvbiwzCi5hbGlnbgkxNgpwcml2YXRlX1JDNF9zZXRfa2V5OgoJbGVhCTgoJGRhdCksJGRhdAoJbGVhCSgkaW5wLCRsZW4pLCRpbnAKCW5lZwkkbGVuCgltb3YJJGxlbiwlcmN4Cgl4b3IJJWVheCwlZWF4Cgl4b3IJJGlkbywkaWRvCgl4b3IJJXIxMCwlcjEwCgl4b3IJJXIxMSwlcjExCgoJbW92CU9QRU5TU0xfaWEzMmNhcF9QKCVyaXApLCRpZHgjZAoJYnQJXCQyMCwkaWR4I2QJIyBSQzRfQ0hBUj8KCWpjCS5MYzFzdGxvb3AKCWptcAkuTHcxc3Rsb29wCgouYWxpZ24JMTYKLkx3MXN0bG9vcDoKCW1vdgklZWF4LCgkZGF0LCVyYXgsNCkKCWFkZAlcJDEsJWFsCglqbmMJLkx3MXN0bG9vcAoKCXhvcgkkaWRvLCRpZG8KCXhvcgkkaWR4LCRpZHgKLmFsaWduCTE2Ci5MdzJuZGxvb3A6Cgltb3YJKCRkYXQsJGlkbyw0KSwlcjEwZAoJYWRkCSgkaW5wLCRsZW4sMSksJGlkeCNiCglhZGQJJXIxMGIsJGlkeCNiCglhZGQJXCQxLCRsZW4KCW1vdgkoJGRhdCwkaWR4LDQpLCVyMTFkCgljbW92egklcmN4LCRsZW4KCW1vdgklcjEwZCwoJGRhdCwkaWR4LDQpCgltb3YJJXIxMWQsKCRkYXQsJGlkbyw0KQoJYWRkCVwkMSwkaWRvI2IKCWpuYwkuTHcybmRsb29wCglqbXAJLkxleGl0X2tleQoKLmFsaWduCTE2Ci5MYzFzdGxvb3A6Cgltb3YJJWFsLCgkZGF0LCVyYXgpCglhZGQJXCQxLCVhbAoJam5jCS5MYzFzdGxvb3AKCgl4b3IJJGlkbywkaWRvCgl4b3IJJGlkeCwkaWR4Ci5hbGlnbgkxNgouTGMybmRsb29wOgoJbW92CSgkZGF0LCRpZG8pLCVyMTBiCglhZGQJKCRpbnAsJGxlbiksJGlkeCNiCglhZGQJJXIxMGIsJGlkeCNiCglhZGQJXCQxLCRsZW4KCW1vdgkoJGRhdCwkaWR4KSwlcjExYgoJam56CS5MY25vd3JhcAoJbW92CSVyY3gsJGxlbgouTGNub3dyYXA6Cgltb3YJJXIxMGIsKCRkYXQsJGlkeCkKCW1vdgklcjExYiwoJGRhdCwkaWRvKQoJYWRkCVwkMSwkaWRvI2IKCWpuYwkuTGMybmRsb29wCgltb3ZsCVwkLTEsMjU2KCRkYXQpCgouYWxpZ24JMTYKLkxleGl0X2tleToKCXhvcgklZWF4LCVlYXgKCW1vdgklZWF4LC04KCRkYXQpCgltb3YJJWVheCwtNCgkZGF0KQoJcmV0Ci5zaXplCXByaXZhdGVfUkM0X3NldF9rZXksLi1wcml2YXRlX1JDNF9zZXRfa2V5CgouZ2xvYmwJUkM0X29wdGlvbnMKLnR5cGUJUkM0X29wdGlvbnMsXEBhYmktb21uaXBvdGVudAouYWxpZ24JMTYKUkM0X29wdGlvbnM6CglsZWEJLkxvcHRzKCVyaXApLCVyYXgKCW1vdglPUEVOU1NMX2lhMzJjYXBfUCglcmlwKSwlZWR4CglidAlcJDIwLCVlZHgKCWpjCS5MOHhjaGFyCglidAlcJDMwLCVlZHgKCWpuYwkuTGRvbmUKCWFkZAlcJDI1LCVyYXgKCXJldAouTDh4Y2hhcjoKCWFkZAlcJDEyLCVyYXgKLkxkb25lOgoJcmV0Ci5hbGlnbgk2NAouTG9wdHM6Ci5hc2NpegkicmM0KDh4LGludCkiCi5hc2NpegkicmM0KDh4LGNoYXIpIgouYXNjaXoJInJjNCgxNngsaW50KSIKLmFzY2l6CSJSQzQgZm9yIHg4Nl82NCwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKLmFsaWduCTY0Ci5zaXplCVJDNF9vcHRpb25zLC4tUkM0X29wdGlvbnMKX19fCgojIEVYQ0VQVElPTl9ESVNQT1NJVElPTiBoYW5kbGVyIChFWENFUFRJT05fUkVDT1JEICpyZWMsVUxPTkc2NCBmcmFtZSwKIwkJQ09OVEVYVCAqY29udGV4dCxESVNQQVRDSEVSX0NPTlRFWFQgKmRpc3ApCmlmICgkd2luNjQpIHsKJHJlYz0iJXJjeCI7CiRmcmFtZT0iJXJkeCI7CiRjb250ZXh0PSIlcjgiOwokZGlzcD0iJXI5IjsKCiRjb2RlLj08PF9fXzsKLmV4dGVybglfX2ltcF9SdGxWaXJ0dWFsVW53aW5kCi50eXBlCXN0cmVhbV9zZV9oYW5kbGVyLFxAYWJpLW9tbmlwb3RlbnQKLmFsaWduCTE2CnN0cmVhbV9zZV9oYW5kbGVyOgoJcHVzaAklcnNpCglwdXNoCSVyZGkKCXB1c2gJJXJieAoJcHVzaAklcmJwCglwdXNoCSVyMTIKCXB1c2gJJXIxMwoJcHVzaAklcjE0CglwdXNoCSVyMTUKCXB1c2hmcQoJc3ViCVwkNjQsJXJzcAoKCW1vdgkxMjAoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJheAoJbW92CTI0OCgkY29udGV4dCksJXJieAkjIHB1bGwgY29udGV4dC0+UmlwCgoJbGVhCS5McHJvbG9ndWUoJXJpcCksJXIxMAoJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA8cHJvbG9ndWUgbGFiZWwKCWpiCS5MaW5fcHJvbG9ndWUKCgltb3YJMTUyKCRjb250ZXh0KSwlcmF4CSMgcHVsbCBjb250ZXh0LT5Sc3AKCglsZWEJLkxlcGlsb2d1ZSglcmlwKSwlcjEwCgljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcD49ZXBpbG9ndWUgbGFiZWwKCWphZQkuTGluX3Byb2xvZ3VlCgoJbGVhCTI0KCVyYXgpLCVyYXgKCgltb3YJLTgoJXJheCksJXJieAoJbW92CS0xNiglcmF4KSwlcjEyCgltb3YJLTI0KCVyYXgpLCVyMTMKCW1vdgklcmJ4LDE0NCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJieAoJbW92CSVyMTIsMjE2KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjEyCgltb3YJJXIxMywyMjQoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SMTMKCi5MaW5fcHJvbG9ndWU6Cgltb3YJOCglcmF4KSwlcmRpCgltb3YJMTYoJXJheCksJXJzaQoJbW92CSVyYXgsMTUyKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UnNwCgltb3YJJXJzaSwxNjgoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5Sc2kKCW1vdgklcmRpLDE3NigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJkaQoKCWptcAkuTGNvbW1vbl9zZWhfZXhpdAouc2l6ZQlzdHJlYW1fc2VfaGFuZGxlciwuLXN0cmVhbV9zZV9oYW5kbGVyCgoudHlwZQlrZXlfc2VfaGFuZGxlcixcQGFiaS1vbW5pcG90ZW50Ci5hbGlnbgkxNgprZXlfc2VfaGFuZGxlcjoKCXB1c2gJJXJzaQoJcHVzaAklcmRpCglwdXNoCSVyYngKCXB1c2gJJXJicAoJcHVzaAklcjEyCglwdXNoCSVyMTMKCXB1c2gJJXIxNAoJcHVzaAklcjE1CglwdXNoZnEKCXN1YglcJDY0LCVyc3AKCgltb3YJMTUyKCRjb250ZXh0KSwlcmF4CSMgcHVsbCBjb250ZXh0LT5Sc3AKCW1vdgk4KCVyYXgpLCVyZGkKCW1vdgkxNiglcmF4KSwlcnNpCgltb3YJJXJzaSwxNjgoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5Sc2kKCW1vdgklcmRpLDE3NigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJkaQoKLkxjb21tb25fc2VoX2V4aXQ6CgoJbW92CTQwKCRkaXNwKSwlcmRpCQkjIGRpc3AtPkNvbnRleHRSZWNvcmQKCW1vdgkkY29udGV4dCwlcnNpCQkjIGNvbnRleHQKCW1vdglcJDE1NCwlZWN4CQkjIHNpemVvZihDT05URVhUKQoJLmxvbmcJMHhhNTQ4ZjNmYwkJIyBjbGQ7IHJlcCBtb3ZzcQoKCW1vdgkkZGlzcCwlcnNpCgl4b3IJJXJjeCwlcmN4CQkjIGFyZzEsIFVOV19GTEFHX05IQU5ETEVSCgltb3YJOCglcnNpKSwlcmR4CQkjIGFyZzIsIGRpc3AtPkltYWdlQmFzZQoJbW92CTAoJXJzaSksJXI4CQkjIGFyZzMsIGRpc3AtPkNvbnRyb2xQYwoJbW92CTE2KCVyc2kpLCVyOQkJIyBhcmc0LCBkaXNwLT5GdW5jdGlvbkVudHJ5Cgltb3YJNDAoJXJzaSksJXIxMAkJIyBkaXNwLT5Db250ZXh0UmVjb3JkCglsZWEJNTYoJXJzaSksJXIxMQkJIyAmZGlzcC0+SGFuZGxlckRhdGEKCWxlYQkyNCglcnNpKSwlcjEyCQkjICZkaXNwLT5Fc3RhYmxpc2hlckZyYW1lCgltb3YJJXIxMCwzMiglcnNwKQkJIyBhcmc1Cgltb3YJJXIxMSw0MCglcnNwKQkJIyBhcmc2Cgltb3YJJXIxMiw0OCglcnNwKQkJIyBhcmc3Cgltb3YJJXJjeCw1NiglcnNwKQkJIyBhcmc4LCAoTlVMTCkKCWNhbGwJKl9faW1wX1J0bFZpcnR1YWxVbndpbmQoJXJpcCkKCgltb3YJXCQxLCVlYXgJCSMgRXhjZXB0aW9uQ29udGludWVTZWFyY2gKCWFkZAlcJDY0LCVyc3AKCXBvcGZxCglwb3AJJXIxNQoJcG9wCSVyMTQKCXBvcAklcjEzCglwb3AJJXIxMgoJcG9wCSVyYnAKCXBvcAklcmJ4Cglwb3AJJXJkaQoJcG9wCSVyc2kKCXJldAouc2l6ZQlrZXlfc2VfaGFuZGxlciwuLWtleV9zZV9oYW5kbGVyCgouc2VjdGlvbgkucGRhdGEKLmFsaWduCTQKCS5ydmEJLkxTRUhfYmVnaW5fUkM0CgkucnZhCS5MU0VIX2VuZF9SQzQKCS5ydmEJLkxTRUhfaW5mb19SQzQKCgkucnZhCS5MU0VIX2JlZ2luX3ByaXZhdGVfUkM0X3NldF9rZXkKCS5ydmEJLkxTRUhfZW5kX3ByaXZhdGVfUkM0X3NldF9rZXkKCS5ydmEJLkxTRUhfaW5mb19wcml2YXRlX1JDNF9zZXRfa2V5Cgouc2VjdGlvbgkueGRhdGEKLmFsaWduCTgKLkxTRUhfaW5mb19SQzQ6CgkuYnl0ZQk5LDAsMCwwCgkucnZhCXN0cmVhbV9zZV9oYW5kbGVyCi5MU0VIX2luZm9fcHJpdmF0ZV9SQzRfc2V0X2tleToKCS5ieXRlCTksMCwwLDAKCS5ydmEJa2V5X3NlX2hhbmRsZXIKX19fCn0KCnN1YiByZWdfcGFydCB7Cm15ICgkcmVnLCRjb252KT1AXzsKICAgIGlmICgkcmVnID1+IC8lclswLTldKy8pCXsgJHJlZyAuPSAkY29udjsgfQogICAgZWxzaWYgKCRjb252IGVxICJiIikJeyAkcmVnID1+IHMvJVtlcl0oW154XSspeD8vJSQxbC87CX0KICAgIGVsc2lmICgkY29udiBlcSAidyIpCXsgJHJlZyA9fiBzLyVbZXJdKC4rKS8lJDEvOwkJfQogICAgZWxzaWYgKCRjb252IGVxICJkIikJeyAkcmVnID1+IHMvJVtlcl0oLispLyVlJDEvOwkJfQogICAgcmV0dXJuICRyZWc7Cn0KCiRjb2RlID1+IHMvKCVbYS16MC05XSspIyhbYndkXSkvcmVnX3BhcnQoJDEsJDIpL2dlbTsKJGNvZGUgPX4gcy9cYChbXlxgXSopXGAvZXZhbCAkMS9nZW07CgpwcmludCAkY29kZTsKCmNsb3NlIFNURE9VVDsK