ZGlmZiAtLWdpdCBhL2Fvcy9idWlsZC9idWlsZC5zaCBiL2Fvcy9idWlsZC9idWlsZC5zaAppbmRleCA3MmU2YzdhLi42YWZiOGJiIDEwMDc1NQotLS0gYS9hb3MvYnVpbGQvYnVpbGQuc2gKKysrIGIvYW9zL2J1aWxkL2J1aWxkLnNoCkBAIC03LDggKzcsOCBAQAogUExBVEZPUk09JDEKIEdZUF9NQUlOPSQyCiBERUJVRz0kMwotQUNUSU9OPSQ0Ci1PVVRfTkFNRT0kNQorT1VUX05BTUU9JDQKK0FDVElPTj0kNQogCiBleHBvcnQgV0lORF9CQVNFPSR7V0lORF9CQVNFOi0iL3Vzci9sb2NhbC9wb3dlcnBjLXdycy12eHdvcmtzL3dpbmRfYmFzZSJ9CiAKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvV1BJTGliL1dQSUxpYi9WaXNpb24yMDA5L0F4aXNDYW1lcmEuY3BwIGIvYW9zL2V4dGVybmFscy9XUElMaWIvV1BJTGliL1Zpc2lvbjIwMDkvQXhpc0NhbWVyYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVlNDhjYwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvV1BJTGliL1dQSUxpYi9WaXNpb24yMDA5L0F4aXNDYW1lcmEuY3BwCkBAIC0wLDAgKzEsMTAyMSBAQAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIFByb2plY3QgICAJCTogRklSU1QgTW90b3IgQ29udHJvbGxlcgorKiAgRmlsZSBOYW1lICAJCTogQXhpc0NhbWVyYS5jcHAgICAgICAgIAorKiAgQ29udHJpYnV0b3JzIAk6IFRELCBFTEYsIEpERywgU1ZLCisqICBDcmVhdGlvbiBEYXRlIAk6IEp1bHkgMjksIDIwMDgKKyogIFJldmlzaW9uIEhpc3RvcnkJOiBTb3VyY2UgY29kZSAmIHJldmlzaW9uIGhpc3RvcnkgbWFpbnRhaW5lZCBhdCBzb3VyY2Vmb3JnZS5XUEkuZWR1ICAgIAorKiAgRmlsZSBEZXNjcmlwdGlvbgk6IEF4aXMgY2FtZXJhIGFjY2VzcyBmb3IgdGhlIEZJUlNUIFZpc2lvbiBBUEkKKyogICAgICBUaGUgY2FtZXJhIHRhc2sgcnVucyBhcyBhbiBpbmRlcGVuZGVudCB0aHJlYWQgCisqLyAgICAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAgICAgICAgQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAqLworLyogIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgKi8KKy8qICBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgICAgICAgICAgICAgICAgICAKKworCisjaW5jbHVkZSAic29ja0xpYi5oIiAKKyNpbmNsdWRlICJ2eFdvcmtzLmgiIAorCisjaW5jbHVkZSAiZXJybm8uaCIKKyNpbmNsdWRlICJmaW9MaWIuaCIKKyNpbmNsdWRlICJob3N0TGliLmgiIAorI2luY2x1ZGUgImluZXRMaWIuaCIgCisjaW5jbHVkZSAic2lnbmFsLmgiCisjaW5jbHVkZSAic2lnTGliLmgiCQkvLyBmb3Igc2lnbmFsCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgInRpbWUuaCIKKyNpbmNsdWRlICJ1c3JMaWIuaCIKKworI2luY2x1ZGUgIkF4aXNDYW1lcmEuaCIgCisjaW5jbHVkZSAiQmFlVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiRnJjRXJyb3IuaCIKKyNpbmNsdWRlICJUYXNrLmgiCisjaW5jbHVkZSAiVGltZXIuaCIKKyNpbmNsdWRlICJWaXNpb25BUEkuaCIKKworLyoqIHBhY2tldCBzaXplICovCisjZGVmaW5lIERFRkFVTFRfUEFDS0VUX1NJWkUgNTEyCisKKy8qKiBQcml2YXRlIE5JIGZ1bmN0aW9uIHRvIGRlY29kZSBKUEVHICovIAorSU1BUV9GVU5DIGludCBQcml2X1JlYWRKUEVHU3RyaW5nX0MoSW1hZ2UqIF9pbWFnZSwgY29uc3QgdW5zaWduZWQgY2hhciogX3N0cmluZywgVUlOVDMyIF9zdHJpbmdMZW5ndGgpOyAKKworLy8gVG8gbG9jYWxseSBlbmFibGUgZGVidWcgcHJpbnRpbmc6IHNldCBBeGlzQ2FtZXJhX2RlYnVnRmxhZyB0byBhIDEsIHRvIGRpc2FibGUgc2V0IHRvIDAKK2ludCBBeGlzQ2FtZXJhX2RlYnVnRmxhZyA9IDA7CisjZGVmaW5lIERQUklOVEYgaWYoQXhpc0NhbWVyYV9kZWJ1Z0ZsYWcpZHByaW50ZgorCisvKiogQGJyaWVmIENhbWVyYSBkYXRhIHRvIGJlIGFjY2Vzc2VkIGdsb2JhbGx5ICovCitzdHJ1Y3QgeworCWludCByZWFkZXJQSUQ7IC8vIFNldCB0byB0YXNrSUQgZm9yIHNpZ25hbGluZworCWludCBpbmRleDsgLyogLTEsMCwxICovCisJaW50CWFjcXVpcmU7IC8qIDA6U1RPUCBDQU1FUkE7IDE6U1RBUlQgQ0FNRVJBICovCisJaW50IGNhbWVyYVJlYWR5OyAgLyogMDogQ0FNRVJBIE5PVCBJTklUSUFMSVpFRDsgMTogQ0FNRVJBIElOSVRJQUxJWkVEICovCisJaW50CWRlY29kZTsgLyogMDpkaXNhYmxlIGRlY29kaW5nOyAxOmVuYWJsZSBkZWNvZGluZyB0byBIU0wgSW1hZ2UgKi8KKwlzdHJ1Y3QgeworCQkvLworCQkvLyBUbyBmaW5kIHRoZSBsYXRlc3QgaW1hZ2UgdGltZXN0YW1wLCBhY2Nlc3M6CisJCS8vIGdsb2JhbENhbWVyYS5kYXRhW2dsb2JhbENhbWVyYS5pbmRleF0udGltZXN0YW1wCisJCS8vCisJCWRvdWJsZSB0aW1lc3RhbXA7ICAgICAgIC8vIHdoZW4gaW1hZ2Ugd2FzIHRha2VuCisJCWNoYXIqCWNhbWVyYUltYWdlOyAgICAvLyBqcGVnIGltYWdlIHN0cmluZworCQlpbnQgY2FtZXJhSW1hZ2VTaXplOyAgICAvLyBpbWFnZSBzaXplCisJCUltYWdlKiBkZWNvZGVkSW1hZ2U7ICAgIC8vIGltYWdlIGRlY29kZWQgdG8gTkkgSW1hZ2Ugb2JqZWN0CisJCWludCBkZWNvZGVkSW1hZ2VTaXplOyAgIC8vIHNpemUgb2YgZGVjb2RlZCBpbWFnZQorCX1kYXRhWzJdOworCWludCBjYW1lcmFNZXRyaWNzW0NBTV9OVU1fTUVUUklDU107Cit9Z2xvYmFsQ2FtZXJhOworCisvKiBydW4gZmxhZyAqLworc3RhdGljIHNob3J0IGNvbnQgPSAwOworCisvKioKKyAqIEBicmllZiBHZXQgdGhlIG1vc3QgcmVjZW50IGNhbWVyYSBpbWFnZS4KKyAqIFN1cHBvcnRzIElNQVFfSU1BR0VfUkdCIGFuZCBJTUFRX0lNQUdFX0hTTC4KKyAqIEBwYXJhbSBpbWFnZSBJbWFnZSB0byByZXR1cm4gdG87IGltYWdlIG11c3QgaGF2ZSBiZWVuIGZpcnN0IGNyZWF0ZWQgdXNpbmcgZnJjQ3JlYXRlSW1hZ2UuIAorICogV2hlbiB5b3UgYXJlIGRvbmUsIHVzZSBmcmNEaXNwb3NlLgorICogQHBhcmFtIHRpbWVzdGFtcCBUaW1lc3RhbXAgdG8gcmV0dXJuOyB3aWxsIHJlY29yZCB0aGUgdGltZSBhdCB3aGljaCB0aGUgaW1hZ2Ugd2FzIHN0b3JlZC4KKyAqIEBwYXJhbSBsYXN0SW1hZ2VUaW1lc3RhbXAgSW5wdXQgLSB0aW1lc3RhbXAgb2YgbGFzdCBpbWFnZTsgcHJldmVudHMgc2VydmluZyBvZiBzdGFsZSBpbWFnZXMKKyAqIEByZXR1cm4gMCBpcyBmYWlsdXJlLCAxIGlzIHN1Y2Nlc3MKKyAqIEBzYSBmcmNDcmVhdGVJbWFnZSgpLCBmcmNEaXNwb3NlKCkKKyAqLworaW50IEdldEltYWdlQmxvY2tpbmcoSW1hZ2UqIGltYWdlLCBkb3VibGUgKnRpbWVzdGFtcCwgZG91YmxlIGxhc3RJbWFnZVRpbWVzdGFtcCkKK3sKKwljaGFyIGZ1bmNOYW1lW109IkdldEltYWdlQmxvY2tpbmciOworCWludCBzdWNjZXNzOworCWRvdWJsZSBzdGFydFRpbWUgPSBHZXRUaW1lKCk7CisJCisJd2hpbGUgKDEpCisJeworCQlzdWNjZXNzID0gR2V0SW1hZ2UoaW1hZ2UsIHRpbWVzdGFtcCk7CisJCWlmICghc3VjY2VzcykgcmV0dXJuIChzdWNjZXNzKTsKKwkJCisJCWlmICgqdGltZXN0YW1wID4gbGFzdEltYWdlVGltZXN0YW1wKQorCQkJcmV0dXJuICgxKTsgLy8gR09PRCBJTUFHRSBSRVRVUk5FRAorCisJCWlmIChHZXRUaW1lKCkgPiAoc3RhcnRUaW1lICsgTUFYX0JMT0NLSU5HX1RJTUVfU0VDKSkKKwkJeworCQkJaW1hcVNldEVycm9yKEVSUl9DQU1FUkFfQkxPQ0tJTkdfVElNRU9VVCwgZnVuY05hbWUpOworCQkJZ2xvYmFsQ2FtZXJhLmNhbWVyYU1ldHJpY3NbQ0FNX0JMT0NLSU5HX1RJTUVPVVRdKys7CisJCQlyZXR1cm4gKDApOyAvLyBOTyBJTUFHRSBBVkFJTEFCTEUgV0lUSElOIHNwZWNpZmllZCB0aW1lCisJCX0KKwkJZ2xvYmFsQ2FtZXJhLmNhbWVyYU1ldHJpY3NbQ0FNX0JMT0NLSU5HX0NPVU5UXSsrOworCQl0YXNrRGVsYXkgKDEpOworCX0KK30KKworLyoqCisgKiBAYnJpZWYgVmVyaWZpZXMgdGhhdCB0aGUgY2FtZXJhIGlzIGluaXRpYWxpemVkCisgKiBAcmV0dXJuIDAgZm9yIGZhaWx1cmUsIDEgZm9yIHN1Y2Nlc3MKKyAqLworaW50IENhbWVyYUluaXRpYWxpemVkKCkKK3sKKwljaGFyIGZ1bmNOYW1lW109IkNhbWVyYUluaXRpYWxpemVkIjsKKwlpbnQgc3VjY2VzcyA9IDA7CisJLyogY2hlY2sgdG8gc2VlIGlmIGNhbWVyYSBpcyBpbml0aWFsaXplZCAqLworCWlmICghZ2xvYmFsQ2FtZXJhLmNhbWVyYVJlYWR5KSAgeworCQlpbWFxU2V0RXJyb3IoRVJSX0NBTUVSQV9OT1RfSU5JVElBTElaRUQsIGZ1bmNOYW1lKTsKKwkJRFBSSU5URiAoTE9HX0RFQlVHLCAiQ2FtZXJhIHJlcXVlc3QgYmVmb3JlIGNhbWVyYSBpcyBpbml0aWFsaXplZCIpOworCQlnbG9iYWxDYW1lcmEuY2FtZXJhTWV0cmljc1tDQU1fR0VUSU1BR0VfQkVGT1JFX0lOSVRdKys7CisJCWdsb2JhbENhbWVyYS5jYW1lcmFNZXRyaWNzW0NBTV9HRVRJTUFHRV9GQUlMVVJFXSsrOworCQlyZXR1cm4gc3VjY2VzczsKKwl9CisJCisJaWYgKGdsb2JhbENhbWVyYS5pbmRleCA9PSAtMSl7CisJCWltYXFTZXRFcnJvcihFUlJfQ0FNRVJBX05PX0JVRkZFUl9BVkFJTEFCTEUsIGZ1bmNOYW1lKTsKKwkJRFBSSU5URiAoTE9HX0RFQlVHLCAiTm8gY2FtZXJhIGltYWdlIGF2YWlsYWJsZSIpOworCQlnbG9iYWxDYW1lcmEuY2FtZXJhTWV0cmljc1tDQU1fR0VUSU1BR0VfQkVGT1JFX0FWQUlMQUJMRV0rKzsKKwkJZ2xvYmFsQ2FtZXJhLmNhbWVyYU1ldHJpY3NbQ0FNX0dFVElNQUdFX0ZBSUxVUkVdKys7CisJCXJldHVybiBzdWNjZXNzOworCX0KKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBAYnJpZWYgR2V0cyB0aGUgbW9zdCByZWNlbnQgY2FtZXJhIGltYWdlLCBhcyBsb25nIGFzIGl0IGlzIG5vdCBzdGFsZS4KKyAqIFN1cHBvcnRlZCBpbWFnZSB0eXBlczogSU1BUV9JTUFHRV9SR0IsIElNQVFfSU1BR0VfSFNMCisgKiBAcGFyYW0gaW1hZ2UgSW1hZ2UgdG8gcmV0dXJuLCBtdXN0IGhhdmUgZmlyc3QgYmVlbiBjcmVhdGVkIHdpdGggZnJjQ3JlYXRlSW1hZ2Ugb3IgaW1hcUNyZWF0ZS4gCisgKiBXaGVuIHlvdSBmaW5pc2ggd2l0aCB0aGUgaW1hZ2UsIGNhbGwgZnJjRGlzcG9zZSgpIHRvIGRpc3Bvc2Ugb2YgaXQuCisgKiBAcGFyYW0gdGltZXN0YW1wIFJldHVybmVkIHRpbWVzdGFtcCBvZiB3aGVuIHRoZSBpbWFnZSB3YXMgdGFrZW4gZnJvbSB0aGUgY2FtZXJhCisgKiBAcmV0dXJuIGZhaWx1cmUgPSAwLCBzdWNjZXNzID0gMQorICovCitpbnQgR2V0SW1hZ2UoSW1hZ2UqIGltYWdlLCBkb3VibGUgKnRpbWVzdGFtcCkKK3sKKwljaGFyIGZ1bmNOYW1lW109IkdldEltYWdlIjsKKwlpbnQgc3VjY2VzcyA9IDA7CisJaW50IHJlYWRJbmRleDsKKwlpbnQJcmVhZENvdW50ID0gMTA7CisJZG91YmxlIGN1cnJlbnRUaW1lID0gdGltZShOVUxMKTsKKwlkb3VibGUgY3VycmVudEltYWdlVGltZXN0YW1wOworCisJLyogY2hlY2sgdG8gc2VlIGlmIGNhbWVyYSBpcyBpbml0aWFsaXplZCAqLworCQorCWlmICghQ2FtZXJhSW5pdGlhbGl6ZWQoKSkge3JldHVybiBzdWNjZXNzO30KKwkKKwkvKiB0cnkgcmVhZENvdW50IHRpbWVzIHRvIGdldCBhbiBpbWFnZSAqLworCXdoaWxlIChyZWFkQ291bnQpIHsKKwkJcmVhZEluZGV4ID0gZ2xvYmFsQ2FtZXJhLmluZGV4OworCQlpZiAoIWltYXFEdXBsaWNhdGUoaW1hZ2UsIGdsb2JhbENhbWVyYS5kYXRhW3JlYWRJbmRleF0uZGVjb2RlZEltYWdlKSkgeworCQkJaW50IGVycm9yQ29kZSA9IEdldExhc3RWaXNpb25FcnJvcigpOyAKKwkJCURQUklOVEYgKExPR19ERUJVRywiRXJyb3IgZHVwbGljYXRpbmcgaW1hZ2U9ICVpICAlcyAiLCBlcnJvckNvZGUsIEdldFZpc2lvbkVycm9yVGV4dChlcnJvckNvZGUpKTsJCQkKKwkJfQorCQkvLyBzYXZlIHRoZSB0aW1lc3RhbXAgdG8gY2hlY2sgYmVmb3JlIHJldHVybmluZworCQljdXJyZW50SW1hZ2VUaW1lc3RhbXAgPSBnbG9iYWxDYW1lcmEuZGF0YVtyZWFkSW5kZXhdLnRpbWVzdGFtcDsKKwkJCisJCS8vIG1ha2Ugc3VyZSB0aGlzIGJ1ZmZlciBpcyBub3QgYmVpbmcgd3JpdHRlbiB0byBub3cKKwkJaWYgKHJlYWRJbmRleCA9PSBnbG9iYWxDYW1lcmEuaW5kZXgpIGJyZWFrOworCQlyZWFkQ291bnQtLTsKKwl9CisJCisJLyogd2VyZSB3ZSBzdWNjZXNzZnVsID8gKi8KKwlpZiAocmVhZENvdW50KXsKKwkJc3VjY2VzcyA9IDE7CisJCWlmICh0aW1lc3RhbXAgIT0gTlVMTCkKKwkJCSAgKnRpbWVzdGFtcCA9IGN1cnJlbnRJbWFnZVRpbWVzdGFtcDsgLy8gUmV0dXJuIGltYWdlIHRpbWVzdGFtcAkgIAorCX0gZWxzZXsKKwkJZ2xvYmFsQ2FtZXJhLmNhbWVyYU1ldHJpY3NbQ0FNX0dFVElNQUdFX0ZBSUxVUkVdKys7CisJfQorCQorCS8qIEVuc3VyZSB0aGUgYnVmZmVyZWQgaW1hZ2UgaXMgbm90IHRvbyBvbGQgLSBzZXQgdGhpcyAic3RhbGUgdGltZSIgYWJvdmUgKi8KKwlpZiAoY3VycmVudFRpbWUgPiBnbG9iYWxDYW1lcmEuZGF0YVtnbG9iYWxDYW1lcmEuaW5kZXhdLnRpbWVzdGFtcCArIENBTUVSQV9JTUFHRV9TVEFMRV9USU1FX1NFQyl7CisJCURQUklOVEYgKExPR19DUklUSUNBTCwgIlNUQUxFIGNhbWVyYSBpbWFnZSAoVEhJUyBDT1VMRCBCRSBBIEJBRCBJTUFHRSkiKTsKKwkJaW1hcVNldEVycm9yKEVSUl9DQU1FUkFfU1RBTEVfSU1BR0UsIGZ1bmNOYW1lKTsKKwkJZ2xvYmFsQ2FtZXJhLmNhbWVyYU1ldHJpY3NbQ0FNX1NUQUxFX0lNQUdFXSsrOworCQlnbG9iYWxDYW1lcmEuY2FtZXJhTWV0cmljc1tDQU1fR0VUSU1BR0VfRkFJTFVSRV0rKzsKKwkJc3VjY2VzcyA9IDA7CisJfQorCWdsb2JhbENhbWVyYS5jYW1lcmFNZXRyaWNzW0NBTV9HRVRJTUFHRV9TVUNDRVNTXSsrOworCXJldHVybiBzdWNjZXNzOworfQorCisvKioKKyAqIEBicmllZiBNZXRob2QgdG8gZ2V0IGEgcmF3IGltYWdlIGZyb20gdGhlIGJ1ZmZlcgorICogQHBhcmFtIGltYWdlRGF0YSByZXR1cm5lZCBpbWFnZSBkYXRhCisgKiBAcGFyYW0gbnVtQnl0ZXMgcmV0dXJuZWQgbnVtYmVyIG9mIGJ5dGVzIGluIGJ1ZmZlcgorICogQHBhcmFtIGN1cnJlbnRJbWFnZVRpbWVzdGFtcCByZXR1cm5lZCBidWZmZXIgdGltZSBvZiBpbWFnZSBkYXRhCisgKiBAcmV0dXJuIDAgaWYgZmFpbHVyZTsgMSBpZiBzdWNjZXNzCisgKi8KK2ludCBHZXRJbWFnZURhdGEoY2hhcioqIGltYWdlRGF0YSwgaW50KiBudW1CeXRlcywgZG91YmxlKiBjdXJyZW50SW1hZ2VUaW1lc3RhbXApCit7CisJaW50IHN1Y2Nlc3MgPSAwOworCWludCByZWFkSW5kZXg7CisJaW50CXJlYWRDb3VudCA9IDEwOworCWludCBjYW1lcmFJbWFnZVNpemU7CisJY2hhciAqY2FtZXJhSW1hZ2VTdHJpbmc7CisKKwkvKiBjaGVjayB0byBzZWUgaWYgY2FtZXJhIGlzIGluaXRpYWxpemVkICovCisJCQkKKwlpZiAoIUNhbWVyYUluaXRpYWxpemVkKCkpIHtyZXR1cm4gc3VjY2Vzczt9CisJCQkKKwkvKiB0cnkgcmVhZENvdW50IHRpbWVzIHRvIGdldCBhbiBpbWFnZSAqLworCXdoaWxlIChyZWFkQ291bnQpIHsKKwkJcmVhZEluZGV4ID0gZ2xvYmFsQ2FtZXJhLmluZGV4OworCQljYW1lcmFJbWFnZVNpemUgPSBnbG9iYWxDYW1lcmEuZGF0YVtyZWFkSW5kZXhdLmNhbWVyYUltYWdlU2l6ZTsKKwkJLy9jYW1lcmFJbWFnZVN0cmluZyA9IChJbWFnZSAqKSBtYWxsb2MoY2FtZXJhSW1hZ2VTaXplKTsKKwkJY2FtZXJhSW1hZ2VTdHJpbmcgPSBuZXcgY2hhcltjYW1lcmFJbWFnZVNpemVdOworCQlpZiAoTlVMTCA9PSBjYW1lcmFJbWFnZVN0cmluZykgeworCQkJCQlEUFJJTlRGIChMT0dfREVCVUcsICJVbmFibGUgdG8gYWxsb2NhdGUgY2FtZXJhSW1hZ2UiKTsKKwkJCQkJZ2xvYmFsQ2FtZXJhLmNhbWVyYU1ldHJpY3NbQ0FNX0dFVElNQUdFX0ZBSUxVUkVdKys7CisJCQkJCXJldHVybiBzdWNjZXNzOworCQl9CisJCW1lbWNweSAoY2FtZXJhSW1hZ2VTdHJpbmcsIGdsb2JhbENhbWVyYS5kYXRhW3JlYWRJbmRleF0uY2FtZXJhSW1hZ2UsIGNhbWVyYUltYWdlU2l6ZSk7CisJCSpjdXJyZW50SW1hZ2VUaW1lc3RhbXAgPSBnbG9iYWxDYW1lcmEuZGF0YVtyZWFkSW5kZXhdLnRpbWVzdGFtcDsKKwkJLy8gbWFrZSBzdXJlIHRoaXMgYnVmZmVyIGlzIG5vdCBiZWluZyB3cml0dGVuIHRvIG5vdworCQlpZiAocmVhZEluZGV4ID09IGdsb2JhbENhbWVyYS5pbmRleCkgYnJlYWs7CisJCWZyZWUgKGNhbWVyYUltYWdlU3RyaW5nKTsKKwkJcmVhZENvdW50LS07CisJfQorCWlmIChyZWFkQ291bnQpeworCQkqaW1hZ2VEYXRhID0gY2FtZXJhSW1hZ2VTdHJpbmc7CisJCSpudW1CeXRlcyA9IGNhbWVyYUltYWdlU2l6ZTsKKwkJcmV0dXJuIDE7CisJfQkJCisJcmV0dXJuIChPSyk7Cit9CisKKy8qKgorICogQGJyaWVmIEJsb2NraW5nIGNhbGwgdG8gZ2V0IGltYWdlcyBmb3IgUEMuCisgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgZnJvbSBhIHNlcGFyYXRlIHRhc2sgdG8gbWFpbnRhaW4gY2FtZXJhIHJlYWQgcGVyZm9ybWFuY2UuIAorICogSXQgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3Igc2VuZGluZyByYXcgKHVuZGVjb2RlZCkgaW1hZ2UgZGF0YSB0byB0aGUgUEMuCisgKiBAcGFyYW0gaW1hZ2VEYXRhIGltYWdlIGRhdGEgdG8gcmV0dXJuCisgKiBAcGFyYW0gbnVtQnl0ZXMgbnVtYmVyIG9mIGJ5dGVzIGluIGJ1ZmZlcgorICogQHBhcmFtIHRpbWVzdGFtcCB0aW1lc3RhbXAgb2YgYnVmZmVyIHJldHVybmVkCisgKiBAcGFyYW0gbGFzdEltYWdlVGltZXN0YW1wIGJ1ZmZlciB0aW1lIG9mIGxhc3QgaW1hZ2UgZGF0YSBzZW50IHRvIFBDCisgKiBAcmV0dXJuIDAgaWYgZmFpbHVyZTsgMSBpZiBzdWNjZXNzCisgKi8KK2ludCBHZXRJbWFnZURhdGFCbG9ja2luZyhjaGFyKiogaW1hZ2VEYXRhLCBpbnQqIG51bUJ5dGVzLCBkb3VibGUqIHRpbWVzdGFtcCwgZG91YmxlIGxhc3RJbWFnZVRpbWVzdGFtcCkKK3sKKworCWNoYXIgZnVuY05hbWVbXT0iR2V0SW1hZ2VEYXRhQmxvY2tpbmciOworCWludCBzdWNjZXNzOworCWRvdWJsZSBzdGFydFRpbWUgPSBHZXRUaW1lKCk7CisJCisgICAgKmltYWdlRGF0YSA9IE5VTEw7CisJd2hpbGUgKDEpCisJeworCQlzdWNjZXNzID0gR2V0SW1hZ2VEYXRhKGltYWdlRGF0YSwgbnVtQnl0ZXMsIHRpbWVzdGFtcCk7CisJCWlmICghc3VjY2VzcykgcmV0dXJuIChzdWNjZXNzKTsKKwkJCisJCWlmICgqdGltZXN0YW1wID4gbGFzdEltYWdlVGltZXN0YW1wKQorCQkJcmV0dXJuICgxKTsgLy8gR09PRCBJTUFHRSBEQVRBIFJFVFVSTkVECisKKyAgICAgICAgZGVsZXRlICppbWFnZURhdGE7CisgICAgICAgICppbWFnZURhdGEgPSBOVUxMOworCisJCWlmIChHZXRUaW1lKCkgPiAoc3RhcnRUaW1lICsgTUFYX0JMT0NLSU5HX1RJTUVfU0VDKSkKKwkJeworCQkJaW1hcVNldEVycm9yKEVSUl9DQU1FUkFfQkxPQ0tJTkdfVElNRU9VVCwgZnVuY05hbWUpOworCQkJcmV0dXJuICgwKTsgLy8gTk8gSU1BR0UgQVZBSUxBQkxFIFdJVEhJTiBzcGVjaWZpZWQgdGltZQorCQl9CisJCWdsb2JhbENhbWVyYS5jYW1lcmFNZXRyaWNzW0NBTV9CTE9DS0lOR19DT1VOVF0rKzsKKwkJdGFza0RlbGF5ICgxKTsKKwl9Cit9CisKKy8qKgorICogQGJyaWVmIEFjY2Vzc29yIGZvciBjYW1lcmEgaW5zdHJ1bWVudGF0aW9uIGRhdGEKKyAqIEBwYXJhbSB0aGUgY291bnRlciBxdWVyaWVkCisgKiBAcmV0dXJuIHRoZSBjb3VudGVyIHZhbHVlCisgKi8KK2ludCBHZXRDYW1lcmFNZXRyaWMoRnJjdkNhbWVyYU1ldHJpYyBtZXRyaWMpCit7CXJldHVybiBnbG9iYWxDYW1lcmEuY2FtZXJhTWV0cmljc1ttZXRyaWNdOyAgfQorCisvKioKKyAqIEBicmllZiBDbG9zZSBzb2NrZXQgJiByZXBvcnQgZXJyb3IKKyAqIEBwYXJhbSBlcnJzdHJpbmcgU3RyaW5nIHRvIHByaW50CisgKiBAcGFyYW0gc29ja2V0IFNvY2tldCB0byBjbG9zZQorICogQHJldHVybiBlcnJvcgorICovCitpbnQgQ2FtZXJhQ2xvc2VTb2NrZXQoY2hhciAqZXJyc3RyaW5nLCBpbnQgc29ja2V0KQoreworCURQUklOVEYgKExPR19DUklUSUNBTCwgIkNsb3Npbmcgc29ja2V0IC0gQ0FNRVJBIEVSUk9SOiAlcyIsIGVycnN0cmluZyApOworCWNsb3NlIChzb2NrZXQpOworCXJldHVybiAoRVJST1IpOworfQorCisKKy8qKgorICogQGJyaWVmIFJlYWRzIG9uZSBsaW5lIGZyb20gdGhlIFRDUCBzdHJlYW0uCisgKiBAcGFyYW0gY2FtU29jayAgICAgICAgIFRoZSBzb2NrZXQuCisgKiBAcGFyYW0gYnVmZmVyICAgICAgICAgIEEgYnVmZmVyIHdpdGggYnVmU2l6ZSBhbGxvY2F0ZWQgZm9yIGl0LiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgT24gcmV0dXJuLCBidWZTaXplLTEgYW1vdW50IG9mIGRhdGEgb3IgZGF0YSB1cHRvIGZpcnN0IGxpbmUgZW5kaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoZXZlciBpcyBzbWFsbGVyLCBudWxsIHRlcm1pbmF0ZWQuCisgKiBAcGFyYW0gYnVmU2l6ZSAgICAgICAgIFRoZSBzaXplIG9mIGJ1ZmZlci4KKyAqIEBwYXJhbSBzdHJpcExpbmVFbmRpbmcgSWYgdHJ1ZSwgc3RyaXBzIHRoZSBsaW5lIGVuZGluZyBjaGFjdGVycyBmcm9tIHRoZSBidWZmZXIgYmVmb3JlIHJldHVybi4KKyAqIEByZXR1cm4gMCBpZiBmYWlsdXJlOyAxIGlmIHN1Y2Nlc3MKKyovCitzdGF0aWMgaW50IENhbWVyYVJlYWRMaW5lKGludCBjYW1Tb2NrLCBjaGFyKiBidWZmZXIsIGludCBidWZTaXplLCBib29sIHN0cmlwTGluZUVuZGluZykgeworCWNoYXIgZnVuY05hbWVbXT0iQ2FtZXJhUmVhZExpbmUiOworICAgIC8vIE5lZWQgYXQgbGVhc3QgMyBieXRlcyBpbiB0aGUgYnVmZmVyIHRvIHB1bGwgdGhpcyBvZmYuCisJaWYgKGJ1ZlNpemUgPCAzKSB7CisJCWltYXFTZXRFcnJvcihFUlJfQ0FNRVJBX0ZBSUxVUkUsIGZ1bmNOYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorICAgIC8vICBSZWR1Y2Ugc2l6ZSBieSAxIHRvIGFsbG93IGZvciBudWxsIHRlcm1pbmF0b3IuCisgICAgLS1idWZTaXplOworICAgIC8vICBSZWFkIHVwdG8gYnVmU2l6ZSBjaGFyYWN0ZXJzLgorICAgIGZvciAoaW50IGk9MDtpIDwgYnVmU2l6ZTsrK2ksICsrYnVmZmVyKSB7CisgICAgICAgIC8vICBSZWFkIG9uZSBjaGFyYWN0ZXIuCisgICAgICAgIGlmIChyZWFkIChjYW1Tb2NrLCBidWZmZXIsIDEpIDw9IDApIHsKKyAgICAJCWltYXFTZXRFcnJvcihFUlJfQ0FNRVJBX0ZBSUxVUkUsIGZ1bmNOYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIC8vICBMaW5lIGVuZGluZ3MgY2FuIGJlICJcclxuIiBvciBqdXN0ICJcbiIuIFNvIGFsd2F5cyAKKyAgICAgICAgLy8gIGxvb2sgZm9yIGEgIlxuIi4gSWYgeW91IGdvdCBqdXN0IGEgIlxuIiBhbmQgCisgICAgICAgIC8vICBzdHJpcExpbmVFbmRpbmcgaXMgZmFsc2UsIHRoZW4gY29udmVydCBpdCBpbnRvIGEgXHJcbgorICAgICAgICAvLyAgYmVjYXVzZSBjYWxsZXJzIGV4cGVjdCBhIFxyXG4uCisgICAgICAgIC8vICBJZiB0aGUgY29tYmluYXRpb24gb2YgdGhlIHByZXZpb3VzIGNoYXJhY3RlciBhbmQgdGhlIGN1cnJlbnQgY2hhcmFjdGVyCisgICAgICAgIC8vICBpcyAiXHJcbiIsIHRoZSBsaW5lIGVuZGluZworICAgICAgICBpZiAoKmJ1ZmZlcj09J1xuJykgeworICAgICAgICAgICAgLy8gIElmIGFza2VkIHRvIHN0cmlwIHRoZSBsaW5lIGVuZGluZywgdGhlbiBzZXQgdGhlIGJ1ZmZlciB0byB0aGUgcHJldmlvdXMgCisgICAgICAgICAgICAvLyAgY2hhcmFjdGVyLgorICAgICAgICAgICAgaWYgKHN0cmlwTGluZUVuZGluZykgeworICAgICAgICAgICAgICAgIGlmIChpID4gMCAmJiAqKGJ1ZmZlci0xKT09J1xyJykgeworICAgICAgICAgICAgICAgICAgICAtLWJ1ZmZlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyAgSWYgdGhlIHByZXZpb3VzIGNoYXJhY3RlciB3YXMgbm90IGEgJ1xyJywgCisgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCB8fCAqKGJ1ZmZlci0xKSE9J1xyJykgeworICAgICAgICAgICAgICAgICAgICAvLyAgTWFrZSB0aGUgY3VycmVudCBjaGFyYWN0ZXIgYSAnXHInLgorICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gJ1xyJzsKKyAgICAgICAgICAgICAgICAgICAgLy8gIElmIHNwYWNlIHBlcm1pdHMsIGFkZCBiYWNrIHRoZSAnXG4nLgorICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGJ1ZlNpemUtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgKytidWZmZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gJ1xuJzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyAgU2V0IHRoZSBidWZmZXIgcGFzdCB0aGUgY3VycmVudCBjaGFyYWN0ZXIgKCdcbicpCisgICAgICAgICAgICAgICAgKytidWZmZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAgTnVsbCB0ZXJtaW5hdGUuCisgICAgKmJ1ZmZlciA9ICdcMCc7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qKgorQGJyaWVmIFNraXBzIHJlYWQgZGF0YSB1bnRpbCB0aGUgZmlyc3QgZW1wdHkgbGluZS4KKworQHBhcmFtIGNhbVNvY2sgQW4gb3BlbiB0Y3Agc29ja2V0IHRvIHRoZSBjYW1lcmEgdG8gcmVhZCB0aGUgZGF0YSBmcm9tLgorQHJldHVybiBzdWNlc3MgMCBpZiBmYWlsdXJlOyAxIGlmIHN1Y2Nlc3MKKyovCitzdGF0aWMgaW50IENhbWVyYVNraXBVbnRpbEVtcHR5TGluZShpbnQgY2FtU29jaykgeworICAgIGNoYXIgYnVmZmVyWzEwMjRdOworICAgIGludCBzdWNjZXNzID0gMDsKKyAgICB3aGlsZSgxKSB7CisgICAgICAgIHN1Y2Nlc3MgPSBDYW1lcmFSZWFkTGluZShjYW1Tb2NrLCBidWZmZXIsIHNpemVvZihidWZmZXIpLCB0cnVlKTsKKyAgICAgICAgaWYgKCpidWZmZXIgPT0gJ1wwJykgeworICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKy8qKgorQGJyaWVmIE9wZW5zIGEgc29ja2V0LgorCitJc3N1ZXMgdGhlIGdpdmVuIGh0dHAgcmVxdWVzdCB3aXRoIHRoZSByZXF1aXJlZCBhZGRlZCBpbmZvcm1hdGlvbiAKK2FuZCBhdXRoZW50aWNhdGlvbi4gSXQgIGN5Y2xlcyB0aHJvdWdoIGFuIGFycmF5IG9mIHByZWRldGVybWluZWQgCitlbmNyeXB0ZWQgdXNlcm5hbWUsIHBhc3N3b3JkIGNvbWJpbmF0aW9ucyB0aGF0IHdlIGV4cGVjdCB0aGUgdXNlcnMgCit0byBoYXZlIGF0IGFueSBwb2ludCBpbiB0aW1lLiBJZiBub25lIG9mIHRoZSB1c2VybmFtZSwgcGFzc3dvcmQgCitjb21iaW5hdGlvbnMgd29yaywgaXQgb3V0cHV0cyBhICJVbmtub3duIHVzZXIgb3IgcGFzc3dvcmQiIGVycm9yLgorSWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMsIGl0IHJldHVybnMgdGhlIHNvY2tldCBudW1iZXIuCisKK0BwYXJhbSBzZXJ2ZXJOYW1lIFRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaG9zdCBmcm9tIHdoaWNoIHRoaXMgcmVxdWVzdCBvcmlnaW5hdGVzCitAcGFyYW0gcmVxdWVzdCAgIFRoZSByZXF1ZXN0IHRvIHNlbmQgdG8gdGhlIGNhbWVyYSBub3QgaW5jbHVkaW5nIGJvaWxlcnBsYXRlIG9yIAorICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbi4gVGhpcyBpcyB1c3VhbGx5IGluIHRoZSBmb3JtIG9mICJHRVQgPHN0cmluZz4iCitAcmV0dXJuIGludCAtIGZhaWx1cmUgPSBFUlJPUjsgc3VjY2VzcyA9IHNvY2tldCBudW1iZXI7ICAgICAKKyovCitzdGF0aWMgaW50IENhbWVyYU9wZW5Tb2NrZXRBbmRJc3N1ZUF1dGhvcml6ZWRSZXF1ZXN0KGNvbnN0IGNoYXIqIHNlcnZlck5hbWUsIGNvbnN0IGNoYXIqIHJlcXVlc3QpIAoreworICAgIGNoYXIgZnVuY05hbWVbXT0iY2FtZXJhT3BlblNvY2tldEFuZElzc3VlQXV0aG9yaXplZFJlcXVlc3QiOworCQorCXN0cnVjdCBzb2NrYWRkcl9pbiBjYW1lcmFBZGRyOworCWludCBzb2NrQWRkclNpemU7ICAKKwlpbnQgY2FtU29jayA9IEVSUk9SOyAgICAKKworICAgIC8vIFRoZSBjYW1lcmEgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB1c2VybmFtZSwgcGFzc3dvcmQgY29tYmluYXRpb25zLgorICAgIC8vIFRoaXMgcm91dGluZSB3aWxsIHJldHVybiBhbiBlcnJvciBpZiBpdCBkb2VzIG5vdCBmaW5kIG9uZSBvZiB0aGVzZS4KKyAgICBzdGF0aWMgY29uc3QgY2hhciogYXV0aGVudGljYXRpb25TdHJpbmdzW10gPSB7CisgICAgICAgICJSbEpET2taU1F3PT0iLCAgICAgLyogRlJDLCBGUkMgKi8KKyAgICAgICAgImNtOXZkRHB3WVhOeiIsICAgICAvKiByb290LCBhZG1pbiovCisgICAgICAgICJjbTl2ZERwaFpHMXBiZz09IiAgLyogcm9vdCwgcGFzcyovCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBpbnQgbnVtQXV0aGVudGljYXRpb25TdHJpbmdzID0gc2l6ZW9mKGF1dGhlbnRpY2F0aW9uU3RyaW5ncykvc2l6ZW9mKGF1dGhlbnRpY2F0aW9uU3RyaW5nc1swXSk7CisJCisJc3RhdGljIGNvbnN0IGNoYXIgKnJlcXVlc3RUZW1wbGF0ZSA9ICIlcyAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSFRUUC8xLjFcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZXItQWdlbnQ6IEhUVFBTdHJlYW1DbGllbnRcbiIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb25uZWN0aW9uOiBLZWVwLUFsaXZlXG4iICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FjaGUtQ29udHJvbDogbm8tY2FjaGVcbiIgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF1dGhvcml6YXRpb246IEJhc2ljICVzXG5cbiI7CisKKwlpbnQgaSA9IDA7CisgICAgZm9yICg7aSA8IG51bUF1dGhlbnRpY2F0aW9uU3RyaW5nczsrK2kpIHsKKyAgICAgICAgY2hhciBidWZmZXJbMTAyNF07CisKKyAgICAgICAgc3ByaW50ZihidWZmZXIsIHJlcXVlc3RUZW1wbGF0ZSwgcmVxdWVzdCwgYXV0aGVudGljYXRpb25TdHJpbmdzW2ldKTsKKworICAgICAgICAvKiBjcmVhdGUgY2FtZXJhIHNvY2tldCAqLworICAgICAgICAvL0RQUklOVEYgKExPR19ERUJVRywgImNyZWF0aW5nIGNhbVNvY2siICk7IAorICAgICAgICBpZiAoKGNhbVNvY2sgPSBzb2NrZXQgKEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKSkgPT0gRVJST1IpIHsKKyAgICAJCWltYXFTZXRFcnJvcihFUlJfQ0FNRVJBX1NPQ0tFVF9DUkVBVEVfRkFJTEVELCBmdW5jTmFtZSk7CisgICAgCQlwZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgc29ja2V0Iik7CisgICAgCQlyZXR1cm4gKEVSUk9SKTsKKyAgICAgICAgfQorCisgICAgICAgIHNvY2tBZGRyU2l6ZSA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX2luKTsKKyAgICAgICAgYnplcm8gKChjaGFyICopICZjYW1lcmFBZGRyLCBzb2NrQWRkclNpemUpOworICAgICAgICBjYW1lcmFBZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBjYW1lcmFBZGRyLnNpbl9sZW4gPSAodV9jaGFyKSBzb2NrQWRkclNpemU7CisgICAgICAgIGNhbWVyYUFkZHIuc2luX3BvcnQgPSBodG9ucyAoQ0FNRVJBX1BPUlQpOworCisgICAgICAgIGlmICgoIChpbnQpKGNhbWVyYUFkZHIuc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyIChjb25zdF9jYXN0PGNoYXIqPihzZXJ2ZXJOYW1lKSkgKSA9PSBFUlJPUikgJiYKKyAgICAgICAgICAgICggKGludCkoY2FtZXJhQWRkci5zaW5fYWRkci5zX2FkZHIgPSBob3N0R2V0QnlOYW1lIChjb25zdF9jYXN0PGNoYXIqPihzZXJ2ZXJOYW1lKSkgKSA9PSBFUlJPUikpIAorICAgICAgICB7CisgICAgCQlpbWFxU2V0RXJyb3IoRVJSX0NBTUVSQV9DT05ORUNUX0ZBSUxFRCwgZnVuY05hbWUpOworICAgICAgICAgICAgcmV0dXJuIENhbWVyYUNsb3NlU29ja2V0KCJGYWlsZWQgdG8gZ2V0IElQLCBjaGVjayBob3N0bmFtZSBvciBJUCIsIGNhbVNvY2spOworICAgICAgICB9CisKKyAgICAgICAgLy9EUFJJTlRGIChMT0dfSU5GTywgImNvbm5lY3RpbmcgY2FtU29jayIgKTsgCisgICAgICAgIGlmIChjb25uZWN0IChjYW1Tb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZjYW1lcmFBZGRyLCBzb2NrQWRkclNpemUpID09IEVSUk9SKSAJeworICAgIAkJaW1hcVNldEVycm9yKEVSUl9DQU1FUkFfQ09OTkVDVF9GQUlMRUQsIGZ1bmNOYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBDYW1lcmFDbG9zZVNvY2tldCgiRmFpbGVkIHRvIGNvbm5lY3QgdG8gY2FtZXJhIC0gY2hlY2sgbmV0d29yIiwgY2FtU29jayk7CisgICAgICAgIH0KKworICAgICAgICAvL0RQUklOVEYgKExPR19ERUJVRywgIndyaXRpbmcgR0VUIHJlcXVlc3QgdG8gY2FtU29jayIgKTsgCisgICAgICAgIGlmICh3cml0ZSAoY2FtU29jaywgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSApID09IEVSUk9SKSB7CisgICAgCQlpbWFxU2V0RXJyb3IoRVJSX0NBTUVSQV9DT05ORUNUX0ZBSUxFRCwgZnVuY05hbWUpOworICAgICAgICAgICAgcmV0dXJuIENhbWVyYUNsb3NlU29ja2V0KCJGYWlsZWQgdG8gc2VuZCBHRVQgcmVxdWVzdCIsIGNhbVNvY2spOworICAgICAgICB9CisKKyAgICAgICAgLy8gIFJlYWQgb25lIGxpbmUgd2l0aCB0aGUgbGluZSBlbmRpbmcgcmVtb3ZlZC4KKyAgICAgICAgaWYgKCFDYW1lcmFSZWFkTGluZShjYW1Tb2NrLCBidWZmZXIsIDEwMjQsIHRydWUpKSB7CisgICAgICAgICAgICByZXR1cm4gQ2FtZXJhQ2xvc2VTb2NrZXQoIkJhZCByZXNwb25zZSB0byBHRVQgcmVxdWVzdCIsIGNhbVNvY2spOworICAgICAgICB9CisKKyAgICAgICAgLy8gIENoZWNrIGlmIHRoZSByZXNwb25zZSBpcyBvZiB0aGUgZm9ybWF0IEhUVFAvPHZlcnNpb24+IDIwMCBPSy4KKyAgICAgICAgZmxvYXQgZGlzY2FyZDsKKyAgICAgICAgaWYgKHNzY2FuZihidWZmZXIsICJIVFRQLyVmIDIwMCBPSyIsICZkaXNjYXJkKSA9PSAxKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vICBXZSBoYXZlIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uIGJlY2F1c2UgaW4gdGhlIGNhc2Ugb2YgZmFpbHVyZQorICAgICAgICAvLyAgdGhlIHNlcnZlciBjbG9zZXMgdGhlIGNvbm5lY3Rpb24uCisgICAgICAgIGNsb3NlKGNhbVNvY2spOworICAgIH0KKyAgICAvLyAgSWYgbm9uZSBvZiB0aGUgYXR0ZW1wdHMgd2VyZSBzdWNjZXNzZnVsLCB0aGVuIGxldCB0aGUgY2FsbGVyIGtub3cuCisgICAgaWYgKG51bUF1dGhlbnRpY2F0aW9uU3RyaW5ncyA9PSBpKSB7CisJCWltYXFTZXRFcnJvcihFUlJfQ0FNRVJBX0FVVEhPUklaQVRJT05fRkFJTEVELCBmdW5jTmFtZSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXhwZWN0ZWQgdXNlcm5hbWUvcGFzc3dvcmQgY29tYmluYXRpb24gbm90IGZvdW5kIG9uIGNhbWVyYSIpOworICAgICAgICByZXR1cm4gRVJST1I7CisgICAgfQorICAgIHJldHVybiBjYW1Tb2NrOworfQorCisKKy8qKgorICogQGJyaWVmIFNlbmRzIGEgY29uZmlndXJhdGlvbiBtZXNzYWdlIHRvIHRoZSBjYW1lcmEKKyAqIEBwYXJhbSBjb25maWdTdHJpbmcgY29uZmlndXJhdGlvbiBtZXNzYWdlIHRvIHRoZSBjYW1lcmEKKyAqIEByZXR1cm4gc3VjY2VzczogMD1mYWlsdXJlOyAxPXN1Y2Nlc3MKKyAqLworaW50IENvbmZpZ3VyZUNhbWVyYShjaGFyICpjb25maWdTdHJpbmcpeworCWNoYXIgZnVuY05hbWVbXT0iQ29uZmlndXJlQ2FtZXJhIjsKKwljaGFyICpzZXJ2ZXJOYW1lID0gIjE5Mi4xNjguMC45MCI7CQkvKiBjYW1lcmEgQCAqLyAKKwlpbnQgc3VjY2VzcyA9IDA7CisJaW50IGNhbVNvY2sgPSAwOyAgICAKKwkKKwkvKiBHZW5lcmF0ZSBjYW1lcmEgY29uZmlndXJhdGlvbiBzdHJpbmcgKi8KKwljaGFyICogZ2V0U3RyMSA9IAorCQkiR0VUIC9heGlzLWNnaS9hZG1pbi9wYXJhbS5jZ2k/YWN0aW9uPXVwZGF0ZSZJbWFnZVNvdXJjZS5JMC5TZW5zb3IuIjsKKwkKKwljaGFyIGNhbWVyYVJlcXVlc3Rbc3RybGVuKGdldFN0cjEpICsgc3RybGVuKGNvbmZpZ1N0cmluZyldOworICAgIHNwcmludGYgKGNhbWVyYVJlcXVlc3QsICIlcyVzIiwJZ2V0U3RyMSwgY29uZmlnU3RyaW5nKTsKKwlEUFJJTlRGKExPR19ERUJVRywgImNhbWVyYSBjb25maWd1cmF0aW9uIHN0cmluZzogXG4lcyIsIGNhbWVyYVJlcXVlc3QpOworCWNhbVNvY2sgPSBDYW1lcmFPcGVuU29ja2V0QW5kSXNzdWVBdXRob3JpemVkUmVxdWVzdChzZXJ2ZXJOYW1lLCBjYW1lcmFSZXF1ZXN0KTsKKwlEUFJJTlRGKExPR19ERUJVRywgImNhbWVyYSBzb2NrZXQjID0gJWkiLCBjYW1Tb2NrKTsKKwkKKyAgICAvL3JlYWQgcmVzcG9uc2UKKyAgICBzdWNjZXNzID0gQ2FtZXJhU2tpcFVudGlsRW1wdHlMaW5lKGNhbVNvY2spOworCS8vRFBSSU5URihMT0dfREVCVUcsICJzdWNjY2VzcyBmcm9tIENhbWVyYVNraXBVbnRpbEVtcHR5TGluZTogJWkiLCBzdWNjZXNzKTsKKyAgICBjaGFyIGJ1ZmZlclszXTsJLy8gc2V0IHByb3BlcnR5IC0gMworICAgIHN1Y2Nlc3MgPSBDYW1lcmFSZWFkTGluZShjYW1Tb2NrLCBidWZmZXIsIDMsIHRydWUpOworCS8vRFBSSU5URihMT0dfREVCVUcsICJzdWNjY2VzcyBmcm9tIENhbWVyYVJlYWRMaW5lOiAlaSIsIHN1Y2Nlc3MpOworCURQUklOVEYoTE9HX0RFQlVHLCAibGluZSByZWFkIGZyb20gY2FtZXJhIFxuJXMiLCBidWZmZXIpOworICAgIGlmIChzdHJjbXAoYnVmZmVyLCAiT0siKSAhPSAwKSB7CisJCWltYXFTZXRFcnJvcihFUlJfQ0FNRVJBX0NPTU1BTkRfRkFJTFVSRSwgZnVuY05hbWUpOworCQlEUFJJTlRGKExPR19ERUJVRywgInNldHRpbmcgRVJSX0NBTUVSQV9DT01NQU5EX0ZBSUxVUkUgLSBPSyBub3QgZm91bmQiKTsKKyAgICB9CisJRFBSSU5URiAoTE9HX0lORk8sICJcbkNvbmZpZ3VyZUNhbWVyYSBFTkRJTkcgIHN1Y2Nlc3MgPSAlaVxuIiwgc3VjY2VzcyApOwkKKworCS8qIGNsZWFuIHVwICovCisJY2xvc2UgKGNhbVNvY2spOworCXJldHVybiAoMSk7Cit9CisKKworLyoqCisgKiBAYnJpZWYgU2VuZHMgYSByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGNhbWVyYQorICogQHBhcmFtIGNvbmZpZ1N0cmluZyByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGNhbWVyYQorICogQHBhcmFtIGNhbWVyYVJlc3BvbnNlIHJlc3BvbnNlIGZyb20gY2FtZXJhCisgKiBAcmV0dXJuIHN1Y2Nlc3M6IDA9ZmFpbHVyZTsgMT1zdWNjZXNzCisgKi8KK2ludCBHZXRDYW1lcmFTZXR0aW5nKGNoYXIgKmNvbmZpZ1N0cmluZywgY2hhciAqY2FtZXJhUmVzcG9uc2UpeworCWNoYXIgKnNlcnZlck5hbWUgPSAiMTkyLjE2OC4wLjkwIjsJCS8qIGNhbWVyYSBAICovIAorCWludCBzdWNjZXNzID0gMDsKKwlpbnQgY2FtU29jayA9IDA7ICAgIAorCQorCS8qIEdlbmVyYXRlIGNhbWVyYSByZXF1ZXN0IHN0cmluZyAqLworCWNoYXIgKiBnZXRTdHIxID0gCisJCSJHRVQgL2F4aXMtY2dpL2FkbWluL3BhcmFtLmNnaT9hY3Rpb249bGlzdCZncm91cD1JbWFnZVNvdXJjZS5JMC5TZW5zb3IuIjsKKwljaGFyIGNhbWVyYVJlcXVlc3Rbc3RybGVuKGdldFN0cjEpICsgc3RybGVuKGNvbmZpZ1N0cmluZyldOworICAgIHNwcmludGYgKGNhbWVyYVJlcXVlc3QsICIlcyVzIiwJZ2V0U3RyMSwgY29uZmlnU3RyaW5nKTsKKwlEUFJJTlRGKExPR19ERUJVRywgImNhbWVyYSBjb25maWd1cmF0aW9uIHN0cmluZzogXG4lcyIsIGNhbWVyYVJlcXVlc3QpOworCWNhbVNvY2sgPSBDYW1lcmFPcGVuU29ja2V0QW5kSXNzdWVBdXRob3JpemVkUmVxdWVzdChzZXJ2ZXJOYW1lLCBjYW1lcmFSZXF1ZXN0KTsKKwlEUFJJTlRGKExPR19ERUJVRywgInJldHVybiBmcm9tIENhbWVyYU9wZW5Tb2NrZXRBbmRJc3N1ZUF1dGhvcml6ZWRSZXF1ZXN0ICVpIiwgY2FtU29jayk7CisJCisgICAgLy9yZWFkIHJlc3BvbnNlCisgICAgc3VjY2VzcyA9IENhbWVyYVNraXBVbnRpbEVtcHR5TGluZShjYW1Tb2NrKTsKKyAgICBzdWNjZXNzID0gQ2FtZXJhUmVhZExpbmUoY2FtU29jaywgY2FtZXJhUmVzcG9uc2UsIDEwMjQsIHRydWUpOworCURQUklOVEYoTE9HX0RFQlVHLCAic3VjY2Nlc3MgZnJvbSBDYW1lcmFSZWFkTGluZTogJWkiLCBzdWNjZXNzKTsKKwlEUFJJTlRGKExPR19ERUJVRywgImxpbmUgcmVhZCBmcm9tIGNhbWVyYSBcbiVzIiwgY2FtZXJhUmVzcG9uc2UpOworCURQUklOVEYgKExPR19JTkZPLCAiXG5HZXRDYW1lcmFTZXR0aW5nIEVORElORyAgc3VjY2VzcyA9ICVpXG4iLCBzdWNjZXNzICk7CQorCisJLyogY2xlYW4gdXAgKi8KKwljbG9zZSAoY2FtU29jayk7CisJcmV0dXJuICgxKTsKK30KKworLyoqCisgKiBAYnJpZWYgU2VuZHMgYSByZXF1ZXN0IG1lc3NhZ2UgdG8gdGhlIGNhbWVyYSBmb3IgaW1hZ2UgYXBwZWFyYW5jZSBwcm9wZXJ0eQorICogKHJlc29sdXRpb24sIGNvbXByZXNzaW9uLCByb3RhdGlvbikKKyAqIEBwYXJhbSBjb25maWdTdHJpbmcgcmVxdWVzdCBtZXNzYWdlIHRvIHRoZSBjYW1lcmEKKyAqIEBwYXJhbSBjYW1lcmFSZXNwb25zZSByZXNwb25zZSBmcm9tIGNhbWVyYQorICogQHJldHVybiBzdWNjZXNzOiAwPWZhaWx1cmU7IDE9c3VjY2VzcworICovCitpbnQgR2V0SW1hZ2VTZXR0aW5nKGNoYXIgKmNvbmZpZ1N0cmluZywgY2hhciAqY2FtZXJhUmVzcG9uc2UpeworCWNoYXIgKnNlcnZlck5hbWUgPSAiMTkyLjE2OC4wLjkwIjsJCS8qIGNhbWVyYSBAICovIAorCWludCBzdWNjZXNzID0gMDsKKwlpbnQgY2FtU29jayA9IDA7ICAgIAorCQorCS8qIEdlbmVyYXRlIGNhbWVyYSByZXF1ZXN0IHN0cmluZyAqLworCWNoYXIgKmdldFN0cjEgPSAiR0VUIC9heGlzLWNnaS9hZG1pbi9wYXJhbS5jZ2k/YWN0aW9uPWxpc3QmZ3JvdXA9SW1hZ2UuSTAuQXBwZWFyYW5jZS4iOworCWNoYXIgY2FtZXJhUmVxdWVzdFtzdHJsZW4oZ2V0U3RyMSkgKyBzdHJsZW4oY29uZmlnU3RyaW5nKV07CisgICAgc3ByaW50ZiAoY2FtZXJhUmVxdWVzdCwgIiVzJXMiLAlnZXRTdHIxLCBjb25maWdTdHJpbmcpOworCURQUklOVEYoTE9HX0RFQlVHLCAiY2FtZXJhIGNvbmZpZ3VyYXRpb24gc3RyaW5nOiBcbiVzIiwgY2FtZXJhUmVxdWVzdCk7CisJY2FtU29jayA9IENhbWVyYU9wZW5Tb2NrZXRBbmRJc3N1ZUF1dGhvcml6ZWRSZXF1ZXN0KHNlcnZlck5hbWUsIGNhbWVyYVJlcXVlc3QpOworCURQUklOVEYoTE9HX0RFQlVHLCAicmV0dXJuIGZyb20gQ2FtZXJhT3BlblNvY2tldEFuZElzc3VlQXV0aG9yaXplZFJlcXVlc3QgJWkiLCBjYW1Tb2NrKTsKKwkKKyAgICAvL3JlYWQgcmVzcG9uc2UKKyAgICBzdWNjZXNzID0gQ2FtZXJhU2tpcFVudGlsRW1wdHlMaW5lKGNhbVNvY2spOworICAgIHN1Y2Nlc3MgPSBDYW1lcmFSZWFkTGluZShjYW1Tb2NrLCBjYW1lcmFSZXNwb25zZSwgMTAyNCwgdHJ1ZSk7CisJRFBSSU5URihMT0dfREVCVUcsICJzdWNjY2VzcyBmcm9tIENhbWVyYVJlYWRMaW5lOiAlaSIsIHN1Y2Nlc3MpOworCURQUklOVEYoTE9HX0RFQlVHLCAibGluZSByZWFkIGZyb20gY2FtZXJhIFxuJXMiLCBjYW1lcmFSZXNwb25zZSk7CisJRFBSSU5URiAoTE9HX0lORk8sICJcbkdldENhbWVyYVNldHRpbmcgRU5ESU5HICBzdWNjZXNzID0gJWlcbiIsIHN1Y2Nlc3MgKTsJCisKKwkvKiBjbGVhbiB1cCAqLworCWNsb3NlIChjYW1Tb2NrKTsKKwlyZXR1cm4gKDEpOworfQorCisKKyNkZWZpbmUgTUVBU1VSRV9TT0NLRVRfVElNRSAxICAgCisKKy8qKgorICogQGJyaWVmIE1hbmFnZSBhY2Nlc3MgdG8gdGhlIGNhbWVyYS4gU2V0cyB1cCBzb2NrZXRzIGFuZCByZWFkcyBpbWFnZXMKKyAqIEBwYXJhbSBmcmFtZXMgRnJhbWVzIHBlciBzZWNvbmQgCisgKiBAcGFyYW0gY29tcHJlc3Npb24gQ2FtZXJhIGltYWdlIGNvbXByZXNzaW9uIAorICogQHBhcmFtIHJlc29sdXRpb24gQ2FtZXJhIGltYWdlIHNpemUgCisgKiBAcGFyYW0gcm90YXRpb24gQ2FtZXJhIGltYWdlIHJvdGF0aW9uIAorICogQHJldHVybiBlcnJvcgorICovCitpbnQgY2FtZXJhSlBFR1NlcnZlcihpbnQgZnJhbWVzLCBpbnQgY29tcHJlc3Npb24sIEltYWdlUmVzb2x1dGlvbiByZXNvbHV0aW9uLCBJbWFnZVJvdGF0aW9uIHJvdGF0aW9uKQoreworCWNoYXIgZnVuY05hbWVbXT0iY2FtZXJhSlBFR1NlcnZlciI7CisJY2hhciAqc2VydmVyTmFtZSA9ICIxOTIuMTY4LjAuOTAiOwkJLyogY2FtZXJhIEAgKi8gCisJY29udCA9IDE7CisJaW50IGVycm9yQ29kZSA9IDA7CisJaW50IHByaW50Q291bnRlciA9IDA7CisJaW50CXdyaXRlSW5kZXg7CisJaW50IGF1dGhvcml6ZUNvdW50ID0gMDsKKwlpbnQgYXV0aG9yaXplQ29uZmlybWVkID0gMDsKKwlzdGF0aWMgY29uc3QgaW50IGF1dGhlbnRpY2F0aW9uU3RyaW5nc0NvdW50ID0gMzsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogYXV0aGVudGljYXRpb25TdHJpbmdzW10gPSB7CisgICAgCQkiY205dmREcGhaRzFwYmc9PSIsIC8qIHJvb3QsIGFkbWluKi8KKyAgICAJCSJSbEpET2taU1F3PT0iLCAgICAgLyogRlJDLCBGUkMgKi8KKyAgICAJCSJjbTl2ZERwd1lYTno9PSIgICAgLyogcm9vdCwgcGFzcyovCisgICAgfTsKKworCURQUklOVEYgKExPR19ERUJVRywgImNhbWVyYUpQRUdTZXJ2ZXIiICk7IAorCQorCXN0cnVjdCBzb2NrYWRkcl9pbiBjYW1lcmFBZGRyOworCWludCBzb2NrQWRkclNpemU7ICAKKwlpbnQgY2FtU29jayA9IDA7ICAgIAorCisJY2hhciByZXNTdHJbMTBdOworCXN3aXRjaCAocmVzb2x1dGlvbikgeworCQljYXNlIGs2NDB4NDgwOiB7IHNwcmludGYocmVzU3RyLCI2NDB4NDgwIik7IGJyZWFrOyB9CisJCWNhc2UgazMyMHgyNDA6IHsgc3ByaW50ZihyZXNTdHIsIjMyMHgyNDAiKTsgYnJlYWs7IH0KKwkJY2FzZSBrMTYweDEyMDogeyBzcHJpbnRmKHJlc1N0ciwiMTYweDEyMCIpOyBicmVhazsgfQorCQlkZWZhdWx0OiB7RFBSSU5URiAoTE9HX0RFQlVHLCAiY29kZSBlcnJvciAtIHJlc29sdXRpb24gaW5wdXQiICk7IGJyZWFrOyB9CisJfQorCQorCS8qIEdlbmVyYXRlIGNhbWVyYSBpbml0aWFsaXphdGlvbiBzdHJpbmcgKi8KKwkvKiBjaGFuZ2VkIHJlc29sdXRpb24gdG8gMTYweDEyMCBmcm9tIDMyMHgyNDAgKi8KKwkvKiBzdXBwb3J0ZWQgcmVzb2x1dGlvbnMgYXJlOiA2NDB4NDgwLCA2NDB4MzYwLCAzMjB4MjQwLCAxNjB4MTIwICovCQorCWNoYXIgKiBnZXRTdHIxID0gCisJIkdFVCAvYXhpcy1jZ2kvbWpwZy92aWRlby5jZ2k/c2hvd2xlbmd0aD0xJmNhbWVyYT0xJiI7CQorCQkKKwljaGFyIGluc2VydFN0clsxMDBdOworCXNwcmludGYgKGluc2VydFN0ciwgImRlc19mcHM9JWkmY29tcHJlc3Npb249JWkmcmVzb2x1dGlvbj0lcyZyb3RhdGlvbj0laSIsIAorCQkJZnJhbWVzLCBjb21wcmVzc2lvbiwgcmVzU3RyLCAoaW50KXJvdGF0aW9uKTsJCisJCisJY2hhciAqIGdldFN0cjIgPSAiIEhUVFAvMS4xXG5cCitVc2VyLUFnZW50OiBIVFRQU3RyZWFtQ2xpZW50XG5cCitIb3N0OiAxOTIuMTUwLjEuMTAwXG5cCitDb25uZWN0aW9uOiBLZWVwLUFsaXZlXG5cCitDYWNoZS1Db250cm9sOiBuby1jYWNoZVxuXAorQXV0aG9yaXphdGlvbjogQmFzaWMgJXM7XG5cbiI7CisKKwljaGFyIGdldFN0cltzdHJsZW4oZ2V0U3RyMSkgKyBzdHJsZW4oaW5zZXJ0U3RyKSArIHN0cmxlbihnZXRTdHIyKV07ICAgICAgCisgICAgc3ByaW50ZiAoZ2V0U3RyLCAiJXM6JXMlcyIsCWdldFN0cjEsIGluc2VydFN0ciwgZ2V0U3RyMik7CisKKwlEUFJJTlRGKExPR19ERUJVRywgInJldmlzZWQgY2FtZXJhIHN0cmluZzogXG4lcyIsIGdldFN0cik7CisJLyogQWxsb2NhdGlvbiAqLworCWNoYXIgdGVtcEJ1ZmZlclsxMDI0XTsKKyAgICAKKwlSRVRSWToKKwlXYWl0KDAuMSk7ICAvL2J1ZyBmaXggLSBkb24ndCBwZXN0ZXIgY2FtZXJhIGlmIGl0J3MgYm9vdGluZworCXdoaWxlIChnbG9iYWxDYW1lcmEuYWNxdWlyZSA9PSAwKSBXYWl0KDAuMSk7CisKKwlpZiAoIWF1dGhvcml6ZUNvbmZpcm1lZCl7CisJICBpZiAoYXV0aG9yaXplQ291bnQgPCBhdXRoZW50aWNhdGlvblN0cmluZ3NDb3VudCl7CisJICAgIHNwcmludGYgKHRlbXBCdWZmZXIsIGdldFN0ciwgYXV0aGVudGljYXRpb25TdHJpbmdzW2F1dGhvcml6ZUNvdW50XSk7CisJICB9IGVsc2UgeworCQlpbWFxU2V0RXJyb3IoRVJSX0NBTUVSQV9BVVRIT1JJWkFUSU9OX0ZBSUxFRCwgZnVuY05hbWUpOworCQlmcHJpbnRmKHN0ZGVyciwgIkNhbWVyYSBhdXRob3JpemF0aW9uIGZhaWxlZCAuLi4gSW5jb3JyZWN0IHBhc3N3b3JkIG9uIGNhbWVyYSEhIik7CisJCXJldHVybiAoRVJST1IpOworCSAgfQorCX0KKworCXdoaWxlICgxKQorCXsKKwkgIGdsb2JhbENhbWVyYS5jYW1lcmFNZXRyaWNzW0NBTV9TT0NLRVRfSU5JVF9BVFRFTVBUU10rKzsJICAKKworCSAgLyogY3JlYXRlIGNhbWVyYSBzb2NrZXQgKi8KKwkgIERQUklOVEYgKExPR19ERUJVRywgImNyZWF0aW5nIGNhbVNvY2siICk7IAorCSAgaWYgKChjYW1Tb2NrID0gc29ja2V0IChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkpID09IEVSUk9SKSB7CQorCQlpbWFxU2V0RXJyb3IoRVJSX0NBTUVSQV9TT0NLRVRfQ1JFQVRFX0ZBSUxFRCwgZnVuY05hbWUpOworCQlwZXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgc29ja2V0Iik7CisJCWNvbnQgPSAwOworCQlyZXR1cm4gKEVSUk9SKTsKKwkgIH0KKworCSAgc29ja0FkZHJTaXplID0gc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCSAgYnplcm8gKChjaGFyICopICZjYW1lcmFBZGRyLCBzb2NrQWRkclNpemUpOworCSAgY2FtZXJhQWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkgIGNhbWVyYUFkZHIuc2luX2xlbiA9ICh1X2NoYXIpIHNvY2tBZGRyU2l6ZTsKKwkgIGNhbWVyYUFkZHIuc2luX3BvcnQgPSBodG9ucyAoQ0FNRVJBX1BPUlQpOworCisJICBEUFJJTlRGIChMT0dfREVCVUcsICJnZXR0aW5nIElQIiApOworCSAgaWYgKCggKGludCkoY2FtZXJhQWRkci5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIgKHNlcnZlck5hbWUpICkgPT0gRVJST1IpICYmCisJCSggKGludCkoY2FtZXJhQWRkci5zaW5fYWRkci5zX2FkZHIgPSBob3N0R2V0QnlOYW1lIChzZXJ2ZXJOYW1lKSApID09IEVSUk9SKSkgCisJICB7CQorCQkgIENhbWVyYUNsb3NlU29ja2V0KCJGYWlsZWQgdG8gZ2V0IElQLCBjaGVjayBob3N0bmFtZSBvciBJUCIsIGNhbVNvY2spOworCQljb250aW51ZTsKKwkgIH0KKwkgIAorCSAgRFBSSU5URiAoTE9HX0lORk8sICJBdHRlbXB0aW5nIHRvIGNvbm5lY3QgdG8gY2FtU29jayIgKTsgCisJICBpZiAoY29ubmVjdCAoY2FtU29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmY2FtZXJhQWRkciwgc29ja0FkZHJTaXplKSA9PSBFUlJPUikgCXsKKwkJaW1hcVNldEVycm9yKEVSUl9DQU1FUkFfQ09OTkVDVF9GQUlMRUQsIGZ1bmNOYW1lKTsKKwkJQ2FtZXJhQ2xvc2VTb2NrZXQoIkZhaWxlZCB0byBjb25uZWN0IHRvIGNhbWVyYSAtIGNoZWNrIG5ldHdvcmsiLCBjYW1Tb2NrKTsKKwkJY29udGludWU7CisJICB9CSAgCisKKyNpZiBNRUFTVVJFX1NPQ0tFVF9TRVRVUAorCSAgc29ja2V0RW5kVGltZSA9IEdldFRpbWUoKTsgCisJICBzZXR1cFRpbWUgPSBzb2NrZXRFbmRUaW1lIC0gc29ja2V0U3RhcnRUaW1lOyAKKwkgIHByaW50ZigiXG4qKipzb2NrZXQgc2V0dXAgdGltZSA9ICVnXG4iLCBzZXR1cFRpbWUgKTsKKyNlbmRpZgkgIAorCSAgCisJICBnbG9iYWxDYW1lcmEuY2FtZXJhTWV0cmljc1tDQU1fU09DS0VUX09QRU5dKys7CisJICBicmVhazsKKwl9IC8vIGVuZCB3aGlsZSAodHJ5aW5nIHRvIGNvbm5lY3QgdG8gY2FtZXJhKQorCisJRFBSSU5URiAoTE9HX0RFQlVHLCAid3JpdGluZyBHRVQgcmVxdWVzdCB0byBjYW1Tb2NrIiApOyAKKwlpZiAod3JpdGUgKGNhbVNvY2ssIHRlbXBCdWZmZXIgLCBzdHJsZW4odGVtcEJ1ZmZlcikgKSA9PSBFUlJPUikgeworCQlyZXR1cm4gQ2FtZXJhQ2xvc2VTb2NrZXQoIkZhaWxlZCB0byBzZW5kIEdFVCByZXF1ZXN0IiwgY2FtU29jayk7CisJfQorCisJLy9EUFJJTlRGIChMT0dfREVCVUcsICJyZWFkaW5nIGhlYWRlciIgKTsgCisJLyogRmluZCBjb250ZW50LWxlbmd0aCwgdGhlbiByZWFkIHRoYXQgbWFueSBieXRlcyAqLworCWludCBjb3VudGVyID0gMjsKKwljaGFyKiBjb250ZW50U3RyaW5nID0gIkNvbnRlbnQtTGVuZ3RoOiAiOworCWNoYXIqIGF1dGhvcml6ZVN0cmluZyA9ICIyMDAgT0siOworCQorI2RlZmluZSBNRUFTVVJFX1RJTUUgMAorI2lmIE1FQVNVUkVfVElNRQorCS8vdGltaW5nIHBhcmFtZXRlcnMgLSBvbmx5IG1lYXN1cmUgb25lIGF0IHRoZSB0aW1lCisJZG91YmxlIGxvb3BTdGFydFRpbWUgPSAwLjA7IC8vIG1lYXN1cmluZyBzcGVlZCBvZiBleGVjdXRpb24gbG9vcAorCWRvdWJsZSBsb29wRW5kVGltZSA9IDAuMDsKKwlkb3VibGUgY2FtZXJhU3RhcnRUaW1lID0gMC4wOworCWRvdWJsZSBjYW1lcmFFbmRUaW1lID0gMC4wOworCWRvdWJsZSBwcmV2aW91c1N0YXJ0VGltZSA9IDAuMDsKKwlpbnQgcGVyZm9ybWFuY2VMb29wQ291bnRlciA9IDA7CisJaW50IG1heENvdW50ID0gMzA7CisjZW5kaWYKKwkKKwl3aGlsZSAoY29udCkgeworI2lmIE1FQVNVUkVfVElNRQorCQlwcmV2aW91c1N0YXJ0VGltZSA9IGxvb3BTdGFydFRpbWU7ICAvLyBmaXJzdCB0aW1lIGlzIGJvZ3VzCisJCWxvb3BTdGFydFRpbWUgPSBHZXRUaW1lKCk7IAorI2VuZGlmCQorCQkvLyBJZiBjYW1lcmEgaGFzIGJlZW4gdHVybmVkIE9GRiwganVtcCB0byBSRVRSWQorCQkvL2lmIChnbG9iYWxDYW1lcmEuYWNxdWlyZSA9PSAwKSBnb3RvIFJFVFJZOworCQkKKwkJLyogRGV0ZXJtaW5lIHdyaXRlciBpbmRleCAqLworCQlpZiAoZ2xvYmFsQ2FtZXJhLmluZGV4ID09IDApCisJCQl3cml0ZUluZGV4ID0gMTsKKwkJZWxzZQorCQkJd3JpdGVJbmRleCA9IDA7CisJCQorCQkvKiByZWFkIGhlYWRlciAqLworCQkvL1RPRE86IGNoZWNrIGZvciBlcnJvciBpbiBoZWFkZXIsIGluY3JlbWVudCBFUlJfQ0FNRVJBX0hFQURFUl9FUlJPUgorCQljaGFyIGluaXRpYWxSZWFkQnVmZmVyW0RFRkFVTFRfUEFDS0VUX1NJWkVdID0gIiI7CisJCWNoYXIgaW50ZXJtZWRpYXRlQnVmZmVyWzFdOworCQljaGFyICp0cmFpbGluZ1B0ciA9IGluaXRpYWxSZWFkQnVmZmVyOworCQlpbnQgdHJhaWxpbmdDb3VudGVyID0gMDsKKwkJCisKKyNpZiBNRUFTVVJFX1RJTUUKKwkJY2FtZXJhU3RhcnRUaW1lID0gR2V0VGltZSgpOyAKKyNlbmRpZgkKKworCQl3aGlsZSAoY291bnRlcikgeworCQkJaWYgKHJlYWQgKGNhbVNvY2ssIGludGVybWVkaWF0ZUJ1ZmZlciwgMSkgPD0gMCkgeworCQkJCUNhbWVyYUNsb3NlU29ja2V0KCJGYWlsZWQgdG8gcmVhZCBpbWFnZSBoZWFkZXIiLCBjYW1Tb2NrKTsKKwkJCQlnbG9iYWxDYW1lcmEuY2FtZXJhTWV0cmljc1tFUlJfQ0FNRVJBX0hFQURFUl9FUlJPUl0rKzsKKwkJCQlnb3RvIFJFVFJZOworCQkJfQorCisJCQlzdHJuY2F0KGluaXRpYWxSZWFkQnVmZmVyLCBpbnRlcm1lZGlhdGVCdWZmZXIsIDEpOworCQkJaWYgKE5VTEwgIT0gc3Ryc3RyKHRyYWlsaW5nUHRyLCAiXHJcblxyXG4iKSkgeworCisJCQkJICBpZiAoIWF1dGhvcml6ZUNvbmZpcm1lZCl7CisKKwkJCQkJICBpZiAoc3Ryc3RyKGluaXRpYWxSZWFkQnVmZmVyLCBhdXRob3JpemVTdHJpbmcpKQorCQkJCQkgIHsKKwkJCQkJCSAgYXV0aG9yaXplQ29uZmlybWVkID0gMTsKKwkJCQkJCSAgLyogc2V0IGNhbWVyYSB0byBpbml0aWFsaXplZCAqLworCQkJCQkJICBnbG9iYWxDYW1lcmEuY2FtZXJhUmVhZHkgPSAxOyAKKwkJCQkJICB9CisJCQkJCSAgZWxzZQorCQkJCQkgIHsKKwkJCQkJCSAgQ2FtZXJhQ2xvc2VTb2NrZXQoIk5vdCBhdXRob3JpemVkIHRvIGNvbm5lY3QgdG8gY2FtZXJhIiwgY2FtU29jayk7CisJCQkJCQkgIGF1dGhvcml6ZUNvdW50Kys7CisJCQkJICBnb3RvIFJFVFJZOworCQkJCQkgIH0KKwkJCQl9CisJCQkJLS1jb3VudGVyOworCQkJfQorCQkJaWYgKCsrdHJhaWxpbmdDb3VudGVyID49IDQpIHsKKwkJCQl0cmFpbGluZ1B0cisrOworCQkJfQorCQl9CisJCisJCWNvdW50ZXIgPSAxOworCQljaGFyICpjb250ZW50TGVuZ3RoID0gc3Ryc3RyKGluaXRpYWxSZWFkQnVmZmVyLCBjb250ZW50U3RyaW5nKTsKKwkJaWYgKGNvbnRlbnRMZW5ndGggPT0gTlVMTCkgeworCQkJZ2xvYmFsQ2FtZXJhLmNhbWVyYU1ldHJpY3NbRVJSX0NBTUVSQV9IRUFERVJfRVJST1JdKys7CisJCQlDYW1lcmFDbG9zZVNvY2tldCgiTm8gY29udGVudC1sZW5ndGggdG9rZW4gZm91bmQgaW4gcGFja2V0IiwgY2FtU29jayk7CisJCQlnb3RvIFJFVFJZOworCQl9CisJCS8qIGdldCBsZW5ndGggb2YgaW1hZ2UgY29udGVudCAqLworCQljb250ZW50TGVuZ3RoID0gY29udGVudExlbmd0aCArIHN0cmxlbihjb250ZW50U3RyaW5nKTsKKwkJZ2xvYmFsQ2FtZXJhLmRhdGFbd3JpdGVJbmRleF0uY2FtZXJhSW1hZ2VTaXplID0gYXRvbCAoY29udGVudExlbmd0aCk7CisJCQorCQlpZihnbG9iYWxDYW1lcmEuZGF0YVt3cml0ZUluZGV4XS5jYW1lcmFJbWFnZSkKKwkJCWZyZWUoZ2xvYmFsQ2FtZXJhLmRhdGFbd3JpdGVJbmRleF0uY2FtZXJhSW1hZ2UpOworCQkvL2dsb2JhbENhbWVyYS5kYXRhW3dyaXRlSW5kZXhdLmNhbWVyYUltYWdlID0gKEltYWdlICopIG1hbGxvYyhnbG9iYWxDYW1lcmEuZGF0YVt3cml0ZUluZGV4XS5jYW1lcmFJbWFnZVNpemUpOworCQlnbG9iYWxDYW1lcmEuZGF0YVt3cml0ZUluZGV4XS5jYW1lcmFJbWFnZSA9IChjaGFyKiltYWxsb2MoZ2xvYmFsQ2FtZXJhLmRhdGFbd3JpdGVJbmRleF0uY2FtZXJhSW1hZ2VTaXplKTsKKwkJaWYgKE5VTEwgPT0gZ2xvYmFsQ2FtZXJhLmRhdGFbd3JpdGVJbmRleF0uY2FtZXJhSW1hZ2UpIHsKKwkJCXJldHVybiBDYW1lcmFDbG9zZVNvY2tldCgiRmFpbGVkIHRvIGFsbG9jYXRlIHNwYWNlIGZvciBpbWFnZVN0cmluZyIsIGNhbVNvY2spOworCQl9CisJCWdsb2JhbENhbWVyYS5jYW1lcmFNZXRyaWNzW0NBTV9CVUZGRVJTX1dSSVRURU5dKys7CisJCQorCQkvLworCQkvLyBUaGlzIGlzIGEgYmxvY2tpbmcgY2FtZXJhIHJlYWQgZnVuY3Rpb24sIGFuZCB3aWxsIGJsb2NrIGlmIHRoZSBjYW1lcmEKKwkJLy8gaGFzIGJlZW4gZGlzY29ubmVjdGVkIGZyb20gdGhlIGNSSU8uICBJZiBob3dldmVyIHRoZSBjYW1lcmEgaXMKKwkJLy8gUE9XRVJFRCBPRkYgd2hpbGUgY29ubmVjdGVkIHRvIHRoZSBjUklPLCB0aGlzIGZ1bmN0aW9uIE5FVkVSIFJFVFVSTlMKKwkJLy8KKwkJaW50IGJ5dGVzUmVhZCA9IGZpb1JlYWQgKGNhbVNvY2ssIChjaGFyICopZ2xvYmFsQ2FtZXJhLmRhdGFbd3JpdGVJbmRleF0uY2FtZXJhSW1hZ2UsCisJCQkJZ2xvYmFsQ2FtZXJhLmRhdGFbd3JpdGVJbmRleF0uY2FtZXJhSW1hZ2VTaXplKTsKKworI2lmIE1FQVNVUkVfVElNRQorCQljYW1lcmFFbmRUaW1lID0gR2V0VGltZSgpOyAKKyNlbmRpZgkKKwkJCisJCS8vRFBSSU5URiAoTE9HX0RFQlVHLCAiQ29tcGxldGVkIGZpb1JlYWQgZnVuY3Rpb24gLSBieXRlcyByZWFkOiVkIiwgYnl0ZXNSZWFkKTsKKwkJaWYgKGJ5dGVzUmVhZCA8PSAwKSB7CisJCQlDYW1lcmFDbG9zZVNvY2tldCgiRmFpbGVkIHRvIHJlYWQgaW1hZ2UgZGF0YSIsIGNhbVNvY2spOworCQkJZ290byBSRVRSWTsKKwkJfSBlbHNlIGlmIChieXRlc1JlYWQgIT0gZ2xvYmFsQ2FtZXJhLmRhdGFbd3JpdGVJbmRleF0uY2FtZXJhSW1hZ2VTaXplKXsKKwkJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IEZhaWxlZCB0byByZWFkIGVudGlyZSBpbWFnZTogcmVhZExlbmd0aCBkb2VzIG5vdCBtYXRjaCBieXRlcyByZWFkIik7CisJCQlnbG9iYWxDYW1lcmEuY2FtZXJhTWV0cmljc1tDQU1fQkFEX0lNQUdFX1NJWkVdKys7CisJCX0KKwkJLy8gaWYgZGVjb2RpbmcgdGhlIEpQRUcgdG8gYW4gSFNMIEltYWdlLCBkbyBpdCBoZXJlCisJCWlmIChnbG9iYWxDYW1lcmEuZGVjb2RlKSB7CisJCQlpZihnbG9iYWxDYW1lcmEuZGF0YVt3cml0ZUluZGV4XS5kZWNvZGVkSW1hZ2UpCisJCQkJZnJjRGlzcG9zZShnbG9iYWxDYW1lcmEuZGF0YVt3cml0ZUluZGV4XS5kZWNvZGVkSW1hZ2UpOworCQkJZ2xvYmFsQ2FtZXJhLmRhdGFbd3JpdGVJbmRleF0uZGVjb2RlZEltYWdlID0gZnJjQ3JlYXRlSW1hZ2UoSU1BUV9JTUFHRV9IU0wpOworCQkJaWYgKCEgUHJpdl9SZWFkSlBFR1N0cmluZ19DKGdsb2JhbENhbWVyYS5kYXRhW3dyaXRlSW5kZXhdLmRlY29kZWRJbWFnZSwgCisJCQkJCShjb25zdCB1bnNpZ25lZCBjaGFyICopZ2xvYmFsQ2FtZXJhLmRhdGFbd3JpdGVJbmRleF0uY2FtZXJhSW1hZ2UsIAorCQkJCQlnbG9iYWxDYW1lcmEuZGF0YVt3cml0ZUluZGV4XS5jYW1lcmFJbWFnZVNpemUpICkgeworCQkJCURQUklOVEYgKExPR19ERUJVRywgImZhaWx1cmUgY3JlYXRpbmcgSW1hZ2UiKTsJCQkKKwkJCX0KKwkJfQorCQkKKwkJLy8gVE9ETzogUmVhY3QgdG8gcGFydGlhbCBpbWFnZQorCQlnbG9iYWxDYW1lcmEuZGF0YVt3cml0ZUluZGV4XS50aW1lc3RhbXAgPSBHZXRUaW1lKCk7CisJCWdsb2JhbENhbWVyYS5pbmRleCA9IHdyaXRlSW5kZXg7CisJCQorCQkvKiBzaWduYWwgYSBsaXN0ZW5pbmcgdGFzayAqLworCQlpZiAoZ2xvYmFsQ2FtZXJhLnJlYWRlclBJRCkgeworCQkJaWYgKHRhc2tLaWxsIChnbG9iYWxDYW1lcmEucmVhZGVyUElELFNJR1VTUjEpID09IE9LKQorCQkJCURQUklOVEYgKExPR19ERUJVRywgIlNJR05BTElORyBQSUQ9ICVpIiwgZ2xvYmFsQ2FtZXJhLnJlYWRlclBJRCk7CisJCQllbHNlCisJCQkJZ2xvYmFsQ2FtZXJhLmNhbWVyYU1ldHJpY3NbQ0FNX1BJRF9TSUdOQUxfRVJSXSsrOworCQkJCURQUklOVEYgKExPR19ERUJVRywgIkVSUk9SIFNJR05BTElORyBQSUQ9ICVpIiwgZ2xvYmFsQ2FtZXJhLnJlYWRlclBJRCk7CisJCX0KKworCQlnbG9iYWxDYW1lcmEuY2FtZXJhTWV0cmljc1tDQU1fTlVNX0lNQUdFXSsrOwkKKwkJcHJpbnRDb3VudGVyICsrOworCQlpZiAocHJpbnRDb3VudGVyID09IDEwMDApIHsgCisJCQlEUFJJTlRGIChMT0dfREVCVUcsICJpbWFnZUNvdW50ZXIgPSAlaSIsIGdsb2JhbENhbWVyYS5jYW1lcmFNZXRyaWNzW0NBTV9OVU1fSU1BR0VdKTsgCisJCQlwcmludENvdW50ZXI9MDsgCisJCX0KKwkJCisJCXRhc2tEZWxheSgxKTsgIAorCQkKKyNpZiBNRUFTVVJFX1RJTUUKKwkJbG9vcEVuZFRpbWUgPSBHZXRUaW1lKCk7IAorCQlwZXJmb3JtYW5jZUxvb3BDb3VudGVyKys7CisJCWlmIChwZXJmb3JtYW5jZUxvb3BDb3VudGVyIDw9IG1heENvdW50KSB7CisJCQlEUFJJTlRGIChMT0dfREVCVUcsICIlaSBET05FISEhOiBsb29wID0gLCVnLCAgY2FtZXJhID0gLCVnLCAgZGlmZmVyZW5jZSA9ICwlZywgbG9vcFJhdGU9ICwlZywiLAorCQkJCQlwZXJmb3JtYW5jZUxvb3BDb3VudGVyLCBsb29wRW5kVGltZS1sb29wU3RhcnRUaW1lLCBjYW1lcmFFbmRUaW1lLWNhbWVyYVN0YXJ0VGltZSwgCisJCQkJCShsb29wRW5kVGltZS1sb29wU3RhcnRUaW1lKSAtIChjYW1lcmFFbmRUaW1lLWNhbWVyYVN0YXJ0VGltZSksCisJCQkJCWxvb3BTdGFydFRpbWUtcHJldmlvdXNTdGFydFRpbWUpOwkJCQkJCQorCQl9CisjZW5kaWYJCisJfSAgLyogZW5kIHdoaWxlIChjb250KSAqLworCisJLyogY2xlYW4gdXAgKi8KKwljbG9zZSAoY2FtU29jayk7CisJY29udCA9IDA7CisJRFBSSU5URiAoTE9HX0lORk8sICJcbkpQRUcgU0VSVkVSIEVORElORyAgZXJyb3JDb2RlID0gJWlcbiIsIGVycm9yQ29kZSApOworCQorCXJldHVybiAoT0spOworfQorCisvKioKKyAqIEBicmllZiBTdGFydCBzaWduYWxpbmcgYSB0YXNrIHdoZW4gbmV3IGltYWdlcyBhcmUgYXZhaWxhYmxlCisgKiBAcGFyYW0gdGFza0lEIG51bWJlciBmb3IgdGFzayB0byBnZXQgdGhlIHNpZ25hbAorICovCit2b2lkIFN0YXJ0SW1hZ2VTaWduYWwoaW50IHRhc2tJZCkgLy8gU3RhcnQgaXNzdWluZyBhIFNJR1VTUjEgc2lnbmFsIHRvIHRoZSBzcGVjaWZpZWQgdGFza0lkCit7CWdsb2JhbENhbWVyYS5yZWFkZXJQSUQgPSB0YXNrSWQ7IH0KKworLyoqCisgKiBAYnJpZWYgU3RhcnQgc2VydmluZyBpbWFnZXMKKyAqLwordm9pZCBTdGFydEltYWdlQWNxdWlzaXRpb24oKQorewkKKwlnbG9iYWxDYW1lcmEuY2FtZXJhTWV0cmljc1tDQU1fU1RBUlRTXSsrOyAgCisJZ2xvYmFsQ2FtZXJhLmFjcXVpcmUgPSAxOyAKKwlEUFJJTlRGKExPR19ERUJVRywgInN0YXJ0aW5nIGFjcXVpc2l0aW9uIik7Cit9CisKKworLyoqCisgKiBAYnJpZWYgU3RvcCBzZXJ2aW5nIGltYWdlcworICovCit2b2lkIFN0b3BJbWFnZUFjcXVpc2l0aW9uKCkKK3sJZ2xvYmFsQ2FtZXJhLmNhbWVyYU1ldHJpY3NbQ0FNX1NUT1BTXSsrOyAgZ2xvYmFsQ2FtZXJhLmFjcXVpcmUgPSAwOyB9CisKKworLyoqCisgKiBAYnJpZWYgVGhpcyBpcyB0aGUgcm91dGluZSB0aGF0IGlzIHJ1biB3aGVuIHRoZSB0YXNrIGlzIHNwYXduZWQKKyAqIEl0IGluaXRpYWxpemVzIHRoZSBjYW1lcmEgd2l0aCB0aGUgaW1hZ2Ugc2V0dGluZ3MgcGFzc2VkIGluLCBhbmQKKyAqIHN0YXJ0cyBpbWFnZSBhY3F1aXNpdGlvbi4KKyAqIEBwYXJhbSBmcmFtZXMgRnJhbWVzIHBlciBzZWNvbmQgCisgKiBAcGFyYW0gY29tcHJlc3Npb24gQ2FtZXJhIGltYWdlIGNvbXByZXNzaW9uIAorICogQHBhcmFtIHJlc29sdXRpb24gQ2FtZXJhIGltYWdlIHNpemUgCisgKiBAcGFyYW0gcm90YXRpb24gQ2FtZXJhIGltYWdlIHJvdGF0aW9uIAorICovCitzdGF0aWMgaW50IGluaXRDYW1lcmEoaW50IGZyYW1lcywgaW50IGNvbXByZXNzaW9uLCBJbWFnZVJlc29sdXRpb24gcmVzb2x1dGlvbiwgSW1hZ2VSb3RhdGlvbiByb3RhdGlvbikgCit7CisJLy9TZXREZWJ1Z0ZsYWcgKCBERUJVR19TQ1JFRU5fQU5EX0ZJTEUgICkgOworCQorCURQUklOVEYoTE9HX0RFQlVHLCAiXG4rKysrKyBjYW1lcmEgdGFzayBzdGFydGluZzogcm90YXRpb24gPSAlaSIsIChpbnQpcm90YXRpb24pOworCWludCBlcnJvckNvZGU7CisKKwkvKiBJbml0aWFsaXplIGdsb2JhbENhbWVyYSBhcmVhIAorCSAqIFNldCBkZWNvZGUgdG8gMSAtIGFsd2F5cyB3YW50IHRvIGRlY29kZSBpbWFnZXMgZm9yIHByb2Nlc3NpbmcgCisJICogSWYgT05MWSBzZW5kaW5nIGltYWdlcyB0byB0aGUgZGFzaGJvYXJkLCB5b3UgY291bGQgc2V0IGl0IHRvIDAgKi8KKwliemVybyAoKGNoYXIgKikmZ2xvYmFsQ2FtZXJhLCBzaXplb2YoZ2xvYmFsQ2FtZXJhKSk7CisJZ2xvYmFsQ2FtZXJhLmluZGV4ID0gLTE7CisJZ2xvYmFsQ2FtZXJhLmRlY29kZSA9IDE7CisJCisJLyogYWxsb3cgd3JpdGluZyB0byB2eFdvcmtzIHRhcmdldCAqLworCVByaXZfU2V0V3JpdGVGaWxlQWxsb3dlZCgxKTsgCisJCisJLyogc3RhcnQgYWNxdWlzaXRpb24gaW1tZWRpYXRlbHkgKi8KKwlTdGFydEltYWdlQWNxdWlzaXRpb24oKTsKKwkKKwkvKiAgY2FtZXJhSlBFR1NlcnZlciBydW5zIHVudGlsIGNhbWVyYSBpcyBzdG9wcGVkICovCisJRFBSSU5URiAoTE9HX0RFQlVHLCAiY2FsbGluZyBjYW1lcmFKUEVHU2VydmVyIiApOyAKKwllcnJvckNvZGUgPSBjYW1lcmFKUEVHU2VydmVyKGZyYW1lcywgY29tcHJlc3Npb24sIHJlc29sdXRpb24sIHJvdGF0aW9uKTsJCisJRFBSSU5URiAoTE9HX0lORk8sICJlcnJvckNvZGUgZnJvbSBjYW1lcmFKUEVHU2VydmVyID0gJWlcbiIsIGVycm9yQ29kZSApOyAKKwlyZXR1cm4gKE9LKTsKK30KKworVGFzayBnX2F4aXNDYW1lcmFUYXNrKCJDYW1lcmEiLCAoRlVOQ1BUUilpbml0Q2FtZXJhKTsKKworLyoqCisgKiBAYnJpZWYgU3RhcnQgdGhlIGNhbWVyYSB0YXNrCisgKiBAcGFyYW0gZnJhbWVzIEZyYW1lcyBwZXIgc2Vjb25kIAorICogQHBhcmFtIGNvbXByZXNzaW9uIENhbWVyYSBpbWFnZSBjb21wcmVzc2lvbiAKKyAqIEBwYXJhbSByZXNvbHV0aW9uIENhbWVyYSBpbWFnZSBzaXplIAorICogQHBhcmFtIHJvdGF0aW9uIENhbWVyYSBpbWFnZSByb3RhdGlvbiAoUk9UXzAgb3IgUk9UXzE4MCkKKyAqIEByZXR1cm4gVGFza0lEIG9mIGNhbWVyYSB0YXNrLCBvciAtMSBpZiBlcnJvci4KKyAqLworaW50IFN0YXJ0Q2FtZXJhVGFzaygpCit7CisJcmV0dXJuIFN0YXJ0Q2FtZXJhVGFzaygxMCwgMCwgazE2MHgxMjAsIFJPVF8wKTsKK30KK2ludCBTdGFydENhbWVyYVRhc2soaW50IGZyYW1lcywgaW50IGNvbXByZXNzaW9uLCBJbWFnZVJlc29sdXRpb24gcmVzb2x1dGlvbiwgSW1hZ2VSb3RhdGlvbiByb3RhdGlvbikKK3sKKwljaGFyIGZ1bmNOYW1lW109InN0YXJ0Q2FtZXJhVGFzayI7CisJRFBSSU5URihMT0dfREVCVUcsICJzdGFydGluZyBjYW1lcmEiKTsKKworCWludCBjYW1lcmFUYXNrSUQgPSAwOworCisJLy9yYW5nZSBjaGVjaworCWlmIChmcmFtZXMgPCAxKSBmcmFtZXMgPSAxOworCWVsc2UgaWYgKGZyYW1lcyA+IDMwKSBmcmFtZXMgPSAzMDsKKwlpZiAoY29tcHJlc3Npb24gPCAwKSBjb21wcmVzc2lvbiA9IDA7CQkKKwllbHNlIGlmIChjb21wcmVzc2lvbiA+IDEwMCkgY29tcHJlc3Npb24gPSAxMDA7CisKKwkvLyBzdG9wIGFueSBwcmlvciBjb3B5IG9mIHJ1bm5pbmcgdGFzaworCVN0b3BDYW1lcmFUYXNrKCk7IAorCisJLy8gc3Bhd24gY2FtZXJhIHRhc2sKKwlib29sIHN0YXJ0ZWQgPSBnX2F4aXNDYW1lcmFUYXNrLlN0YXJ0KGZyYW1lcywgY29tcHJlc3Npb24sIHJlc29sdXRpb24sIHJvdGF0aW9uKTsKKwljYW1lcmFUYXNrSUQgPSBnX2F4aXNDYW1lcmFUYXNrLkdldElEKCk7CisJRFBSSU5URihMT0dfREVCVUcsICJzcGF3bmVkIHRhc2sgaWQgJWkiLCBjYW1lcmFUYXNrSUQpOworCisJaWYgKCFzdGFydGVkKQl7CisJCURQUklOVEYoTE9HX0RFQlVHLCAiY2FtZXJhIHRhc2sgZmFpbGVkIHRvIHN0YXJ0Iik7CisJCWltYXFTZXRFcnJvcihFUlJfQ0FNRVJBX1RBU0tfU1BBV05fRkFJTEVELCBmdW5jTmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIGNhbWVyYVRhc2tJRDsKK30KKworLyoqCisgKiBAYnJpZWYgU3RvcHMgdGhlIGNhbWVyYSB0YXNrCisgKiBAcmV0dXJuIFRhc2tJRCBvZiBjYW1lcmEgdGFzayBraWxsZWQsIG9yIC0xIGlmIG5vbmUgd2FzIHJ1bm5pbmcuCisgKi8KK2ludCBTdG9wQ2FtZXJhVGFzaygpCit7CisgICAgc3RkOjpzdHJpbmcgdGFza05hbWUoIkZSQ19DYW1lcmEiKTsgICAgCisJLy8gY2hlY2sgZm9yIHByaW9yIGNvcHkgb2YgcnVubmluZyB0YXNrCisJaW50IG9sZFRhc2tJRCA9IHRhc2tOYW1lVG9JZChjb25zdF9jYXN0PGNoYXIqPih0YXNrTmFtZS5jX3N0cigpKSk7CisJaWYob2xkVGFza0lEICE9IEVSUk9SKSB7IHRhc2tEZWxldGUob2xkVGFza0lEKTsgIH0KKwlyZXR1cm4gb2xkVGFza0lEOworfQorCisjaWYgMAorLyogaWYgeW91IHdhbnQgdG8gcnVuIHRoaXMgdGFzayBieSBpdHNlbGYgdG8gZGVidWcgIAorICogZW5hYmxlIHRoaXMgY29kZSBhbmQgbWFrZSBSdW5Qcm9ncmFtIHRoZSBlbnRyeSBwb2ludCAKKyAqLworZXh0ZXJuICJDIgorewordm9pZCBSdW5Qcm9ncmFtKCk7CitpbnQgQXhpc0NhbWVyYV9TdGFydHVwTGlicmFyeUluaXQoKTsKK30KKy8qKiAqIEBicmllZiBTdGFydCBwb2ludCBvZiB0aGUgcHJvZ3JhbSAqLwordm9pZCBSdW5Qcm9ncmFtKCkKK3sJU3RhcnRDYW1lcmFUYXNrKCk7fQorCisvKiogKiBAYnJpZWYgVGhpcyBpcyB0aGUgbWFpbiBwcm9ncmFtIHRoYXQgaXMgcnVuIGJ5IHRoZSBkZWJ1Z2dlciBvciB0aGUgcm9ib3Qgb24gYm9vdC4gKi8KK2ludCBBeGlzQ2FtZXJhX1N0YXJ0dXBMaWJyYXJ5SW5pdCgpCisJewkJUnVuUHJvZ3JhbSgpOwkJcmV0dXJuIDA7CX0KKworI2VuZGlmCisKKworCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL1dQSUxpYi9XUElMaWIvVmlzaW9uMjAwOS9BeGlzQ2FtZXJhLmggYi9hb3MvZXh0ZXJuYWxzL1dQSUxpYi9XUElMaWIvVmlzaW9uMjAwOS9BeGlzQ2FtZXJhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZiMjFkMAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvV1BJTGliL1dQSUxpYi9WaXNpb24yMDA5L0F4aXNDYW1lcmEuaApAQCAtMCwwICsxLDkyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIFByb2plY3QgICAJCTogRklSU1QgTW90b3IgQ29udHJvbGxlcgorKiAgRmlsZSBOYW1lICAJCTogQXhpc0NhbWVyYS5oICAgICAgICAgIAorKiAgQ29udHJpYnV0b3JzICAgCTogRUxGCisqICBDcmVhdGlvbiBEYXRlIAk6IEF1Z3VzdCAxMiwgMjAwOAorKiAgUmV2aXNpb24gSGlzdG9yeQk6IFNvdXJjZSBjb2RlICYgcmV2aXNpb24gaGlzdG9yeSBtYWludGFpbmVkIGF0IHNvdXJjZWZvcmdlLldQSS5lZHUgICAgCisqICBGaWxlIERlc2NyaXB0aW9uCTogR2xvYmFsbHkgZGVmaW5lZCB2YWx1ZXMgZm9yIHRoZSBGUkMgQ2FtZXJhIEFQSQorKiAKKyogIEFQSTogQmVjYXVzZSBuaXZpc2lvbi5oIHVzZXMgQysrIHN0eWxlIGNvbW1lbnRzLCBhbnkgZmlsZSBpbmNsdWRpbmcgdGhpcworKiAgbXVzdCBiZSBhIC5jcHAgaW5zdGVhZCBvZiAuYy4KKyogCisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICAgICAgICBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAqLworLyogIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgX19BWElTQ0FNRVJBX0hfXworI2RlZmluZSBfX0FYSVNDQU1FUkFfSF9fCisKKyNpbmNsdWRlICJuaXZpc2lvbi5oIgorCisvKiogcG9ydCBmb3IgY29tbXVuaWNhdGluZyB3aXRoIGNhbWVyYSAqLworI2RlZmluZSBDQU1FUkFfUE9SVCA4MAorLyoqIGhvdyBvbGQgYW4gaW1hZ2UgaXMgYmVmb3JlIGl0J3MgZGlzY2FyZGVkICovCisjZGVmaW5lIENBTUVSQV9JTUFHRV9TVEFMRV9USU1FX1NFQyAyLjAgIAorLyoqIHRpbWUgdG8gd2FpdCBmb3IgYSBuZXcgaW1hZ2UgaW4gYmxvY2tpbmcgY2FsbCAqLworI2RlZmluZSBNQVhfQkxPQ0tJTkdfVElNRV9TRUMgMC41CisKKy8qICBFbnVtZXJhdGVkIFR5cGVzICovCisvKiogQGJyaWVmIENvdW50ZXJzIGZvciBjYW1lcmEgbWV0cmljcyAqLworZW51bSBGcmN2Q2FtZXJhTWV0cmljIHtDQU1fU1RBUlRTLCBDQU1fU1RPUFMsIAorCUNBTV9OVU1fSU1BR0UsIENBTV9CVUZGRVJTX1dSSVRURU4sIENBTV9CTE9DS0lOR19DT1VOVCwKKwkKKwlDQU1fU09DS0VUX09QRU4sIENBTV9TT0NLRVRfSU5JVF9BVFRFTVBUUywgQ0FNX0JMT0NLSU5HX1RJTUVPVVQsCisJQ0FNX0dFVElNQUdFX1NVQ0NFU1MsIENBTV9HRVRJTUFHRV9GQUlMVVJFLCAKKwkKKwlDQU1fU1RBTEVfSU1BR0UsIENBTV9HRVRJTUFHRV9CRUZPUkVfSU5JVCwgQ0FNX0dFVElNQUdFX0JFRk9SRV9BVkFJTEFCTEUsCisJQ0FNX1JFQURfSlBFR19GQUlMVVJFLCBDQU1fUElEX1NJR05BTF9FUlIsIAorCQorCUNBTV9CQURfSU1BR0VfU0laRSwgQ0FNX0hFQURFUl9FUlJPUn07CisKKyNkZWZpbmUgQ0FNX05VTV9NRVRSSUNTIDE3CisKKy8qKiBQcml2YXRlIE5JIGZ1bmN0aW9uIG5lZWRlZCB0byB3cml0ZSB0byB0aGUgVnhXb3JrcyB0YXJnZXQgKi8KK0lNQVFfRlVOQyBpbnQgUHJpdl9TZXRXcml0ZUZpbGVBbGxvd2VkKFVJTlQzMiBlbmFibGUpOyAKKworLyoqCitAYnJpZWYgUG9zc2libGUgaW1hZ2Ugc2l6ZXMgdGhhdCB5b3UgY2FuIHNldCBvbiB0aGUgY2FtZXJhLgorKi8KK2VudW0gSW1hZ2VSZXNvbHV0aW9uIHsgazY0MHg0ODAsIGszMjB4MjQwLCBrMTYweDEyMCB9OworCisvKioKK0BicmllZiBQb3NzaWJsZSByb3RhdGlvbiB2YWx1ZXMgdGhhdCB5b3UgY2FuIHNldCBvbiB0aGUgY2FtZXJhLgorKi8KK2VudW0gSW1hZ2VSb3RhdGlvbiB7IFJPVF8wID0gMCwgUk9UXzE4MCA9IDE4MCB9OworCisKKworaW50IFN0YXJ0Q2FtZXJhVGFzaygpOworCitleHRlcm4gIkMiIHsKKy8qICBJbWFnZSBBY3F1aXNpdGlvbiBmdW5jdGlvbnMgKi8KKy8qIG9idGFpbnMgYW4gaW1hZ2UgZnJvbSB0aGUgY2FtZXJhIHNlcnZlciAqLworaW50IEdldEltYWdlKEltYWdlKiBjYW1lcmFJbWFnZSwgZG91YmxlICp0aW1lc3RhbXApOworaW50IEdldEltYWdlQmxvY2tpbmcoSW1hZ2UqIGNhbWVyYUltYWdlLCBkb3VibGUgKnRpbWVzdGFtcCwgZG91YmxlIGxhc3RJbWFnZVRpbWVzdGFtcCk7CisvKiBvYnRhaW5zIHJhdyBpbWFnZSBzdHJpbmcgdG8gc2VuZCB0byBQQyAqLworaW50IEdldEltYWdlRGF0YShjaGFyKiogaW1hZ2VEYXRhLCBpbnQqIG51bUJ5dGVzLCBkb3VibGUqIGN1cnJlbnRJbWFnZVRpbWVzdGFtcCk7CitpbnQgR2V0SW1hZ2VEYXRhQmxvY2tpbmcoY2hhcioqIGltYWdlRGF0YSwgaW50KiBudW1CeXRlcywgZG91YmxlKiB0aW1lc3RhbXAsIGRvdWJsZSBsYXN0SW1hZ2VUaW1lc3RhbXApOworCisvKiBzdGFydCB0aGUgY2FtZXJhIHNlcnZlciAqLwordm9pZCBTdGFydEltYWdlQWNxdWlzaXRpb24oKTsKK3ZvaWQgU3RvcEltYWdlQWNxdWlzaXRpb24oKTsKK3ZvaWQgU3RhcnRJbWFnZVNpZ25hbChpbnQgdGFza0lkKTsKKworLyogc3RhdHVzICYgbWV0cmljcyAqLworaW50IGZyY0NhbWVyYUluaXRpYWxpemVkKCk7CitpbnQgR2V0Q2FtZXJhTWV0cmljKEZyY3ZDYW1lcmFNZXRyaWMgbWV0cmljKTsKKworLyogY2FtZXJhIGNvbmZpZ3VyYXRpb24gKi8KK2ludCBDb25maWd1cmVDYW1lcmEoY2hhciAqY29uZmlnU3RyaW5nKTsKK2ludCBHZXRDYW1lcmFTZXR0aW5nKGNoYXIgKmNvbmZpZ1N0cmluZywgY2hhciAqY2FtZXJhUmVzcG9uc2UpOworaW50IEdldEltYWdlU2V0dGluZyhjaGFyICpjb25maWdTdHJpbmcsIGNoYXIgKmNhbWVyYVJlc3BvbnNlKTsKKworLyogY2FtZXJhIHRhc2sgY29udHJvbCAqLworCitpbnQgU3RhcnRDYW1lcmFUYXNrKGludCBmcmFtZXMsIGludCBjb21wcmVzc2lvbiwgSW1hZ2VSZXNvbHV0aW9uIHJlc29sdXRpb24sIEltYWdlUm90YXRpb24gcm90YXRpb24pOworaW50IFN0b3BDYW1lcmFUYXNrKCk7Cit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9XUElMaWIvV1BJTGliL1Zpc2lvbjIwMDkvQmFlVXRpbGl0aWVzLmNwcCBiL2Fvcy9leHRlcm5hbHMvV1BJTGliL1dQSUxpYi9WaXNpb24yMDA5L0JhZVV0aWxpdGllcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUxNTg5MwotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvV1BJTGliL1dQSUxpYi9WaXNpb24yMDA5L0JhZVV0aWxpdGllcy5jcHAKQEAgLTAsMCArMSw0MDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgUHJvamVjdCAgIAkJOiBGSVJTVCBNb3RvciBDb250cm9sbGVyCisqICBGaWxlIE5hbWUgIAkJOiBCYWVVdGlsaXRpZXMuY3BwICAgICAgICAKKyogIENvbnRyaWJ1dG9ycyAgIAk6IEpERywgRUxGLCBFTUYKKyogIENyZWF0aW9uIERhdGUgCTogSnVseSAyMCwgMjAwOAorKiAgUmV2aXNpb24gSGlzdG9yeQk6IFNvdXJjZSBjb2RlICYgcmV2aXNpb24gaGlzdG9yeSBtYWludGFpbmVkIGF0IHNvdXJjZWZvcmdlLldQSS5lZHUgICAgCisqICBGaWxlIERlc2NyaXB0aW9uCTogT3BlbiBzb3VyY2UgdXRpbGl0eSBleHRlbnNpb25zIGZvciBGSVJTVCBWaXNpb24gQVBJLgorKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogICAgICAgIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICovCisvKiAgbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGlvTGliLmg+IAorIAorI2luY2x1ZGUgIkJhZVV0aWxpdGllcy5oIgorI2luY2x1ZGUgIlNlcnZvLmgiCisjaW5jbHVkZSAiVGltZXIuaCIKKworLyoqCisgKiAgIFV0aWxpdHkgZnVuY3Rpb25zIAorICovCisKKy8qKgorICogZGVidWcgb3V0cHV0IGZsYWcgb3B0aW9uczoKKyAqIERFQlVHX09GRiwgREVCVUdfTU9TVExZX09GRiwgREVCVUdfU0NSRUVOX09OTFksIERFQlVHX0ZJTEVfT05MWSwgREVCVUdfU0NSRUVOX0FORF9GSUxFCisgKi8KK3N0YXRpYyBEZWJ1Z091dHB1dFR5cGUJZHByaW50ZkZsYWcgPSBERUJVR19PRkY7ICAKKworLyoqCisgKiBTZXQgdGhlIGRlYnVnIGZsYWcgdG8gcHJpbnQgdG8gc2NyZWVuLCBmaWxlIG9uIGNSSU8sIGJvdGggb3IgbmVpdGhlcgorICogQHBhcmFtIHRlbXBTdHJpbmcgVGhlIGZvcm1hdCBzdHJpbmcuCisgKi8KK3ZvaWQgU2V0RGVidWdGbGFnICggRGVidWdPdXRwdXRUeXBlIGZsYWcgICkgIAoreyBkcHJpbnRmRmxhZyA9IGZsYWc7IH0KKworLyoqCisgKiBEZWJ1ZyBwcmludCB0byBhIGZpbGUgYW5kL29yIGEgdGVybWluYWwgd2luZG93LgorICogQ2FsbCBsaWtlIHlvdSB3b3VsZCBjYWxsIHByaW50Zi4KKyAqIFNldCBmdW5jdGlvbk5hbWUgaW4gdGhlIGZ1bmN0aW9uIGlmIHlvdSB3YW50IHRoZSBjb3JyZWN0IGZ1bmN0aW9uIG5hbWUgdG8gcHJpbnQgb3V0LgorICogVGhlIGZpbGUgbGluZSBudW1iZXIgd2lsbCBhbHNvIGJlIHByaW50ZWQuCisgKiBAcGFyYW0gdGVtcFN0cmluZyBUaGUgZm9ybWF0IHN0cmluZy4KKyAqLwordm9pZCBkcHJpbnRmICggY2hhciAqIHRlbXBTdHJpbmcsIC4uLiAgKSAgLyogVmFyaWFibGUgYXJndW1lbnQgbGlzdCAqLworeworICB2YV9saXN0CWFyZ3M7CQkJICAvKiBJbnB1dCBhcmd1bWVudCBsaXN0ICovCisgIGludAkJbGluZV9udW1iZXI7ICAgICAgLyogTGluZSBudW1iZXIgcGFzc2VkIGluIGFyZ3VtZW50ICovCisgIGludAkJdHlwZTsKKyAgY2hhcgkJKmZ1bmN0aW9uTmFtZTsgICAgLyogRm9ybWF0IHBhc3NlZCBpbiBhcmd1bWVudCAqLworICBjaGFyCQkqZm10OyAgICAgICAgICAgICAvKiBGb3JtYXQgcGFzc2VkIGluIGFyZ3VtZW50ICovCisgIGNoYXIJCXRleHRbNTEyXTsgICAJICAvKiBUZXh0IHN0cmluZyAqLworICBjaGFyCQlvdXR0ZXh0WzUxMl07ICAgICAvKiBUZXh0IHN0cmluZyAqLworICBGSUxFCQkqb3V0ZmlsZV9mZDsgICAgICAvKiBPdXRwdXQgZmlsZSBwb2ludGVyICovCisgIGNoYXIJCWZpbGVwYXRoWzEyOF07ICAgIC8qIFRleHQgc3RyaW5nICovCisgIGludAkJZmF0YWxGbGFnPTA7CisgIGNoYXIJCSpmaWxlbmFtZTsKKyAgaW50CQlpbmRleDsKKyAgaW50CQl0ZW1wU3RyaW5nTGVuOworCisgIGlmIChkcHJpbnRmRmxhZyA9PSBERUJVR19PRkYpIHsgcmV0dXJuOyB9CisgIAorICB2YV9zdGFydCAoYXJncywgdGVtcFN0cmluZyk7CisgIAorICB0ZW1wU3RyaW5nTGVuID0gc3RybGVuKHRlbXBTdHJpbmcpOworICBmaWxlbmFtZSA9IHRlbXBTdHJpbmc7CisgIGZvciAoaW5kZXg9MDtpbmRleDx0ZW1wU3RyaW5nTGVuO2luZGV4KyspeworCSAgaWYgKHRlbXBTdHJpbmdbaW5kZXhdID09ICcgJykgeworCQkgIHByaW50ZiggIkVSUk9SIGluIGRwcmludGY6IG1hbGZvcm1lZCBjYWxsaW5nIHNlcXVlbmNlICglcylcbiIsdGVtcFN0cmluZyk7cmV0dXJuOworCSAgCX0KKwkgIGlmICh0ZW1wU3RyaW5nW2luZGV4XSA9PSAnXFwnIHx8IHRlbXBTdHJpbmdbaW5kZXhdID09ICcvJykKKwkJICBmaWxlbmFtZSA9IHRlbXBTdHJpbmcgKyBpbmRleCArIDE7CisgIH0KKyAgCisgIC8qIEV4dHJhY3QgZnVuY3Rpb24gbmFtZSAqLworICBmdW5jdGlvbk5hbWUgPSB2YV9hcmcgKGFyZ3MsIGNoYXIgKik7CisgCisgLyogRXh0cmFjdCBsaW5lIG51bWJlciBmcm9tIGFyZ3VtZW50IGxpc3QgKi8KKyAgbGluZV9udW1iZXIgPSB2YV9hcmcgKGFyZ3MsIGludCk7CisKKyAvKiBFeHRyYWN0IGluZm9ybWF0aW9uIHR5cGUgZnJvbSBhcmd1bWVudCBsaXN0ICovCisgIHR5cGUgPSB2YV9hcmcgKGFyZ3MsIGludCk7CisKKyAvKiBFeHRyYWN0IGZvcm1hdCBmcm9tIGFyZ3VtZW50IGxpc3QgKi8KKyAgZm10ID0gdmFfYXJnIChhcmdzLCBjaGFyICopOworCisgIHZzcHJpbnRmICh0ZXh0LCBmbXQsIGFyZ3MpOworCisgIHZhX2VuZCAoYXJncyk7CisKKyAgLyogRm9ybWF0IG91dHB1dCBzdGF0ZW1lbnQgKi8KKyAgc3dpdGNoICh0eXBlKQorICAgeworICAgY2FzZSBERUJVR19UWVBFOgorICAgICBzcHJpbnRmIChvdXR0ZXh0LCAiWyVzOiVzQCUwNGRdIERFQlVHICVzXG4iLAorICAgICAgICAgICAgICBmaWxlbmFtZSwgZnVuY3Rpb25OYW1lLCBsaW5lX251bWJlciwgdGV4dCk7CisgICAgIGJyZWFrOworICAgY2FzZSBJTkZPX1RZUEU6CisgICAgIHNwcmludGYgKG91dHRleHQsICJbJXM6JXNAJTA0ZF0gSU5GTyAlc1xuIiwKKyAgICAgICAgICAgICAgZmlsZW5hbWUsIGZ1bmN0aW9uTmFtZSwgbGluZV9udW1iZXIsIHRleHQpOworICAgICBicmVhazsKKyAgIGNhc2UgRVJST1JfVFlQRToKKyAgICAgc3ByaW50ZiAob3V0dGV4dCwgIlslczolc0AlMDRkXSBFUlJPUiAlc1xuIiwKKyAgICAgICAgICAgICAgZmlsZW5hbWUsIGZ1bmN0aW9uTmFtZSwgbGluZV9udW1iZXIsIHRleHQpOworICAgICBicmVhazsKKyAgIGNhc2UgQ1JJVElDQUxfVFlQRToKKyAgICAgc3ByaW50ZiAob3V0dGV4dCwgIlslczolc0AlMDRkXSBDUklUSUNBTCAlc1xuIiwKKyAgICAgICAgICAgICAgZmlsZW5hbWUsIGZ1bmN0aW9uTmFtZSwgbGluZV9udW1iZXIsIHRleHQpOworICAgICBicmVhazsKKyAgIGNhc2UgRkFUQUxfVFlQRToKKyAgICAgZmF0YWxGbGFnID0gMTsKKyAgICAgc3ByaW50ZiAob3V0dGV4dCwgIlslczolc0AlMDRkXSBGQVRBTCAlc1xuIiwKKyAgICAgICAgICAgICAgZmlsZW5hbWUsIGZ1bmN0aW9uTmFtZSwgbGluZV9udW1iZXIsIHRleHQpOworICAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgIHByaW50ZiggIkVSUk9SIGluIGRwcmludGY6IG1hbGZvcm1lZCBjYWxsaW5nIHNlcXVlbmNlXG4iKTsKKyAgICAgcmV0dXJuOworICAgICBicmVhazsKKyAgIH0KKworICBzcHJpbnRmIChmaWxlcGF0aCwgIiVzLmRlYnVnIiwgZmlsZW5hbWUpOworCisgIC8qIFdyaXRlIG91dHB1dCBzdGF0ZW1lbnQgKi8KKyAgc3dpdGNoIChkcHJpbnRmRmxhZykKKyAgeworICBkZWZhdWx0OgorICBjYXNlIERFQlVHX09GRjogCisgIAlicmVhazsKKyAgY2FzZSBERUJVR19NT1NUTFlfT0ZGOiAKKyAgCWlmIChmYXRhbEZsYWcpCXsKKwkgIGlmICgob3V0ZmlsZV9mZCA9IGZvcGVuIChmaWxlcGF0aCwgImErIikpICE9IE5VTEwpCSAgeworCSAgICBmd3JpdGUgKG91dHRleHQsIHNpemVvZiAoY2hhciksIHN0cmxlbiAob3V0dGV4dCksIG91dGZpbGVfZmQpOworCSAgICBmY2xvc2UgKG91dGZpbGVfZmQpOworCSAgfQorCX0KKyAgCWJyZWFrOworICBjYXNlIERFQlVHX1NDUkVFTl9PTkxZOiAKKyAgCXByaW50ZiAoIiVzIiwgb3V0dGV4dCk7CisgIAlicmVhazsKKyAgY2FzZSBERUJVR19GSUxFX09OTFk6IAorCWlmICgob3V0ZmlsZV9mZCA9IGZvcGVuIChmaWxlcGF0aCwgImErIikpICE9IE5VTEwpCXsKKwkgIGZ3cml0ZSAob3V0dGV4dCwgc2l6ZW9mIChjaGFyKSwgc3RybGVuIChvdXR0ZXh0KSwgb3V0ZmlsZV9mZCk7CisJICBmY2xvc2UgKG91dGZpbGVfZmQpOworCX0KKyAgCWJyZWFrOworICBjYXNlIERFQlVHX1NDUkVFTl9BTkRfRklMRTogLy8gQk9USAorICAJcHJpbnRmICgiJXMiLCBvdXR0ZXh0KTsKKwlpZiAoKG91dGZpbGVfZmQgPSBmb3BlbiAoZmlsZXBhdGgsICJhKyIpKSAhPSBOVUxMKQl7CisJICBmd3JpdGUgKG91dHRleHQsIHNpemVvZiAoY2hhciksIHN0cmxlbiAob3V0dGV4dCksIG91dGZpbGVfZmQpOworCSAgZmNsb3NlIChvdXRmaWxlX2ZkKTsKKwl9CisgIAlicmVhazsKKyAgfQorfQorCisvKioKKyAqIEBicmllZiBOb3JtYWxpemVzIGEgdmFsdWUgaW4gYSByYW5nZSwgdXNlZCBmb3IgZHJpdmUgaW5wdXQKKyAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gaW4gdGhlIHJhbmdlLCBzdGFydGluZyBhdCAwCisgKiBAcGFyYW0gcmFuZ2UgVGhlIHNpemUgb2YgdGhlIHJhbmdlIHRoYXQgcG9zaXRpb24gaXMgaW4KKyAqIEByZXR1cm4gVGhlIG5vcm1hbGl6ZWQgcG9zaXRpb24gZnJvbSAtMSB0byArMQorICovCitkb3VibGUgUmFuZ2VUb05vcm1hbGl6ZWQoZG91YmxlIHBvc2l0aW9uLCBpbnQgcmFuZ2UpeworCXJldHVybigoKHBvc2l0aW9uKjIuMCkvKGRvdWJsZSlyYW5nZSktMS4wKTsKK30KKworLyoqCisgKiBAYnJpZWYgQ29udmVydCBhIG5vcm1hbGl6ZWQgdmFsdWUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gYSByYW5nZS4KKyAqIFRoaXMgaXMgdXNlZCB0byBjb252ZXJ0IG5vcm1hbGl6ZWQgdmFsdWVzIHRvIHRoZSBzZXJ2byBjb21tYW5kIHJhbmdlLgorICogQHBhcmFtIG5vcm1hbGl6ZWRWYWx1ZSBUaGUgbm9ybWFsaXplZCB2YWx1ZSAoaW4gdGhlIC0xIHRvICsxIHJhbmdlKQorICogQHBhcmFtIG1pblJhbmdlIFRoZSBtaW5pbXVtIG9mIHRoZSByYW5nZSAoMCBpcyBkZWZhdWx0KQorICogQHBhcmFtIG1heFJhbmdlIFRoZSBtYXhpbXVtIG9mIHRoZSByYW5nZSAoMSBpcyBkZWZhdWx0KQorICogQHJldHVybiBUaGUgdmFsdWUgaW4gdGhlIHJhbmdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IG5vcm1hbGl6ZWQgdmFsdWUKKyAqLworZmxvYXQgTm9ybWFsaXplVG9SYW5nZShmbG9hdCBub3JtYWxpemVkVmFsdWUsIGZsb2F0IG1pblJhbmdlLCBmbG9hdCBtYXhSYW5nZSkgeworCWZsb2F0IHJhbmdlID0gbWF4UmFuZ2UtbWluUmFuZ2U7CisJZmxvYXQgdGVtcCA9IChmbG9hdCkoKG5vcm1hbGl6ZWRWYWx1ZSAvIDIuMCkrIDAuNSkqcmFuZ2U7CisJcmV0dXJuICh0ZW1wICsgbWluUmFuZ2UpOworfQkKK2Zsb2F0IE5vcm1hbGl6ZVRvUmFuZ2UoZmxvYXQgbm9ybWFsaXplZFZhbHVlKSB7CisJcmV0dXJuIChmbG9hdCkoKG5vcm1hbGl6ZWRWYWx1ZSAvIDIuMCkgKyAwLjUpOworfQkKKworLyoqCisgKiBAYnJpZWYgRGlzcGxheXMgYW4gYWN0aXZpdHkgaW5kaWNhdG9yIHRvIGNvbnNvbGUuIAorICogQ2FsbCB0aGlzIGZ1bmN0aW9uIGxpa2UgeW91IHdvdWxkIGNhbGwgcHJpbnRmLgorICogQHBhcmFtIGZtdCBUaGUgZm9ybWF0IHN0cmluZworKi8KK3ZvaWQgU2hvd0FjdGl2aXR5IChjaGFyICpmbXQsIC4uLikKK3sKKyAgc3RhdGljIGNoYXIgICBhY3Rpdml0eV9pbmRpY2F0aW9uX3N0cmluZ1tdID0gInwvLVxcIjsKKyAgc3RhdGljIGludCAgICBhaSA9IDM7CisgIHZhX2xpc3QgICAgICAgYXJnczsKKyAgY2hhciAgICAgICAgICB0ZXh0WzEwMjRdOworCisgIHZhX3N0YXJ0IChhcmdzLCBmbXQpOworCisgIHZzcHJpbnRmICh0ZXh0LCBmbXQsIGFyZ3MpOworCisgIGFpID0gYWkgPT0gMyA/IDAgOiBhaSArIDE7CisKKyAgcHJpbnRmICgiJWMgJXMgXHIiLCBhY3Rpdml0eV9pbmRpY2F0aW9uX3N0cmluZ1thaV0sIHRleHQpOworICBmZmx1c2ggKHN0ZG91dCk7CisKKyAgdmFfZW5kIChhcmdzKTsKK30KKworI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5CisvKioKKyAqIEBicmllZiBDYWxjdWxhdGUgc2luZSB3YXZlIGluY3JlbWVudHMgKC0xLjAgdG8gMS4wKS4gCisgKiBUaGUgZmlyc3QgdGltZSB0aGlzIGlzIGNhbGxlZCwgaXQgc2V0cyB1cCB0aGUgdGltZSBpbmNyZW1lbnQuIFN1YnNlcXVlbnQgY2FsbHMKKyAqIHdpbGwgZ2l2ZSB2YWx1ZXMgYWxvbmcgdGhlIHNpbmUgd2F2ZSBkZXBlbmRpbmcgb24gY3VycmVudCB0aW1lLiBJZiB0aGUgd2F2ZSBpcworICogc3RvcHBlZCBhbmQgcmVzdGFydGVkLCBpdCBtdXN0IGJlIHJlaW5pdGlhbGl6ZWQgd2l0aCBhIG5ldyAiZmlyc3QgY2FsbCIuCisgKiAKKyAqIEBwYXJhbSBwZXJpb2QgbGVuZ3RoIG9mIHRpbWUgdG8gY29tcGxldGUgYSBjb21wbGV0ZSB3YXZlCisgKiBAcGFyYW0gc2luU3RhcnQgV2hlcmUgdG8gc3RhcnQgdGhlIHNpbmUgd2F2ZSAoMC4wID0gMiBwaSwgcGkvMiA9IDEuMCwgZXRjLikKKyAqLworZG91YmxlIFNpblBvc2l0aW9uIChkb3VibGUgKnBlcmlvZCwgZG91YmxlIHNpblN0YXJ0KQoreworICBkb3VibGUgcnRuVmFsOworICBzdGF0aWMgZG91YmxlIHNpbmVQZXJpb2Q9MC4wOworICBzdGF0aWMgZG91YmxlIHRpbWVzdGFtcDsKKyAgZG91YmxlIHNpbkFyZzsKKworICAvLzFzdCBjYWxsCisgIGlmIChwZXJpb2QgIT0gTlVMTCkgeworICAgIHNpbmVQZXJpb2QgPSAqcGVyaW9kOworCXRpbWVzdGFtcCA9IEdldFRpbWUoKTsKKwlyZXR1cm4gMC4wOworICB9CisKKyAgLy9NdWx0aXBseWluZyBieSAyKnBpIHRvIHRoZSB0aW1lIGRpZmZlcmVuY2UgbWFrZXMgc2luZVBlcmlvZCB3b3JrIGlmIGl0J3MgbWVhc3VyZWQgaW4gc2Vjb25kcy4KKyAgLy9BZGRpbmcgc2luU3RhcnQgdG8gdGhlIHBhcnQgbXVsdGlwbGllZCBieSBQSSwgYnV0IG5vdCBieSAyLCBhbGxvd3MgaXQgdG8gd29yayBhcyBkZXNjcmliZWQgaW4gdGhlIGNvbW1lbnRzLgorICBzaW5BcmcgPSBQSSAqKCgyLjAgKiAoR2V0VGltZSgpIC0gdGltZXN0YW1wKSkgKyBzaW5TdGFydCkgLyBzaW5lUGVyaW9kOworICBydG5WYWwgPSBzaW4gKHNpbkFyZyk7ICAKKyAgcmV0dXJuIChydG5WYWwpOworfQorCisKKy8qKgorICogQGJyaWVmIEZpbmQgdGhlIGVsYXBzZWQgdGltZSBzaW5jZSBhIHNwZWNpZmllZCB0aW1lLgorICogQHBhcmFtIHN0YXJ0VGltZSBUaGUgc3RhcnRpbmcgdGltZQorICogQHJldHVybiBIb3cgbG9uZyBpdCBoYXMgYmVlbiBzaW5jZSB0aGUgc3RhcnRpbmcgdGltZQorICovCitkb3VibGUgRWxhcHNlZFRpbWUgKCBkb3VibGUgc3RhcnRUaW1lICkgIAoreworCWRvdWJsZSByZWFsVGltZSA9IEdldFRpbWUoKTsJCisJcmV0dXJuIChyZWFsVGltZS1zdGFydFRpbWUpOworfQorCisvKioKKyAqIEBicmllZiBJbml0aWFsaXplIHBhbiBwYXJhbWV0ZXJzCisgKiBAcGFyYW0gcGVyaW9kIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byBjb21wbGV0ZSBvbmUgcGFuCisgKi8KK3ZvaWQgcGFuSW5pdCgpCXsKKwlkb3VibGUgcGVyaW9kID0gMy4wOyAgCS8vIG51bWJlciBvZiBzZWNvbmRzIGZvciBvbmUgY29tcGxldGUgcGFuCisJU2luUG9zaXRpb24oJnBlcmlvZCwgMC4wKTsJLy8gaW5pdGlhbCBjYWxsIHRvIHNldCB1cCB0aW1lCit9CisKK3ZvaWQgcGFuSW5pdChkb3VibGUgcGVyaW9kKQl7CisJaWYgKHBlcmlvZCA8IDAuMCkgcGVyaW9kPTMuMDsKKwlTaW5Qb3NpdGlvbigmcGVyaW9kLCAwLjApOwkvLyBpbml0aWFsIGNhbGwgdG8gc2V0IHVwIHRpbWUKK30KKworLyoqCisgKiBAYnJpZWYgTW92ZSB0aGUgaG9yaXpvbnRhbCBzZXJ2byBiYWNrIGFuZCBmb3J0aC4KKyAqIEBwYXJhbSBwYW5TZXJ2byBUaGUgc2Vydm8gb2JqZWN0IHRvIG1vdmUKKyAqIEBwYXJhbSBzaW5TdGFydCBUaGUgcG9zaXRpb24gb24gdGhlIHNpbmUgd2F2ZSB0byBiZWdpbiB0aGUgcGFuCisgKi8KK3ZvaWQgcGFuRm9yVGFyZ2V0KFNlcnZvICpwYW5TZXJ2bykJeyBwYW5Gb3JUYXJnZXQocGFuU2Vydm8sIDAuMCk7IH0KKwordm9pZCBwYW5Gb3JUYXJnZXQoU2Vydm8gKnBhblNlcnZvLCBkb3VibGUgc2luU3RhcnQpCXsKKwlmbG9hdCBub3JtYWxpemVkU2luUG9zaXRpb24gPSAoZmxvYXQpU2luUG9zaXRpb24oTlVMTCwgc2luU3RhcnQpOworCWZsb2F0IG5ld1NlcnZvUG9zaXRpb24gPSBOb3JtYWxpemVUb1JhbmdlKG5vcm1hbGl6ZWRTaW5Qb3NpdGlvbik7CisJcGFuU2Vydm8tPlNldCggbmV3U2Vydm9Qb3NpdGlvbiApOworCS8vU2hvd0FjdGl2aXR5ICgicGFuIHg6IG5vcm1hbGl6ZWQgJWYgbmV3U2Vydm9Qb3NpdGlvbiA9ICVmIiAsIAorCS8vCQlub3JtYWxpemVkU2luUG9zaXRpb24sIG5ld1NlcnZvUG9zaXRpb24gKTsKK30KKworCisvKiogQGJyaWVmIFJlYWQgYSBmaWxlIGFuZCByZXR1cm4gbm9uLWNvbW1lbnQgb3V0cHV0IHN0cmluZyAKKworQ2FsbCB0aGUgZmlyc3QgdGltZSB3aXRoIDAgbGluZU51bWJlciB0byBnZXQgdGhlIG51bWJlciBvZiBsaW5lcyB0byByZWFkCitUaGVuIGNhbGwgd2l0aCBlYWNoIGxpbmVOdW1iZXIgdG8gZ2V0IG9uZSBjYW1lcmEgcGFyYW1ldGVyLiBUaGVyZSBzaG91bGQKK2JlIG9uZSBwcm9wZXJ0eT12YWx1ZSBlbnRyeSBvbiBlYWNoIGxpbmUsIGkuZS4gImV4cG9zdXJlPWF1dG8iCisKKyAqIEBwYXJhbSBpbnB1dEZpbGUgZmlsZW5hbWUgdG8gcmVhZAorICogQHBhcmFtIG91dHB1dFN0cmluZyBvbmUgc3RyaW5nCisgKiBAcGFyYW0gbGluZU51bWJlciBpZiAwLCByZXR1cm4gbnVtYmVyIG9mIGxpbmVzOyBlbHNlIHJldHVybiB0aGF0IGxpbmUgbnVtYmVyCisgKiBAcmV0dXJuIGludCBudW1iZXIgb2YgbGluZXMgb3IgLTEgaWYgZXJyb3IKKyAqKi8KK2ludCBwcm9jZXNzRmlsZShjaGFyICppbnB1dEZpbGUsIGNoYXIgKm91dHB1dFN0cmluZywgaW50IGxpbmVOdW1iZXIpCit7CisJRklMRSAqaW5maWxlOworCWludCBzdHJpbmdTaXplID0gODA7CQkvLyBtYXggc2l6ZSBvZiBvbmUgbGluZSBpbiBmaWxlIAorCWNoYXIgaW5wdXRTdHJbc3RyaW5nU2l6ZV07CisJc3RydWN0IHN0YXQgZmlsZVN0YXR1czsKKwlpbnQgZmlsZVNpemU9MDsKKwlpbnQgbGluZUNvdW50PTA7CisJICAKKwlpZiAobGluZU51bWJlciA8IDApCisJCSAgcmV0dXJuICgtMSk7CisKKwlpZiAoKGluZmlsZSA9IGZvcGVuIChpbnB1dEZpbGUsICJyIikpID09IE5VTEwpIHsKKwkgICAgcHJpbnRmICgiRmF0YWwgZXJyb3Igb3BlbmluZyBmaWxlICVzXG4iLGlucHV0RmlsZSk7CisJICAgIHJldHVybiAoMCk7CisJfQorICAgIG1lbXNldCAoJmZpbGVTdGF0dXMsIDAsIHNpemVvZihmaWxlU3RhdHVzKSk7CisgICAgaWYgKCFzdGF0KGlucHV0RmlsZSwgJmZpbGVTdGF0dXMpKSB7CisgICAgICBpZiAoU19JU1JFRyhmaWxlU3RhdHVzLnN0X21vZGUpKSB7CisgICAgICAgIGZpbGVTaXplID0gZmlsZVN0YXR1cy5zdF9zaXplOworICAgICAgfQorICAgIH0KKworICB3aGlsZSAoIWZlb2YoaW5maWxlKSkgeworICAgIGlmIChmZ2V0cyAoaW5wdXRTdHIsIHN0cmluZ1NpemUsIGluZmlsZSkgIT0gTlVMTCkgeworICAgICAgLy8gU2tpcCBlbXB0eSBsaW5lcworICAgICAgaWYgKGVtcHR5U3RyaW5nKGlucHV0U3RyKSkKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBTa2lwIGNvbW1lbnQgbGluZXMKKyAgICAgIGlmIChpbnB1dFN0clswXSA9PSAnIycgfHwgaW5wdXRTdHJbMF0gPT0gJyEnKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgbGluZUNvdW50Kys7CisgICAgICBpZiAobGluZU51bWJlciA9PSAwKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAJICBpZiAobGluZUNvdW50ID09IGxpbmVOdW1iZXIpCisgICAgCQkgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIGNsb3NlIGZpbGUgCisgIGZjbG9zZSAoaW5maWxlKTsKKyAgLy8gaWYgbnVtYmVyIGxpbmVzIHJlcXVlc3RlZCByZXR1cm4gdGhlIGNvdW50CisgIGlmIChsaW5lTnVtYmVyID09IDApCisJICByZXR1cm4gKGxpbmVDb3VudCk7CisgIC8vIGNoZWNrIGZvciBpbnB1dCBvdXQgb2YgcmFuZ2UKKyAgaWYgKGxpbmVOdW1iZXIgPiBsaW5lQ291bnQpCisJICByZXR1cm4gKC0xKTsKKyAgLy8gcmV0dXJuIHRoZSBsaW5lIHNlbGVjdGVkCisgIGlmIChsaW5lQ291bnQpIHsKKyAgICBzdHJpcFN0cmluZyhpbnB1dFN0cik7CisgICAgc3RyY3B5KG91dHB1dFN0cmluZywgaW5wdXRTdHIpOworICAgIHJldHVybihsaW5lQ291bnQpOworICB9IAorICBlbHNlIHsKKyAgICByZXR1cm4oLTEpOworICB9Cit9CisKKy8qKiBJZ25vcmUgZW1wdHkgc3RyaW5nIAorICogQHBhcmFtIHN0cmluZyB0byBjaGVjayBpZiBlbXB0eQorICoqLworaW50IGVtcHR5U3RyaW5nKGNoYXIgKnN0cmluZykKK3sKKyAgaW50IGksbGVuOworCisgIGlmKHN0cmluZyA9PSBOVUxMKQorICAgIHJldHVybigxKTsKKworICBsZW4gPSBzdHJsZW4oc3RyaW5nKTsKKyAgZm9yKGk9MDsgaTxsZW47IGkrKykgeworICAgIC8vIElnbm9yZSB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnMKKyAgICBpZiAoc3RyaW5nW2ldID09ICdcbicgfHwgc3RyaW5nW2ldID09ICdccicgfHwKKyAgICAgICAgc3RyaW5nW2ldID09ICdcdCcgfHwgc3RyaW5nW2ldID09ICcgJykKKyAgICAgIGNvbnRpbnVlOworICAgIHJldHVybigwKTsKKyAgfQorICByZXR1cm4oMSk7Cit9CisKKy8qKiBSZW1vdmUgc3BlY2lhbCBjaGFyYWN0ZXJzIGZyb20gc3RyaW5nIAorICogQHBhcmFtIHN0cmluZyB0byBwcm9jZXNzCisgKiovCit2b2lkIHN0cmlwU3RyaW5nKGNoYXIgKnN0cmluZykKK3sKKyAgaW50IGksaixsZW47CisKKyAgaWYoc3RyaW5nID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIGxlbiA9IHN0cmxlbihzdHJpbmcpOworICBmb3IoaT0wLGo9MDsgaTxsZW47IGkrKykgeworICAgIC8vIFJlbW92ZSB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnMgZnJvbSB0aGUgc3RyaW5nCisgICAgaWYgKHN0cmluZ1tpXSA9PSAnXG4nIHx8IHN0cmluZ1tpXSA9PSAnXHInIHx8IHN0cmluZ1tpXSA9PSAnXCInKQorICAgICAgY29udGludWU7CisgICAgLy8gQ29weSBhbnl0aGluZyBlbHNlCisgICAgc3RyaW5nW2orK10gPSBzdHJpbmdbaV07CisgIH0KKyAgc3RyaW5nW2pdID0gJ1wwJzsgCit9CisKKwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9XUElMaWIvV1BJTGliL1Zpc2lvbjIwMDkvQmFlVXRpbGl0aWVzLmggYi9hb3MvZXh0ZXJuYWxzL1dQSUxpYi9XUElMaWIvVmlzaW9uMjAwOS9CYWVVdGlsaXRpZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDhhYzIzCi0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9XUElMaWIvV1BJTGliL1Zpc2lvbjIwMDkvQmFlVXRpbGl0aWVzLmgKQEAgLTAsMCArMSw2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBQcm9qZWN0ICAgCQk6IEZJUlNUIE1vdG9yIENvbnRyb2xsZXIKKyogIEZpbGUgTmFtZSAgCQk6IEJhZVV0aWxpdGllcy5oICAgICAgICAgIAorKiAgQ29udHJpYnV0b3JzICAgCTogSkRHLCBFTEYKKyogIENyZWF0aW9uIERhdGUgCTogQXVndXN0IDEyLCAyMDA4CisqICBSZXZpc2lvbiBIaXN0b3J5CTogU291cmNlIGNvZGUgJiByZXZpc2lvbiBoaXN0b3J5IG1haW50YWluZWQgYXQgc291cmNlZm9yZ2UuV1BJLmVkdSAgICAgIAorKiAgRmlsZSBEZXNjcmlwdGlvbgk6IEdsb2JhbGx5IGRlZmluZWQgdmFsdWVzIGZvciB1dGlsaXRpZXMKKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogICAgICAgIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gICAgICAgICovCisvKiAgIE11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfX0JBRVVUSUxJVElFU19IX18KKyNkZWZpbmUgX19CQUVVVElMSVRJRVNfSF9fCisKKy8qICBDb25zdGFudHMgKi8KKyNkZWZpbmUgTE9HX0RFQlVHICAgIF9fRklMRV9fLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyxERUJVR19UWVBFCisjZGVmaW5lIExPR19JTkZPICAgICBfX0ZJTEVfXyxfX0ZVTkNUSU9OX18sX19MSU5FX18sSU5GT19UWVBFCisjZGVmaW5lIExPR19FUlJPUiAgICBfX0ZJTEVfXyxfX0ZVTkNUSU9OX18sX19MSU5FX18sRVJST1JfVFlQRQorI2RlZmluZSBMT0dfQ1JJVElDQUwgX19GSUxFX18sX19GVU5DVElPTl9fLF9fTElORV9fLENSSVRJQ0FMX1RZUEUKKyNkZWZpbmUgTE9HX0ZBVEFMICAgIF9fRklMRV9fLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyxGQVRBTF9UWVBFCisjZGVmaW5lIExPR19ERUJVRyAgICBfX0ZJTEVfXyxfX0ZVTkNUSU9OX18sX19MSU5FX18sREVCVUdfVFlQRQorCisvKiAgIEVudW1lcmF0ZWQgVHlwZXMgKi8KKworLyoqIGRlYnVnIGxldmVscyAqLworZW51bSBkcHJpbnRfdHlwZSB7REVCVUdfVFlQRSwgSU5GT19UWVBFLCBFUlJPUl9UWVBFLCBDUklUSUNBTF9UWVBFLCBGQVRBTF9UWVBFfTsKKworLyoqIGRlYnVnIG91dHB1dCBzZXR0aW5nICovCit0eXBlZGVmIGVudW0gRGVidWdPdXRwdXRUeXBlX2VudW0geyAKKwlERUJVR19PRkYsIERFQlVHX01PU1RMWV9PRkYsIERFQlVHX1NDUkVFTl9PTkxZLCBERUJVR19GSUxFX09OTFksIERFQlVHX1NDUkVFTl9BTkRfRklMRQorfURlYnVnT3V0cHV0VHlwZTsKKworLyogIEVudW1lcmF0ZWQgVHlwZXMgKi8KKworLyogVXRpbGl0eSBmdW5jdGlvbnMgKi8KKworLyogZGVidWcgKi8KK3ZvaWQgU2V0RGVidWdGbGFnICggRGVidWdPdXRwdXRUeXBlIGZsYWcgICk7IAordm9pZCBkcHJpbnRmICggY2hhciAqIHRlbXBTdHJpbmcsIC4uLiAgKTsgIC8qIFZhcmlhYmxlIGFyZ3VtZW50IGxpc3QgKi8KKworLyogc2V0IEZSQyByYW5nZXMgZm9yIGRyaXZlICovCitkb3VibGUgUmFuZ2VUb05vcm1hbGl6ZWQoZG91YmxlIHBpeGVsLCBpbnQgcmFuZ2UpOworLyogY2hhbmdlIG5vcm1hbGl6ZWQgdmFsdWUgdG8gYW55IHJhbmdlIC0gdXNlZCBmb3Igc2Vydm8gKi8KK2Zsb2F0IE5vcm1hbGl6ZVRvUmFuZ2UoZmxvYXQgbm9ybWFsaXplZFZhbHVlLCBmbG9hdCBtaW5SYW5nZSwgZmxvYXQgbWF4UmFuZ2UpOworZmxvYXQgTm9ybWFsaXplVG9SYW5nZShmbG9hdCBub3JtYWxpemVkVmFsdWUpOworCisvKiBzeXN0ZW0gdXRpbGl0aWVzICovCit2b2lkIFNob3dBY3Rpdml0eSAoY2hhciAqZm10LCAuLi4pOworZG91YmxlIEVsYXBzZWRUaW1lIChkb3VibGUgc3RhcnRUaW1lKTsKKworLyogc2Vydm8gcGFubmluZyB1dGlsaXRpZXMgKi8KK2NsYXNzIFNlcnZvOworZG91YmxlIFNpblBvc2l0aW9uIChkb3VibGUgKnBlcmlvZCwgZG91YmxlIHNpblN0YXJ0KTsKK3ZvaWQgcGFuSW5pdCgpOwordm9pZCBwYW5Jbml0KGRvdWJsZSBwZXJpb2QpOwordm9pZCBwYW5Gb3JUYXJnZXQoU2Vydm8gKnBhblNlcnZvKTsKK3ZvaWQgcGFuRm9yVGFyZ2V0KFNlcnZvICpwYW5TZXJ2bywgZG91YmxlIHNpblN0YXJ0KTsKKworLyogY29uZmlnIGZpbGUgcmVhZCB1dGlsaXRpZXMgKi8KK2ludCBwcm9jZXNzRmlsZShjaGFyICppbnB1dEZpbGUsIGNoYXIgKm91dHB1dFN0cmluZywgaW50IGxpbmVOdW1iZXIpOworaW50IGVtcHR5U3RyaW5nKGNoYXIgKnN0cmluZyk7Cit2b2lkIHN0cmlwU3RyaW5nKGNoYXIgKnN0cmluZyk7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL1dQSUxpYi9XUElMaWIvVmlzaW9uMjAwOS9GcmNFcnJvci5jcHAgYi9hb3MvZXh0ZXJuYWxzL1dQSUxpYi9XUElMaWIvVmlzaW9uMjAwOS9GcmNFcnJvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdmMGJhMQotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvV1BJTGliL1dQSUxpYi9WaXNpb24yMDA5L0ZyY0Vycm9yLmNwcApAQCAtMCwwICsxLDEyMzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgUHJvamVjdCAgIAkJOiBGSVJTVCBNb3RvciBDb250cm9sbGVyCisqICBGaWxlIE5hbWUgIAkJOiBGcmNFcnJvci5jcHAgICAgICAgIAorKiAgQ29udHJpYnV0b3JzICAgCTogSkRHLCBFTEYKKyogIENyZWF0aW9uIERhdGUgCTogSnVseSAyMCwgMjAwOAorKiAgUmV2aXNpb24gSGlzdG9yeQk6IFNvdXJjZSBjb2RlICYgcmV2aXNpb24gaGlzdG9yeSBtYWludGFpbmVkIGF0IHNvdXJjZWZvcmdlLldQSS5lZHUgICAgCisqICBGaWxlIERlc2NyaXB0aW9uCTogRXJyb3IgaGFuZGxpbmcgZnVuY3Rpb25hbGl0eSBmb3IgQyByb3V0aW5lcworKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogICAgICAgIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICovCisvKiAgbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAKKyNpbmNsdWRlICJuaXZpc2lvbi5oIiAKKyNpbmNsdWRlICJGcmNFcnJvci5oIiAKKworLyoqCisgKiBHZXQgdGhlIGVycm9yIGNvZGUgcmV0dXJuZWQgZnJvbSB0aGUgTkkgVmlzaW9uIGxpYnJhcnkKKyAqIEByZXR1cm4gVGhlIGxhc3QgZXJyb3IgY29kZS4KKyAqLworaW50IEdldExhc3RWaXNpb25FcnJvcigpCit7CisJLy9pbnQgZXJyb3JDb2RlID0gaW1hcUdldExhc3RWaXNpb25FcnJvcigpOyAgICAgLy8gZXJyb3IgY29kZTogMCA9IG5vIGVycm9yCQorCS8vY2hhciogZXJyb3JUZXh0ID0gR2V0VmlzaW9uRXJyb3JUZXh0KGVycm9yQ29kZSk7CisJLy9kcHJpbnRmIChMT0dfREVCVUcsICJFcnJvciA9ICVpICAlcyAiLCBlcnJvckNvZGUsIGVycm9yVGV4dCk7CisJcmV0dXJuIGltYXFHZXRMYXN0RXJyb3IoKTsKK30KKwkKKy8qKgorKiBHZXQgdGhlIGVycm9yIHRleHQgZm9yIGFuIE5JIFZpc2lvbiBlcnJvciBjb2RlLgorKiBOb3RlOiBpbWFxR2V0RXJyb3JUZXh0KCkgaXMgbm90IHN1cHBvcnRlZCBvbiByZWFsIHRpbWUgc3lzdGVtLCBzbworKiBzbyByZWxldmFudCBzdHJpbmdzIGFyZSBoYXJkY29kZWQgaGVyZSAtIHRoZSBtYWludGFpbmVkIHZlcnNpb24gaXMKKyogaW4gdGhlIExhYldpbmRvd3MvQ1ZJIGhlbHAgZmlsZS4KKyogQHBhcmFtIGVycm9yQ29kZSBUaGUgZXJyb3IgY29kZSB0byBmaW5kIHRoZSB0ZXh0IGZvci4KKyogQHJldHVybiBUaGUgZXJyb3IgdGV4dAorKi8KK2NoYXIqIEdldFZpc2lvbkVycm9yVGV4dChpbnQgZXJyb3JDb2RlKQoreworCWNoYXIqIGVycm9yVGV4dDsKKworCXN3aXRjaCAoZXJyb3JDb2RlKQorCXsKKwkJZGVmYXVsdDoKKwkJCXsgZXJyb3JUZXh0ID0gIlVOS05PV05fRVJST1IiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTEzODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfUkVHSU9OX1RPT19TTUFMTCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTM5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lNQVFfUVJfRElNRU5TSU9OX0lOVkFMSUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE0MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfQ0hBUl9SRVBPUlRfQ09SUlVQVEVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNDE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX05PX1RFWFRfRk9VTkQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE0MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9RUl9ERVRFQ1RJT05fTU9ERUxUWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNDM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUVJfREVURUNUSU9OX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE0NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9RUl9JTlZBTElEX0JBUkNPREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE0NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9RUl9JTlZBTElEX1JFQUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE0NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9RUl9ERVRFQ1RJT05fVkVSU0lPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTQ3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBUkNPREVfUlNTTElNSVRFRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTQ4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09WRVJMQVlfR1JPVVBfTk9UX0ZPVU5EIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNDk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRFVQTElDQVRFX1RSQU5TRk9STV9UWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNTE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX0NPUlJFQ1RJT05fRkFJTEVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNTU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX09SSUVOVF9ERVRFQ1RfRkFJTEVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNTY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX1NLRVdfREVURUNUX0ZBSUxFRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTU4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9JTlZBTElEX0NPTlRSQVNUTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTU5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9JTlZBTElEX1RPTEVSQU5DRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTYwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9JTlZBTElEX01BWFBPSU5UU0laRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTYxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9JTlZBTElEX0NPUlJFQ1RJT05MRVZFTCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTYyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9JTlZBTElEX0NPUlJFQ1RJT05NT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNjM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX0lOVkFMSURfQ0hBUkFDVEVSUFJFRkVSRU5DRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTY0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9BRERfV09SRF9GQUlMRUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE2NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfV1RTX0RJUl9OT1RfRk9VTkQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE2NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfQklOX0RJUl9OT1RfRk9VTkQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE2NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfSU5WQUxJRF9PVVRQVVRERUxJTUlURVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE2ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfSU5WQUxJRF9BVVRPQ09SUkVDVElPTk1PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE2OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfSU5WQUxJRF9SRUNPR05JVElPTk1PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE3MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfSU5WQUxJRF9DSEFSQUNURVJUWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNzE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX0lOSV9GSUxFX05PVF9GT1VORCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTcyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9JTlZBTElEX0NIQVJBQ1RFUlNFVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTczOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9JTlZBTElEX0xBTkdVQUdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUxNzQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX0lOVkFMSURfQVVUT09SSUVOVE1PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE3NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfQkFEX1VTRVJfRElDVElPTkFSWSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MTc4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09DUl9SRUNPR05JVElPTl9GQUlMRUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTE3OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfUFJFUFJPQ0VTU0lOR19GQUlMRUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTIwMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfSU5WQUxJRF9QQVJBTUVURVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTIwMToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9PQ1JfTE9BRF9MSUJSQVJZIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyMDM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX0xJQl9JTklUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyMTA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX0NBTk5PVF9NQVRDSF9URVhUX1RFTVBMQVRFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyMTE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX0JBRF9URVhUX1RFTVBMQVRFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyMTI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT0NSX1RFTVBMQVRFX1dST05HX1NJWkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTIzMzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURV9JTUFHRV9UT09fTEFSR0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTIzNDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURV9JTUFHRV9UT09fU01BTEwiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTIzNToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURV9JTUFHRV9DT05UUkFTVF9UT09fTE9XIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyMzc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVfREVTQ1JJUFRPUl9TSElGVF8xIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyMzg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVfREVTQ1JJUFRPUl9OT1NISUZUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyMzk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVfREVTQ1JJUFRPUl9TSElGVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjQwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1JfUk9UQVRJT05fMSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjQxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1JfTk9ST1RBVElPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjQyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RFTVBMQVRFX0RFU0NSSVBUT1JfUk9UQVRJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI0MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURV9ERVNDUklQVE9SXzQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI0NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURV9ERVNDUklQVE9SXzMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI0NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURV9ERVNDUklQVE9SXzIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI0NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURV9ERVNDUklQVE9SXzEiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI0NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURV9ERVNDUklQVE9SIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNDg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVE9PX01BTllfUk9UQVRJT05fQU5HTEVfUkFOR0VTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNDk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9UQVRJT05fQU5HTEVfUkFOR0VfVE9PX0xBUkdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNTA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTUFUQ0hfU0VUVVBfREFUQSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjUxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUFUQ0hfTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjUyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0xFQVJOX1NFVFVQX0RBVEEiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI1MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0xFQVJOX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI1NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9FVkVOX1dJTkRPV19TSVpFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNTc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9FREdFX0RJUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjU4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBRF9GSUxURVJfV0lEVEgiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI2MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9IRUFQX1RSQVNIRUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI2MToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9HSVBfUkFOR0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI2MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9MQ0RfQkFEX01BVENIIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNjM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTENEX05PX1NFR01FTlRTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNjU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQkFSQ09ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjY3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTVBMRVhfUk9PVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjY4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0xJTkVBUl9DT0VGRiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjY5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05VTExfUE9JTlRFUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjcwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RJVl9CWV9aRVJPIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNzU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9CUk9XU0VSX0lNQUdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNzY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTElORVNfUEFSQUxMRUwiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI3NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9CQVJDT0RFX0NIRUNLU1VNIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNzg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTENEX05PVF9OVU1FUklDIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyNzk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9JX05PVF9QT0xZR09OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyODA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9JX05PVF9SRUNUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyODE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU1BR0VfU01BTExFUl9USEFOX0JPUkRFUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjgyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NBTlRfRFJBV19JTlRPX1ZJRVdFUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjgzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfUkFLRV9ESVJFQ1RJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI4NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0VER0VfUFJPQ0VTUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mjg1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfU1BPS0VfRElSRUNUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyODY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DT05DRU5UUklDX1JBS0VfRElSRUNUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyODc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9MSU5FIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyOTA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfU0hBUEVNQVRDSF9CQURURU1QTEFURSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MjkxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1NIQVBFTUFUQ0hfQkFESU1BR0VEQVRBIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyOTI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUE9JTlRTX0FSRV9DT0xMSU5FQVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI5MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT05UT1VSSURfTk9UX0ZPVU5EIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyOTQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09OVE9VUl9JTkRFWF9PVVRfT0ZfUkFOR0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI5NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0lOVEVSUE9MQVRJT05NRVRIT0RfSU5URVJQT0xBVEVQT0lOVFMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTI5NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0JBUkNPREVUWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyOTc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9QQVJUSUNMRUlORk9NT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUyOTg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09NUExFWFBMQU5FX05PVF9SRUFMX09SX0lNQUdJTkFSWSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mjk5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ09NUExFWFBMQU5FIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMDA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NRVRFUkFSQ01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMwMToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ST0lfTk9UXzJfTElORVMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMwMjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1RIUkVTSE9MRE1FVEhPRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzAzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTlVNX09GX0NMQVNTRVMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMwNDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01BVEhUUkFOU0ZPUk1NRVRIT0QiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMwNToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1JFRkVSRU5DRU1PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMwNjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1RPT0wiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMwNzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9QUkVDSVNJT05fTk9UX0dUUl9USEFOXzAiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMwODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NPTE9SU0VOU0lUSVZJVFkiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMwOToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1dJTkRPV19USFJFQURfUE9MSUNZIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMTA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9QQUxFVFRFX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMxMToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NPTE9SX1NQRUNUUlVNIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMTI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTENEX0NBTElCUkFURSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzEzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1dSSVRFX0ZJTEVfTk9UX1NVUFBPUlRFRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzE2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfS0VSTkVMX0NPREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMxNzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9VTkRFRl9QT0lOVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzE4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOU0ZfUE9JTlRTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMTk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TVUJQSVhfVFlQRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzIwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RFTVBMQVRFX0VNUFRZIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMjE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NT1JQSE9MT0dZTUVUSE9EIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMjI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9URVhUQUxJR05NRU5UIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMjM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9GT05UQ09MT1IiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMyNDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NIQVBFTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzI1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfRFJBV01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMyNjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0RSQVdNT0RFX0ZPUl9MSU5FIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMjc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TQ0FMSU5HTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzI4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfSU5URVJQT0xBVElPTk1FVEhPRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzI5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfT1VUTElORU1FVEhPRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzMwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQk9SREVSX1NJWkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTMzMToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0JPUkRFUk1FVEhPRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzMyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ09NUEFSRUZVTkNUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMzM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9WRVJUSUNBTF9URVhUX0FMSUdOTUVOVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzM0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ09OVkVSU0lPTlNUWUxFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMzU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRElTUEFUQ0hfU1RBVFVTX0NPTkZMSUNUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzMzY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVU5LTk9XTl9BTEdPUklUSE0iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM0MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NJWkVUWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNDM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRklMRV9GSUxFTkFNRV9OVUxMIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNDU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9GTElQQVhJUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzQ2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfSU5URVJQT0xBVElPTk1FVEhPRF9GT1JfUk9UQVRFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNDc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF8zRERJUkVDVElPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzQ4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfM0RQTEFORSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzQ5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfU0tFTEVUT05NRVRIT0QiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM1MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1ZJU0lPTl9JTkZPIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNTE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9SRUNUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNTI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9GRUFUVVJFX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM1MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NFQVJDSF9TVFJBVEVHWSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzU0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ09MT1JfV0VJR0hUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNTU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9OVU1fTUFUQ0hFU19SRVFVRVNURUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM1NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01JTl9NQVRDSF9TQ09SRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzU3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ09MT1JfSUdOT1JFX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM2MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT01QTEVYX1BMQU5FIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNjE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TVEVFUE5FU1MiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM2MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1dJRFRIIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNjM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TVUJTQU1QTElOR19SQVRJTyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzY0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lHTk9SRV9DT0xPUl9TUEVDVFJVTV9TRVQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM2NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX05PU1BFQ1RSVU0iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM2NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX05PU0hBUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM2NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX1JPVEFUSU9OXzUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM2ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX1JPVEFUSU9OXzQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM2OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX1JPVEFUSU9OXzMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM3MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX1JPVEFUSU9OXzIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM3MToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX1JPVEFUSU9OXzEiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM3MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX05PUk9UQVRJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM3MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9ERVNDUklQVE9SX1JPVEFUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNzQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9TSElGVF8yIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNzU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9TSElGVF8xIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNzY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9OT1NISUZUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzNzc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfREVTQ1JJUFRPUl9TSElGVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mzc4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfNiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mzc5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfNSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzgwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfNCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzgxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfMyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzgyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfMiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzgzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1JfMSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mzg0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0RFU0NSSVBUT1IiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM4NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9ST1RBVElPTl9SRVFVSVJFU19TSEFQRV9GRUFUVVJFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzODY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfTUFUQ0hfU0VUVVBfREFUQV9TSEFQRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Mzg3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX01BVENIX1NFVFVQX0RBVEEiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM4ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9MRUFSTl9TRVRVUF9EQVRBX1NIQVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzODk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfTEVBUk5fU0VUVVBfREFUQSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1MzkwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX1RFTVBMQVRFX0lNQUdFX0xVTUlOQU5DRV9DT05UUkFTVF9UT09fTE9XIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzOTE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfVEVNUExBVEVfSU1BR0VfSFVFX0NPTlRSQVNUX1RPT19MT1ciO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM5MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9JTUFHRV9UT09fTEFSR0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM5MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9URU1QTEFURV9JTUFHRV9UT09fU01BTEwiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM5NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT0xPUl9TUEVDVFJVTV9NQVNLIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzOTU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09MT1JfSU1BR0VfUkVRVUlSRUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTM5NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT01QTEVYX0lNQUdFX1JFUVVJUkVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTUzOTk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTVVMVElDT1JFX0lOVkFMSURfQVJHVU1FTlQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTQwMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9NVUxUSUNPUkVfT1BFUkFUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU0MDE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NQVRDSEZBQ1RPUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NDAyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUFYUE9JTlRTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU0MDM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRVhUUkFJTkZPX1ZFUlNJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTQwNDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0lOVEVSUE9MQVRJT05NRVRIT0RfRk9SX1VOV1JBUCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NDA1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfVEVYVE9SSUVOVEFUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU0MDY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ09PUkRTWVNfTk9UX0ZPVU5EIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU0MDc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DT05UUkFTVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NDA4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfREVURUNUSU9OX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTQwOToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NVQlBJWEVMX0RJVklTSU9OUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NDEwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfSUNPTlNfUEVSX0xJTkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU0OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX05VTUJFUl9PRl9PQkpFQ1RTX1RPX1ZFUklGWSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTUwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfQ0hBUkFDVEVSX1ZBTFVFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1NTE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfUkVOQU1FX1JFRkNIQVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU1MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9OT1RfQV9WQUxJRF9DSEFSQUNURVJfU0VUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1NTM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9NSU5fQk9VTkRJTkdfUkVDVF9IRUlHSFQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU1NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX1JFQURfUkVTT0xVVElPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTU1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfU1BBQ0lOR19SQU5HRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTU2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfQk9VTkRJTkdfUkVDVF9IRUlHSFRfUkFOR0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU1NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX0JPVU5ESU5HX1JFQ1RfV0lEVEhfUkFOR0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU1ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX0NIQVJBQ1RFUl9TSVpFX1JBTkdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1NTk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9SRUFEX09QVElPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTYwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfT0JKRUNUX0lOREVYIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1NjE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9OVU1CRVJfT0ZfQ0hBUkFDVEVSUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTYyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0JPT0xFQU5fVkFMVUVfRk9SX1NUUklOR19BVFRSSUJVVEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU2MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9VTkxJQ0VOU0VEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1NjQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9QUkVERUZJTkVEX0NIQVJBQ1RFUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTY1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX01VU1RfQkVfU0lOR0xFX0NIQVJBQ1RFUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTY2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0JPT0xFQU5fVkFMVUVfRk9SX0lOVEVHRVJfQVRUUklCVVRFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1Njc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfU1RSSU5HX1ZBTFVFX0ZPUl9CT09MRUFOX0FUVFJJQlVURSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTY4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX1NUUklOR19WQUxVRV9GT1JfSU5URUdFUl9BVFRSSUJVVEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU2OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX0FUVFJJQlVURSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTcwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVEVHRVJfVkFMVUVfRk9SX0JPT0xFQU5fQVRUUklCVVRFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1NzE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfR0VUX09OTFlfQVRUUklCVVRFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1NzI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5URUdFUl9WQUxVRV9GT1JfU1RSSU5HX0FUVFJJQlVURSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTczOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfQ0hBUkFDVEVSX1NFVF9GSUxFX1ZFUlNJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU3NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9DSEFSQUNURVJfU0VUX0RFU0NSSVBUSU9OX1RPT19MT05HIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1NzU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9OVU1CRVJfT0ZfRVJPU0lPTlMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU3NjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9DSEFSQUNURVJfVkFMVUVfVE9PX0xPTkciO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU3NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9DSEFSQUNURVJfVkFMVUVfQ0FOTk9UX0JFX0VNUFRZU1RSSU5HIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1Nzg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9DSEFSQUNURVJfU0VUX0ZJTEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU3OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX0FTUEVDVF9SQVRJTyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTgwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfTUlOX0JPVU5ESU5HX1JFQ1RfV0lEVEgiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU4MToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX01BWF9WRVJUX0VMRU1FTlRfU1BBQ0lORyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTgyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfTUFYX0hPUklaX0VMRU1FTlRfU1BBQ0lORyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTgzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfTUlOX0NIQVJfU1BBQ0lORyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTg0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfVEhSRVNIT0xEX0xJTUlUUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTg1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfVVBQRVJfVEhSRVNIT0xEX0xJTUlUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1ODY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9MT1dFUl9USFJFU0hPTERfTElNSVQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU4NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX1RIUkVTSE9MRF9SQU5HRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTg4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX0lOVkFMSURfSElHSF9USFJFU0hPTERfVkFMVUUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU4OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX0xPV19USFJFU0hPTERfVkFMVUUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU5MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX05VTUJFUl9PRl9WQUxJRF9DSEFSQUNURVJfUE9TSVRJT05TIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1OTE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9DSEFSQUNURVJfSU5ERVgiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU5MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX1JFQURfU1RSQVRFR1kiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU5MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX05VTUJFUl9PRl9CTE9DS1MiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU5NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX1NVQlNUSVRVVElPTl9DSEFSQUNURVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU5NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX1RIUkVTSE9MRF9NT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU1OTY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTklPQ1JfSU5WQUxJRF9DSEFSQUNURVJfU0laRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NTk3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05JT0NSX05PVF9BX1ZBTElEX1NFU1NJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTU5ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OSU9DUl9JTlZBTElEX0FDQ0VQVEFOQ0VfTEVWRUwiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYwMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTkZPX05PVF9GT1VORCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjAxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfRURHRV9USFJFU0hPTEQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYwMjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01JTklNVU1fQ1VSVkVfTEVOR1RIIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2MDM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9ST1dfU1RFUCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjA0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ09MVU1OX1NURVAiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYwNToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01BWElNVU1fRU5EX1BPSU5UX0dBUCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjA2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUlOSU1VTV9GRUFUVVJFU19UT19NQVRDSCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjA3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUFYSU1VTV9GRUFUVVJFU19QRVJfTUFUQ0giO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYwODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NVQlBJWEVMX0lURVJBVElPTlMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYwOToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NVQlBJWEVMX1RPTEVSQU5DRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjEwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfSU5JVElBTF9NQVRDSF9MSVNUX0xFTkdUSCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjExOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUlOSU1VTV9SRUNUQU5HTEVfRElNRU5TSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2MTI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NSU5JTVVNX0ZFQVRVUkVfUkFESVVTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2MTM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NSU5JTVVNX0ZFQVRVUkVfTEVOR1RIIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2MTQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NSU5JTVVNX0ZFQVRVUkVfQVNQRUNUX1JBVElPIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2MTU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NSU5JTVVNX0ZFQVRVUkVfU1RSRU5HVEgiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYxNjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0VER0VfRklMVEVSX1NJWkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYxNzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX05VTUJFUl9PRl9GRUFUVVJFU19SQU5HRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjE4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RPT19NQU5ZX1NDQUxFX1JBTkdFUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjE5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RPT19NQU5ZX09DQ0xVU0lPTl9SQU5HRVMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYyMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NVUlZFX0VYVFJBQ1RJT05fTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjIxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTEVBUk5fR0VPTUVUUklDX1BBVFRFUk5fU0VUVVBfREFUQSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjIyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUFUQ0hfR0VPTUVUUklDX1BBVFRFUk5fU0VUVVBfREFUQSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjIzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfU0NBTEVfUkFOR0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYyNDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX09DQ0xVU0lPTl9SQU5HRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjI1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUFUQ0hfQ09OU1RSQUlOVF9UWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2MjY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTk9UX0VOT1VHSF9URU1QTEFURV9GRUFUVVJFUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjI3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05PVF9FTk9VR0hfVEVNUExBVEVfRkVBVFVSRVNfMSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjI4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfR0VPTUVUUklDX01BVENISU5HX1RFTVBMQVRFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2Mjk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NQVhJTVVNX1BJWEVMX0RJU1RBTkNFX0ZST01fTElORSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjMwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUFYSU1VTV9GRUFUVVJFU19MRUFSTkVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2MzE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NSU5fTUFUQ0hfU0VQQVJBVElPTl9ESVNUQU5DRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjMyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUlOX01BVENIX1NFUEFSQVRJT05fQU5HTEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTYzMzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01JTl9NQVRDSF9TRVBBUkFUSU9OX1NDQUxFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2MzQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NQVhfTUFUQ0hfT1ZFUkxBUCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjM1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfU0hBUEVfREVTQ1JJUFRPUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjM2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RJUkVDVFhfTk9UX0ZPVU5EIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2Mzc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSEFSRFdBUkVfRE9FU05UX1NVUFBPUlRfTk9OVEVBUklORyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjM4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfRklMTF9TVFlMRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjM5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfSEFUQ0hfU1RZTEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTY0MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9UT09fTUFOWV9aT05FUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjQxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RVUExJQ0FURV9MQUJFTCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjQyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0xBQkVMX05PVF9GT1VORCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjQzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTlVNQkVSX09GX01BVENIX09QVElPTlMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTY0NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9MQUJFTF9UT09fTE9ORyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjQ1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTlVNQkVSX09GX0xBQkVMUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjQ2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05PX1RFTVBMQVRFX1RPX0xFQVJOIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2NDc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NVUxUSVBMRV9HRU9NRVRSSUNfVEVNUExBVEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTY0ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9URU1QTEFURV9OT1RfTEVBUk5FRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjQ5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfR0VPTUVUUklDX0ZFQVRVUkVfVFlQRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjUwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NVUlZFX0VYVFJBQ1RJT05fTU9ERV9NVVNUX0JFX1NBTUUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTY1MToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9FREdFX0ZJTFRFUl9TSVpFX01VU1RfQkVfU0FNRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjUyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09QRU5JTkdfTkVXRVJfR0VPTUVUUklDX01BVENISU5HX1RFTVBMQVRFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU2NTM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT1BFTklOR19ORVdFUl9NVUxUSVBMRV9HRU9NRVRSSUNfVEVNUExBVEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTY1NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9HUkFESU5HX0lORk9STUFUSU9OX05PVF9GT1VORCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjU1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0VOQUJMRV9DQUxJQlJBVElPTl9TVVBQT1JUX01VU1RfQkVfU0FNRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NjU2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1NNT09USF9DT05UT1VSU19NVVNUX0JFX1NBTUUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcwMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9SRVFVSVJFU19XSU4yMDAwX09SX05FV0VSIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3MDE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NQVRSSVhfU0laRV9SQU5HRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzAyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTEVOR1RIIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3MDM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9UWVBFX09GX0ZMQVRURU4iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcwNDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NPTVBSRVNTSU9OX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcwNToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9EQVRBX0NPUlJVUFRFRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzA2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0FWSV9TRVNTSU9OX0FMUkVBRFlfT1BFTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzA3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0FWSV9XUklURV9TRVNTSU9OX1JFUVVJUkVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3MDg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQVZJX1JFQURfU0VTU0lPTl9SRVFVSVJFRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzA5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0FWSV9VTk9QRU5FRF9TRVNTSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3MTA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVE9PX01BTllfUEFSVElDTEVTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3MTE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTk9UX0VOT1VHSF9SRUdJT05TIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3MTI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfV1JPTkdfUkVHSU9OX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcxMzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9WQUxVRV9OT1RfSU5fRU5VTSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzE0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQVhJU19PUklFTlRBVElPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzE1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ0FMSUJSQVRJT05fVU5JVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzE2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfU0NBTElOR19NRVRIT0QiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcxNzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1JBTkdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3MTg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTEFCX1ZFUlNJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcxOToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9CQURfUk9JX0JPWCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzIwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBRF9ST0kiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcyMToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0JJVF9ERVBUSCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzIyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NMQVNTSUZJRVJfQ0xBU1NJRllfSU1BR0VfV0lUSF9DVVNUT01fU0VTU0lPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzIzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NVU1RPTURBVEFfS0VZX05PVF9GT1VORCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzI0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NVU1RPTURBVEFfSU5WQUxJRF9TSVpFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3MjU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfREFUQV9WRVJTSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3MjY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTUFUQ0hGQUNUT1JfT0JTT0xFVEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTcyNzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9VTlNVUFBPUlRFRF8yRF9CQVJDT0RFX1NFQVJDSF9NT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3Mjg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF8yRF9CQVJDT0RFX1NFQVJDSF9NT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3NTQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVFJJR19USU1FT1VUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3NTY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRExMX0ZVTkNUSU9OX05PVF9GT1VORCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzU3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RMTF9OT1RfRk9VTkQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc1ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9CT0FSRF9OT1RfT1BFTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzYwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JPQVJEX05PVF9GT1VORCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzYyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTklCTEFDS19ERVZJQVRJT05fRkFDVE9SIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3NjM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9OT1JNQUxJWkFUSU9OX01FVEhPRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzY2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RFUFJFQ0FURURfRlVOQ1RJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc2NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0FMSUdOTUVOVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzY4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfU0NBTEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc2OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0VER0VfVEhJQ0tORVNTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3NzA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9JTlNQRUNUSU9OX1RFTVBMQVRFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3NzE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT1BFTklOR19ORVdFUl9JTlNQRUNUSU9OX1RFTVBMQVRFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3NzI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9SRUdJU1RSQVRJT05fTUVUSE9EIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3NzM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTk9fREVTVF9JTUFHRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Nzc0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05PX0xBQkVMIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3NzU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9JX0hBU19PUEVOX0NPTlRPVVJTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3NzY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9VU0VfT0ZfQ09NUEFDVF9TRVNTSU9OX0ZJTEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc3NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTkNPTVBBVElCTEVfQ0xBU1NJRklFUl9UWVBFUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Nzc4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfS0VSTkVMX1NJWkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc3OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQU5OT1RfQ09NUEFDVF9VTlRSQUlORUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc4MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1BBUlRJQ0xFX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc4MToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DTEFTU0lGSUVSX0lOVkFMSURfRU5HSU5FX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc4MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ERVNDUklQVElPTl9UT09fTE9ORyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzgzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBRF9TQU1QTEVfSU5ERVgiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc4NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0xJTUlUUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Nzg1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05PX1BBUlRJQ0xFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3ODY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9QQVJUSUNMRV9PUFRJT05TIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3ODc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DTEFTU0lGSUVSX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc4ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9OT19TQU1QTEVTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3ODk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT1BFTklOR19ORVdFUl9DTEFTU0lGSUVSX1NFU1NJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc5MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0RJU1RBTkNFX01FVFJJQyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1NzkxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NMQVNTSUZJRVJfSU5WQUxJRF9TRVNTSU9OX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc5MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DTEFTU0lGSUVSX1NFU1NJT05fTk9UX1RSQUlORUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTc5MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX09QRVJBVElPTl9PTl9DT01QQUNUX1NFU1NJT05fQVRURU1QVEVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3OTQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfS19UT09fSElHSCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Nzk1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0tfVE9PX0xPVyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Nzk2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfS05OX01FVEhPRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1Nzk3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ0xBU1NJRklFUl9TRVNTSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3OTg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DVVNUT01fU0FNUExFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU3OTk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5URVJOQUwiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTgwMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9QUk9URUNUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU4MDE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVE9PX01BTllfQ09OVE9VUlMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTgzNzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NPTVBSRVNTSU9OX1JBVElPIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU4NDA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQkFEX0lOREVYIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU4NzU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQkFSQ09ERV9QSEFSTUFDT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU4NzY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVU5TVVBQT1JURURfQ09MT1JfTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1ODc3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9STU9ERV9SRVFVSVJFU19DSEFOR0VDT0xPUlNQQUNFMiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1ODc4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1BST1BfTk9ERV9XUklURV9OT1RfU1VQUE9SVEVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU4Nzk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQkFEX01FQVNVUkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTg4MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9QQVJUSUNMRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTIwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05VTUJFUl9DTEFTUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTUzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfV0FWRUxFVF9UUkFOU0ZPUk1fTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTU0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfUVVBTlRJWkFUSU9OX1NURVBfU0laRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTU1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfTUFYX1dBVkVMRVRfVFJBTlNGT1JNX0xFVkVMIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5NTY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9RVUFMSVRZIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5NTc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQVJSQVlfU0laRV9NSVNNQVRDSCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTU4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1dJTkRPV19JRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTU5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NSRUFURV9XSU5ET1ciO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk2MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTklUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5NzE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9PRkZTRVQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk3MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ESVJFQ1RYX0VOVU1FUkFURV9GSUxURVJTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5NzM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSlBFRzIwMDBfVU5TVVBQT1JURURfTVVMVElQTEVfTEFZRVJTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5NzQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVU5TVVBQT1JURURfSlBFRzIwMDBfQ09MT1JTUEFDRV9NRVRIT0QiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk3NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9BVklfVElNRU9VVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTc2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05VTUJFUl9PRl9QQUxFVFRFX0NPTE9SUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTc3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0FWSV9WRVJTSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5Nzg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9QQVJUSUNMRV9OVU1CRVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk3OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1BBUlRJQ0xFX0lORk8iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk4MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DT01fSU5JVElBTElaRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTgxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOU1VGRklDSUVOVF9CVUZGRVJfU0laRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTgyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfRlJBTUVTX1BFUl9TRUNPTkQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk4MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX05PX1NQQUNFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5ODQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRklMRV9JTlZBTElEX0RBVEFfVFlQRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTg1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0ZJTEVfT1BFUkFUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5ODY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRklMRV9GT1JNQVQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk4NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX0VPRiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTg4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0ZJTEVfV1JJVEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk4OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX1JFQUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk5MDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX0dFVF9JTkZPIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5OTE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRklMRV9JTlZBTElEX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk5MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX1BFUk1JU1NJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk5MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX0lPX0VSUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTk0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0ZJTEVfVE9PX01BTllfT1BFTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk1OTk1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0ZJTEVfTk9UX0ZPVU5EIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5OTY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRklMRV9PUEVOIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5OTc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRklMRV9BUkdFUlIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NTk5ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX0NPTE9SX1RBQkxFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTU5OTk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRklMRV9GSUxFX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAwMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9GSUxFX0ZJTEVfSEVBREVSIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMDE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVE9PX01BTllfQVZJX1NFU1NJT05TIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMDI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9MSU5FR0FVR0VNRVRIT0QiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAwMzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9BVklfREFUQV9FWENFRURTX0JVRkZFUl9TSVpFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMDQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRElSRUNUWF9DRVJUSUZJQ0FUSU9OX0ZBSUxVUkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAwNToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0FWSV9TRVNTSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMDY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRElSRUNUWF9VTktOT1dOX0NPTVBSRVNTSU9OX0ZJTFRFUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDA3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RJUkVDVFhfSU5DT01QQVRJQkxFX0NPTVBSRVNTSU9OX0ZJTFRFUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDA4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RJUkVDVFhfTk9fRklMVEVSIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMDk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRElSRUNUWCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDEwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfRlJBTUVfTlVNQkVSIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMTE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUlBDX0JJTkQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAxMjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9SUENfRVhFQ1VURSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDEzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfVklERU9fTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDE0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfVklERU9fQkxJVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDE1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1JQQ19FWEVDVVRFX0lWQiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDE2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05PX1ZJREVPX0RSSVZFUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDE3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX09QRU5JTkdfTkVXRVJfQUlNX0dSQURJTkdfREFUQSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDE4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfRURHRV9QT0xBUklUWV9TRUFSQ0hfTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDE5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfVEhSRVNIT0xEX1BFUkNFTlRBR0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAyMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0dSQURJTkdfTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDIxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfS0VSTkVMX1NJWkVfRk9SX0VER0VfREVURUNUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMjI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TRUFSQ0hfTU9ERV9GT1JfU1RSQUlHSFRfRURHRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDIzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQU5HTEVfVE9MX0ZPUl9TVFJBSUdIVF9FREdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMjQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NSU5fQ09WRVJBR0VfRk9SX1NUUkFJR0hUX0VER0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAyNToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0FOR0xFX1JBTkdFX0ZPUl9TVFJBSUdIVF9FREdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMjY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9QUk9DRVNTX1RZUEVfRk9SX0VER0VfREVURUNUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMzI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVERVNDUklQVE9SX1JPVEFUSU9OX1NFQVJDSFNUUkFURUdZIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMzM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVERVNDUklQVE9SX0xFQVJOU0VUVVBEQVRBIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwMzQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVEVNUExBVEVJTUFHRV9FREdFSU5GTyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDM1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RFTVBMQVRFSU1BR0VfTk9DSVJDTEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAzNjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NLRUxFVE9OTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDM3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RJTUVPVVQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjAzODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9GSU5EX0NPT1JEU1lTX01PUkVfVEhBTl9PTkVfRURHRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDM5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lPX0VSUk9SIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNDA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRFJJVkVSIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNDE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF8yRF9CQVJDT0RFX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA0MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEXzJEX0JBUkNPREVfQ09OVFJBU1QiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA0MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEXzJEX0JBUkNPREVfQ0VMTF9TSEFQRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDQ0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfMkRfQkFSQ09ERV9TSEFQRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDQ1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfMkRfQkFSQ09ERV9TVUJUWVBFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNDY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF8yRF9CQVJDT0RFX0NPTlRSQVNUX0ZPUl9ST0kiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA0NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0xJTkVBUl9BVkVSQUdFX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA0ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NFTExfU0FNUExFX1NJWkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA0OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01BVFJJWF9QT0xBUklUWSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDUwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfRUNDX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA1MToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NFTExfRklMVEVSX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA1MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0RFTU9EVUxBVElPTl9NT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNTM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9CT1JERVJfSU5URUdSSVRZIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNTQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DRUxMX0ZJTExfVFlQRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDU1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQVNQRUNUX1JBVElPIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNTY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9NQVRSSVhfTUlSUk9SX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA1NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NFQVJDSF9WRUNUT1JfV0lEVEgiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA1ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1JPVEFUSU9OX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA1OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01BWF9JVEVSQVRJT05TIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNjA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSlBFRzIwMDBfTE9TU0xFU1NfV0lUSF9GTE9BVElOR19QT0lOVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDYxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfV0lORE9XX1NJWkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA2MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1RPTEVSQU5DRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDYzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0VYVEVSTkFMX0FMSUdOTUVOVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDY0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0VYVEVSTkFMX05PVF9TVVBQT1JURUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA2NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQU5UX1JFU0laRV9FWFRFUk5BTCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDY2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfUE9JTlRTWU1CT0wiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA2NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTUFHRVNfTk9UX0RJRkYiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA2ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0FDVElPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDY5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfQ09MT1JfTU9ERSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDcwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfRlVOQ1RJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA3MToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1NDQU5fRElSRUNUSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNzI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9CT1JERVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA3MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9NQVNLX09VVFNJREVfSU1BR0UiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA3NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTkNPTVBfU0laRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDc1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPT1JEX1NZU19TRUNPTkRfQVhJUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDc2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPT1JEX1NZU19GSVJTVF9BWElTIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwNzc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5DT01QX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA3OToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX01FVEFGSUxFX0hBTkRMRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDgwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lOVkFMSURfSU1BR0VfVFlQRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDgxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBRF9QQVNTV09SRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDgyOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1BBTEVUVEVfTk9UX1NVUFBPUlRFRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDgzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1JPTExCQUNLX1RJTUVPVVQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA4NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ST0xMQkFDS19ERUxFVEVfVElNRVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA4NToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ST0xMQkFDS19JTklUX1RJTUVSIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwODY6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9MTEJBQ0tfU1RBUlRfVElNRVIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA4NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ST0xMQkFDS19TVE9QX1RJTUVSIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwODg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9MTEJBQ0tfUkVTSVpFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwODk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9MTEJBQ0tfUkVTT1VSQ0VfUkVJTklUSUFMSVpFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwOTA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9MTEJBQ0tfUkVTT1VSQ0VfRU5BQkxFRCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDkxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1JPTExCQUNLX1JFU09VUkNFX1VOSU5JVElBTElaRURfRU5BQkxFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwOTI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9MTEJBQ0tfUkVTT1VSQ0VfTk9OX0VNUFRZX0lOSVRJQUxJWkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA5MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ST0xMQkFDS19SRVNPVVJDRV9MT0NLRUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA5NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ST0xMQkFDS19SRVNPVVJDRV9DQU5OT1RfVU5MT0NLIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYwOTU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FMSUJSQVRJT05fRFVQTElDQVRFX1JFRkVSRU5DRV9QT0lOVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDk2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05PVF9BTl9PQkpFQ1QiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjA5NzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX1BBUlRJQ0xFX1BBUkFNRVRFUl9WQUxVRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDk4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1JFU0VSVkVEX01VU1RfQkVfTlVMTCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MDk5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NBTElCUkFUSU9OX0lORk9fU0lNUExFX1RSQU5TRk9STSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTAwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NBTElCUkFUSU9OX0lORk9fUEVSU1BFQ1RJVkVfUFJPSkVDVElPTiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTAxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NBTElCUkFUSU9OX0lORk9fTUlDUk9fUExBTkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEwMjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTkZPXzYiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEwMzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTkZPXzUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEwNDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTkZPXzQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEwNToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTkZPXzMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEwNjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTkZPXzIiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEwNzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTkZPXzEiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEwODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9FUlJPUk1BUCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTA5OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NBTElCUkFUSU9OX0lOVkFMSURfU0NBTElOR19GQUNUT1IiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjExMDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTkZPX1ZFUlNJT04iO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjExMToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9GQUlMRURfVE9fRklORF9HUklEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMTI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5DT01QX01BVFJJWF9TSVpFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMTM6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FMSUJSQVRJT05fSU1BR0VfVU5DQUxJQlJBVEVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMTQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FMSUJSQVRJT05fSU5WQUxJRF9ST0kiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjExNToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTUFHRV9DT1JSRUNURUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjExNjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQUxJQlJBVElPTl9JTlNGX1BPSU5UUyI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTE3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX01BVFJJWF9TSVpFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMTg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9TVEVQX1NJWkUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjExOToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DVVNUT01EQVRBX0lOVkFMSURfS0VZIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMjA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTk9UX0lNQUdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMjE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfU0FUVVJBVElPTl9USFJFU0hPTERfT1VUX09GX1JBTkdFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMjI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfRFJBV1RFWFRfQ09MT1JfTVVTVF9CRV9HUkFZU0NBTEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEyMzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NBTElCUkFUSU9OX01PREUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEyNDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0NBTElCUkFUSU9OX1JPSV9NT0RFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMjU6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfSU5WQUxJRF9DT05UUkFTVF9USFJFU0hPTEQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEyNjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ST0xMQkFDS19SRVNPVVJDRV9DT05GTElDVF8xIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMjc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUk9MTEJBQ0tfUkVTT1VSQ0VfQ09ORkxJQ1RfMiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTI4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1JPTExCQUNLX1JFU09VUkNFX0NPTkZMSUNUXzMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEyOToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ST0xMQkFDS19VTkJPVU5ERURfSU5URVJGQUNFIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMzA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTk9UX1JFQ1RfT1JfUk9UQVRFRF9SRUNUIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxMzI6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTUFTS19OT1RfVEVNUExBVEVfU0laRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTMzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RIUkVBRF9DT1VMRF9OT1RfSU5JVElBTElaRSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTM0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1RIUkVBRF9JTklUSUFMSVpJTkciO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEzNToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9JTlZBTElEX0JVVFRPTl9MQUJFTCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTM2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RJUkVDVFhfSU5WQUxJRF9GSUxURVJfUVVBTElUWSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTM3OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0RJUkVDVFhfRExMX05PVF9GT1VORCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTM4OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1JPTExCQUNLX05PVF9TVVBQT1JURUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjEzOToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9ST0xMQkFDS19SRVNPVVJDRV9PVVRfT0ZfTUVNT1JZIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxNDA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQkFSQ09ERV9DT0RFMTI4X1NFVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTQxOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBUkNPREVfQ09ERTEyOF9GTkMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjE0MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9CQVJDT0RFX0lOVkFMSUQiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjE0MzoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9CQVJDT0RFX1RZUEUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjE0NDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9CQVJDT0RFX0NPREU5M19TSElGVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTQ1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBUkNPREVfVVBDQSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTQ2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBUkNPREVfTVNJIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxNDc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQkFSQ09ERV9JMjUiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjE0ODoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9CQVJDT0RFX0VBTjEzIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxNDk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQkFSQ09ERV9FQU44IjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxNTA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQkFSQ09ERV9DT0RFMTI4IjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxNTE6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQkFSQ09ERV9DT0RFOTMiO2JyZWFrO30KKwkJY2FzZSAtMTA3NDM5NjE1MjoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9CQVJDT0RFX0NPREUzOSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTUzOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0JBUkNPREVfQ09EQUJBUiI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTU0OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0lNQUdFX1RPT19TTUFMTCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTU1OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1VOSU5JVCI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTU2OgorCQkJeyBlcnJvclRleHQgPSAiRVJSX05FRURfRlVMTF9WRVJTSU9OIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxNTc6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVU5SRUdJU1RFUkVEIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxNTg6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfTUVNT1JZX0VSUk9SIjticmVhazt9CisJCWNhc2UgLTEwNzQzOTYxNTk6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfT1VUX09GX01FTU9SWSI7YnJlYWs7fQorCQljYXNlIC0xMDc0Mzk2MTYwOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX1NZU1RFTV9FUlJPUiI7YnJlYWs7fQorCQljYXNlIDA6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfU1VDQ0VTUyI7YnJlYWs7fQorCQkvLyBlbmQgTmF0aW9uYWwgSW5zdHJ1bWVudHMgZGVmaW5lZCBlcnJvcnMKKwkJCQorCQkvLyBiZWdpbiBCQUUgZGVmaW5lZCBlcnJvcnMKKwkJY2FzZSBFUlJfVklTSU9OX0dFTkVSQUxfRVJST1I6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfVklTSU9OX0dFTkVSQUxfRVJST1IiO2JyZWFrO30KKwkJY2FzZSBFUlJfQ09MT1JfTk9UX0ZPVU5EOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NPTE9SX05PVF9GT1VORCI7YnJlYWs7fQorCQljYXNlIEVSUl9QQVJUSUNMRV9UT09fU01BTEw6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfUEFSVElDTEVfVE9PX1NNQUxMIjticmVhazt9CisJCWNhc2UgRVJSX0NBTUVSQV9GQUlMVVJFOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NBTUVSQV9GQUlMVVJFIjticmVhazt9CisJCWNhc2UgRVJSX0NBTUVSQV9TT0NLRVRfQ1JFQVRFX0ZBSUxFRDoKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQU1FUkFfU09DS0VUX0NSRUFURV9GQUlMRUQiO2JyZWFrO30KKwkJY2FzZSBFUlJfQ0FNRVJBX0NPTk5FQ1RfRkFJTEVEOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NBTUVSQV9DT05ORUNUX0ZBSUxFRCI7YnJlYWs7fQorCQljYXNlIEVSUl9DQU1FUkFfU1RBTEVfSU1BR0U6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FNRVJBX1NUQUxFX0lNQUdFIjticmVhazt9CisJCWNhc2UgRVJSX0NBTUVSQV9OT1RfSU5JVElBTElaRUQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FNRVJBX05PVF9JTklUSUFMSVpFRCI7YnJlYWs7fQorCQljYXNlIEVSUl9DQU1FUkFfTk9fQlVGRkVSX0FWQUlMQUJMRToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQU1FUkFfTk9fQlVGRkVSX0FWQUlMQUJMRSI7YnJlYWs7fQorCQljYXNlIEVSUl9DQU1FUkFfSEVBREVSX0VSUk9SOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NBTUVSQV9IRUFERVJfRVJST1IiO2JyZWFrO30KKwkJY2FzZSBFUlJfQ0FNRVJBX0JMT0NLSU5HX1RJTUVPVVQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FNRVJBX0JMT0NLSU5HX1RJTUVPVVQiO2JyZWFrO30KKwkJY2FzZSBFUlJfQ0FNRVJBX0FVVEhPUklaQVRJT05fRkFJTEVEOgorCQkJeyBlcnJvclRleHQgPSAiRVJSX0NBTUVSQV9BVVRIT1JJWkFUSU9OX0ZBSUxFRCI7YnJlYWs7fQorCQljYXNlIEVSUl9DQU1FUkFfVEFTS19TUEFXTl9GQUlMRUQ6CisJCQl7IGVycm9yVGV4dCA9ICJFUlJfQ0FNRVJBX1RBU0tfU1BBV05fRkFJTEVEIjticmVhazt9CisJCWNhc2UgRVJSX0NBTUVSQV9UQVNLX0lOUFVUX09VVF9PRl9SQU5HRToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQU1FUkFfVEFTS19JTlBVVF9PVVRfT0ZfUkFOR0UiO2JyZWFrO30KKwkJY2FzZSBFUlJfQ0FNRVJBX0NPTU1BTkRfRkFJTFVSRToKKwkJCXsgZXJyb3JUZXh0ID0gIkVSUl9DQU1FUkFfQ09NTUFORF9GQUlMVVJFIjticmVhazt9CisJfQorCQorCXJldHVybiBlcnJvclRleHQ7Cit9CisKKworCmRpZmYgLS1naXQgYS9hb3MvZXh0ZXJuYWxzL1dQSUxpYi9XUElMaWIvVmlzaW9uMjAwOS9GcmNFcnJvci5oIGIvYW9zL2V4dGVybmFscy9XUElMaWIvV1BJTGliL1Zpc2lvbjIwMDkvRnJjRXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWEwMzU2Ci0tLSAvZGV2L251bGwKKysrIGIvYW9zL2V4dGVybmFscy9XUElMaWIvV1BJTGliL1Zpc2lvbjIwMDkvRnJjRXJyb3IuaApAQCAtMCwwICsxLDQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIFByb2plY3QgICAJCTogRklSU1QgTW90b3IgQ29udHJvbGxlcgorKiAgRmlsZSBOYW1lICAJCTogRnJjRXJyb3IuaCAgICAgICAgICAKKyogIENvbnRyaWJ1dG9ycyAgIAk6IEpERywgRUxGCisqICBDcmVhdGlvbiBEYXRlIAk6IEF1Z3VzdCAxMiwgMjAwOAorKiAgUmV2aXNpb24gSGlzdG9yeQk6IFNvdXJjZSBjb2RlICYgcmV2aXNpb24gaGlzdG9yeSBtYWludGFpbmVkIGF0IHNvdXJjZWZvcmdlLldQSS5lZHUgICAgICAKKyogIEZpbGUgRGVzY3JpcHRpb24JOiBFcnJvciBoYW5kbGluZyB2YWx1ZXMgZm9yIEMgcm91dGluZXMKKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogICAgICAgIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gICAgICAgICovCisvKiAgIE11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfX0ZSQ0VSUk9SX0hfXworI2RlZmluZSBfX0ZSQ0VSUk9SX0hfXworCisvKiBFcnJvciBDb2RlcyAqLworI2RlZmluZSBFUlJfVklTSU9OX0dFTkVSQUxfRVJST1IJCQkxNjYwMDAJLy8gCisjZGVmaW5lIEVSUl9DT0xPUl9OT1RfRk9VTkQJCQkJCTE2NjEwMAkvLyBUcmFja0FQSS5jcHAKKyNkZWZpbmUgRVJSX1BBUlRJQ0xFX1RPT19TTUFMTAkJCQkxNjYxMDEJLy8gVHJhY2tBUEkuY3BwCisKKyNkZWZpbmUgRVJSX0NBTUVSQV9GQUlMVVJFCQkJCQkxNjYyMDAJLy8gQXhpc0NhbWVyYS5jcHAKKyNkZWZpbmUgRVJSX0NBTUVSQV9TT0NLRVRfQ1JFQVRFX0ZBSUxFRAkJMTY2MjAxCS8vIEF4aXNDYW1lcmEuY3BwCisjZGVmaW5lIEVSUl9DQU1FUkFfQ09OTkVDVF9GQUlMRUQJCQkxNjYyMDIJLy8gQXhpc0NhbWVyYS5jcHAKKyNkZWZpbmUgRVJSX0NBTUVSQV9TVEFMRV9JTUFHRQkJCQkxNjYyMDMJLy8gQXhpc0NhbWVyYS5jcHAKKyNkZWZpbmUgRVJSX0NBTUVSQV9OT1RfSU5JVElBTElaRUQJCQkxNjYyMDQJLy8gQXhpc0NhbWVyYS5jcHAKKyNkZWZpbmUgRVJSX0NBTUVSQV9OT19CVUZGRVJfQVZBSUxBQkxFCQkxNjYyMDUJLy8gQXhpc0NhbWVyYS5jcHAKKyNkZWZpbmUgRVJSX0NBTUVSQV9IRUFERVJfRVJST1IJCQkJMTY2MjA2CS8vIEF4aXNDYW1lcmEuY3BwCisjZGVmaW5lIEVSUl9DQU1FUkFfQkxPQ0tJTkdfVElNRU9VVAkJCTE2NjIwNwkvLyBBeGlzQ2FtZXJhLmNwcAorI2RlZmluZSBFUlJfQ0FNRVJBX0FVVEhPUklaQVRJT05fRkFJTEVECQkxNjYyMDgJLy8gQXhpc0NhbWVyYS5jcHAKKyNkZWZpbmUgRVJSX0NBTUVSQV9UQVNLX1NQQVdOX0ZBSUxFRAkJMTY2MjA5CS8vIEF4aXNDYW1lcmEuY3BwCisjZGVmaW5lIEVSUl9DQU1FUkFfVEFTS19JTlBVVF9PVVRfT0ZfUkFOR0UJMTY2MjEwCS8vIEF4aXNDYW1lcmEuY3BwCisjZGVmaW5lIEVSUl9DQU1FUkFfQ09NTUFORF9GQUlMVVJFCQkJMTY2MjExCS8vIEF4aXNDYW1lcmEuY3BwCisKKy8qIGVycm9yIGhhbmRsaW5nIGZ1bmN0aW9ucyAqLworaW50IEdldExhc3RWaXNpb25FcnJvcigpOworY2hhciogR2V0VmlzaW9uRXJyb3JUZXh0KGludCBlcnJvckNvZGUpOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYW9zL2V4dGVybmFscy9XUElMaWIvV1BJTGliL1Zpc2lvbjIwMDkvVHJhY2tBUEkuY3BwIGIvYW9zL2V4dGVybmFscy9XUElMaWIvV1BJTGliL1Zpc2lvbjIwMDkvVHJhY2tBUEkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYzU5NGEKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL1dQSUxpYi9XUElMaWIvVmlzaW9uMjAwOS9UcmFja0FQSS5jcHAKQEAgLTAsMCArMSw0ODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgUHJvamVjdCAgIAkJOiBGSVJTVCBNb3RvciBDb250cm9sbGVyCisqICBGaWxlIE5hbWUgIAkJOiBUcmFja0FQSS5jcHAgICAgICAgIAorKiAgQ29udHJpYnV0b3JzICAgCTogRUxGLCBEV0QKKyogIENyZWF0aW9uIERhdGUgCTogQXVndXN0IDEwLCAyMDA4CisqICBSZXZpc2lvbiBIaXN0b3J5CTogU291cmNlIGNvZGUgJiByZXZpc2lvbiBoaXN0b3J5IG1haW50YWluZWQgYXQgc291cmNlZm9yZ2UuV1BJLmVkdSAgIAorKiAgRmlsZSBEZXNjcmlwdGlvbgk6IFRyYWNraW5nIFJvdXRpbmVzIGZvciBGSVJTVCBWaXNpb24gQVBJCisqLyAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAgICAgICAgQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAqLworLyogIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgKi8KKy8qICBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAic3RyaW5nLmgiCisjaW5jbHVkZSAidnhXb3Jrcy5oIiAKKworI2luY2x1ZGUgIkF4aXNDYW1lcmEuaCIgCisjaW5jbHVkZSAiRnJjRXJyb3IuaCIKKyNpbmNsdWRlICJUcmFja0FQSS5oIiAKKyNpbmNsdWRlICJWaXNpb25BUEkuaCIgCisKK2ludCBUcmFja0FQSV9kZWJ1Z0ZsYWcgPSAwOworI2RlZmluZSBEUFJJTlRGIGlmKFRyYWNrQVBJX2RlYnVnRmxhZylkcHJpbnRmCisKKy8qKgorKiBAYnJpZWYgRmluZCB0aGUgbGFyZ2VzdCBwYXJ0aWNsZSB0aGF0IG1lZXRzIGEgY3JpdGVyaWEgCisqIEBwYXJhbSBiaW5hcnlJbWFnZSBJbWFnZSB0byBpbnNwZWN0CisqIEBwYXJhbSByZWN0IGFyZWEgdG8gc2VhcmNoCisqIEByZXR1cm4gMCA9IGVycm9yCisqLworYm9vbCBJbkFyZWEoSW1hZ2UqIGJpbmFyeUltYWdlLCBpbnQgcGFydGljbGVJbmRleCwgUmVjdCByZWN0KQoreyAKKwlkb3VibGUgcG9zaXRpb247CisJCisJaW1hcU1lYXN1cmVQYXJ0aWNsZShiaW5hcnlJbWFnZSwgcGFydGljbGVJbmRleCwgMCwgCisJCQlJTUFRX01UX0JPVU5ESU5HX1JFQ1RfTEVGVCwgJnBvc2l0aW9uKTsKKwlpZiAoIHBvc2l0aW9uIDwgKHJlY3QubGVmdCAgICAgICAgICAgICApICkgcmV0dXJuIGZhbHNlOyAvLyBvdXRzaWRlIGxlZnQgb2YgcmVjdGFuZ2xlPworCQorCWltYXFNZWFzdXJlUGFydGljbGUoYmluYXJ5SW1hZ2UsIHBhcnRpY2xlSW5kZXgsIDAsIAorCQkJSU1BUV9NVF9CT1VORElOR19SRUNUX1RPUCwgJnBvc2l0aW9uKTsKKwlpZiAoIHBvc2l0aW9uIDwgKHJlY3QudG9wICAgICAgICAgICAgICApICkgcmV0dXJuIGZhbHNlOyAvLyBvdXRzaWRlIHRvcCBvZiByZWN0YW5nbGUgPworCisJaW1hcU1lYXN1cmVQYXJ0aWNsZShiaW5hcnlJbWFnZSwgcGFydGljbGVJbmRleCwgMCwgCisJCQlJTUFRX01UX0JPVU5ESU5HX1JFQ1RfUklHSFQsICZwb3NpdGlvbik7CisJaWYgKHBvc2l0aW9uID4gKHJlY3QubGVmdCArIHJlY3Qud2lkdGgpICkgcmV0dXJuIGZhbHNlOwkvLyBvdXRzaWRlIHJpZ2h0IG9mIHJlY3RhbmdsZSA/CisJCisJaW1hcU1lYXN1cmVQYXJ0aWNsZShiaW5hcnlJbWFnZSwgcGFydGljbGVJbmRleCwgMCwgCisJCQlJTUFRX01UX0JPVU5ESU5HX1JFQ1RfQk9UVE9NLCAmcG9zaXRpb24pOworCWlmIChwb3NpdGlvbiA+IChyZWN0LnRvcCArIHJlY3QuaGVpZ2h0KSApIHJldHVybiBmYWxzZTsgLy8gb3V0c2lkZSBib3R0b20gb2YgcmVjdGFuZ2xlID8JCisKKwlEUFJJTlRGKExPR19JTkZPLCAicGFydGljbGUgJWkgaXMgaW4gKCVpICVpKSBoZWlnaHQgJWkgd2lkdGggJWlcbiIsIAorCQkJcGFydGljbGVJbmRleCwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5oZWlnaHQsIHJlY3Qud2lkdGgpOworCXJldHVybiB0cnVlOyAKK30KKworLyoqCisqIEBicmllZiBGaW5kIHRoZSBsYXJnZXN0IHBhcnRpY2xlIHRoYXQgbWVldHMgYSBjcml0ZXJpYSAKKyogQHBhcmFtIGJpbmFyeUltYWdlIEltYWdlIHRvIGluc3BlY3QKKyogQHBhcmFtIGxhcmdlc3RQYXJ0aWNsZUluZGV4IEluZGV4IG9mIHRoZSBsYXJnZXN0IHBhcnRpY2xlIAorKiBAcGFyYW0gcmVjdCBhcmVhIHRvIHNlYXJjaAorKiBAcmV0dXJuIDAgPSBlcnJvcgorKi8KK2ludCBHZXRMYXJnZXN0UGFydGljbGUoSW1hZ2UqIGJpbmFyeUltYWdlLCBpbnQqIGxhcmdlc3RQYXJ0aWNsZUluZGV4KQoreyByZXR1cm4gR2V0TGFyZ2VzdFBhcnRpY2xlKGJpbmFyeUltYWdlLCBsYXJnZXN0UGFydGljbGVJbmRleCwgSU1BUV9OT19SRUNUKTsgfQorCitpbnQgR2V0TGFyZ2VzdFBhcnRpY2xlKEltYWdlKiBiaW5hcnlJbWFnZSwgaW50KiBsYXJnZXN0UGFydGljbGVJbmRleCwgUmVjdCByZWN0KQoreworCSpsYXJnZXN0UGFydGljbGVJbmRleCA9IDA7IC8vIHBvaW50cyB0byBjYWxsZXItcHJvdmlkZWQgdmFyaWFibGUKKwkKKwkvKiBkZXRlcm1pbmUgbnVtYmVyIG9mIHBhcnRpY2xlcyBpbiB0aHJlc2hvbGRlZCBpbWFnZSAqLwkKKwlpbnQgbnVtUGFydGljbGVzOworCWludCBzdWNjZXNzID0gZnJjQ291bnRQYXJ0aWNsZXMoYmluYXJ5SW1hZ2UsICZudW1QYXJ0aWNsZXMpOworCWlmICggIXN1Y2Nlc3MgKQl7ICByZXR1cm4gc3VjY2VzczsgCX0JCQkKKwkKKwkvKiBpZiBubyBwYXJ0aWNsZXMgZm91bmQgd2UgY2FuIHF1aXQgaGVyZSAqLworCWlmIChudW1QYXJ0aWNsZXMgPT0gMCkgIHsgIHJldHVybiAwOyAJfSAgLy8gdW5zdWNjZXNzZnVsIGlmIHplcm8gcGFydGljbGVzIGZvdW5kCisJCisJLy8gZmluZCB0aGUgbGFyZ2VzdCBwYXJ0aWNsZQorCWRvdWJsZSBsYXJnZXN0UGFydGljbGVBcmVhID0gMDsKKwlkb3VibGUgcGFydGljbGVBcmVhOworCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtUGFydGljbGVzOyArK2kpIHsJCQorCQlzdWNjZXNzID0gaW1hcU1lYXN1cmVQYXJ0aWNsZShiaW5hcnlJbWFnZSwgaSwgMCwgSU1BUV9NVF9BUkVBLCAmcGFydGljbGVBcmVhKTsKKwkJaWYgKCAhc3VjY2VzcyApCXsgcmV0dXJuIHN1Y2Nlc3M7IH0JCQorCQlpZiAocGFydGljbGVBcmVhID4gbGFyZ2VzdFBhcnRpY2xlQXJlYSkgCXsKKwkJCS8vIHNlZSBpZiBpcyBpbiB0aGUgcmlnaHQgYXJlYQorCQkJaWYgKCBJbkFyZWEoYmluYXJ5SW1hZ2UsIGksIHJlY3QpICkgeworCQkJCWxhcmdlc3RQYXJ0aWNsZUFyZWEgPSBwYXJ0aWNsZUFyZWE7CisJCQkJKmxhcmdlc3RQYXJ0aWNsZUluZGV4ID0gaTsgIC8vIHJldHVybiBpbmRleCB0byBjYWxsZXIKKwkJCX0KKwkJfQorCX0KKwkKKwlyZXR1cm4gc3VjY2VzczsKK30KKworLyoqCisqIEBicmllZiBTZWFyY2ggZm9yIGEgY29sb3IuIFN1cHBvcnRzIElNQVFfSU1BR0VfSFNMLiAKKyogQHBhcmFtIGNvbG9yIERlZmluaXRpb24gZm9yIHRoZSBodWUgcmFuZ2UgCisqIEBwYXJhbSB0cmFja1JlcG9ydCBWYWx1ZXMgZm9yIHRyYWNraW5nOiBjZW50ZXIgb2YgcGFydGljbGUsIHBhcnRpY2xlIHNpemUsIGNvbG9yCisqIEByZXR1cm4gMCA9IGVycm9yCisqLworaW50IEZpbmRDb2xvcihGcmNIdWUgY29sb3IsIFBhcnRpY2xlQW5hbHlzaXNSZXBvcnQqIHRyYWNrUmVwb3J0KQoreworCWludCBzdWNjZXNzID0gMDsJCS8vIHJldHVybjogMCA9IGVycm9yCisJCisJLyogdHJhY2sgY29sb3IgKi8KKwkvLyB1c2UgQUNUSVZFX0xJR0hUIG9yIFdISVRFX0xJR0hUIGZvciBicmlnaHRseSBsaXQgb2JqZWN0cworCVRyYWNraW5nVGhyZXNob2xkIHRkID0gR2V0VHJhY2tpbmdEYXRhKGNvbG9yLCBQQVNTSVZFX0xJR0hUKTsKKworCXN1Y2Nlc3MgPSBGaW5kQ29sb3IoSU1BUV9IU0wsICZ0ZC5odWUsICZ0ZC5zYXR1cmF0aW9uLCAmdGQubHVtaW5hbmNlLCB0cmFja1JlcG9ydCk7IAorCWlmICggIXN1Y2Nlc3MgKQl7IAorCQlEUFJJTlRGIChMT0dfSU5GTywgImRpZCBub3QgZmluZCBjb2xvciAtIGVycm9yQ29kZT0gJWkiLEdldExhc3RWaXNpb25FcnJvcigpKTsJCisJCXJldHVybiBzdWNjZXNzOworCX0KKworCS8vUHJpbnRSZXBvcnQocGFyKTsKKwkKKwkvKiBzZXQgYW4gaW1hZ2UgcXVhbGl0eSByZXN0cmljdGlvbiAqLworCWlmICh0cmFja1JlcG9ydC0+cGFydGljbGVUb0ltYWdlUGVyY2VudCA8IFBBUlRJQ0xFX1RPX0lNQUdFX1BFUkNFTlQpIHsKKwkJaW1hcVNldEVycm9yKEVSUl9QQVJUSUNMRV9UT09fU01BTEwsIF9fRlVOQ1RJT05fXyk7CisJCXN1Y2Nlc3MgPSAwOworCX0JCisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKy8qKgorKiBAYnJpZWYgU2VhcmNoIGZvciBhIGNvbG9yLiBTdXBwb3J0cyBJTUFRX0lNQUdFX0hTTC4gCisqIEBwYXJhbSBodWVSYW5nZSBUaGUgcmFuZ2UgZm9yIHRoZSBmaXJzdCBwbGFuZQorKiBAcGFyYW0gdHJhY2tSZXBvcnQgVmFsdWVzIGZvciB0cmFja2luZzogY2VudGVyIG9mIHBhcnRpY2xlLCBwYXJ0aWNsZSBzaXplLCBjb2xvcgorKiBAcmV0dXJuIDAgPSBlcnJvcgorKi8KK2ludCBGaW5kQ29sb3IoY29uc3QgUmFuZ2UqIGh1ZVJhbmdlLCBQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0ICp0cmFja1JlcG9ydCkKK3sgcmV0dXJuIEZpbmRDb2xvcihodWVSYW5nZSwgREVGQVVMVF9TQVRVUkFUSU9OX1RIUkVTSE9MRCwgdHJhY2tSZXBvcnQpOyB9CisKKy8qKgorKiBAYnJpZWYgU2VhcmNoIGZvciBhIGNvbG9yLiBTdXBwb3J0cyBJTUFRX0lNQUdFX0hTTC4gCisqIEBwYXJhbSBodWVSYW5nZSBUaGUgcmFuZ2UgZm9yIHRoZSBmaXJzdCBwbGFuZQorKiBAcGFyYW0gbWluU2F0dXJhdGlvbiBUaGUgbG93ZXIgcmFuZ2Ugc2F0dXJhdGlvbgorKiBAcGFyYW0gdHJhY2tSZXBvcnQgVmFsdWVzIGZvciB0cmFja2luZzogY2VudGVyIG9mIHBhcnRpY2xlLCBwYXJ0aWNsZSBzaXplLCBjb2xvcgorKiBAcmV0dXJuIDAgPSBlcnJvcgorKi8KK2ludCBGaW5kQ29sb3IoY29uc3QgUmFuZ2UqIGh1ZVJhbmdlLCBpbnQgbWluU2F0dXJhdGlvbiwgUGFydGljbGVBbmFseXNpc1JlcG9ydCAqdHJhY2tSZXBvcnQpCit7CisJUmFuZ2Ugc2F0UmFuZ2U7CisJc2F0UmFuZ2UubWluVmFsdWUgPSBtaW5TYXR1cmF0aW9uOworCXNhdFJhbmdlLm1heFZhbHVlID0gMjU1OworCVJhbmdlIGx1bVJhbmdlOworCWx1bVJhbmdlLm1pblZhbHVlID0gMDsKKwlsdW1SYW5nZS5tYXhWYWx1ZSA9IDI1NTsKKwlDb2xvck1vZGUgY21vZGUgPSBJTUFRX0hTTDsKKwlyZXR1cm4gRmluZENvbG9yKGNtb2RlLCBodWVSYW5nZSwgJnNhdFJhbmdlLCAmbHVtUmFuZ2UsIHRyYWNrUmVwb3J0KTsKK30KKworLyoqCisqIEBicmllZiBTZWFyY2ggZm9yIGEgY29sb3IuIFN1cHBvcnRzIElNQVFfSU1BR0VfSFNMIGFuZCBJTUFRX0lNQUdFX1JHQi4gCisqIEBwYXJhbSBtb2RlIENvbG9yIG1vZGUsIGVpdGhlciBJTUFRX0hTTCBvciBJTUFRX1JHQgorKiBAcGFyYW0gcGxhbmUxUmFuZ2UgVGhlIHJhbmdlIGZvciB0aGUgZmlyc3QgcGxhbmUgKGh1ZSBvciByZWQpCisqIEBwYXJhbSBwbGFuZTJSYW5nZSBUaGUgcmFuZ2UgZm9yIHRoZSBzZWNvbmQgcGxhbmUgKHNhdHVyYXRpb24gb3IgZ3JlZW4pCisqIEBwYXJhbSBwbGFuZTNSYW5nZSBUaGUgcmFuZ2UgZm9yIHRoZSB0aGlyZCBwbGFuZSAobHVtaW5hbmNlIG9yIGJsdWUpCisqIEBwYXJhbSB0cmFja1JlcG9ydCBWYWx1ZXMgZm9yIHRyYWNraW5nOiBjZW50ZXIgb2YgcGFydGljbGUsIHBhcnRpY2xlIHNpemUsIGV0YworKiBAcmV0dXJuIDAgPSBlcnJvcgorKi8KK2ludCBGaW5kQ29sb3IoQ29sb3JNb2RlIG1vZGUsIGNvbnN0IFJhbmdlKiBwbGFuZTFSYW5nZSwgY29uc3QgUmFuZ2UqIHBsYW5lMlJhbmdlLCAKKwkJY29uc3QgUmFuZ2UqIHBsYW5lM1JhbmdlLCBQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0ICp0cmFja1JlcG9ydCkKK3sKKwlyZXR1cm4gRmluZENvbG9yKG1vZGUsIHBsYW5lMVJhbmdlLCBwbGFuZTJSYW5nZSwgcGxhbmUzUmFuZ2UsIHRyYWNrUmVwb3J0LCBOVUxMKTsKK30KKworLyoqCisqIEBicmllZiBTZWFyY2ggZm9yIGEgY29sb3IuIFN1cHBvcnRzIElNQVFfSU1BR0VfSFNMIGFuZCBJTUFRX0lNQUdFX1JHQi4gCisqIEBwYXJhbSBtb2RlIENvbG9yIG1vZGUsIGVpdGhlciBJTUFRX0hTTCBvciBJTUFRX1JHQgorKiBAcGFyYW0gcGxhbmUxUmFuZ2UgVGhlIHJhbmdlIGZvciB0aGUgZmlyc3QgcGxhbmUgKGh1ZSBvciByZWQpCisqIEBwYXJhbSBwbGFuZTJSYW5nZSBUaGUgcmFuZ2UgZm9yIHRoZSBzZWNvbmQgcGxhbmUgKHNhdHVyYXRpb24gb3IgZ3JlZW4pCisqIEBwYXJhbSBwbGFuZTNSYW5nZSBUaGUgcmFuZ2UgZm9yIHRoZSB0aGlyZCBwbGFuZSAobHVtaW5hbmNlIG9yIGJsdWUpCisqIEBwYXJhbSB0cmFja1JlcG9ydCBWYWx1ZXMgZm9yIHRyYWNraW5nOiBjZW50ZXIgb2YgcGFydGljbGUsIHBhcnRpY2xlIHNpemUsIGV0YworKiBAcGFyYW0gY29sb3JSZXBvcnQgQ29sb3IgY2hhcmFjdGFyaXN0aWNzIG9mIHRoZSBwYXJ0aWNsZQorKiBAcmV0dXJuIDAgPSBlcnJvcgorKi8KK2ludCBGaW5kQ29sb3IoQ29sb3JNb2RlIG1vZGUsIGNvbnN0IFJhbmdlKiBwbGFuZTFSYW5nZSwgY29uc3QgUmFuZ2UqIHBsYW5lMlJhbmdlLCAKKwkJY29uc3QgUmFuZ2UqIHBsYW5lM1JhbmdlLCBQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0ICp0cmFja1JlcG9ydCwgCisJCUNvbG9yUmVwb3J0ICpjb2xvclJlcG9ydCkKK3sKKwlyZXR1cm4gRmluZENvbG9yKG1vZGUsIHBsYW5lMVJhbmdlLCBwbGFuZTJSYW5nZSwgcGxhbmUzUmFuZ2UsIHRyYWNrUmVwb3J0LCAKKwkJCU5VTEwsIElNQVFfTk9fUkVDVCk7Cit9CisKKy8qKgorKiBAYnJpZWYgU2VhcmNoIGZvciBhIGNvbG9yLiBTdXBwb3J0cyBJTUFRX0lNQUdFX0hTTCBhbmQgSU1BUV9JTUFHRV9SR0IuIAorKiBAcGFyYW0gbW9kZSBDb2xvciBtb2RlLCBlaXRoZXIgSU1BUV9IU0wgb3IgSU1BUV9SR0IKKyogQHBhcmFtIHBsYW5lMVJhbmdlIFRoZSByYW5nZSBmb3IgdGhlIGZpcnN0IHBsYW5lIChodWUgb3IgcmVkKQorKiBAcGFyYW0gcGxhbmUyUmFuZ2UgVGhlIHJhbmdlIGZvciB0aGUgc2Vjb25kIHBsYW5lIChzYXR1cmF0aW9uIG9yIGdyZWVuKQorKiBAcGFyYW0gcGxhbmUzUmFuZ2UgVGhlIHJhbmdlIGZvciB0aGUgdGhpcmQgcGxhbmUgKGx1bWluYW5jZSBvciBibHVlKQorKiBAcGFyYW0gdHJhY2tSZXBvcnQgVmFsdWVzIGZvciB0cmFja2luZzogY2VudGVyIG9mIHBhcnRpY2xlLCBwYXJ0aWNsZSBzaXplLCBldGMKKyogQHBhcmFtIGNvbG9yUmVwb3J0IENvbG9yIGNoYXJhY3RhcmlzdGljcyBvZiB0aGUgcGFydGljbGUKKyogQHBhcmFtIHJlY3QgUmVjdGFuZ2xlIHRvIGNvbmZpbmUgc2VhcmNoIHRvCisqIEByZXR1cm4gMCA9IGVycm9yCisqLworaW50IEZpbmRDb2xvcihDb2xvck1vZGUgbW9kZSwgY29uc3QgUmFuZ2UqIHBsYW5lMVJhbmdlLCBjb25zdCBSYW5nZSogcGxhbmUyUmFuZ2UsIAorCQljb25zdCBSYW5nZSogcGxhbmUzUmFuZ2UsIFBhcnRpY2xlQW5hbHlzaXNSZXBvcnQgKnRyYWNrUmVwb3J0LCAKKwkJQ29sb3JSZXBvcnQgKmNvbG9yUmVwb3J0LCBSZWN0IHJlY3QpCit7CisJaW50IGVycm9yQ29kZSA9IDA7CisJaW50IHN1Y2Nlc3MgPSAwOworCQorCS8qIGNyZWF0ZSBhbiBpbWFnZSBvYmplY3QgKi8KKwlJbWFnZSogY2FtZXJhSW1hZ2UgPSBmcmNDcmVhdGVJbWFnZShJTUFRX0lNQUdFX0hTTCk7CisJaWYgKCFjYW1lcmFJbWFnZSkgIHsgcmV0dXJuIHN1Y2Nlc3M7IH0KKwkKKwkvKiBnZXQgaW1hZ2UgZnJvbSBjYW1lcmEgLSBpZiB0aGUgY2FtZXJhIGhhcyBub3QgZmluaXNoZWQgaW5pdGlhbGl6aW5nLAorCSAqIHRoaXMgd2lsbCBmYWlsIAorCSAqLworCWRvdWJsZSBpbWFnZVRpbWU7CisJc3VjY2VzcyA9IEdldEltYWdlKGNhbWVyYUltYWdlLCAmaW1hZ2VUaW1lKTsKKwlpZiAoIXN1Y2Nlc3MpeworCQlEUFJJTlRGKExPR19JTkZPLCAiTm8gY2FtZXJhIEltYWdlIGF2YWlsYWJsZSBFcnJvciA9ICVpICVzIiwgCisJCQkJZXJyb3JDb2RlLCBHZXRWaXNpb25FcnJvclRleHQoZXJyb3JDb2RlKSk7CisJCWZyY0Rpc3Bvc2UoY2FtZXJhSW1hZ2UpOyAKKwkJaW1hcVNldEVycm9yKGVycm9yQ29kZSwgX19GVU5DVElPTl9fKTsJLy9yZXNldCBlcnJvciBjb2RlIGZvciB0aGUgY2FsbGVyCQorCQlyZXR1cm4gc3VjY2VzczsJCQorCX0JCisJCisJLyogc2F2ZSBhIGNvcHkgb2YgdGhlIGltYWdlIHRvIGFub3RoZXIgaW1hZ2UgZm9yIGNvbG9yIHRocmVzaG9sZGluZyBsYXRlciAqLworCUltYWdlKiBoaXN0SW1hZ2UgPSBmcmNDcmVhdGVJbWFnZShJTUFRX0lNQUdFX0hTTCk7CisJaWYgKCFoaXN0SW1hZ2UpICB7IGZyY0Rpc3Bvc2UoY2FtZXJhSW1hZ2UpOyByZXR1cm4gc3VjY2VzczsgfQorCXN1Y2Nlc3MgPSBmcmNDb3B5SW1hZ2UoaGlzdEltYWdlLGNhbWVyYUltYWdlKTsKKwlpZiAoICFzdWNjZXNzICkJeyAKKwkJZXJyb3JDb2RlID0gR2V0TGFzdFZpc2lvbkVycm9yKCk7IAorCQlmcmNEaXNwb3NlKF9fRlVOQ1RJT05fXyxjYW1lcmFJbWFnZSxoaXN0SW1hZ2UsTlVMTCk7IAorCQlyZXR1cm4gc3VjY2VzczsgCisJfQkKKwkKKwkvKiBDb2xvciB0aHJlc2hvbGQgdGhlIGltYWdlICovCisJc3VjY2VzcyA9IGZyY0NvbG9yVGhyZXNob2xkKGNhbWVyYUltYWdlLCBjYW1lcmFJbWFnZSwgbW9kZSwgcGxhbmUxUmFuZ2UsIHBsYW5lMlJhbmdlLCBwbGFuZTNSYW5nZSk7CisJaWYgKCAhc3VjY2VzcyApCXsgCisJCWVycm9yQ29kZSA9IEdldExhc3RWaXNpb25FcnJvcigpOyAKKwkJRFBSSU5URiAoTE9HX0RFQlVHLCAiRXJyb3IgPSAlaSAgJXMgIiwgZXJyb3JDb2RlLCBHZXRWaXNpb25FcnJvclRleHQoZXJyb3JDb2RlKSk7CisJCWZyY0Rpc3Bvc2UoX19GVU5DVElPTl9fLGNhbWVyYUltYWdlLGhpc3RJbWFnZSxOVUxMKTsgCisJCXJldHVybiBzdWNjZXNzOyAKKwl9CQorCisJaW50IGxhcmdlc3RQYXJ0aWNsZUluZGV4ID0gMDsKKwlzdWNjZXNzID0gR2V0TGFyZ2VzdFBhcnRpY2xlKGNhbWVyYUltYWdlLCAmbGFyZ2VzdFBhcnRpY2xlSW5kZXgsIHJlY3QgKTsKKwlpZiAoICFzdWNjZXNzICkJeworCQllcnJvckNvZGUgPSBHZXRMYXN0VmlzaW9uRXJyb3IoKTsgCisJCURQUklOVEYgKExPR19ERUJVRywgIkVycm9yIGFmdGVyIEdldExhcmdlc3RQYXJ0aWNsZSA9ICVpICAlcyAiLCBlcnJvckNvZGUsIEdldFZpc2lvbkVycm9yVGV4dChlcnJvckNvZGUpKTsKKwkJZnJjRGlzcG9zZShfX0ZVTkNUSU9OX18sY2FtZXJhSW1hZ2UsaGlzdEltYWdlLE5VTEwpOyAKKwkJaW1hcVNldEVycm9yKEVSUl9DT0xPUl9OT1RfRk9VTkQsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBzdWNjZXNzOyAKKwl9CisJRFBSSU5URihMT0dfSU5GTywgImxhcmdlc3RQYXJ0aWNsZUluZGV4ID0gJWlcbiIsIGxhcmdlc3RQYXJ0aWNsZUluZGV4KTsKKworCS8qIFBhcnRpY2xlcyB3ZXJlIGZvdW5kICAqLworCQkvKiAKKwkJICogRmlsbCBpbiByZXBvcnQgaW5mb3JtYXRpb24gZm9yIGxhcmdlc3QgcGFydGljbGUgZm91bmQKKwkJICovCisJCXN1Y2Nlc3MgPSBmcmNQYXJ0aWNsZUFuYWx5c2lzKGNhbWVyYUltYWdlLCBsYXJnZXN0UGFydGljbGVJbmRleCwgdHJhY2tSZXBvcnQpOworCQl0cmFja1JlcG9ydC0+aW1hZ2VUaW1lc3RhbXAgPSBpbWFnZVRpbWU7CisJCQorCQkvKiBjbGVhbiB1cCAqLworCQlpZiAoIXN1Y2Nlc3MpIHtmcmNEaXNwb3NlKF9fRlVOQ1RJT05fXyxjYW1lcmFJbWFnZSxoaXN0SW1hZ2UsTlVMTCk7IHJldHVybiBzdWNjZXNzO30KKwkJCisJCS8qIHBhcnRpY2xlIGNvbG9yIHN0YXRpc3RpY3MgKi8KKwkJLyogb25seSBpZiBhIGNvbG9yIHJlcG9ydCByZXF1ZXN0ZWQgKi8KKwkJaWYgKGNvbG9yUmVwb3J0ICE9IE5VTEwpCisJCXsKKwkJCS8qIGZpcnN0IGZpbHRlciBvdXQgdGhlIG90aGVyIHBhcnRpY2xlcyAqLworCQkJUGFydGljbGVGaWx0ZXJDcml0ZXJpYTIgY3JpdGVyaWE7CisJCQlQYXJ0aWNsZUZpbHRlck9wdGlvbnMqIG9wdGlvbnMgPSBOVUxMOworCQkJUmVjdCByZWN0OworCQkJaW50IG51bVBhcnRpY2xlczsKKwkJCXN1Y2Nlc3MgPSBmcmNQYXJ0aWNsZUZpbHRlcihjYW1lcmFJbWFnZSwgY2FtZXJhSW1hZ2UsICZjcml0ZXJpYSwgMSwgb3B0aW9ucywgCisJCQkJCXJlY3QsICZudW1QYXJ0aWNsZXMpOworCQkJaWYgKCAhc3VjY2VzcyApCXsgCisJCQkJRFBSSU5URihMT0dfSU5GTywgImZyY1BhcnRpY2xlRmlsdGVyIGVycm9yQ29kZSAlaSIsIEdldExhc3RWaXNpb25FcnJvcigpKTsgCisJCQl9CQorCQkJCQkKKwkJCS8qIGhpc3RvZ3JhbSB0aGUgb3JpZ2luYWwgaW1hZ2UgdXNpbmcgdGhlIHRocmVzaG9sZGVkIGltYWdlIGFzIGEgbWFzayAqLworCQkJaW50IG51bUNsYXNzZXMgPSAxMDsgLy9ob3cgbWFueSBjbGFzc2VzPworCQkJQ29sb3JIaXN0b2dyYW1SZXBvcnQqIGNocmVwID0gaW1hcUNvbG9ySGlzdG9ncmFtMihoaXN0SW1hZ2UsIG51bUNsYXNzZXMsIElNQVFfSFNMLCAKKwkJCQkJCU5VTEwsIGNhbWVyYUltYWdlKTsKKwkJCWlmIChjaHJlcCA9PSBOVUxMKSB7IAorCQkJCURQUklOVEYoTE9HX0lORk8sICJOVUxMIENvbG9yIEhpc3RvZ3JhbSIpOworCQkJCWVycm9yQ29kZSA9IEdldExhc3RWaXNpb25FcnJvcigpOyAKKwkJCX0gZWxzZSB7CisJCQkJY29sb3JSZXBvcnQtPnBhcnRpY2xlSHVlTWF4ID0gY2hyZXAtPnBsYW5lMS5tYXg7CisJCQkJY29sb3JSZXBvcnQtPnBhcnRpY2xlSHVlTWluID0gY2hyZXAtPnBsYW5lMS5taW47CisJCQkJY29sb3JSZXBvcnQtPnBhcnRpY2xlSHVlTWVhbiA9IGNocmVwLT5wbGFuZTEubWVhbjsKKwkJCQljb2xvclJlcG9ydC0+cGFydGljbGVTYXRNYXggPSBjaHJlcC0+cGxhbmUyLm1heDsKKwkJCQljb2xvclJlcG9ydC0+cGFydGljbGVTYXRNaW4gID0gY2hyZXAtPnBsYW5lMi5taW47CisJCQkJY29sb3JSZXBvcnQtPnBhcnRpY2xlU2F0TWVhbiA9IGNocmVwLT5wbGFuZTIubWVhbjsKKwkJCQljb2xvclJlcG9ydC0+cGFydGljbGVMdW1NYXggPSBjaHJlcC0+cGxhbmUzLm1heDsKKwkJCQljb2xvclJlcG9ydC0+cGFydGljbGVMdW1NaW4gPSBjaHJlcC0+cGxhbmUzLm1pbjsKKwkJCQljb2xvclJlcG9ydC0+cGFydGljbGVMdW1NZWFuID0gY2hyZXAtPnBsYW5lMy5tZWFuOworCQkJCWNvbG9yUmVwb3J0LT5udW1iZXJQYXJ0aWNsZXNGb3VuZCA9IG51bVBhcnRpY2xlczsKKwkJCQlmcmNEaXNwb3NlKGNocmVwKTsgCisJCQl9CisJCX0KKworCS8qIGNsZWFuIHVwICovCisJZnJjRGlzcG9zZShfX0ZVTkNUSU9OX18sY2FtZXJhSW1hZ2UsaGlzdEltYWdlLE5VTEwpOyAKKwkKKwlyZXR1cm4gc3VjY2VzczsJCit9CisKKworLyoqCisgKiAgIERhdGEgZnVuY3Rpb25zIGZvciB0cmFja2luZworICovCisKKworLyoqCisgKiBAYnJpZWYgR2V0IGRlZmF1bHQgSFNMIHRyYWNraW5nIHBhcmFtZXRlcnMKKyAqIE5vdGUgdGhlc2UgcGFyYW1ldGVycyBhcmUgbm90IGZ1bGx5IGNoYXJhY3Rlcml6ZWQgYXQgdGhpcyBwb2ludAorICogR2V0IHRoZXNlIGRlZmF1bHQgdmFsdWVzIGFuZCBtb2RpZnkgdGhlbSBhcyBuZWVkZWQgZm9yIHlvdXIgZW52aXJvbm1lbnQKKyAqIEBwYXJhbSBodWUgdGFza2VkIGNvbG9yCisgKiBAcGFyYW0gbGlnaHQgc2F0dXJhdGlvbi9sdW1pbmFuY2UKKyAqLworVHJhY2tpbmdUaHJlc2hvbGQgR2V0VHJhY2tpbmdEYXRhKEZyY0h1ZSBodWUsIEZyY0xpZ2h0IGxpZ2h0KQoreworCVRyYWNraW5nVGhyZXNob2xkIHRyYWNraW5nRGF0YTsJCisJCisJLy9zZXQgc2F0dXJhdGlvbiAmIGx1bWluYW5jZQkKKwlzd2l0Y2ggKGxpZ2h0KSB7CisJCWRlZmF1bHQ6CisJCWNhc2UgRkxVT1JFU0NFTlQ6CisJCQl0cmFja2luZ0RhdGEuc2F0dXJhdGlvbi5taW5WYWx1ZSA9IDEwMDsKKwkJCXRyYWNraW5nRGF0YS5zYXR1cmF0aW9uLm1heFZhbHVlID0gMjU1OworCQkJdHJhY2tpbmdEYXRhLmx1bWluYW5jZS5taW5WYWx1ZSA9IDQwOworCQkJdHJhY2tpbmdEYXRhLmx1bWluYW5jZS5tYXhWYWx1ZSA9IDI1NTsKKwkJCWlmIChodWUgPT0gR1JFRU4pIHRyYWNraW5nRGF0YS5sdW1pbmFuY2UubWluVmFsdWUgPSAxMDA7CisJCQlpZiAoaHVlID09IFBJTkspIHRyYWNraW5nRGF0YS5zYXR1cmF0aW9uLm1pblZhbHVlID0gODA7CisJCQlpZiAoaHVlID09IFBJTkspIHRyYWNraW5nRGF0YS5sdW1pbmFuY2UubWluVmFsdWUgPSA2MDsKKwkJCWlmIChodWUgPT0gUElOSykgdHJhY2tpbmdEYXRhLmx1bWluYW5jZS5tYXhWYWx1ZSA9IDE1NTsKKwkJCWJyZWFrOworCQljYXNlIFBBU1NJVkVfTElHSFQ6CisJCQl0cmFja2luZ0RhdGEuc2F0dXJhdGlvbi5taW5WYWx1ZSA9IDUwOworCQkJdHJhY2tpbmdEYXRhLnNhdHVyYXRpb24ubWF4VmFsdWUgPSAyNTU7CisJCQl0cmFja2luZ0RhdGEubHVtaW5hbmNlLm1pblZhbHVlID0gMjA7CisJCQl0cmFja2luZ0RhdGEubHVtaW5hbmNlLm1heFZhbHVlID0gMjU1OworCQkJYnJlYWs7CisJCWNhc2UgQlJJR0hUX0xJR0hUOgorCQkJdHJhY2tpbmdEYXRhLnNhdHVyYXRpb24ubWluVmFsdWUgPSAwOworCQkJdHJhY2tpbmdEYXRhLnNhdHVyYXRpb24ubWF4VmFsdWUgPSAxMDA7CisJCQl0cmFja2luZ0RhdGEubHVtaW5hbmNlLm1pblZhbHVlID0gMTAwOworCQkJdHJhY2tpbmdEYXRhLmx1bWluYW5jZS5tYXhWYWx1ZSA9IDI1NTsKKwkJCWJyZWFrOworCQljYXNlIEFDVElWRV9MSUdIVDoKKwkJCXRyYWNraW5nRGF0YS5zYXR1cmF0aW9uLm1pblZhbHVlID0gMDsKKwkJCXRyYWNraW5nRGF0YS5zYXR1cmF0aW9uLm1heFZhbHVlID0gNTA7CisJCQl0cmFja2luZ0RhdGEubHVtaW5hbmNlLm1pblZhbHVlID0gMTUwOworCQkJdHJhY2tpbmdEYXRhLmx1bWluYW5jZS5tYXhWYWx1ZSA9IDI1NTsKKwkJCWJyZWFrOworCQljYXNlIFdISVRFX0xJR0hUOgorCQkJdHJhY2tpbmdEYXRhLnNhdHVyYXRpb24ubWluVmFsdWUgPSAwOworCQkJdHJhY2tpbmdEYXRhLnNhdHVyYXRpb24ubWF4VmFsdWUgPSAyMDsKKwkJCXRyYWNraW5nRGF0YS5sdW1pbmFuY2UubWluVmFsdWUgPSAyMDA7CisJCQl0cmFja2luZ0RhdGEubHVtaW5hbmNlLm1heFZhbHVlID0gMjU1OworCQkJYnJlYWs7CisJfQorCQorCS8vc2V0IGh1ZQorCXN3aXRjaCAoaHVlKXsKKwlkZWZhdWx0OgorCWNhc2UgV0hJVEU6CisJCXN0cmNweSAodHJhY2tpbmdEYXRhLm5hbWUsICJXSElURSIpOworCQl0cmFja2luZ0RhdGEuaHVlLm1pblZhbHVlID0gMDsKKwkJdHJhY2tpbmdEYXRhLmh1ZS5tYXhWYWx1ZSA9IDI1NTsKKwkJYnJlYWs7CisJY2FzZSBPUkFOR0U6CisJCXN0cmNweSAodHJhY2tpbmdEYXRhLm5hbWUsICJPUkFOR0UiKTsKKwkJdHJhY2tpbmdEYXRhLmh1ZS5taW5WYWx1ZSA9IDU7CisJCXRyYWNraW5nRGF0YS5odWUubWF4VmFsdWUgPSAyNTsKKwkJYnJlYWs7CisJY2FzZSBZRUxMT1c6CisJCXN0cmNweSAodHJhY2tpbmdEYXRhLm5hbWUsICJZRUxMT1ciKTsKKwkJdHJhY2tpbmdEYXRhLmh1ZS5taW5WYWx1ZSA9IDMwOworCQl0cmFja2luZ0RhdGEuaHVlLm1heFZhbHVlID0gNTA7CisJCWJyZWFrOworCWNhc2UgR1JFRU46CisJCXN0cmNweSAodHJhY2tpbmdEYXRhLm5hbWUsICJHUkVFTiIpOworCQlpZiAobGlnaHQgPT0gRkxVT1JFU0NFTlQpIHsKKwkJCXRyYWNraW5nRGF0YS5odWUubWluVmFsdWUgPSA2MDsKKwkJCXRyYWNraW5nRGF0YS5odWUubWF4VmFsdWUgPSAxMTA7CisJCX0gZWxzZSB7CisJCQl0cmFja2luZ0RhdGEuaHVlLm1pblZhbHVlID0gOTA7CisJCQl0cmFja2luZ0RhdGEuaHVlLm1heFZhbHVlID0gMTI1OwkJCQorCQl9CisJCWJyZWFrOworCWNhc2UgQkxVRToKKwkJc3RyY3B5ICh0cmFja2luZ0RhdGEubmFtZSwgIkJMVUUiKTsKKwkJdHJhY2tpbmdEYXRhLmh1ZS5taW5WYWx1ZSA9IDE0MDsKKwkJdHJhY2tpbmdEYXRhLmh1ZS5tYXhWYWx1ZSA9IDE3MDsKKwkJYnJlYWs7CisJY2FzZSBQVVJQTEU6CisJCXN0cmNweSAodHJhY2tpbmdEYXRhLm5hbWUsICJQVVJQTEUiKTsKKwkJdHJhY2tpbmdEYXRhLmh1ZS5taW5WYWx1ZSA9IDE4MDsKKwkJdHJhY2tpbmdEYXRhLmh1ZS5tYXhWYWx1ZSA9IDIwMDsKKwkJYnJlYWs7CisJY2FzZSBQSU5LOgorCQlzdHJjcHkgKHRyYWNraW5nRGF0YS5uYW1lLCAiUElOSyIpOworCQl0cmFja2luZ0RhdGEuaHVlLm1pblZhbHVlID0gMjEwOworCQl0cmFja2luZ0RhdGEuaHVlLm1heFZhbHVlID0gMjUwOworCQlicmVhazsKKwljYXNlIFJFRDoKKwkJc3RyY3B5ICh0cmFja2luZ0RhdGEubmFtZSwgIlJFRCIpOworCQl0cmFja2luZ0RhdGEuaHVlLm1pblZhbHVlID0gMjQwOworCQl0cmFja2luZ0RhdGEuaHVlLm1heFZhbHVlID0gMjU1OworCQlicmVhazsKKwl9CisgIHJldHVybih0cmFja2luZ0RhdGEpOworfQorCisKKy8qKgorICogUHJpbnQgcGFydGljbGUgYW5hbHlzaXMgcmVwb3J0CisgKiBAcGFyYW0gbXlSZXBvcnQgUmVwb3J0IHRvIHByaW50CisgKi8KK3ZvaWQgUHJpbnRSZXBvcnQoUGFydGljbGVBbmFseXNpc1JlcG9ydCogbXlSZXBvcnQpCit7CisJZHByaW50ZihMT0dfSU5GTywgInBhcnRpY2xlIGFuYWx5c2lzOlxuICAgICVzJWkgICVzJWlcbiAgICAlcyVsZlxuICAgICVzJWkgICVzJWlcbiAgICAlcyVnICAlcyVnXG4gICAgJXMlZ1xuICAgICVzJWkgICVzJWlcbiAgICAlcyVpICAlcyVpXG4iLAorCQkJImltYWdlSGVpZ2h0ID0gIiwgbXlSZXBvcnQtPmltYWdlSGVpZ2h0LCAKKwkJCSJpbWFnZVdpZHRoID0gIiwgbXlSZXBvcnQtPmltYWdlV2lkdGgsIAorCQkJImltYWdlVGltZXN0YW1wID0gIiwgbXlSZXBvcnQtPmltYWdlVGltZXN0YW1wLCAKKwkJCSJjZW50ZXJfbWFzc194ID0gIiwgbXlSZXBvcnQtPmNlbnRlcl9tYXNzX3gsIAorCQkJImNlbnRlcl9tYXNzX3kgPSAiLCBteVJlcG9ydC0+Y2VudGVyX21hc3NfeSwgCisJCQkiY2VudGVyX21hc3NfeF9ub3JtYWxpemVkID0gIiwgbXlSZXBvcnQtPmNlbnRlcl9tYXNzX3hfbm9ybWFsaXplZCwgCisJCQkiY2VudGVyX21hc3NfeV9ub3JtYWxpemVkID0gIiwgbXlSZXBvcnQtPmNlbnRlcl9tYXNzX3lfbm9ybWFsaXplZCwgCisJCQkicGFydGljbGVBcmVhID0gIiwgbXlSZXBvcnQtPnBhcnRpY2xlQXJlYSwgCisJCQkiYm91bmRpbmdSZWN0YW5nbGVUb3AgPSAiLCBteVJlcG9ydC0+Ym91bmRpbmdSZWN0LnRvcCwgCisJCQkiYm91bmRpbmdSZWN0YW5nbGVMZWZ0ID0gIiwgbXlSZXBvcnQtPmJvdW5kaW5nUmVjdC5sZWZ0LAorCQkJImJvdW5kaW5nUmVjdGFuZ2xlSGVpZ2h0ID0gIiwgbXlSZXBvcnQtPmJvdW5kaW5nUmVjdC5oZWlnaHQsIAorCQkJImJvdW5kaW5nUmVjdGFuZ2xlV2lkdGggPSAiLCBteVJlcG9ydC0+Ym91bmRpbmdSZWN0LndpZHRoKTsKKworCWRwcmludGYoTE9HX0lORk8sICJxdWFsaXR5IHN0YXRpc3RpY3M6ICBcbiAgICAlcyVnICVzJWcgXG4iLAorCQkJInBhcnRpY2xlVG9JbWFnZVBlcmNlbnQgPSAiLCBteVJlcG9ydC0+cGFydGljbGVUb0ltYWdlUGVyY2VudCwgCisJCQkicGFydGljbGVRdWFsaXR5ID0gIiwgbXlSZXBvcnQtPnBhcnRpY2xlUXVhbGl0eSk7Cit9CisKKy8qKgorICogUHJpbnQgY29sb3IgcmVwb3J0CisgKiBAcGFyYW0gbXlSZXBvcnQgUmVwb3J0IHRvIHByaW50CisgKi8KK3ZvaWQgUHJpbnRSZXBvcnQoQ29sb3JSZXBvcnQqIG15UmVwb3J0KQoreworCWRwcmludGYoTE9HX0lORk8sICJwYXJ0aWNsZSByYW5nZXMgZm9yICVpIHBhcnRpY2xlczogICAgICIsCisJCQkibnVtYmVyUGFydGljbGVzRm91bmQgPSAiLCBteVJlcG9ydC0+bnVtYmVyUGFydGljbGVzRm91bmQpOworCTsKKwlkcHJpbnRmKExPR19JTkZPLCAiXG4gICAgJXMlZiAgJXMlZiAgJXMlZlxuICAgICVzJWYgJXMlZiAgJXMlZlxuICAgICVzJWYgICVzJWYgICVzJWZcbiAtLS0tLS0tIiwKKwkJCSJwYXJ0aWNsZUh1ZU1heCA9ICIsIG15UmVwb3J0LT5wYXJ0aWNsZUh1ZU1heCwgCisJCQkicGFydGljbGVIdWVNaW4gPSAiLCBteVJlcG9ydC0+cGFydGljbGVIdWVNaW4sIAorCQkJInBhcnRpY2xlSHVlTWVhbiA9ICIsIG15UmVwb3J0LT5wYXJ0aWNsZUh1ZU1lYW4sCisJCQkicGFydGljbGVTYXRNYXggPSAiLCBteVJlcG9ydC0+cGFydGljbGVTYXRNYXgsIAorCQkJInBhcnRpY2xlU2F0TWluID0gIiwgbXlSZXBvcnQtPnBhcnRpY2xlU2F0TWluLCAKKwkJCSJwYXJ0aWNsZVNhdE1lYW4gPSAiLCBteVJlcG9ydC0+cGFydGljbGVTYXRNZWFuLAorCQkJInBhcnRpY2xlTHVtTWF4ID0gIiwgbXlSZXBvcnQtPnBhcnRpY2xlTHVtTWF4LCAKKwkJCSJwYXJ0aWNsZUx1bU1pbiA9ICIsIG15UmVwb3J0LT5wYXJ0aWNsZUx1bU1pbiwgCisJCQkicGFydGljbGVMdW1NZWFuID0gIiwgbXlSZXBvcnQtPnBhcnRpY2xlTHVtTWVhbik7CisKK30KKworLyoqCisgKiBQcmludCBjb2xvciByZXBvcnQKKyAqIEBwYXJhbSBteVJlcG9ydCBSZXBvcnQgdG8gcHJpbnQKKyAqLwordm9pZCBQcmludFJlcG9ydChUcmFja2luZ1RocmVzaG9sZCogbXlSZXBvcnQpCit7CisJZHByaW50ZihMT0dfSU5GTywgIm5hbWUgb2YgY29sb3I6ICVzIiwgbXlSZXBvcnQtPm5hbWUpOworCisJZHByaW50ZihMT0dfSU5GTywgIlxuICAgICVzJWkgICVzJWlcbiAgICAlcyVpICVzJWlcbiAgICAlcyVpICAlcyVpXG4gLS0tLS0tLSIsCisJCQkiaHVlTWluID0gIiwgbXlSZXBvcnQtPmh1ZS5taW5WYWx1ZSwgCisJCQkiaHVlTWF4ID0gIiwgbXlSZXBvcnQtPmh1ZS5tYXhWYWx1ZSwgCisJCQkic2F0TWluID0gIiwgbXlSZXBvcnQtPnNhdHVyYXRpb24ubWluVmFsdWUsIAorCQkJInNhdE1heCA9ICIsIG15UmVwb3J0LT5zYXR1cmF0aW9uLm1heFZhbHVlLCAKKwkJCSJsdW1NaW4gPSAiLCBteVJlcG9ydC0+bHVtaW5hbmNlLm1pblZhbHVlLCAKKwkJCSJsdW1NYXggPSAiLCBteVJlcG9ydC0+bHVtaW5hbmNlLm1heFZhbHVlICk7CisKK30KKworCisKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvV1BJTGliL1dQSUxpYi9WaXNpb24yMDA5L1RyYWNrQVBJLmggYi9hb3MvZXh0ZXJuYWxzL1dQSUxpYi9XUElMaWIvVmlzaW9uMjAwOS9UcmFja0FQSS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNzJkNjYKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL1dQSUxpYi9XUElMaWIvVmlzaW9uMjAwOS9UcmFja0FQSS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgUHJvamVjdCAgIAkJOiBGSVJTVCBNb3RvciBDb250cm9sbGVyCisqICBGaWxlIE5hbWUgIAkJOiBUcmFja0FQSS5oICAgICAgICAgIAorKiAgQ29udHJpYnV0b3JzICAgCTogRUxGCisqICBDcmVhdGlvbiBEYXRlIAk6IEF1Z3VzdCAxMiwgMjAwOAorKiAgUmV2aXNpb24gSGlzdG9yeQk6IFNvdXJjZSBjb2RlICYgcmV2aXNpb24gaGlzdG9yeSBtYWludGFpbmVkIGF0IHNvdXJjZWZvcmdlLldQSS5lZHUgICAgCisqICBGaWxlIERlc2NyaXB0aW9uCTogR2xvYmFsbHkgZGVmaW5lZCB2YWx1ZXMgZm9yIHRoZSBGSVJTVCBWaXNpb24gQVBJCisqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qICAgICAgICBDb3B5cmlnaHQgKGMpIEZJUlNUIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgT3BlbiBTb3VyY2UgU29mdHdhcmUgLSBtYXkgYmUgbW9kaWZpZWQgYW5kIHNoYXJlZCBieSBGUkMgdGVhbXMuIFRoZSBjb2RlICAqLworLyogIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgdGhlIEZJUlNUIEJTRCBsaWNlbnNlIGZpbGUgaW4gJChXSU5EX0JBU0UpL1dQSUxpYi4gKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgX19UUkFDS0FQSV9IX18KKyNkZWZpbmUgX19UUkFDS0FQSV9IX18KKworI2luY2x1ZGUgIlZpc2lvbkFQSS5oIgorI2luY2x1ZGUgIkJhZVV0aWxpdGllcy5oIgorCisvKiAgQ29uc3RhbnRzICovCisvKiogaW1hZ2UgcXVhbGl0eSByZXF1aXJlbWVudDogcGFydGljbGUgbXVzdCBiZSB0aGlzICUgb2YgcGl4ZWxzIAorICogRm9yIGluc3RhbmNlLCBhIDMyMHgyNDAgaW1hZ2UgaGFzIDc2ODAwIHBpeGVscy4gV2l0aCB0aGlzIAorICogdG9sZXJhbmNlIGF0IC4wMSwgdGhlIGltYWdlIG11c3QgYmUgNzY4IHBpeGVscy4KKyAqIFVzZSBhIHBlcmNlbnRhZ2UgaW5zdGVhZCBvZiBhIGZpeGVkICMgb2YgcGl4ZWxzIHNvIGRpZmZlcmVudAorICogaW1hZ2Ugc2l6ZXMgd2lsbCB3b3JrIHRoZSBzYW1lIHdheSAqLworI2RlZmluZSBQQVJUSUNMRV9UT19JTUFHRV9QRVJDRU5UIDAuMDEKKworLyogIFN0cnVjdHVyZXMgKi8KK3R5cGVkZWYgc3RydWN0IFRyYWNraW5nVGhyZXNob2xkX3N0cnVjdCB7CisJY2hhciBuYW1lWzY0XTsKKwlSYW5nZSBodWU7CisJUmFuZ2Ugc2F0dXJhdGlvbjsKKwlSYW5nZSBsdW1pbmFuY2U7Cit9IFRyYWNraW5nVGhyZXNob2xkOworCQkKKy8qICBFbnVtZXJhdGVkIFR5cGVzICovCisKKy8qKiBQcmVkZWZpbmVkIGh1ZXMgKi8KK3R5cGVkZWYgZW51bSBGcmNIdWVfZW51bSB7IAorCS8vIEJhc2ljIGNvbG9ycworCVJFRCwgR1JFRU4sIEJMVUUsIFlFTExPVywgT1JBTkdFLCBQVVJQTEUsIFdISVRFLCBQSU5LCit9RnJjSHVlOworCisvKiogUHJlZGVmaW5lZCBzYXR1cmF0aW9uIC8gbHVtaW5hbmNlIHNldHRpbmdzICovCit0eXBlZGVmIGVudW0gRnJjTGlnaHRfZW51bSB7IAorCVBBU1NJVkVfTElHSFQsIEJSSUdIVF9MSUdIVCwgQUNUSVZFX0xJR0hULCBXSElURV9MSUdIVCwgRkxVT1JFU0NFTlQKK31GcmNMaWdodDsKKwkKKy8qIGNvbG9yIHRyYWNraW5nIHN1cHBvcnQgZnVuY3Rpb25zICovCitUcmFja2luZ1RocmVzaG9sZCBHZXRUcmFja2luZ0RhdGEoRnJjSHVlIGh1ZSwgRnJjTGlnaHQgbGlnaHQpOworCit2b2lkIFByaW50UmVwb3J0KFBhcnRpY2xlQW5hbHlzaXNSZXBvcnQqIG15UmVwb3J0KTsKK3ZvaWQgUHJpbnRSZXBvcnQoQ29sb3JSZXBvcnQqIG15UmVwb3J0KTsKK3ZvaWQgUHJpbnRSZXBvcnQoVHJhY2tpbmdUaHJlc2hvbGQqIG15UmVwb3J0KTsKKworLyogIFRyYWNraW5nIGZ1bmN0aW9ucyAqLworCisvKiBmaW5kIGEgY29sb3IgaW4gY3VycmVudCBjYW1lcmEgaW1hZ2UgKi8KK2Jvb2wgSW5BcmVhKEltYWdlKiBiaW5hcnlJbWFnZSwgaW50IHBhcnRpY2xlSW5kZXgsIFJlY3QgcmVjdCk7CitpbnQgR2V0TGFyZ2VzdFBhcnRpY2xlKEltYWdlKiBiaW5hcnlJbWFnZSwgaW50KiBwYXJ0aWNsZU51bSk7CitpbnQgR2V0TGFyZ2VzdFBhcnRpY2xlKEltYWdlKiBiaW5hcnlJbWFnZSwgaW50KiBwYXJ0aWNsZU51bSwgUmVjdCByZWN0KTsKK2ludCBGaW5kQ29sb3IoRnJjSHVlIGNvbG9yLCBQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0KiB0cmFja1JlcG9ydCk7CitpbnQgRmluZENvbG9yKGNvbnN0IFJhbmdlKiBodWVSYW5nZSwgUGFydGljbGVBbmFseXNpc1JlcG9ydCAqdHJhY2tSZXBvcnQpOworaW50IEZpbmRDb2xvcihjb25zdCBSYW5nZSogaHVlUmFuZ2UsIGludCBtaW5TYXR1cmF0aW9uLCBQYXJ0aWNsZUFuYWx5c2lzUmVwb3J0ICp0cmFja1JlcG9ydCk7CitpbnQgRmluZENvbG9yKENvbG9yTW9kZSBtb2RlLCBjb25zdCBSYW5nZSogcGxhbmUxUmFuZ2UsIGNvbnN0IFJhbmdlKiBwbGFuZTJSYW5nZSwgCisJCWNvbnN0IFJhbmdlKiBwbGFuZTNSYW5nZSwgUGFydGljbGVBbmFseXNpc1JlcG9ydCAqdHJhY2tSZXBvcnQpOworaW50IEZpbmRDb2xvcihDb2xvck1vZGUgbW9kZSwgY29uc3QgUmFuZ2UqIHBsYW5lMVJhbmdlLCBjb25zdCBSYW5nZSogcGxhbmUyUmFuZ2UsIAorCQljb25zdCBSYW5nZSogcGxhbmUzUmFuZ2UsIFBhcnRpY2xlQW5hbHlzaXNSZXBvcnQgKnRyYWNrUmVwb3J0LCBDb2xvclJlcG9ydCAqY29sb3JSZXBvcnQpOworaW50IEZpbmRDb2xvcihDb2xvck1vZGUgbW9kZSwgY29uc3QgUmFuZ2UqIHBsYW5lMVJhbmdlLCBjb25zdCBSYW5nZSogcGxhbmUyUmFuZ2UsIAorCQljb25zdCBSYW5nZSogcGxhbmUzUmFuZ2UsIFBhcnRpY2xlQW5hbHlzaXNSZXBvcnQgKnRyYWNrUmVwb3J0LCAKKwkJQ29sb3JSZXBvcnQgKmNvbG9yUmVwb3J0LCBSZWN0IHJlY3QpOworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvV1BJTGliL1dQSUxpYi9WaXNpb24yMDA5L1Zpc2lvbkFQSS5jcHAgYi9hb3MvZXh0ZXJuYWxzL1dQSUxpYi9XUElMaWIvVmlzaW9uMjAwOS9WaXNpb25BUEkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MTFiMzkKLS0tIC9kZXYvbnVsbAorKysgYi9hb3MvZXh0ZXJuYWxzL1dQSUxpYi9XUElMaWIvVmlzaW9uMjAwOS9WaXNpb25BUEkuY3BwCkBAIC0wLDAgKzEsNjc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIFByb2plY3QgICAJCTogRklSU1QgTW90b3IgQ29udHJvbGxlcgorKiAgRmlsZSBOYW1lICAJCTogVmlzaW9uQVBJLmNwcCAgICAgICAgCisqICBDb250cmlidXRvcnMgICAJOiBFTEYsIEVNRgorKiAgQ3JlYXRpb24gRGF0ZSAJOiBKdW5lIDI2LCAyMDA4CisqICBSZXZpc2lvbiBIaXN0b3J5CTogU291cmNlIGNvZGUgJiByZXZpc2lvbiBoaXN0b3J5IG1haW50YWluZWQgYXQgc291cmNlZm9yZ2UuV1BJLmVkdSAgIAorKiAgRmlsZSBEZXNjcmlwdGlvbgk6IEMgUm91dGluZXMgZm9yIEZJUlNUIFZpc2lvbiBBUEkuIE9wZW4gc291cmNlIEFQSSBkZXZlbG9wZWQgCisqICAgIGJ5IEJBRSBTeXN0ZW1zIHRvIGludGVyZmFjZSB3aXRoIHRoZSBOYXRpb25hbCBJbnN0cnVtZW50cyB2aXNpb24gQyBsaWJyYXJ5CisqICAgIGluIHRoZSBuaXZpc2lvbi5vdXQgbW9kdWxlLiBUaGUgcHVibGlzaGVkIGludGVyZmFjZSB0byBuaXZpc2lvbi5vdXQgaXMgaW4KKyogICAgdGhlIGhlYWRlciBmaWxlIG5pdmlzaW9uLmggYW5kIGRvY3VtZW50ZWQgaW4gdGhlIE5JVmlzaW9uQ1ZJLmNobSBoZWxwIGZpbGUuCisqLyAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiAgICAgICAgQ29weXJpZ2h0IChjKSBGSVJTVCAyMDA4LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAqLworLyogIE9wZW4gU291cmNlIFNvZnR3YXJlIC0gbWF5IGJlIG1vZGlmaWVkIGFuZCBzaGFyZWQgYnkgRlJDIHRlYW1zLiBUaGUgY29kZSAgKi8KKy8qICBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBGSVJTVCBCU0QgbGljZW5zZSBmaWxlIGluICQoV0lORF9CQVNFKS9XUElMaWIuICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAic3RkaW9MaWIuaCIgCisjaW5jbHVkZSAidnhXb3Jrcy5oIiAKKworI2luY2x1ZGUgIkJhZVV0aWxpdGllcy5oIgorI2luY2x1ZGUgIkZyY0Vycm9yLmgiCisjaW5jbHVkZSAiVmlzaW9uQVBJLmgiIAorCitpbnQgVmlzaW9uQVBJX2RlYnVnRmxhZyA9IDE7CisjZGVmaW5lIERQUklOVEYgaWYoVmlzaW9uQVBJX2RlYnVnRmxhZylkcHJpbnRmCisKKy8qICAgSW1hZ2UgTWFuYWdlbWVudCBmdW5jdGlvbnMgICAgKi8KKworLyoqCisqIEBicmllZiBDcmVhdGUgYW4gaW1hZ2Ugb2JqZWN0CisqIFN1cHBvcnRzIElNQVFfSU1BR0VfVTgsIElNQVFfSU1BR0VfSTE2LCBJTUFRX0lNQUdFX1NHTCwgSU1BUV9JTUFHRV9DT01QTEVYLCBJTUFRX0lNQUdFX1JHQiwgSU1BUV9JTUFHRV9IU0wsIElNQVFfSU1BR0VfUkdCX1U2NCAgICAgICAgICAKKyogVGhlIGJvcmRlciBzaXplIGlzIGRlZmF1bHRlZCB0byAzIHNvIHRoYXQgY29udm9sdXRpb25hbCBhbGdvcml0aG1zIHdvcmsgYXQgdGhlIGVkZ2VzLiAKKyogV2hlbiB5b3UgYXJlIGZpbmlzaGVkIHdpdGggdGhlIGNyZWF0ZWQgaW1hZ2UsIGRpc3Bvc2Ugb2YgaXQgYnkgY2FsbGluZyBmcmNEaXNwb3NlKCkuIAorKiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuICAgCisqICAgICAgICAgICAKKyogQHBhcmFtIHR5cGUgVHlwZSBvZiBpbWFnZSB0byBjcmVhdGUKKyogQHJldHVybiBJbWFnZSogT24gc3VjY2VzcywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjcmVhdGVkIGltYWdlLiBPbiBmYWlsdXJlLCBpdCByZXR1cm5zIE5VTEwuCisqLworSW1hZ2UqIGZyY0NyZWF0ZUltYWdlKEltYWdlVHlwZSB0eXBlKSB7IHJldHVybiBpbWFxQ3JlYXRlSW1hZ2UodHlwZSwgREVGQVVMVF9CT1JERVJfU0laRSk7IH0KKworLyoqCisqIEBicmllZiBEaXNwb3NlIG9mIG9uZSBvYmplY3QuIFN1cHBvcnRzIGFueSBvYmplY3QgY3JlYXRlZCBvbiB0aGUgaGVhcC4KKyogCisqIEBwYXJhbSBvYmplY3Qgb2JqZWN0IHRvIGRpc3Bvc2Ugb2YKKyogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuCisqLworaW50IGZyY0Rpc3Bvc2Uodm9pZCogb2JqZWN0KSAgeyByZXR1cm4gaW1hcURpc3Bvc2Uob2JqZWN0KTsJfQorLyoqCisqIEBicmllZiBEaXNwb3NlIG9mIGEgbGlzdCBvZiBvYmplY3RzLiBTdXBwb3J0cyBhbnkgb2JqZWN0IGNyZWF0ZWQgb24gdGhlIGhlYXAuCisqIAorKiBAcGFyYW0gZnVuY3Rpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbgorKiBAcGFyYW0gLi4uIEEgbGlzdCBvZiBwb2ludGVycyB0byBzdHJ1Y3R1cmVzIHRoYXQgbmVlZCB0byBiZSBkaXNwb3NlZCBvZi4gCisqIFRoZSBsYXN0IHBvaW50ZXIgaW4gdGhlIGxpc3Qgc2hvdWxkIGFsd2F5cyBiZSBzZXQgdG8gTlVMTC4KKyogCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNEaXNwb3NlKCBjb25zdCBjaGFyKiBmdW5jdGlvbk5hbWUsIC4uLiApIC8qIFZhcmlhYmxlIGFyZ3VtZW50IGxpc3QgKi8KK3sKKyAgICB2YV9saXN0IGRpc3Bvc2FsUHRyTGlzdDsgICAvKiBJbnB1dCBhcmd1bWVudCBsaXN0ICovCisgICAgdm9pZCogZGlzcG9zYWxQdHI7ICAgICAgICAgLyogRm9yIGl0ZXJhdGlvbiAqLworICAgIGludCBzdWNjZXNzLCByZXR1cm5WYWx1ZSA9IDE7CisgICAgCisgICAgdmFfc3RhcnQoIGRpc3Bvc2FsUHRyTGlzdCwgZnVuY3Rpb25OYW1lICk7ICAvKiBzdGFydCBvZiB2YXJpYWJsZSBsaXN0ICovCisgICAgZGlzcG9zYWxQdHIgPSB2YV9hcmcoIGRpc3Bvc2FsUHRyTGlzdCwgdm9pZCogKTsKKyAgICB3aGlsZSggZGlzcG9zYWxQdHIgIT0gTlVMTCApICAgICB7CisgICAgCXN1Y2Nlc3MgPSBpbWFxRGlzcG9zZShkaXNwb3NhbFB0cik7CisgICAgICAgIGlmICghc3VjY2Vzcykge3JldHVyblZhbHVlID0gMDt9CisgICAgICAgIGRpc3Bvc2FsUHRyID0gdmFfYXJnKCBkaXNwb3NhbFB0ckxpc3QsIHZvaWQqICk7CisgICAgfQorICAgIHJldHVybiByZXR1cm5WYWx1ZTsKK30KKworLyoqCisqIEBicmllZiBDb3B5IGFuIGltYWdlIG9iamVjdC4gCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfVTgsIElNQVFfSU1BR0VfSTE2LCBJTUFRX0lNQUdFX1NHTCwgSU1BUV9JTUFHRV9SR0IsIElNQVFfSU1BR0VfSFNMLiAgICAgICAgICAKKyogCisqIEBwYXJhbSBkZXN0IENvcHkgb2YgaW1hZ2UuIE9uIGZhaWx1cmUsIGRlc3QgaXMgTlVMTC4gTXVzdCBoYXZlIGFscmVhZHkgYmVlbiBjcmVhdGVkIHVzaW5nIGZyY0NyZWF0ZUltYWdlKCkuCisqIFdoZW4geW91IGFyZSBmaW5pc2hlZCB3aXRoIHRoZSBjcmVhdGVkIGltYWdlLCBkaXNwb3NlIG9mIGl0IGJ5IGNhbGxpbmcgZnJjRGlzcG9zZSgpLgorKiBAcGFyYW0gc291cmNlIEltYWdlIHRvIGNvcHkgICAgICAKKyogCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNDb3B5SW1hZ2UoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UpIHsgcmV0dXJuIGltYXFEdXBsaWNhdGUoZGVzdCwgc291cmNlKTsgIH0KKworLyoqCisqIEBicmllZiBDcm9wIGltYWdlIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHNjYWxlLiAKKyogU3VwcG9ydHMgSU1BUV9JTUFHRV9VOCwgSU1BUV9JTUFHRV9JMTYsIElNQVFfSU1BR0VfU0dMLCBJTUFRX0lNQUdFX1JHQiwgSU1BUV9JTUFHRV9IU0wuCisqIAorKiBAcGFyYW0gZGVzdCBNb2RpZmllZCBpbWFnZQorKiBAcGFyYW0gc291cmNlIEltYWdlIHRvIGNyb3AKKyogQHBhcmFtIHJlY3QgcmVnaW9uIHRvIHByb2Nlc3MsIG9yIElNQVFfTk9fUkVDVAorKiAKKyogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuCisqLworaW50IGZyY0Nyb3AoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIFJlY3QgcmVjdCkKK3sJCisJcmV0dXJuIGltYXFTY2FsZShkZXN0LCBzb3VyY2UsIDEsIDEsIElNQVFfU0NBTEVfTEFSR0VSLCByZWN0KTsKK30KKworCisvKioKKyogQGJyaWVmIFNjYWxlcyB0aGUgZW50aXJlIGltYWdlIGxhcmdlciBvciBzbWFsbGVyLiAKKyogU3VwcG9ydHMgSU1BUV9JTUFHRV9VOCwgSU1BUV9JTUFHRV9JMTYsIElNQVFfSU1BR0VfU0dMLCBJTUFRX0lNQUdFX1JHQiwgSU1BUV9JTUFHRV9IU0wuCisqICAgICAKKyogQHBhcmFtIGRlc3QgTW9kaWZpZWQgaW1hZ2UKKyogQHBhcmFtIHNvdXJjZSBJbWFnZSB0byBzY2FsZQorKiBAcGFyYW0geFNjYWxlIHRoZSBob3Jpem9udGFsIHJlZHVjdGlvbiByYXRpbworKiBAcGFyYW0geVNjYWxlIHRoZSB2ZXJ0aWNhbCByZWR1Y3Rpb24gcmF0aW8gCisqIEBwYXJhbSBzY2FsZU1vZGUgSU1BUV9TQ0FMRV9MQVJHRVIgb3IgSU1BUV9TQ0FMRV9TTUFMTEVSICAKKyogCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNTY2FsZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgaW50IHhTY2FsZSwgaW50IHlTY2FsZSwgU2NhbGluZ01vZGUgc2NhbGVNb2RlKQorewkKKwlSZWN0IHJlY3QgPSBJTUFRX05PX1JFQ1Q7CisJcmV0dXJuIGltYXFTY2FsZShkZXN0LCBzb3VyY2UsIHhTY2FsZSwgeVNjYWxlLCBzY2FsZU1vZGUsIHJlY3QpOwkKK30KKyAgCisvKioKKyAqIEBicmllZiBDcmVhdGVzIGltYWdlIG9iamVjdCBmcm9tIHRoZSBpbmZvcm1hdGlvbiBpbiBhIGZpbGUuIFRoZSBmaWxlIGNhbiBiZSBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXRzOiAKKyAqIFBORywgSlBFRywgSlBFRzIwMDAsIFRJRkYsIEFJUEQsIG9yIEJNUC4gCisgKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1U4LCBJTUFRX0lNQUdFX0kxNiwgSU1BUV9JTUFHRV9TR0wsIElNQVFfSU1BR0VfQ09NUExFWCwgSU1BUV9JTUFHRV9SR0IsIElNQVFfSU1BR0VfSFNMLCBJTUFRX0lNQUdFX1JHQl9VNjQuCisgKiAKKyAqIEBwYXJhbSBpbWFnZSBJbWFnZSByZWFkIGluCisgKiBAcGFyYW0gZmlsZU5hbWUgRmlsZSB0byByZWFkLiBDYW5ub3QgYmUgTlVMTAorICogCisgKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IDEuIE9uIGZhaWx1cmU6IDAuIFRvIGdldCBleHRlbmRlZCBlcnJvciBpbmZvcm1hdGlvbiwgY2FsbCBHZXRMYXN0RXJyb3IoKS4KKyAqLworIGludCBmcmNSZWFkSW1hZ2UoSW1hZ2UqIGltYWdlLCBjb25zdCBjaGFyKiBmaWxlTmFtZSkKKyB7CisJIHJldHVybiBpbWFxUmVhZEZpbGUoaW1hZ2UsIGZpbGVOYW1lLCBOVUxMLCBOVUxMKTsKKyB9CisKKworIC8qKgorICogQGJyaWVmIFdyaXRlIGltYWdlIHRvIGEgZmlsZS4gCisgKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1U4LCBJTUFRX0lNQUdFX0kxNiwgSU1BUV9JTUFHRV9TR0wsIElNQVFfSU1BR0VfQ09NUExFWCwgSU1BUV9JTUFHRV9SR0IsIElNQVFfSU1BR0VfSFNMLCBJTUFRX0lNQUdFX1JHQl9VNjQuCisgKiAKKyAqIFRoZSBmaWxlIHR5cGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZXh0ZW5zaW9uLCBhcyBmb2xsb3dzOgorICoKKyAqCQlFeHRlbnNpb24gCQkJCQlGaWxlIFR5cGUgCisgKgkJYWlwZCBvciAuYXBkIAkJCQlBSVBEIAorICoJCS5ibXAgCQkJCQkJQk1QIAorICoJCS5qcGcgb3IgLmpwZWcgCQkJCUpQRUcgCisgKgkJLmpwMiAJCQkJCQlKUEVHMjAwMCAKKyAqCQkucG5nIAkJCQkJCVBORyAKKyAqCQkudGlmIG9yIC50aWZmIAkJCQlUSUZGIAorICogCisgKiAKKyAqVGhlIGZvbGxvd2luZyBhcmUgdGhlIHN1cHBvcnRlZCBpbWFnZSB0eXBlcyBmb3IgZWFjaCBmaWxlIHR5cGU6CisgKgorICoJCUZpbGUgVHlwZXMgCQkJCQlJbWFnZSBUeXBlcyAKKyAqCQlBSVBEIAkJCQkJCWFsbCBpbWFnZSB0eXBlcyAKKyAqCQlCTVAsIEpQRUcgCQkJCQk4LWJpdCwgUkdCIAorICoJCVBORywgVElGRiwgSlBFRzIwMDAgCQk4LWJpdCwgMTYtYml0LCBSR0IsIFJHQlU2NCAJCQorICogCQkJICAgIAorICogQHBhcmFtIGltYWdlIEltYWdlIHRvIHdyaXRlCisgKiBAcGFyYW0gZmlsZU5hbWUgRmlsZSB0byByZWFkLiBDYW5ub3QgYmUgTlVMTC4gVGhlIGV4dGVuc2lvbiBkZXRlcm1pbmVzIHRoZSBmaWxlIGZvcm1hdCB0aGF0IGlzIHdyaXR0ZW4uCisgKiAKKyAqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLgorICovCitpbnQgZnJjV3JpdGVJbWFnZShjb25zdCBJbWFnZSogaW1hZ2UsIGNvbnN0IGNoYXIqIGZpbGVOYW1lKQorewkKKwlSR0JWYWx1ZSogY29sb3JUYWJsZSA9IE5VTEw7CisJcmV0dXJuIGltYXFXcml0ZUZpbGUoaW1hZ2UsIGZpbGVOYW1lLCBjb2xvclRhYmxlKTsKK30KKworCisvKiAgTWVhc3VyZSBJbnRlbnNpdHkgZnVuY3Rpb25zICovCisKKy8qKgorKiBAYnJpZWYgTWVhc3VyZXMgdGhlIHBpeGVsIGludGVuc2l0aWVzIGluIGEgcmVjdGFuZ2xlIG9mIGFuIGltYWdlLiAKKyogT3V0cHV0cyBpbnRlbnNpdHkgYmFzZWQgc3RhdGlzdGljcyBhYm91dCBhbiBpbWFnZSBzdWNoIGFzIE1heCwgTWluLCBNZWFuIGFuZCBTdGQgRGV2IG9mIHBpeGVsIHZhbHVlLiAKKyogU3VwcG9ydHMgSU1BUV9JTUFHRV9VOCwgSU1BUV9JTUFHRV9JMTYsIElNQVFfSU1BR0VfU0dMLgorKgorKiAgUGFyYW1ldGVyIERpc2N1c3Npb24JOiAKKyoJCVJlbGV2YW50IHBhcmFtZXRlcnMgb2YgdGhlIEhpc3RvZ3JhbVJlcG9ydCBpbmNsdWRlOgorKiAJCQltaW4sIG1heCwgbWVhbiBhbmQgc3RkRGV2ICAgICAgCisqCQltaW4vbWF4IJdTZXR0aW5nIGJvdGggbWluIGFuZCBtYXggdG8gMCBjYXVzZXMgdGhlIGZ1bmN0aW9uIHRvIHNldCBtaW4gdG8gMCAKKyogCQkJYW5kIHRoZSBtYXggdG8gMjU1IGZvciA4LWJpdCBpbWFnZXMgYW5kIHRvIHRoZSBhY3R1YWwgbWluaW11bSB2YWx1ZSBhbmQKKyogCQkJbWF4aW11bSB2YWx1ZSBvZiB0aGUgaW1hZ2UgZm9yIGFsbCBvdGhlciBpbWFnZSB0eXBlcy4KKyoJCW1heJdTZXR0aW5nIGJvdGggbWluIGFuZCBtYXggdG8gMCBjYXVzZXMgdGhlIGZ1bmN0aW9uIHRvIHNldCBtYXggdG8gMjU1IAorKiAJCQlmb3IgOC1iaXQgaW1hZ2VzIGFuZCB0byB0aGUgYWN0dWFsIG1heGltdW0gdmFsdWUgb2YgdGhlIGltYWdlIGZvciAKKyogCQkJYWxsIG90aGVyIGltYWdlIHR5cGVzLgorKgorKiBAcGFyYW0gaW1hZ2UgSW1hZ2Ugd2hvc2UgaGlzdG9ncmFtIHRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzLgorKiBAcGFyYW0gbnVtQ2xhc3NlcyBUaGUgbnVtYmVyIG9mIGNsYXNzZXMgaW50byB3aGljaCB0aGUgZnVuY3Rpb24gc2VwYXJhdGVzIHRoZSBwaXhlbHMuIAorKiBEZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGhpc3RvZ3JhbSBhcnJheSByZXR1cm5lZAorKiBAcGFyYW0gbWluIFRoZSBtaW5pbXVtIHBpeGVsIHZhbHVlIHRvIGNvbnNpZGVyIGZvciB0aGUgaGlzdG9ncmFtLiAKKyogVGhlIGZ1bmN0aW9uIGRvZXMgbm90IGNvdW50IHBpeGVscyB3aXRoIHZhbHVlcyBsZXNzIHRoYW4gbWluLgorKiBAcGFyYW0gbWF4IFRoZSBtYXhpbXVtIHBpeGVsIHZhbHVlIHRvIGNvbnNpZGVyIGZvciB0aGUgaGlzdG9ncmFtLiAKKyogVGhlIGZ1bmN0aW9uIGRvZXMgbm90IGNvdW50IHBpeGVscyB3aXRoIHZhbHVlcyBncmVhdGVyIHRoYW4gbWF4LgorKiBAcGFyYW0gcmVjdCBSZWdpb24gb2YgaW50ZXJlc3QgaW4gdGhlIGltYWdlLiBJZiBub3QgaW5jbHVkZWQsIHRoZSBlbnRpcmUgaW1hZ2UgaXMgdXNlZC4gCisqIEByZXR1cm4gT24gc3VjY2VzcywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcmVwb3J0IGRlc2NyaWJpbmcgdGhlIHBpeGVsIHZhbHVlIGNsYXNzaWZpY2F0aW9uLiAgICAKKyogV2hlbiB5b3UgYXJlIGZpbmlzaGVkIHdpdGggdGhlIHJlcG9ydCwgZGlzcG9zZSBvZiBpdCBieSBjYWxsaW5nIGZyY0Rpc3Bvc2UoKS4gCisqIE9uIGZhaWx1cmUsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBOVUxMLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuICAgICAgICAgICAgCisqIAorKi8KK0hpc3RvZ3JhbVJlcG9ydCogZnJjSGlzdG9ncmFtKGNvbnN0IEltYWdlKiBpbWFnZSwgaW50IG51bUNsYXNzZXMsIGZsb2F0IG1pbiwgZmxvYXQgbWF4KQoreworCVJlY3QgcmVjdCA9IElNQVFfTk9fUkVDVDsKKwlyZXR1cm4gZnJjSGlzdG9ncmFtKGltYWdlLCBudW1DbGFzc2VzLCBtaW4sIG1heCwgcmVjdCk7CQkKK30KK0hpc3RvZ3JhbVJlcG9ydCogZnJjSGlzdG9ncmFtKGNvbnN0IEltYWdlKiBpbWFnZSwgaW50IG51bUNsYXNzZXMsIGZsb2F0IG1pbiwgZmxvYXQgbWF4LCBSZWN0IHJlY3QpCit7CisJaW50IHN1Y2Nlc3M7IAorCWludCBmaWxsVmFsdWUgPSAxOworCQorCS8qIGNyZWF0ZSB0aGUgcmVnaW9uIG9mIGludGVyZXN0ICovCisJUk9JKiBwUm9pID0gaW1hcUNyZWF0ZVJPSSgpOworCXN1Y2Nlc3MgPSBpbWFxQWRkUmVjdENvbnRvdXIocFJvaSwgcmVjdCk7IAorCWlmICggIXN1Y2Nlc3MgKQl7IEdldExhc3RWaXNpb25FcnJvcigpOyByZXR1cm4gTlVMTDsgfQkKKworCS8qIG1ha2UgYSBtYXNrIGZyb20gdGhlIFJPSSAqLworCUltYWdlKiBwTWFzayA9IGZyY0NyZWF0ZUltYWdlKElNQVFfSU1BR0VfVTgpOworCXN1Y2Nlc3MgPSBpbWFxUk9JVG9NYXNrKHBNYXNrLCBwUm9pLCBmaWxsVmFsdWUsIE5VTEwsIE5VTEwpOworCWlmICggIXN1Y2Nlc3MgKQl7IAorCQlHZXRMYXN0VmlzaW9uRXJyb3IoKTsgCisJCWZyY0Rpc3Bvc2UoX19GVU5DVElPTl9fLCBwUm9pLCBOVUxMKTsgCisJCXJldHVybiBOVUxMOyAKKwl9CQorCQorCS8qIGdldCBhIGhpc3RvZ3JhbSByZXBvcnQgKi8KKwlIaXN0b2dyYW1SZXBvcnQqIHBIciA9IE5VTEw7CisJcEhyID0gaW1hcUhpc3RvZ3JhbShpbWFnZSwgbnVtQ2xhc3NlcywgbWluLCBtYXgsIHBNYXNrKTsgCisJCisJLyogY2xlYW4gdXAgKi8KKwlmcmNEaXNwb3NlKF9fRlVOQ1RJT05fXywgcFJvaSwgcE1hc2ssIE5VTEwpOyAKKwkKKwlyZXR1cm4gcEhyOworfQorCisvKioKKyogQGJyaWVmIENhbGN1bGF0ZXMgdGhlIGhpc3RvZ3JhbSwgb3IgcGl4ZWwgZGlzdHJpYnV0aW9uLCBvZiBhIGNvbG9yIGltYWdlLiAKKyogU3VwcG9ydHMgSU1BUV9JTUFHRV9SR0IsIElNQVFfSU1BR0VfSFNMLgorKiAgICAgICAgICAgIAorKiBAcGFyYW0gaW1hZ2UgSW1hZ2Ugd2hvc2UgaGlzdG9ncmFtIHRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzLgorKiBAcGFyYW0gbnVtQ2xhc3NlcyBUaGUgbnVtYmVyIG9mIGNsYXNzZXMgaW50byB3aGljaCB0aGUgZnVuY3Rpb24gc2VwYXJhdGVzIHRoZSBwaXhlbHMuIAorKiBEZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGhpc3RvZ3JhbSBhcnJheSByZXR1cm5lZAorKiBAcGFyYW0gbW9kZSBUaGUgY29sb3Igc3BhY2UgaW4gd2hpY2ggdG8gcGVyZm9ybSB0aGUgaGlzdG9ncmFtLiBQb3NzaWJsZSB2YWx1ZXMgaW5jbHVkZSBJTUFRX1JHQiBhbmQgSU1BUV9IU0wuIAorKiBAcGFyYW0gbWFzayBBbiBvcHRpb25hbCBtYXNrIGltYWdlLiBUaGlzIGltYWdlIG11c3QgYmUgYW4gSU1BUV9JTUFHRV9VOCBpbWFnZS4gCisqIFRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBoaXN0b2dyYW0gdXNpbmcgb25seSB0aG9zZSBwaXhlbHMgaW4gdGhlIGltYWdlIHdob3NlIAorKiBjb3JyZXNwb25kaW5nIHBpeGVscyBpbiB0aGUgbWFzayBhcmUgbm9uLXplcm8uIFNldCB0aGlzIHBhcmFtZXRlciB0byBOVUxMIHRvIGNhbGN1bGF0ZSAKKyogdGhlIGhpc3RvZ3JhbSBvZiB0aGUgZW50aXJlIGltYWdlLCBvciB1c2UgdGhlIHNpbXBsaWZpZWQgY2FsbC4KKyogCisqIEByZXR1cm4gT24gc3VjY2VzcywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcmVwb3J0IGRlc2NyaWJpbmcgdGhlIGNsYXNzaWZpY2F0aW9uICAKKyogb2YgZWFjaCBwbGFuZSBpbiBhIEhpc3RvZ3JhbVJlcG9ydC4gCisqIFdoZW4geW91IGFyZSBmaW5pc2hlZCB3aXRoIHRoZSByZXBvcnQsIGRpc3Bvc2Ugb2YgaXQgYnkgY2FsbGluZyBmcmNEaXNwb3NlKCkuIAorKiBPbiBmYWlsdXJlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgTlVMTC4gIAorKiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgaW1hcUdldExhc3RFcnJvcigpLiAKKyovCitDb2xvckhpc3RvZ3JhbVJlcG9ydCogZnJjQ29sb3JIaXN0b2dyYW0oY29uc3QgSW1hZ2UqIGltYWdlLCBpbnQgbnVtQ2xhc3NlcywgQ29sb3JNb2RlIG1vZGUpCit7CQorCXJldHVybiBmcmNDb2xvckhpc3RvZ3JhbShpbWFnZSwgbnVtQ2xhc3NlcywgbW9kZSwgTlVMTCk7Cit9CisKK0NvbG9ySGlzdG9ncmFtUmVwb3J0KiBmcmNDb2xvckhpc3RvZ3JhbShjb25zdCBJbWFnZSogaW1hZ2UsIGludCBudW1DbGFzc2VzLCBDb2xvck1vZGUgbW9kZSwgSW1hZ2UqIG1hc2spCit7CisJcmV0dXJuIGltYXFDb2xvckhpc3RvZ3JhbTIoKEltYWdlKilpbWFnZSwgbnVtQ2xhc3NlcywgbW9kZSwgTlVMTCwgbWFzayk7Cit9CisKKworLyoqCisqIEBicmllZiBNZWFzdXJlcyB0aGUgcGl4ZWwgaW50ZW5zaXRpZXMgaW4gYSByZWN0YW5nbGUgb2YgYW4gaW1hZ2UuIAorKiBPdXRwdXRzIGludGVuc2l0eSBiYXNlZCBzdGF0aXN0aWNzIGFib3V0IGFuIGltYWdlIHN1Y2ggYXMgTWF4LCBNaW4sIE1lYW4gYW5kIFN0ZCBEZXYgb2YgcGl4ZWwgdmFsdWUuIAorKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1U4IChncmF5c2NhbGUpIElNQVFfSU1BR0VfUkdCIChjb2xvcikgSU1BUV9JTUFHRV9IU0wgKGNvbG9yLUhTTCkuCisqIAorKiBAcGFyYW0gaW1hZ2UgVGhlIGltYWdlIHdob3NlIHBpeGVsIHZhbHVlIHRoZSBmdW5jdGlvbiBxdWVyaWVzCisqIEBwYXJhbSBwaXhlbCBUaGUgY29vcmRpbmF0ZXMgb2YgdGhlIHBpeGVsIHRoYXQgdGhlIGZ1bmN0aW9uIHF1ZXJpZXMKKyogQHBhcmFtIHZhbHVlIE9uIHJldHVybiwgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgaW1hZ2UgcGl4ZWwuIFRoaXMgcGFyYW1ldGVyIGNhbm5vdCBiZSBOVUxMLgorKiBUaGlzIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5zIGVpdGhlciBncmF5c2NhbGUsIFJHQiwgSFNMLCBDb21wbGV4IG9yIFJHQlU2NFZhbHVlIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBpbWFnZS4KKyogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuCisqLworaW50IGZyY0dldFBpeGVsVmFsdWUoY29uc3QgSW1hZ2UqIGltYWdlLCBQb2ludCBwaXhlbCwgUGl4ZWxWYWx1ZSogdmFsdWUpCit7CQorCXJldHVybiBpbWFxR2V0UGl4ZWwoaW1hZ2UsIHBpeGVsLCB2YWx1ZSk7Cit9CisKKworLyogICBQYXJ0aWNsZSBBbmFseXNpcyBmdW5jdGlvbnMgKi8KKworLyoqCisqIEBicmllZiBGaWx0ZXJzIHBhcnRpY2xlcyBvdXQgb2YgYW4gaW1hZ2UgYmFzZWQgb24gdGhlaXIgbWVhc3VyZW1lbnRzLiAKKyogU3VwcG9ydHMgSU1BUV9JTUFHRV9VOCwgSU1BUV9JTUFHRV9JMTYsIElNQVFfSU1BR0VfU0dMLgorKiAKKyogQHBhcmFtIGRlc3QgVGhlIGRlc3RpbmF0aW9uIGltYWdlLiBJZiBkZXN0IGlzIHVzZWQsIGl0IG11c3QgYmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgU291cmNlIGltYWdlLiBJdCB3aWxsIGNvbnRhaW4gb25seSB0aGUgZmlsdGVyZWQgcGFydGljbGVzLgorKiBAcGFyYW0gc291cmNlIFRoZSBpbWFnZSBjb250YWluaW5nIHRoZSBwYXJ0aWNsZXMgdG8gZmlsdGVyLiAKKyogQHBhcmFtIGNyaXRlcmlhIEFuIGFycmF5IG9mIGNyaXRlcmlhIHRvIGFwcGx5IHRvIHRoZSBwYXJ0aWNsZXMgaW4gdGhlIHNvdXJjZSBpbWFnZS4gVGhpcyBhcnJheSBjYW5ub3QgYmUgTlVMTC4KKyogU2VlIHRoZSBOSVZpc2lvbkNWSS5jaG0gaGVscCBmaWxlIGZvciBkZWZpbml0aW9ucyBvZiBjcml0ZXJpYS4gCisqIEBwYXJhbSBjcml0ZXJpYUNvdW50IFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNyaXRlcmlhIGFycmF5LgorKiBAcGFyYW0gb3B0aW9ucyBCaW5hcnkgZmlsdGVyIG9wdGlvbnMsIGluY2x1ZGluZyByZWplY3RNYXRjaGVzLCByZWplY3RCb3JkZXIsIGFuZCBjb25uZWN0aXZpdHk4LgorKiBAcGFyYW0gcmVjdCBBcmVhIG9mIGltYWdlIHRvIGZpbHRlci4gSWYgb21pdHRlZCwgdGhlIGRlZmF1bHQgaXMgZW50aXJlIGltYWdlLgorKiBAcGFyYW0gbnVtUGFydGljbGVzIE9uIHJldHVybiwgdGhlIG51bWJlciBvZiBwYXJ0aWNsZXMgbGVmdCBpbiB0aGUgaW1hZ2UKKyogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuCisqLworaW50IGZyY1BhcnRpY2xlRmlsdGVyKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBjb25zdCBQYXJ0aWNsZUZpbHRlckNyaXRlcmlhMiogY3JpdGVyaWEsIAorCQlpbnQgY3JpdGVyaWFDb3VudCwgY29uc3QgUGFydGljbGVGaWx0ZXJPcHRpb25zKiBvcHRpb25zLCBpbnQqIG51bVBhcnRpY2xlcykKK3sKKwlSZWN0IHJlY3QgPSBJTUFRX05PX1JFQ1Q7CisJcmV0dXJuIGZyY1BhcnRpY2xlRmlsdGVyKGRlc3QsIHNvdXJjZSwgY3JpdGVyaWEsIGNyaXRlcmlhQ291bnQsIG9wdGlvbnMsIHJlY3QsIG51bVBhcnRpY2xlcyk7Cit9CisKK2ludCBmcmNQYXJ0aWNsZUZpbHRlcihJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgY29uc3QgUGFydGljbGVGaWx0ZXJDcml0ZXJpYTIqIGNyaXRlcmlhLCAKKwkJaW50IGNyaXRlcmlhQ291bnQsIGNvbnN0IFBhcnRpY2xlRmlsdGVyT3B0aW9ucyogb3B0aW9ucywgUmVjdCByZWN0LCBpbnQqIG51bVBhcnRpY2xlcykKK3sKKwlST0kqIHJvaSA9IGltYXFDcmVhdGVST0koKTsKKwlpbWFxQWRkUmVjdENvbnRvdXIocm9pLCByZWN0KTsKKwlyZXR1cm4gaW1hcVBhcnRpY2xlRmlsdGVyMyhkZXN0LCBzb3VyY2UsIGNyaXRlcmlhLCBjcml0ZXJpYUNvdW50LCBvcHRpb25zLCByb2ksIG51bVBhcnRpY2xlcyk7Cit9CisKKworLyoqCisqIEBicmllZiBQZXJmb3JtcyBtb3JwaG9sb2dpY2FsIHRyYW5zZm9ybWF0aW9ucyBvbiBiaW5hcnkgaW1hZ2VzLiAKKyogU3VwcG9ydHMgSU1BUV9JTUFHRV9VOC4gCisqCisqIEBwYXJhbSBkZXN0IFRoZSBkZXN0aW5hdGlvbiBpbWFnZS4gVGhlIGJvcmRlciBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBpbWFnZSBpcyBub3QgaW1wb3J0YW50LgorKiBAcGFyYW0gc291cmNlIFRoZSBpbWFnZSBvbiB3aGljaCB0aGUgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIG1vcnBob2xvZ2ljYWwgb3BlcmF0aW9ucy4gVGhlIGNhbGN1bGF0aW9uIAorKiBtb2RpZmllcyB0aGUgYm9yZGVyIG9mIHRoZSBzb3VyY2UgaW1hZ2UuIFRoZSBib3JkZXIgbXVzdCBiZSBhdCBsZWFzdCBoYWxmIGFzIGxhcmdlIGFzIHRoZSBsYXJnZXIgCisqIGRpbWVuc2lvbiAgb2YgdGhlIHN0cnVjdHVyaW5nIGVsZW1lbnQuICBUaGUgY29ubmVjdGVkIHNvdXJjZSBpbWFnZSBmb3IgYSBtb3JwaG9sb2dpY2FsIHRyYW5zZm9ybWF0aW9uIAorKiBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIHdpdGggYSBib3JkZXIgY2FwYWJsZSBvZiBzdXBwb3J0aW5nIHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3R1cmluZyBlbGVtZW50LiAKKyogQSAzIGJ5IDMgc3RydWN0dXJpbmcgZWxlbWVudCByZXF1aXJlcyBhIG1pbmltYWwgYm9yZGVyIG9mIDEsIGEgNSBieSA1IHN0cnVjdHVyaW5nIGVsZW1lbnQgcmVxdWlyZXMgYSBtaW5pbWFsIGJvcmRlciBvZiAyLCBhbmQgc28gb24uCisqIEBwYXJhbSBtZXRob2QgVGhlIG1vcnBob2xvZ2ljYWwgdHJhbnNmb3JtIHRvIGFwcGx5LiAKKyogQHBhcmFtIHN0cnVjdHVyaW5nRWxlbWVudCBUaGUgc3RydWN0dXJpbmcgZWxlbWVudCB1c2VkIGluIHRoZSBvcGVyYXRpb24uIE9taXQgdGhpcyBwYXJhbWV0ZXIgaWYgeW91IGRvIG5vdCB3YW50IGEgY3VzdG9tIHN0cnVjdHVyaW5nIGVsZW1lbnQuIAorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IDEuIE9uIGZhaWx1cmU6IDAuIFRvIGdldCBleHRlbmRlZCBlcnJvciBpbmZvcm1hdGlvbiwgY2FsbCBHZXRMYXN0RXJyb3IoKS4gCisqLworaW50IGZyY01vcnBob2xvZ3koSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UsIE1vcnBob2xvZ3lNZXRob2QgbWV0aG9kKQorewkKKwlyZXR1cm4gaW1hcU1vcnBob2xvZ3koZGVzdCwgc291cmNlLCBtZXRob2QsIE5VTEwpOworfQorCitpbnQgZnJjTW9ycGhvbG9neShJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgTW9ycGhvbG9neU1ldGhvZCBtZXRob2QsIGNvbnN0IFN0cnVjdHVyaW5nRWxlbWVudCogc3RydWN0dXJpbmdFbGVtZW50KQorewkKKwlyZXR1cm4gaW1hcU1vcnBob2xvZ3koZGVzdCwgc291cmNlLCBtZXRob2QsIHN0cnVjdHVyaW5nRWxlbWVudCk7IAorfQorCisvKioKKyogQGJyaWVmIEVsaW1pbmF0ZXMgcGFydGljbGVzIHRoYXQgdG91Y2ggdGhlIGJvcmRlciBvZiB0aGUgaW1hZ2UuIAorKiBTdXBwb3J0cyBJTUFRX0lNQUdFX1U4LgorKgorKiBAcGFyYW0gZGVzdCBUaGUgZGVzdGluYXRpb24gaW1hZ2UuCisqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBpbWFnZS4gSWYgdGhlIGltYWdlIGhhcyBhIGJvcmRlciwgdGhlIGZ1bmN0aW9uIHNldHMgYWxsIGJvcmRlciBwaXhlbCB2YWx1ZXMgdG8gMC4KKyogQHBhcmFtIGNvbm5lY3Rpdml0eTggc3BlY2lmaWVzIHRoZSB0eXBlIG9mIGNvbm5lY3Rpdml0eSB1c2VkIGJ5IHRoZSBhbGdvcml0aG0gZm9yIHBhcnRpY2xlIGRldGVjdGlvbi4gCisqIFRoZSBjb25uZWN0aXZpdHkgbW9kZSBkaXJlY3RseSBkZXRlcm1pbmVzIHdoZXRoZXIgYW4gYWRqYWNlbnQgcGl4ZWwgYmVsb25ncyB0byB0aGUgc2FtZSBwYXJ0aWNsZSBvciBhIAorKiBkaWZmZXJlbnQgcGFydGljbGUuIFNldCB0byBUUlVFIHRvIHVzZSBjb25uZWN0aXZpdHktOCB0byBkZXRlcm1pbmUgd2hldGhlciBwYXJ0aWNsZXMgYXJlIHRvdWNoaW5nIAorKiBTZXQgdG8gRkFMU0UgdG8gdXNlIGNvbm5lY3Rpdml0eS00IHRvIGRldGVybWluZSB3aGV0aGVyIHBhcnRpY2xlcyBhcmUgdG91Y2hpbmcuIAorKiBUaGUgZGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgc2ltcGxpZmllZCBjYWxsIGlzIFRSVUUKKyogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuCisqLworaW50IGZyY1JlamVjdEJvcmRlcihJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSkKK3sJcmV0dXJuIGltYXFSZWplY3RCb3JkZXIoZGVzdCwgc291cmNlLCBUUlVFKTsgfQorCitpbnQgZnJjUmVqZWN0Qm9yZGVyKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBpbnQgY29ubmVjdGl2aXR5OCkKK3sJCisJcmV0dXJuIGltYXFSZWplY3RCb3JkZXIoZGVzdCwgc291cmNlLCBjb25uZWN0aXZpdHk4KTsKK30KKworCisvKioKKyogQGJyaWVmIENvdW50cyB0aGUgbnVtYmVyIG9mIHBhcnRpY2xlcyBpbiBhIGJpbmFyeSBpbWFnZS4gCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfVTgsIElNQVFfSU1BR0VfSTE2LCBJTUFRX0lNQUdFX1NHTC4KKyogQHBhcmFtIGltYWdlIGJpbmFyeSAodGhyZXNob2xkZWQpIGltYWdlIAkKKyogQHBhcmFtIG51bVBhcnRpY2xlcyBPbiByZXR1cm4sIHRoZSBudW1iZXIgb2YgcGFydGljbGVzLgorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IDEuIE9uIGZhaWx1cmU6IDAuIFRvIGdldCBleHRlbmRlZCBlcnJvciBpbmZvcm1hdGlvbiwgY2FsbCBHZXRMYXN0RXJyb3IoKS4gICAgCisqLworaW50IGZyY0NvdW50UGFydGljbGVzKEltYWdlKiBpbWFnZSwgaW50KiBudW1QYXJ0aWNsZXMpCQkJCQorewkKKwlyZXR1cm4gaW1hcUNvdW50UGFydGljbGVzKGltYWdlLCAxLCBudW1QYXJ0aWNsZXMpOworfQorCisKKy8qKgorKiBAYnJpZWYgQ29uZHVjdCBtZWFzdXJlbWVudHMgZm9yIGEgc2luZ2xlIHBhcnRpY2xlIGluIGFuIGltYWdlcy4gCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfVTgsIElNQVFfSU1BR0VfSTE2LCBJTUFRX0lNQUdFX1NHTC4KKyogCisqIEBwYXJhbSBpbWFnZSBpbWFnZSB3aXRoIHRoZSBwYXJ0aWNsZSB0byBhbmFseXplLiBUaGlzIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBzb3VyY2UgaW1hZ2UuIAorKiBJZiB5b3UgbmVlZCB0aGUgb3JpZ2luYWwgaW1hZ2UsIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIGltYWdlIHVzaW5nIGZyY0NvcHkoKSBiZWZvcmUgdXNpbmcgdGhpcyBmdW5jdGlvbi4KKyogQHBhcmFtIHBhcnRpY2xlTnVtYmVyIFRoZSBudW1iZXIgb2YgdGhlIHBhcnRpY2xlIHRvIGdldCBpbmZvcm1hdGlvbiBvbgorKiBAcGFyYW0gcGFyIG9uIHJldHVybiwgYSBwYXJ0aWNsZSBhbmFseXNpcyByZXBvcnQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFydGljbGUuIFRoaXMgc3RydWN0dXJlIG11c3QgYmUgY3JlYXRlZCBieSB0aGUgY2FsbGVyLgorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IDEuIE9uIGZhaWx1cmU6IDAuIFRvIGdldCBleHRlbmRlZCBlcnJvciBpbmZvcm1hdGlvbiwgY2FsbCBHZXRMYXN0RXJyb3IoKS4KKyovCitpbnQgZnJjUGFydGljbGVBbmFseXNpcyhJbWFnZSogaW1hZ2UsIGludCBwYXJ0aWNsZU51bWJlciwgUGFydGljbGVBbmFseXNpc1JlcG9ydCogcGFyKQkJCQkKK3sKKwlpbnQgc3VjY2VzcyA9IDA7CisKKwkvKiBpbWFnZSBpbmZvcm1hdGlvbiAqLworCWludCBoZWlnaHQsIHdpZHRoOworCWlmICggISBpbWFxR2V0SW1hZ2VTaXplKGltYWdlLCAmd2lkdGgsICZoZWlnaHQpICkgCXsgcmV0dXJuIHN1Y2Nlc3M7IH0JCisJcGFyLT5pbWFnZVdpZHRoID0gd2lkdGg7CQorCXBhci0+aW1hZ2VIZWlnaHQgPSBoZWlnaHQ7CQorCXBhci0+cGFydGljbGVJbmRleCA9IHBhcnRpY2xlTnVtYmVyOwkJCisKKwkvKiBjZW50ZXIgb2YgbWFzcyBwb2ludCBvZiB0aGUgbGFyZ2VzdCBwYXJ0aWNsZQkqLworCWRvdWJsZSByZXR1cm5Eb3VibGU7CisJc3VjY2VzcyA9IGltYXFNZWFzdXJlUGFydGljbGUoaW1hZ2UsIHBhcnRpY2xlTnVtYmVyLCAwLCBJTUFRX01UX0NFTlRFUl9PRl9NQVNTX1gsICZyZXR1cm5Eb3VibGUpOworCWlmICggIXN1Y2Nlc3MgKQl7IHJldHVybiBzdWNjZXNzOyB9CisJcGFyLT5jZW50ZXJfbWFzc194ID0gKGludClyZXR1cm5Eb3VibGU7CQkJCQkJLy8gcGl4ZWwJCisKKwlzdWNjZXNzID0gaW1hcU1lYXN1cmVQYXJ0aWNsZShpbWFnZSwgcGFydGljbGVOdW1iZXIsIDAsIElNQVFfTVRfQ0VOVEVSX09GX01BU1NfWSwgJnJldHVybkRvdWJsZSk7CQorCWlmICggIXN1Y2Nlc3MgKQl7IHJldHVybiBzdWNjZXNzOyB9CisJcGFyLT5jZW50ZXJfbWFzc195ID0gKGludClyZXR1cm5Eb3VibGU7CQkJCQkJLy8gcGl4ZWwJCQorCQorCS8qIHBhcnRpY2xlIHNpemUgc3RhdGlzdGljcyAqLyAKKwlzdWNjZXNzID0gaW1hcU1lYXN1cmVQYXJ0aWNsZShpbWFnZSwgcGFydGljbGVOdW1iZXIsIDAsIElNQVFfTVRfQVJFQSwgJnJldHVybkRvdWJsZSk7CQorCWlmICggIXN1Y2Nlc3MgKQl7IHJldHVybiBzdWNjZXNzOyB9CisJcGFyLT5wYXJ0aWNsZUFyZWEgPSByZXR1cm5Eb3VibGU7CQorCQorCXN1Y2Nlc3MgPSBpbWFxTWVhc3VyZVBhcnRpY2xlKGltYWdlLCBwYXJ0aWNsZU51bWJlciwgMCwgSU1BUV9NVF9CT1VORElOR19SRUNUX1RPUCwgJnJldHVybkRvdWJsZSk7CQorCWlmICggIXN1Y2Nlc3MgKQl7IHJldHVybiBzdWNjZXNzOyB9CisJcGFyLT5ib3VuZGluZ1JlY3QudG9wID0gKGludClyZXR1cm5Eb3VibGU7CisJCisJc3VjY2VzcyA9IGltYXFNZWFzdXJlUGFydGljbGUoaW1hZ2UsIHBhcnRpY2xlTnVtYmVyLCAwLCBJTUFRX01UX0JPVU5ESU5HX1JFQ1RfTEVGVCwgJnJldHVybkRvdWJsZSk7CQorCWlmICggIXN1Y2Nlc3MgKQl7IHJldHVybiBzdWNjZXNzOyB9CisJcGFyLT5ib3VuZGluZ1JlY3QubGVmdCA9IChpbnQpcmV0dXJuRG91YmxlOworCQorCXN1Y2Nlc3MgPSBpbWFxTWVhc3VyZVBhcnRpY2xlKGltYWdlLCBwYXJ0aWNsZU51bWJlciwgMCwgSU1BUV9NVF9CT1VORElOR19SRUNUX0hFSUdIVCwgJnJldHVybkRvdWJsZSk7CQorCWlmICggIXN1Y2Nlc3MgKQl7IHJldHVybiBzdWNjZXNzOyB9CisJcGFyLT5ib3VuZGluZ1JlY3QuaGVpZ2h0ID0gKGludClyZXR1cm5Eb3VibGU7CQorCisJc3VjY2VzcyA9IGltYXFNZWFzdXJlUGFydGljbGUoaW1hZ2UsIHBhcnRpY2xlTnVtYmVyLCAwLCBJTUFRX01UX0JPVU5ESU5HX1JFQ1RfV0lEVEgsICZyZXR1cm5Eb3VibGUpOwkKKwlpZiAoICFzdWNjZXNzICkJeyByZXR1cm4gc3VjY2VzczsgfQorCXBhci0+Ym91bmRpbmdSZWN0LndpZHRoID0gKGludClyZXR1cm5Eb3VibGU7CQorCQorCS8qIHBhcnRpY2xlIHF1YWxpdHkgc3RhdGlzdGljcyAqLyAKKwlzdWNjZXNzID0gaW1hcU1lYXN1cmVQYXJ0aWNsZShpbWFnZSwgcGFydGljbGVOdW1iZXIsIDAsIElNQVFfTVRfQVJFQV9CWV9JTUFHRV9BUkVBLCAmcmV0dXJuRG91YmxlKTsJCisJaWYgKCAhc3VjY2VzcyApCXsgcmV0dXJuIHN1Y2Nlc3M7IH0KKwlwYXItPnBhcnRpY2xlVG9JbWFnZVBlcmNlbnQgPSByZXR1cm5Eb3VibGU7CisKKwlzdWNjZXNzID0gaW1hcU1lYXN1cmVQYXJ0aWNsZShpbWFnZSwgcGFydGljbGVOdW1iZXIsIDAsIElNQVFfTVRfQVJFQV9CWV9QQVJUSUNMRV9BTkRfSE9MRVNfQVJFQSwgJnJldHVybkRvdWJsZSk7CQorCWlmICggIXN1Y2Nlc3MgKQl7IHJldHVybiBzdWNjZXNzOyB9CisJcGFyLT5wYXJ0aWNsZVF1YWxpdHkgPSByZXR1cm5Eb3VibGU7CisJCQorCS8qIG5vcm1hbGl6ZWQgcG9zaXRpb24gKC0xIHRvIDEpICovCisJcGFyLT5jZW50ZXJfbWFzc194X25vcm1hbGl6ZWQgPSBSYW5nZVRvTm9ybWFsaXplZChwYXItPmNlbnRlcl9tYXNzX3gsIHdpZHRoKTsKKwlwYXItPmNlbnRlcl9tYXNzX3lfbm9ybWFsaXplZCA9IFJhbmdlVG9Ob3JtYWxpemVkKHBhci0+Y2VudGVyX21hc3NfeSwgaGVpZ2h0KTsJCisJCisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKworLyogICBJbWFnZSBFbmhhbmNlbWVudCBmdW5jdGlvbnMgKi8KKworLyoqCisqIEBicmllZiBJbXByb3ZlcyBjb250cmFzdCBvbiBhIGdyYXlzY2FsZSBpbWFnZS4gCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfVTgsIElNQVFfSU1BR0VfSTE2LgorKiBAcGFyYW0gZGVzdCBUaGUgZGVzdGluYXRpb24gaW1hZ2UuCisqIEBwYXJhbSBzb3VyY2UgVGhlIGltYWdlIHRvIGVxdWFsaXplIAorKiBAcGFyYW0gbWluIHRoZSBzbWFsbGVzdCB2YWx1ZSB1c2VkIGZvciBwcm9jZXNzaW5nLiBBZnRlciBwcm9jZXNzaW5nLCBhbGwgcGl4ZWwgdmFsdWVzIHRoYXQgYXJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgTWluaW11bSBpbiB0aGUgb3JpZ2luYWwgaW1hZ2UgYXJlIHNldCB0byAwIGZvciBhbiA4LWJpdCBpbWFnZS4gSW4gMTYtYml0IGFuZCBmbG9hdGluZy1wb2ludCBpbWFnZXMsIHRoZXNlIHBpeGVsIHZhbHVlcyBhcmUgc2V0IHRvIHRoZSBzbWFsbGVzdCBwaXhlbCB2YWx1ZSBmb3VuZCBpbiB0aGUgb3JpZ2luYWwgaW1hZ2UuIAorKiBAcGFyYW0gbWF4IHRoZSBsYXJnZXN0IHZhbHVlIHVzZWQgZm9yIHByb2Nlc3NpbmcuIEFmdGVyIHByb2Nlc3NpbmcsIGFsbCBwaXhlbCB2YWx1ZXMgdGhhdCBhcmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBNYXhpbXVtIGluIHRoZSBvcmlnaW5hbCBpbWFnZSBhcmUgc2V0IHRvIDI1NSBmb3IgYW4gOC1iaXQgaW1hZ2UuIEluIDE2LWJpdCBhbmQgZmxvYXRpbmctcG9pbnQgaW1hZ2VzLCB0aGVzZSBwaXhlbCB2YWx1ZXMgYXJlIHNldCB0byB0aGUgbGFyZ2VzdCBwaXhlbCB2YWx1ZSBmb3VuZCBpbiB0aGUgb3JpZ2luYWwgaW1hZ2UuIAorKiBAcGFyYW0gbWFzayBhbiA4LWJpdCBpbWFnZSB0aGF0IHNwZWNpZmllcyB0aGUgcmVnaW9uIG9mIHRoZSBzbWFsbCBpbWFnZSB0aGF0IHdpbGwgYmUgY29waWVkLiBPbmx5IHRob3NlIHBpeGVscyBpbiB0aGUgSW1hZ2UgU3JjIChTbWFsbCkgaW1hZ2UgdGhhdCBjb3JyZXNwb25kIHRvIGFuIGVxdWl2YWxlbnQgbm9uLXplcm8gcGl4ZWwgaW4gdGhlIG1hc2sgaW1hZ2UgYXJlIGNvcGllZC4gQWxsIG90aGVyIHBpeGVscyBrZWVwIHRoZWlyIG9yaWdpbmFsIHZhbHVlcy4gVGhlIGVudGlyZSBpbWFnZSBpcyBwcm9jZXNzZWQgaWYgSW1hZ2UgTWFzayBpcyBOVUxMIG9yIHRoaXMgcGFyYW1ldGVyIGlzIG9taXR0ZWQuCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLgorKgorKiAgb3B0aW9uIGRlZmF1bHRzOgorKiAgICAgICBzZWFyY2hSZWN0ID0gSU1BUV9OT19SRUNUCisqIAkJbWluTWF0Y2hTY29yZSA9IERFRkFVTFRfTUlOTUFYX1NDT1JFICg4MDApICAKKyovCitpbnQgZnJjRXF1YWxpemUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGZsb2F0IG1pbiwgZmxvYXQgbWF4KQorewlyZXR1cm4gZnJjRXF1YWxpemUoZGVzdCwgc291cmNlLCBtaW4sIG1heCwgTlVMTCk7ICB9CisKK2ludCBmcmNFcXVhbGl6ZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgZmxvYXQgbWluLCBmbG9hdCBtYXgsIGNvbnN0IEltYWdlKiBtYXNrKQoreworCXJldHVybiBpbWFxRXF1YWxpemUoZGVzdCwgc291cmNlLCBtaW4sIG1heCwgbWFzayk7Cit9CisKKy8qKgorKiBAYnJpZWYgSW1wcm92ZXMgY29udHJhc3Qgb24gYSBjb2xvciBpbWFnZS4gCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfUkdCLCBJTUFRX0lNQUdFX0hTTAorKiAKKyogb3B0aW9uIGRlZmF1bHRzOiBjb2xvckVxdWFsaXphdGlvbiA9IFRSVUUgdG8gZXF1YWxpemUgYWxsIHRocmVlIHBsYW5lcyBvZiB0aGUgaW1hZ2UgICAgICAgICAKKyogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuICAgIAorKiBAcGFyYW0gZGVzdCBUaGUgZGVzdGluYXRpb24gaW1hZ2UuCisqIEBwYXJhbSBzb3VyY2UgVGhlIGltYWdlIHRvIGVxdWFsaXplIAorKiBAcGFyYW0gY29sb3JFcXVhbGl6YXRpb24gU2V0IHRoaXMgcGFyYW1ldGVyIHRvIFRSVUUgdG8gZXF1YWxpemUgYWxsIHRocmVlIHBsYW5lcyBvZiB0aGUgaW1hZ2UgKHRoZSBkZWZhdWx0KS4gU2V0IHRoaXMgcGFyYW1ldGVyIHRvIEZBTFNFIHRvIGVxdWFsaXplIG9ubHkgdGhlIGx1bWluYW5jZSBwbGFuZS4KKyovCitpbnQgZnJjQ29sb3JFcXVhbGl6ZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSkKK3sKKwlyZXR1cm4gaW1hcUNvbG9yRXF1YWxpemUoZGVzdCwgc291cmNlLCBUUlVFKTsKK30KKworaW50IGZyY0NvbG9yRXF1YWxpemUoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGludCBjb2xvckVxdWFsaXphdGlvbikKK3sKKwlyZXR1cm4gaW1hcUNvbG9yRXF1YWxpemUoZGVzdCwgc291cmNlLCBUUlVFKTsKK30KKworLyogICBJbWFnZSBDb252ZXJzaW9uIGZ1bmN0aW9ucyAqLworCisvKioKKyogQGJyaWVmIEF1dG9tYXRpY2FsbHkgdGhyZXNob2xkcyBhIGdyYXlzY2FsZSBpbWFnZSBpbnRvIGEgYmluYXJ5IGltYWdlIGZvciBQYXJ0aWNsZSBBbmFseXNpcyBiYXNlZCBvbiBhIHNtYXJ0IHRocmVzaG9sZC4gCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfUkdCLCBJTUFRX0lNQUdFX0kxNgorKiBAcGFyYW0gZGVzdCBUaGUgZGVzdGluYXRpb24gaW1hZ2UuCisqIEBwYXJhbSBzb3VyY2UgVGhlIGltYWdlIHRvIHRocmVzaG9sZCAKKyogQHBhcmFtIHdpbmRvd1dpZHRoIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ3VsYXIgd2luZG93IGFyb3VuZCB0aGUgcGl4ZWwgb24gd2hpY2ggdGhlIGZ1bmN0aW9uCisqICBwZXJmb3JtcyB0aGUgbG9jYWwgdGhyZXNob2xkLiBUaGlzIG51bWJlciBtdXN0IGJlIGF0IGxlYXN0IDMgYW5kIGNhbm5vdCBiZSBsYXJnZXIgdGhhbiB0aGUgd2lkdGggb2Ygc291cmNlCisqIEBwYXJhbSB3aW5kb3dIZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ3VsYXIgd2luZG93IGFyb3VuZCB0aGUgcGl4ZWwgb24gd2hpY2ggdGhlIGZ1bmN0aW9uIAorKiBwZXJmb3JtcyB0aGUgbG9jYWwgdGhyZXNob2xkLiBUaGlzIG51bWJlciBtdXN0IGJlIGF0IGxlYXN0IDMgYW5kIGNhbm5vdCBiZSBsYXJnZXIgdGhhbiB0aGUgaGVpZ2h0IG9mIHNvdXJjZQorKiBAcGFyYW0gbWV0aG9kIFNwZWNpZmllcyB0aGUgbG9jYWwgdGhyZXNob2xkaW5nIG1ldGhvZCB0aGUgZnVuY3Rpb24gdXNlcy4gVmFsdWUgY2FuIGJlIElNQVFfTklCTEFDSyAKKyogKHdoaWNoIGNvbXB1dGVzIHRocmVzaG9sZHMgZm9yIGVhY2ggcGl4ZWwgYmFzZWQgb24gaXRzIGxvY2FsIHN0YXRpc3RpY3MgdXNpbmcgdGhlIE5pYmxhY2sgbG9jYWwgdGhyZXNob2xkaW5nCisqIGFsZ29yaXRobS4pLCBvciBJTUFRX0JBQ0tHUk9VTkRfQ09SUkVDVElPTiAod2hpY2ggZG9lcyBiYWNrZ3JvdW5kIGNvcnJlY3Rpb24gZmlyc3QgdG8gZWxpbWluYXRlIG5vbi11bmlmb3JtIAorKiBsaWdodGluZyBlZmZlY3RzLCB0aGVuIHBlcmZvcm1zIHRocmVzaG9sZGluZyB1c2luZyB0aGUgT3RzdSB0aHJlc2hvbGRpbmcgYWxnb3JpdGhtKQorKiBAcGFyYW0gZGV2aWF0aW9uV2VpZ2h0IFNwZWNpZmllcyB0aGUgayBjb25zdGFudCB1c2VkIGluIHRoZSBOaWJsYWNrIGxvY2FsIHRocmVzaG9sZGluZyBhbGdvcml0aG0sIHdoaWNoIAorKiBkZXRlcm1pbmVzIHRoZSB3ZWlnaHQgYXBwbGllZCB0byB0aGUgdmFyaWFuY2UgY2FsY3VsYXRpb24uIFZhbGlkIGsgY29uc3RhbnRzIHJhbmdlIGZyb20gMCB0byAxLiBTZXR0aW5nIAorKiB0aGlzIHZhbHVlIHRvIDAgd2lsbCBpbmNyZWFzZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGZ1bmN0aW9uIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIHdpbGwgbm90IGNhbGN1bGF0ZSB0aGUgCisqIHZhcmlhbmNlIGZvciBhbnkgb2YgdGhlIHBpeGVscy4gVGhlIGZ1bmN0aW9uIGlnbm9yZXMgdGhpcyB2YWx1ZSBpZiBtZXRob2QgaXMgbm90IHNldCB0byBJTUFRX05JQkxBQ0sKKyogQHBhcmFtIHR5cGUgU3BlY2lmaWVzIHRoZSB0eXBlIG9mIG9iamVjdHMgZm9yIHdoaWNoIHlvdSB3YW50IHRvIGxvb2suIFZhbHVlcyBjYW4gYmUgSU1BUV9CUklHSFRfT0JKRUNUUyAKKyogb3IgSU1BUV9EQVJLX09CSkVDVFMuCisqIEBwYXJhbSByZXBsYWNlVmFsdWUgU3BlY2lmaWVzIHRoZSByZXBsYWNlbWVudCB2YWx1ZSB0aGUgZnVuY3Rpb24gdXNlcyBmb3IgdGhlIHBpeGVscyBvZiB0aGUga2VwdCBvYmplY3RzIAorKiBpbiB0aGUgZGVzdGluYXRpb24gaW1hZ2UuCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNTbWFydFRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgCisJCXVuc2lnbmVkIGludCB3aW5kb3dXaWR0aCwgdW5zaWduZWQgaW50IHdpbmRvd0hlaWdodCwgTG9jYWxUaHJlc2hvbGRNZXRob2QgbWV0aG9kLCAKKwkJZG91YmxlIGRldmlhdGlvbldlaWdodCwgT2JqZWN0VHlwZSB0eXBlKQoreworCWZsb2F0IHJlcGxhY2VWYWx1ZSA9IDEuMDsKKwlyZXR1cm4gaW1hcUxvY2FsVGhyZXNob2xkKGRlc3QsIHNvdXJjZSwgd2luZG93V2lkdGgsIHdpbmRvd0hlaWdodCwgbWV0aG9kLCAKKwkJCWRldmlhdGlvbldlaWdodCwgdHlwZSwgcmVwbGFjZVZhbHVlKTsKK30KKworaW50IGZyY1NtYXJ0VGhyZXNob2xkKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCAKKwkJdW5zaWduZWQgaW50IHdpbmRvd1dpZHRoLCB1bnNpZ25lZCBpbnQgd2luZG93SGVpZ2h0LCBMb2NhbFRocmVzaG9sZE1ldGhvZCBtZXRob2QsIAorCQlkb3VibGUgZGV2aWF0aW9uV2VpZ2h0LCBPYmplY3RUeXBlIHR5cGUsIGZsb2F0IHJlcGxhY2VWYWx1ZSkKK3sKKwlyZXR1cm4gaW1hcUxvY2FsVGhyZXNob2xkKGRlc3QsIHNvdXJjZSwgd2luZG93V2lkdGgsIHdpbmRvd0hlaWdodCwgbWV0aG9kLCAKKwkJCWRldmlhdGlvbldlaWdodCwgdHlwZSwgcmVwbGFjZVZhbHVlKTsKK30KKworLyoqCisqIEBicmllZiBDb252ZXJ0cyBhIGdyYXlzY2FsZSBpbWFnZSB0byBhIGJpbmFyeSBpbWFnZSBmb3IgUGFydGljbGUgQW5hbHlzaXMgYmFzZWQgb24gYSBmaXhlZCB0aHJlc2hvbGQuIAorKiBUaGUgZnVuY3Rpb24gc2V0cyBwaXhlbHMgdmFsdWVzIG91dHNpZGUgb2YgdGhlIGdpdmVuIHJhbmdlIHRvIDAuIFRoZSBmdW5jdGlvbiBzZXRzIHBpeGVsIHZhbHVlcyAKKyogd2l0aGluIHRoZSByYW5nZSB0byBhIGdpdmVuIHZhbHVlIG9yIGxlYXZlcyB0aGUgdmFsdWVzIHVuY2hhbmdlZC4gCisqIFVzZSB0aGUgc2ltcGxpZmllZCBjYWxsIHRvIGxlYXZlIHBpeGVsIHZhbHVlcyB1bmNoYW5nZWQuCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfUkdCLCBJTUFRX0lNQUdFX0kxNi4KKyogCisqIEBwYXJhbSBkZXN0IFRoZSBkZXN0aW5hdGlvbiBpbWFnZS4KKyogQHBhcmFtIHNvdXJjZSBUaGUgaW1hZ2UgdG8gdGhyZXNob2xkIAorKiBAcGFyYW0gcmFuZ2VNaW4gVGhlIGxvd2VyIGJvdW5kYXJ5IG9mIHRoZSByYW5nZSBvZiBwaXhlbCB2YWx1ZXMgdG8ga2VlcAorKiBAcGFyYW0gcmFuZ2VNYXggVGhlIHVwcGVyIGJvdW5kYXJ5IG9mIHRoZSByYW5nZSBvZiBwaXhlbCB2YWx1ZXMgdG8ga2VlcC4KKyogCisqIEByZXR1cm4gaW50IC0gZXJyb3IgY29kZTogMCA9IGVycm9yLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuCisqLworaW50IGZyY1NpbXBsZVRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgZmxvYXQgcmFuZ2VNaW4sIGZsb2F0IHJhbmdlTWF4KQoreworCWludCBuZXdWYWx1ZSA9IDI1NTsKKwlyZXR1cm4gZnJjU2ltcGxlVGhyZXNob2xkKGRlc3QsIHNvdXJjZSwgcmFuZ2VNaW4sIHJhbmdlTWF4LCBuZXdWYWx1ZSk7Cit9CisKKy8qKgorKiBAYnJpZWYgQ29udmVydHMgYSBncmF5c2NhbGUgaW1hZ2UgdG8gYSBiaW5hcnkgaW1hZ2UgZm9yIFBhcnRpY2xlIEFuYWx5c2lzIGJhc2VkIG9uIGEgZml4ZWQgdGhyZXNob2xkLiAKKyogVGhlIGZ1bmN0aW9uIHNldHMgcGl4ZWxzIHZhbHVlcyBvdXRzaWRlIG9mIHRoZSBnaXZlbiByYW5nZSB0byAwLiBUaGUgZnVuY3Rpb24gc2V0cyAKKyogcGl4ZWwgdmFsdWVzIHdpdGhpbiB0aGUgcmFuZ2UgdG8gdGhlIGdpdmVuIHZhbHVlLiAKKyogU3VwcG9ydHMgSU1BUV9JTUFHRV9SR0IsIElNQVFfSU1BR0VfSTE2LgorKiAKKyogQHBhcmFtIGRlc3QgVGhlIGRlc3RpbmF0aW9uIGltYWdlLgorKiBAcGFyYW0gc291cmNlIFRoZSBpbWFnZSB0byB0aHJlc2hvbGQgCisqIEBwYXJhbSByYW5nZU1pbiBUaGUgbG93ZXIgYm91bmRhcnkgb2YgdGhlIHJhbmdlIG9mIHBpeGVsIHZhbHVlcyB0byBrZWVwCisqIEBwYXJhbSByYW5nZU1heCBUaGUgdXBwZXIgYm91bmRhcnkgb2YgdGhlIHJhbmdlIG9mIHBpeGVsIHZhbHVlcyB0byBrZWVwLgorKiBAcGFyYW0gbmV3VmFsdWUgVGhlIHJlcGxhY2VtZW50IHZhbHVlIGZvciBwaXhlbHMgd2l0aGluIHRoZSByYW5nZS4gVXNlIHRoZSBzaW1wbGlmaWVkIGNhbGwgdG8gbGVhdmUgdGhlIHBpeGVsIHZhbHVlcyB1bmNoYW5nZWQgCisqIAorKiBAcmV0dXJuIGludCAtIGVycm9yIGNvZGU6IDAgPSBlcnJvci4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNTaW1wbGVUaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGZsb2F0IHJhbmdlTWluLCBmbG9hdCByYW5nZU1heCwgZmxvYXQgbmV3VmFsdWUpCit7CisJaW50IHVzZU5ld1ZhbHVlID0gVFJVRTsKKwlyZXR1cm4gaW1hcVRocmVzaG9sZChkZXN0LCBzb3VyY2UsIHJhbmdlTWluLCByYW5nZU1heCwgdXNlTmV3VmFsdWUsIG5ld1ZhbHVlKTsKK30KKworLyoqCisqIEBicmllZiBBcHBsaWVzIGEgdGhyZXNob2xkIHRvIHRoZSBSZWQsIEdyZWVuLCBhbmQgQmx1ZSB2YWx1ZXMgb2YgYSBSR0IgaW1hZ2Ugb3IgdGhlIEh1ZSwgCisqIFNhdHVyYXRpb24sIEx1bWluYW5jZSB2YWx1ZXMgZm9yIGEgSFNMIGltYWdlLiAKKyogU3VwcG9ydHMgSU1BUV9JTUFHRV9SR0IsIElNQVFfSU1BR0VfSFNMLgorKiBUaGlzIHNpbXBsZXIgdmVyc2lvbiBmaWx0ZXJzIGJhc2VkIG9uIGEgaHVlIHJhbmdlIGluIHRoZSBIU0wgbW9kZS4KKyogCisqIEBwYXJhbSBkZXN0IFRoZSBkZXN0aW5hdGlvbiBpbWFnZS4gVGhpcyBtdXN0IGJlIGEgSU1BUV9JTUFHRV9VOCBpbWFnZS4KKyogQHBhcmFtIHNvdXJjZSBUaGUgaW1hZ2UgdG8gdGhyZXNob2xkIAorKiBAcGFyYW0gbW9kZSBUaGUgY29sb3Igc3BhY2UgdG8gcGVyZm9ybSB0aGUgdGhyZXNob2xkIGluLiB2YWxpZCB2YWx1ZXMgYXJlOiBJTUFRX1JHQiwgSU1BUV9IU0wuCisqIEBwYXJhbSBwbGFuZTFSYW5nZSBUaGUgc2VsZWN0aW9uIHJhbmdlIGZvciB0aGUgZmlyc3QgcGxhbmUgb2YgdGhlIGltYWdlLiBTZXQgdGhpcyBwYXJhbWV0ZXIgdG8gTlVMTCB0byB1c2UgYSBzZWxlY3Rpb24gcmFuZ2UgZnJvbSAwIHRvIDI1NS4KKyogQHBhcmFtIHBsYW5lMlJhbmdlIFRoZSBzZWxlY3Rpb24gcmFuZ2UgZm9yIHRoZSBzZWNvbmQgcGxhbmUgb2YgdGhlIGltYWdlLiBTZXQgdGhpcyBwYXJhbWV0ZXIgdG8gTlVMTCB0byB1c2UgYSBzZWxlY3Rpb24gcmFuZ2UgZnJvbSAwIHRvIDI1NS4KKyogQHBhcmFtIHBsYW5lM1JhbmdlIFRoZSBzZWxlY3Rpb24gcmFuZ2UgZm9yIHRoZSB0aGlyZCBwbGFuZSBvZiB0aGUgaW1hZ2UuIFNldCB0aGlzIHBhcmFtZXRlciB0byBOVUxMIHRvIHVzZSBhIHNlbGVjdGlvbiByYW5nZSBmcm9tIDAgdG8gMjU1LgorKiAKKyogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuCisqICovCitpbnQgZnJjQ29sb3JUaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIENvbG9yTW9kZSBtb2RlLCAKKwkJY29uc3QgUmFuZ2UqIHBsYW5lMVJhbmdlLCBjb25zdCBSYW5nZSogcGxhbmUyUmFuZ2UsIGNvbnN0IFJhbmdlKiBwbGFuZTNSYW5nZSkKK3sKKwlpbnQgcmVwbGFjZVZhbHVlID0gMTsKKwlyZXR1cm4gaW1hcUNvbG9yVGhyZXNob2xkKGRlc3QsIHNvdXJjZSwgcmVwbGFjZVZhbHVlLCBtb2RlLCBwbGFuZTFSYW5nZSwgcGxhbmUyUmFuZ2UsIHBsYW5lM1JhbmdlKTsKK30KKworLyoqCisqIEBicmllZiBBcHBsaWVzIGEgdGhyZXNob2xkIHRvIHRoZSBSZWQsIEdyZWVuLCBhbmQgQmx1ZSB2YWx1ZXMgb2YgYSBSR0IgaW1hZ2Ugb3IgdGhlIEh1ZSwgCisqIFNhdHVyYXRpb24sIEx1bWluYW5jZSB2YWx1ZXMgZm9yIGEgSFNMIGltYWdlLiAKKyogU3VwcG9ydHMgSU1BUV9JTUFHRV9SR0IsIElNQVFfSU1BR0VfSFNMLgorKiBUaGUgc2ltcGxlciB2ZXJzaW9uIGZpbHRlcnMgYmFzZWQgb24gYSBodWUgcmFuZ2UgaW4gdGhlIEhTTCBtb2RlLgorKiAKKyogQHBhcmFtIGRlc3QgVGhlIGRlc3RpbmF0aW9uIGltYWdlLiBUaGlzIG11c3QgYmUgYSBJTUFRX0lNQUdFX1U4IGltYWdlLgorKiBAcGFyYW0gc291cmNlIFRoZSBpbWFnZSB0byB0aHJlc2hvbGQgCisqIEBwYXJhbSByZXBsYWNlVmFsdWUgVmFsdWUgdG8gYXNzaWduIHRvIHNlbGVjdGVkIHBpeGVscy4gRGVmYXVsdHMgdG8gMSBpZiBzaW1wbGlmaWVkIGNhbGwgaXMgdXNlZC4KKyogQHBhcmFtIG1vZGUgVGhlIGNvbG9yIHNwYWNlIHRvIHBlcmZvcm0gdGhlIHRocmVzaG9sZCBpbi4gdmFsaWQgdmFsdWVzIGFyZTogSU1BUV9SR0IsIElNQVFfSFNMLgorKiBAcGFyYW0gcGxhbmUxUmFuZ2UgVGhlIHNlbGVjdGlvbiByYW5nZSBmb3IgdGhlIGZpcnN0IHBsYW5lIG9mIHRoZSBpbWFnZS4gU2V0IHRoaXMgcGFyYW1ldGVyIHRvIE5VTEwgdG8gdXNlIGEgc2VsZWN0aW9uIHJhbmdlIGZyb20gMCB0byAyNTUuCisqIEBwYXJhbSBwbGFuZTJSYW5nZSBUaGUgc2VsZWN0aW9uIHJhbmdlIGZvciB0aGUgc2Vjb25kIHBsYW5lIG9mIHRoZSBpbWFnZS4gU2V0IHRoaXMgcGFyYW1ldGVyIHRvIE5VTEwgdG8gdXNlIGEgc2VsZWN0aW9uIHJhbmdlIGZyb20gMCB0byAyNTUuCisqIEBwYXJhbSBwbGFuZTNSYW5nZSBUaGUgc2VsZWN0aW9uIHJhbmdlIGZvciB0aGUgdGhpcmQgcGxhbmUgb2YgdGhlIGltYWdlLiBTZXQgdGhpcyBwYXJhbWV0ZXIgdG8gTlVMTCB0byB1c2UgYSBzZWxlY3Rpb24gcmFuZ2UgZnJvbSAwIHRvIDI1NS4KKyogCisqIEByZXR1cm4gT24gc3VjY2VzczogMS4gT24gZmFpbHVyZTogMC4gVG8gZ2V0IGV4dGVuZGVkIGVycm9yIGluZm9ybWF0aW9uLCBjYWxsIEdldExhc3RFcnJvcigpLgorKi8KK2ludCBmcmNDb2xvclRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgaW50IHJlcGxhY2VWYWx1ZSwgQ29sb3JNb2RlIG1vZGUsIAorCQljb25zdCBSYW5nZSogcGxhbmUxUmFuZ2UsIGNvbnN0IFJhbmdlKiBwbGFuZTJSYW5nZSwgY29uc3QgUmFuZ2UqIHBsYW5lM1JhbmdlKQorewlyZXR1cm4gaW1hcUNvbG9yVGhyZXNob2xkKGRlc3QsIHNvdXJjZSwgcmVwbGFjZVZhbHVlLCBtb2RlLCBwbGFuZTFSYW5nZSwgcGxhbmUyUmFuZ2UsIHBsYW5lM1JhbmdlKTt9CisKKworLyoqCisqIEBicmllZiBBIHNpbXBsZXIgdmVyc2lvbiBvZiBDb2xvclRocmVzaG9sZCB0aGF0IHRocmVzaG9sZHMgaHVlIHJhbmdlIGluIHRoZSBIU0wgbW9kZS4gU3VwcG9ydHMgSU1BUV9JTUFHRV9SR0IsIElNQVFfSU1BR0VfSFNMLgorKiBAcGFyYW0gZGVzdCBUaGUgZGVzdGluYXRpb24gaW1hZ2UuCisqIEBwYXJhbSBzb3VyY2UgVGhlIGltYWdlIHRvIHRocmVzaG9sZCAKKyogQHBhcmFtIGh1ZVJhbmdlIFRoZSBzZWxlY3Rpb24gcmFuZ2UgZm9yIHRoZSBodWUgKGNvbG9yKS4gCisqIEBwYXJhbSBtaW5TYXR1cmF0aW9uIFRoZSBtaW5pbXVtIHNhdHVyYXRpb24gdmFsdWUgKDEtMjU1KS4gIElmIG5vdCB1c2VkLCBERUZBVUxUX1NBVFVSQVRJT05fVEhSRVNIT0xEIGlzIHRoZSBkZWZhdWx0LgorKiAKKyogQHJldHVybiBPbiBzdWNjZXNzOiAxLiBPbiBmYWlsdXJlOiAwLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuCisqLworaW50IGZyY0h1ZVRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgY29uc3QgUmFuZ2UqIGh1ZVJhbmdlKQoreyByZXR1cm4gZnJjSHVlVGhyZXNob2xkKGRlc3QsIHNvdXJjZSwgaHVlUmFuZ2UsIERFRkFVTFRfU0FUVVJBVElPTl9USFJFU0hPTEQpOyB9CisKK2ludCBmcmNIdWVUaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGNvbnN0IFJhbmdlKiBodWVSYW5nZSwgaW50IG1pblNhdHVyYXRpb24pCit7CisJLy8gYXNzdW1lIEhTTCBtb2RlCisJQ29sb3JNb2RlIG1vZGUgPSBJTUFRX0hTTDsgIAorCS8vIFNldCBzYXR1cmF0aW9uIDEwMCAtIDI1NQorCVJhbmdlIHNhdFJhbmdlOyAgc2F0UmFuZ2UubWluVmFsdWUgPSBtaW5TYXR1cmF0aW9uOyBzYXRSYW5nZS5tYXhWYWx1ZSA9IDI1NTsKKwkvLyBTZXQgbHVtaW5hbmNlIDEwMCAtIDI1NQorCVJhbmdlIGx1bVJhbmdlOyAgbHVtUmFuZ2UubWluVmFsdWUgPSAxMDA7IGx1bVJhbmdlLm1heFZhbHVlID0gMjU1OworCS8vIFJlcGxhY2UgcGl4ZWxzIHdpdGggMSBpZiBwYXNzIHRocmVzaG9sZCBmaWx0ZXIKKwlpbnQgcmVwbGFjZVZhbHVlID0gMTsKKwlyZXR1cm4gaW1hcUNvbG9yVGhyZXNob2xkKGRlc3QsIHNvdXJjZSwgcmVwbGFjZVZhbHVlLCBtb2RlLCBodWVSYW5nZSwgJnNhdFJhbmdlLCAmbHVtUmFuZ2UpOworfQorCisvKioKKyogQGJyaWVmIEV4dHJhY3RzIHRoZSBSZWQsIEdyZWVuLCBCbHVlLCBvciBIdWUsIFNhdHVyYXRpb24gb3IgTHVtaW5hbmNlIGluZm9ybWF0aW9uIGZyb20gYSBjb2xvciBpbWFnZS4gCisqIFN1cHBvcnRzIElNQVFfSU1BR0VfUkdCLCBJTUFRX0lNQUdFX0hTTCwgSU1BUV9JTUFHRV9SR0JfVTY0LgorKiAKKyogQHBhcmFtIGltYWdlIFRoZSBzb3VyY2UgaW1hZ2UgdGhhdCB0aGUgZnVuY3Rpb24gZXh0cmFjdHMgdGhlIHBsYW5lcyBmcm9tLgorKiBAcGFyYW0gbW9kZSBUaGUgY29sb3Igc3BhY2UgdGhhdCB0aGUgZnVuY3Rpb24gZXh0cmFjdHMgdGhlIHBsYW5lcyBmcm9tLiBWYWxpZCB2YWx1ZXMgYXJlIElNQVFfUkdCLCBJTUFRX0hTTCwgSU1BUV9IU1YsIElNQVFfSFNJLgorKiBAcGFyYW0gcGxhbmUxIE9uIHJldHVybiwgdGhlIGZpcnN0IGV4dHJhY3RlZCBwbGFuZS4gU2V0IHRoaXMgcGFyYW1ldGVyIHRvIE5VTEwgaWYgeW91IGRvIG5vdCBuZWVkIHRoaXMgaW5mb3JtYXRpb24uIFJHQi1SZWQsIEhTTC9IU1YvSFNJLUh1ZS4KKyogQHBhcmFtIHBsYW5lMiBPbiByZXR1cm4sIHRoZSBzZWNvbmQgZXh0cmFjdGVkIHBsYW5lLiBTZXQgdGhpcyBwYXJhbWV0ZXIgdG8gTlVMTCBpZiB5b3UgZG8gbm90IG5lZWQgdGhpcyBpbmZvcm1hdGlvbi4gUkdCLUdyZWVuLCBIU0wvSFNWL0hTSS1TYXR1cmF0aW9uLgorKiBAcGFyYW0gcGxhbmUzIE9uIHJldHVybiwgdGhlIHRoaXJkIGV4dHJhY3RlZCBwbGFuZS4gU2V0IHRoaXMgcGFyYW1ldGVyIHRvIE5VTEwgaWYgeW91IGRvIG5vdCBuZWVkIHRoaXMgaW5mb3JtYXRpb24uIFJHQi1CbHVlLCBIU0wtTHVtaW5hbmNlLCBIU1YtVmFsdWUsIEhTSS1JbnRlbnNpdHkuCisqCisqIEByZXR1cm4gZXJyb3IgY29kZTogMCA9IGVycm9yLiBUbyBnZXQgZXh0ZW5kZWQgZXJyb3IgaW5mb3JtYXRpb24sIGNhbGwgR2V0TGFzdEVycm9yKCkuCisqLworaW50IGZyY0V4dHJhY3RDb2xvclBsYW5lcyhjb25zdCBJbWFnZSogaW1hZ2UsIENvbG9yTW9kZSBtb2RlLCAKKwkJSW1hZ2UqIHBsYW5lMSwgSW1hZ2UqIHBsYW5lMiwgSW1hZ2UqIHBsYW5lMykKK3sJcmV0dXJuIGltYXFFeHRyYWN0Q29sb3JQbGFuZXMoaW1hZ2UsIG1vZGUsIHBsYW5lMSwgcGxhbmUyLCBwbGFuZTMpOyB9CisKKy8qKgorKiBAYnJpZWYgRXh0cmFjdHMgdGhlIEh1ZSBpbmZvcm1hdGlvbiBmcm9tIGEgY29sb3IgaW1hZ2UuIFN1cHBvcnRzIElNQVFfSU1BR0VfUkdCLCBJTUFRX0lNQUdFX0hTTCwgSU1BUV9JTUFHRV9SR0JfVTY0IAorKiAKKyogQHBhcmFtIGltYWdlIFRoZSBzb3VyY2UgaW1hZ2UgdGhhdCB0aGUgZnVuY3Rpb24gZXh0cmFjdHMgdGhlIHBsYW5lIGZyb20uCisqIEBwYXJhbSBodWVQbGFuZSBPbiByZXR1cm4sIHRoZSBleHRyYWN0ZWQgaHVlIHBsYW5lLiAKKyogQHBhcmFtIG1pblNhdHVyYXRpb24gdGhlIG1pbmltdW0gc2F0dXJhdGlvbiBsZXZlbCByZXF1aXJlZCAwLTI1NSAodHJ5IDUwKSAgCisqICAgICAgICAgIAorKiBAcmV0dXJuIE9uIHN1Y2Nlc3M6IDEuIE9uIGZhaWx1cmU6IDAuIFRvIGdldCBleHRlbmRlZCBlcnJvciBpbmZvcm1hdGlvbiwgY2FsbCBHZXRMYXN0RXJyb3IoKS4gICAgIAorKi8KK2ludCBmcmNFeHRyYWN0SHVlUGxhbmUoY29uc3QgSW1hZ2UqIGltYWdlLCBJbWFnZSogaHVlUGxhbmUpCit7CisJcmV0dXJuIGZyY0V4dHJhY3RIdWVQbGFuZShpbWFnZSwgaHVlUGxhbmUsIERFRkFVTFRfU0FUVVJBVElPTl9USFJFU0hPTEQpOworfQorCitpbnQgZnJjRXh0cmFjdEh1ZVBsYW5lKGNvbnN0IEltYWdlKiBpbWFnZSwgSW1hZ2UqIGh1ZVBsYW5lLCBpbnQgbWluU2F0dXJhdGlvbikKK3sKKwlyZXR1cm4gZnJjRXh0cmFjdENvbG9yUGxhbmVzKGltYWdlLCBJTUFRX0hTTCwgaHVlUGxhbmUsIE5VTEwsIE5VTEwpOworfQorCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL2Fvcy9leHRlcm5hbHMvV1BJTGliL1dQSUxpYi9WaXNpb24yMDA5L1Zpc2lvbkFQSS5oIGIvYW9zL2V4dGVybmFscy9XUElMaWIvV1BJTGliL1Zpc2lvbjIwMDkvVmlzaW9uQVBJLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE2NjNmOAotLS0gL2Rldi9udWxsCisrKyBiL2Fvcy9leHRlcm5hbHMvV1BJTGliL1dQSUxpYi9WaXNpb24yMDA5L1Zpc2lvbkFQSS5oCkBAIC0wLDAgKzEsMTYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIFByb2plY3QgICAJCTogRklSU1QgTW90b3IgQ29udHJvbGxlcgorKiAgRmlsZSBOYW1lICAJCTogVmlzaW9uQVBJLmggICAgICAgICAgCisqICBDb250cmlidXRvcnMgICAJOiBFTEYsIEpERywgQVJLLCBFTUYKKyogIENyZWF0aW9uIERhdGUgCTogSnVuZSAyMiwgMjAwOAorKiAgUmV2aXNpb24gSGlzdG9yeQk6IFNvdXJjZSBjb2RlICYgcmV2aXNpb24gaGlzdG9yeSBtYWludGFpbmVkIGF0IHNvdXJjZWZvcmdlLldQSS5lZHUgICAgCisqICBGaWxlIERlc2NyaXB0aW9uCTogR2xvYmFsbHkgZGVmaW5lZCB2YWx1ZXMgZm9yIHRoZSBGSVJTVCBWaXNpb24gQVBJCisqIAorKiAgQVBJOiBCZWNhdXNlIG5pdmlzaW9uLmggdXNlcyBDKysgc3R5bGUgY29tbWVudHMsIGFueSBmaWxlIGluY2x1ZGluZyB0aGlzCisqICBtdXN0IGJlIGEgLmNwcCAobm90IC5jKS4KKyovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogICAgICAgIENvcHlyaWdodCAoYykgRklSU1QgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBPcGVuIFNvdXJjZSBTb2Z0d2FyZSAtIG1heSBiZSBtb2RpZmllZCBhbmQgc2hhcmVkIGJ5IEZSQyB0ZWFtcy4gVGhlIGNvZGUgICovCisvKiAgbXVzdCBiZSBhY2NvbXBhbmllZCBieSB0aGUgRklSU1QgQlNEIGxpY2Vuc2UgZmlsZSBpbiAkKFdJTkRfQkFTRSkvV1BJTGliLiAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBfX1ZJU0lPTkFQSV9IX18KKyNkZWZpbmUgX19WSVNJT05BUElfSF9fCisKKyNpbmNsdWRlICJuaXZpc2lvbi5oIiAKKworLyogICBDb25zdGFudHMgKi8KKworI2RlZmluZSBERUZBVUxUX0JPUkRFUl9TSVpFCQkJCTMJCS8vVmlzaW9uQVBJLmZyY0NyZWF0ZUltYWdlCisjZGVmaW5lIERFRkFVTFRfU0FUVVJBVElPTl9USFJFU0hPTEQJNDAJCS8vVHJhY2tBUEkuRmluZENvbG9yCisKKy8qICAgRm9yd2FyZCBEZWNsYXJlIERhdGEgU3RydWN0dXJlcyAqLwordHlwZWRlZiBzdHJ1Y3QgRmluZEVkZ2VPcHRpb25zX3N0cnVjdCBGaW5kRWRnZU9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBDaXJjdWxhckVkZ2VSZXBvcnRfc3RydWN0IENpcmN1bGFyRWRnZVJlcG9ydDsKKworLyogICBEYXRhIFN0cnVjdHVyZXMgKi8KKworLyoqICBmcmNQYXJ0aWNsZUFuYWx5c2lzIHJldHVybnMgdGhpcyBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IFBhcnRpY2xlQW5hbHlzaXNSZXBvcnRfc3RydWN0IHsKKwlpbnQgCWltYWdlSGVpZ2h0OworCWludCAJaW1hZ2VXaWR0aDsKKwlkb3VibGUgCWltYWdlVGltZXN0YW1wOwkJCQkKKwlpbnQJCXBhcnRpY2xlSW5kZXg7CQkJCS8vIHRoZSBwYXJ0aWNsZSBpbmRleCBhbmFseXplZAorCS8qIFgtY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgcmVwcmVzZW50aW5nIHRoZSBhdmVyYWdlIHBvc2l0aW9uIG9mIHRoZSAKKwkgKiB0b3RhbCBwYXJ0aWNsZSBtYXNzLCBhc3N1bWluZyBldmVyeSBwb2ludCBpbiB0aGUgcGFydGljbGUgaGFzIGEgY29uc3RhbnQgZGVuc2l0eSAqLworCWludCAJY2VudGVyX21hc3NfeDsgIAkJCS8vIE1lYXN1cmVtZW50VHlwZTogSU1BUV9NVF9DRU5URVJfT0ZfTUFTU19YIAorCS8qIFktY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQgcmVwcmVzZW50aW5nIHRoZSBhdmVyYWdlIHBvc2l0aW9uIG9mIHRoZSAKKwkgKiB0b3RhbCBwYXJ0aWNsZSBtYXNzLCBhc3N1bWluZyBldmVyeSBwb2ludCBpbiB0aGUgcGFydGljbGUgaGFzIGEgY29uc3RhbnQgZGVuc2l0eSAqLworCWludCAJY2VudGVyX21hc3NfeTsgIAkJCS8vIE1lYXN1cmVtZW50VHlwZTogSU1BUV9NVF9DRU5URVJfT0ZfTUFTU19ZIAorCWRvdWJsZSAJY2VudGVyX21hc3NfeF9ub3JtYWxpemVkOyAgCS8vQ2VudGVyIG9mIG1hc3MgeCB2YWx1ZSBub3JtYWxpemVkIHRvIC0xLjAgdG8gKzEuMCByYW5nZQorCWRvdWJsZSAJY2VudGVyX21hc3NfeV9ub3JtYWxpemVkOyAgCS8vQ2VudGVyIG9mIG1hc3MgeSB2YWx1ZSBub3JtYWxpemVkIHRvIC0xLjAgdG8gKzEuMCByYW5nZQorCS8qIEFyZWEgb2YgdGhlIHBhcnRpY2xlICovCisJZG91YmxlIAlwYXJ0aWNsZUFyZWE7CQkJCS8vIE1lYXN1cmVtZW50VHlwZTogSU1BUV9NVF9BUkVBCisJLyogQm91bmRpbmcgUmVjdGFuZ2xlICovCisJUmVjdCAJYm91bmRpbmdSZWN0OwkJCQkvLyBsZWZ0L3RvcC93aWR0aC9oZWlnaHQKKwkvKiBQZXJjZW50YWdlIG9mIHRoZSBwYXJ0aWNsZSBBcmVhIGNvdmVyaW5nIHRoZSBJbWFnZSBBcmVhLiAqLworCWRvdWJsZSAJcGFydGljbGVUb0ltYWdlUGVyY2VudDsJCS8vIE1lYXN1cmVtZW50VHlwZTogSU1BUV9NVF9BUkVBX0JZX0lNQUdFX0FSRUEKKwkvKiBQZXJjZW50YWdlIG9mIHRoZSBwYXJ0aWNsZSBBcmVhIGluIHJlbGF0aW9uIHRvIGl0cyBQYXJ0aWNsZSBhbmQgSG9sZXMgQXJlYSAqLworCWRvdWJsZSAJcGFydGljbGVRdWFsaXR5OwkJCS8vIE1lYXN1cmVtZW50VHlwZTogSU1BUV9NVF9BUkVBX0JZX1BBUlRJQ0xFX0FORF9IT0xFU19BUkVBCit9IFBhcnRpY2xlQW5hbHlzaXNSZXBvcnQ7CisKKy8qKiBUcmFja2luZyBmdW5jdGlvbnMgcmV0dXJuIHRoaXMgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBDb2xvclJlcG9ydF9zdHJ1Y3QgeworCWludAkJbnVtYmVyUGFydGljbGVzRm91bmQ7CQkJCS8vIE51bWJlciBvZiBwYXJ0aWNsZXMgZm91bmQgZm9yIHRoaXMgY29sb3IKKwlpbnQgCWxhcmdlc3RQYXJ0aWNsZU51bWJlcjsJCQkJLy8gVGhlIHBhcnRpY2xlIGluZGV4IG9mIHRoZSBsYXJnZXN0IHBhcnRpY2xlCisJLyogQ29sb3IgaW5mb3JtYXRpb24gKi8KKwlmbG9hdCAJcGFydGljbGVIdWVNYXg7CQkJCS8vIEhpc3RvZ3JhbVJlcG9ydDogaHVlIG1heAorCWZsb2F0IAlwYXJ0aWNsZUh1ZU1pbjsJCQkJLy8gSGlzdG9ncmFtUmVwb3J0OiBodWUgbWF4CisJZmxvYXQgCXBhcnRpY2xlSHVlTWVhbjsJCQkvLyBIaXN0b2dyYW1SZXBvcnQ6IGh1ZSBtZWFuCisJZmxvYXQgCXBhcnRpY2xlU2F0TWF4OwkJCQkvLyBIaXN0b2dyYW1SZXBvcnQ6IHNhdHVyYXRpb24gbWF4CisJZmxvYXQgCXBhcnRpY2xlU2F0TWluOwkJCQkvLyBIaXN0b2dyYW1SZXBvcnQ6IHNhdHVyYXRpb24gbWF4CisJZmxvYXQgCXBhcnRpY2xlU2F0TWVhbjsJCQkvLyBIaXN0b2dyYW1SZXBvcnQ6IHNhdHVyYXRpb24gbWVhbgorCWZsb2F0IAlwYXJ0aWNsZUx1bU1heDsJCQkJLy8gSGlzdG9ncmFtUmVwb3J0OiBsdW1pbmFuY2UgbWF4CisJZmxvYXQgCXBhcnRpY2xlTHVtTWluOwkJCQkvLyBIaXN0b2dyYW1SZXBvcnQ6IGx1bWluYW5jZSAgbWF4CisJZmxvYXQgCXBhcnRpY2xlTHVtTWVhbjsJCQkvLyBIaXN0b2dyYW1SZXBvcnQ6IGx1bWluYW5jZSBtZWFuCit9IENvbG9yUmVwb3J0OworCisKKy8qICAgSW1hZ2UgTWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KKworLyogQ3JlYXRlOiBjYWxscyBpbWFxQ3JlYXRlSW1hZ2UuIEJvcmRlciBzaXplIGlzIHNldCB0byBzb21lIGRlZmF1bHQgdmFsdWUgKi8KK0ltYWdlKiBmcmNDcmVhdGVJbWFnZSggSW1hZ2VUeXBlIHR5cGUgKTsKKworLyogRGlzcG9zZTogY2FsbHMgaW1hcURpc3Bvc2UgKi8KK2ludCBmcmNEaXNwb3NlKCB2b2lkKiBvYmplY3QgKTsKK2ludCBmcmNEaXNwb3NlKCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgLi4uICkgOworCisvKiBDb3B5OiBjYWxscyBpbWFxRHVwbGljYXRlSW1hZ2UgKi8KK2ludCBmcmNDb3B5SW1hZ2UoIEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlICk7CisKKy8qIEltYWdlIEV4dHJhY3Rpb246IENyb3A6IGNhbGxzIGltYXFTY2FsZSAqLworaW50IGZyY0Nyb3AoIEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBSZWN0IHJlY3QgKTsKKworLyogSW1hZ2UgRXh0cmFjdGlvbjogU2NhbGU6IGNhbGxzIGltYXFTY2FsZS4gIFNjYWxlcyBlbnRpcmUgaW1hZ2UgKi8KK2ludCBmcmNTY2FsZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgaW50IHhTY2FsZSwgaW50IHlTY2FsZSwgU2NhbGluZ01vZGUgc2NhbGVNb2RlICk7CisKKy8qIFJlYWQgSW1hZ2UgOiBjYWxscyBpbWFxUmVhZEZpbGUgKi8KK2ludCBmcmNSZWFkSW1hZ2UoIEltYWdlKiBpbWFnZSwgY29uc3QgY2hhciogZmlsZU5hbWUgKTsKKy8qIFdyaXRlIEltYWdlIDogY2FsbHMgaW1hcVdyaXRlRmlsZSAqLworaW50IGZyY1dyaXRlSW1hZ2UoIGNvbnN0IEltYWdlKiBpbWFnZSwgY29uc3QgY2hhciogZmlsZU5hbWUpOworCisvKiAgIE1lYXN1cmUgSW50ZW5zaXR5IGZ1bmN0aW9ucyAqLworCisvKiBIaXN0b2dyYW06IGNhbGxzIGltYXFIaXN0b2dyYW0gKi8KK0hpc3RvZ3JhbVJlcG9ydCogZnJjSGlzdG9ncmFtKCBjb25zdCBJbWFnZSogaW1hZ2UsIGludCBudW1DbGFzc2VzLCBmbG9hdCBtaW4sIGZsb2F0IG1heCwgUmVjdCByZWN0ICk7CisvKiBDb2xvciBIaXN0b2dyYW06IGNhbGxzIGltYXFDb2xvckhpc3RvZ3JhbTIgKi8KK0NvbG9ySGlzdG9ncmFtUmVwb3J0KiBmcmNDb2xvckhpc3RvZ3JhbShjb25zdCBJbWFnZSogaW1hZ2UsIGludCBudW1DbGFzc2VzLCBDb2xvck1vZGUgbW9kZSwgSW1hZ2UqIG1hc2spOworCisvKiBHZXQgUGl4ZWwgVmFsdWU6IGNhbGxzIGltYXFHZXRQaXhlbCAqLworaW50IGZyY0dldFBpeGVsVmFsdWUoIGNvbnN0IEltYWdlKiBpbWFnZSwgUG9pbnQgcGl4ZWwsIFBpeGVsVmFsdWUqIHZhbHVlICk7CisKKy8qICAgUGFydGljbGUgQW5hbHlzaXMgZnVuY3Rpb25zICovCisKKy8qIFBhcnRpY2xlIEZpbHRlcjogY2FsbHMgaW1hcVBhcnRpY2xlRmlsdGVyMyAqLworaW50IGZyY1BhcnRpY2xlRmlsdGVyKEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBjb25zdCBQYXJ0aWNsZUZpbHRlckNyaXRlcmlhMiogY3JpdGVyaWEsIAorCQlpbnQgY3JpdGVyaWFDb3VudCwgY29uc3QgUGFydGljbGVGaWx0ZXJPcHRpb25zKiBvcHRpb25zLCBSZWN0IHJlY3QsIGludCogbnVtUGFydGljbGVzKTsKK2ludCBmcmNQYXJ0aWNsZUZpbHRlcihJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgY29uc3QgUGFydGljbGVGaWx0ZXJDcml0ZXJpYTIqIGNyaXRlcmlhLCAKKwkJaW50IGNyaXRlcmlhQ291bnQsIGNvbnN0IFBhcnRpY2xlRmlsdGVyT3B0aW9ucyogb3B0aW9ucywgaW50KiBudW1QYXJ0aWNsZXMpOworLyogTW9ycGhvbG9neTogY2FsbHMgaW1hcU1vcnBob2xvZ3kgKi8KK2ludCBmcmNNb3JwaG9sb2d5KEltYWdlKiBkZXN0LCBJbWFnZSogc291cmNlLCBNb3JwaG9sb2d5TWV0aG9kIG1ldGhvZCk7CitpbnQgZnJjTW9ycGhvbG9neShJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgTW9ycGhvbG9neU1ldGhvZCBtZXRob2QsIGNvbnN0IFN0cnVjdHVyaW5nRWxlbWVudCogc3RydWN0dXJpbmdFbGVtZW50KTsKKy8qIFJlamVjdCBCb3JkZXI6IGNhbGxzIGltYXFSZWplY3RCb3JkZXIgKi8KK2ludCBmcmNSZWplY3RCb3JkZXIoSW1hZ2UqIGRlc3QsIEltYWdlKiBzb3VyY2UpOworaW50IGZyY1JlamVjdEJvcmRlcihJbWFnZSogZGVzdCwgSW1hZ2UqIHNvdXJjZSwgaW50IGNvbm5lY3Rpdml0eTgpOworLyogQ291bnQgUGFydGljbGVzOiBjYWxscyBpbWFxQ291bnRQYXJ0aWNsZXMgKi8KK2ludCBmcmNDb3VudFBhcnRpY2xlcyhJbWFnZSogaW1hZ2UsIGludCogbnVtUGFydGljbGVzKTsKKy8qIFBhcnRpY2xlIEFuYWx5c2lzIFJlcG9ydDogY2FsbHMgaW1hcU1lYXN1cmVQYXJ0aWNsZSAqLworaW50IGZyY1BhcnRpY2xlQW5hbHlzaXMoSW1hZ2UqIGltYWdlLCBpbnQgcGFydGljbGVOdW1iZXIsIFBhcnRpY2xlQW5hbHlzaXNSZXBvcnQqIHBhcik7CisKKy8qICAgSW1hZ2UgRW5oYW5jZW1lbnQgZnVuY3Rpb25zICovCisKKy8qIEVxdWFsaXplOiBjYWxscyBpbWFxRXF1YWxpemUgKi8KK2ludCBmcmNFcXVhbGl6ZShJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgZmxvYXQgbWluLCBmbG9hdCBtYXgpOworaW50IGZyY0VxdWFsaXplKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBmbG9hdCBtaW4sIGZsb2F0IG1heCwgY29uc3QgSW1hZ2UqIG1hc2spOworCisvKiBDb2xvciBFcXVhbGl6ZTogY2FsbHMgaW1hcUNvbG9yRXF1YWxpemUgKi8KK2ludCBmcmNDb2xvckVxdWFsaXplKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlKTsKK2ludCBmcmNDb2xvckVxdWFsaXplKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBpbnQgY29sb3JFcXVhbGl6YXRpb24pOworCisvKiAgIEltYWdlIFRocmVzaG9sZGluZyAmIENvbnZlcnNpb24gZnVuY3Rpb25zICovCisKKy8qIFNtYXJ0IFRocmVzaG9sZDogY2FsbHMgaW1hcUxvY2FsVGhyZXNob2xkICovCitpbnQgZnJjU21hcnRUaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIHVuc2lnbmVkIGludCB3aW5kb3dXaWR0aCwgdW5zaWduZWQgaW50IHdpbmRvd0hlaWdodCwgCisJCUxvY2FsVGhyZXNob2xkTWV0aG9kIG1ldGhvZCwgZG91YmxlIGRldmlhdGlvbldlaWdodCwgT2JqZWN0VHlwZSB0eXBlKTsKK2ludCBmcmNTbWFydFRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgdW5zaWduZWQgaW50IHdpbmRvd1dpZHRoLCB1bnNpZ25lZCBpbnQgd2luZG93SGVpZ2h0LCAKKwkJTG9jYWxUaHJlc2hvbGRNZXRob2QgbWV0aG9kLCBkb3VibGUgZGV2aWF0aW9uV2VpZ2h0LCBPYmplY3RUeXBlIHR5cGUsIGZsb2F0IHJlcGxhY2VWYWx1ZSk7CisKKy8qIFNpbXBsZSBUaHJlc2hvbGQ6IGNhbGxzIGltYXFUaHJlc2hvbGQgKi8KK2ludCBmcmNTaW1wbGVUaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGZsb2F0IHJhbmdlTWluLCBmbG9hdCByYW5nZU1heCwgZmxvYXQgbmV3VmFsdWUpOworaW50IGZyY1NpbXBsZVRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgZmxvYXQgcmFuZ2VNaW4sIGZsb2F0IHJhbmdlTWF4KTsKKworLyogQ29sb3IvSHVlIFRocmVzaG9sZDogY2FsbHMgaW1hcUNvbG9yVGhyZXNob2xkICovCitpbnQgZnJjQ29sb3JUaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIENvbG9yTW9kZSBtb2RlLCAKKwkJY29uc3QgUmFuZ2UqIHBsYW5lMVJhbmdlLCBjb25zdCBSYW5nZSogcGxhbmUyUmFuZ2UsIGNvbnN0IFJhbmdlKiBwbGFuZTNSYW5nZSk7CitpbnQgZnJjQ29sb3JUaHJlc2hvbGQoSW1hZ2UqIGRlc3QsIGNvbnN0IEltYWdlKiBzb3VyY2UsIGludCByZXBsYWNlVmFsdWUsIENvbG9yTW9kZSBtb2RlLCAKKwkJY29uc3QgUmFuZ2UqIHBsYW5lMVJhbmdlLCBjb25zdCBSYW5nZSogcGxhbmUyUmFuZ2UsIGNvbnN0IFJhbmdlKiBwbGFuZTNSYW5nZSk7CitpbnQgZnJjSHVlVGhyZXNob2xkKEltYWdlKiBkZXN0LCBjb25zdCBJbWFnZSogc291cmNlLCBjb25zdCBSYW5nZSogaHVlUmFuZ2UpOworaW50IGZyY0h1ZVRocmVzaG9sZChJbWFnZSogZGVzdCwgY29uc3QgSW1hZ2UqIHNvdXJjZSwgY29uc3QgUmFuZ2UqIGh1ZVJhbmdlLCBpbnQgbWluU2F0dXJhdGlvbik7CisKKy8qIEV4dHJhY3QgQ29sb3JIdWUgUGxhbmU6IGNhbGxzIGltYXFFeHRyYWN0Q29sb3JQbGFuZXMgKi8KK2ludCBmcmNFeHRyYWN0Q29sb3JQbGFuZXMoY29uc3QgSW1hZ2UqIGltYWdlLCBDb2xvck1vZGUgbW9kZSwgSW1hZ2UqIHBsYW5lMSwgSW1hZ2UqIHBsYW5lMiwgSW1hZ2UqIHBsYW5lMyk7CitpbnQgZnJjRXh0cmFjdEh1ZVBsYW5lKGNvbnN0IEltYWdlKiBpbWFnZSwgSW1hZ2UqIGh1ZVBsYW5lKTsKK2ludCBmcmNFeHRyYWN0SHVlUGxhbmUoY29uc3QgSW1hZ2UqIGltYWdlLCBJbWFnZSogaHVlUGxhbmUsIGludCBtaW5TYXR1cmF0aW9uKTsKKworI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvYm90My9hdG9tX2NvZGUvYnVpbGQuc2ggYi9ib3QzL2F0b21fY29kZS9idWlsZC5zaAppbmRleCA3YmRiYmM4Li5hMTA4Y2RmIDEwMDc1NQotLS0gYS9ib3QzL2F0b21fY29kZS9idWlsZC5zaAorKysgYi9ib3QzL2F0b21fY29kZS9idWlsZC5zaApAQCAtMSwzICsxLDMgQEAKICMhL2Jpbi9iYXNoCiAKLS4uLy4uL2Fvcy9idWlsZC9idWlsZC5zaCBhdG9tIGF0b21fY29kZS5neXAgbm8gQWxsIGJvdDNfYXRvbQorLi4vLi4vYW9zL2J1aWxkL2J1aWxkLnNoIGF0b20gYXRvbV9jb2RlLmd5cCBubyBib3QzX2F0b20gJDEKZGlmZiAtLWdpdCBhL2ZyYzk3MS9hdG9tX2NvZGUvYnVpbGQuc2ggYi9mcmM5NzEvYXRvbV9jb2RlL2J1aWxkLnNoCmluZGV4IGRlYjQyZmYuLjQzZGQ0YmYgMTAwNzU1Ci0tLSBhL2ZyYzk3MS9hdG9tX2NvZGUvYnVpbGQuc2gKKysrIGIvZnJjOTcxL2F0b21fY29kZS9idWlsZC5zaApAQCAtMSwzICsxLDMgQEAKICMhL2Jpbi9iYXNoCiAKLS4uLy4uL2Fvcy9idWlsZC9idWlsZC5zaCBhdG9tIGF0b21fY29kZS5neXAgbm8gQWxsIGF0b20KKy4uLy4uL2Fvcy9idWlsZC9idWlsZC5zaCBhdG9tIGF0b21fY29kZS5neXAgbm8gYXRvbSAkMQpkaWZmIC0tZ2l0IGEvZnJjOTcxL2NyaW8vYnVpbGQuc2ggYi9mcmM5NzEvY3Jpby9idWlsZC5zaAppbmRleCA5M2EwNTkzLi44MmM0YjU3IDEwMDc1NQotLS0gYS9mcmM5NzEvY3Jpby9idWlsZC5zaAorKysgYi9mcmM5NzEvY3Jpby9idWlsZC5zaApAQCAtMSwzICsxLDMgQEAKICMhL2Jpbi9iYXNoCiAKLS4uLy4uL2Fvcy9idWlsZC9idWlsZC5zaCBjcmlvIGNyaW8uZ3lwIG5vIEZSQ19Vc2VyUHJvZ3JhbSBvdXRfY3JpbworLi4vLi4vYW9zL2J1aWxkL2J1aWxkLnNoIGNyaW8gY3Jpby5neXAgbm8gY3JpbyBGUkNfVXNlclByb2dyYW0K